public void entriesUpdated(Collection<String> updatedIds) {
   try {
     synchronized (XMPPFriendConnectionImpl.this) {
       checkLoggedIn();
       synchronized (friends) {
         Roster roster = connection.getRoster();
         if (roster != null) {
           List<Friend> updatedFriends = new ArrayList<Friend>();
           for (String id : updatedIds) {
             RosterEntry rosterEntry = roster.getEntry(id);
             XMPPFriendImpl friend = friends.get(id);
             if (friend == null) {
               // should never happen ?
               friend =
                   new XMPPFriendImpl(
                       id, rosterEntry, configuration, connection, featureRegistry);
               friends.put(id, friend);
             } else {
               friend.setRosterEntry(rosterEntry);
             }
             updatedFriends.add(friend);
             LOG.debugf("user {0} updated", friend);
           }
           rosterListeners.broadcast(
               new RosterEvent(updatedFriends, RosterEvent.Type.FRIENDS_UPDATED));
         }
       }
     }
   } catch (org.jivesoftware.smack.XMPPException e) {
     LOG.debugf(e, "error getting roster");
   } catch (FriendException e) {
     LOG.debugf(e, "error getting roster");
   }
 }
 private void addNewPresence(
     final XMPPFriendImpl friend, final org.jivesoftware.smack.packet.Presence presence) {
   final PresenceImpl presenceImpl = new PresenceImpl(presence, friend, featureSupport);
   presenceImpl.addTransport(AddressFeature.class, addressIQListener);
   presenceImpl.addTransport(AuthTokenFeature.class, authTokenIQListener);
   presenceImpl.addTransport(ConnectBackRequestFeature.class, connectRequestIQListener);
   presenceImpl.addTransport(LibraryChangedNotifierFeature.class, libraryChangedIQListener);
   presenceImpl.addTransport(FileOfferFeature.class, fileTransferIQListener);
   friend.addPresense(presenceImpl);
 }
 @Override
 public void presenceChanged(final org.jivesoftware.smack.packet.Presence presence) {
   String localJID;
   try {
     localJID = getLocalJid();
   } catch (FriendException e) {
     localJID = null;
   }
   if (!presence.getFrom().equals(localJID)) {
     XMPPFriendImpl friend = getFriend(presence);
     if (friend != null) {
       LOG.debugf("presence from {0} changed to {1}", presence.getFrom(), presence.getType());
       // synchronize to avoid updates or presences from being lost
       // better to replace that with a lock object private to this
       // connection class
       synchronized (friend) {
         if (presence.getType().equals(org.jivesoftware.smack.packet.Presence.Type.available)) {
           if (!friend.getPresences().containsKey(presence.getFrom())) {
             addNewPresence(friend, presence);
           } else {
             updatePresence(friend, presence);
           }
         } else if (presence
             .getType()
             .equals(org.jivesoftware.smack.packet.Presence.Type.unavailable)) {
           PresenceImpl p = (PresenceImpl) friend.getPresence(presence.getFrom());
           if (p != null) {
             p.update(presence);
             friend.removePresense(p);
           }
         }
       }
     } else {
       LOG.debugf("no friend for presence {0}", presence.getFrom());
     }
   }
 }
 private void updatePresence(
     XMPPFriendImpl friend, org.jivesoftware.smack.packet.Presence presence) {
   PresenceImpl currentPresence = (PresenceImpl) friend.getPresences().get(presence.getFrom());
   currentPresence.update(presence);
   friend.updatePresence(currentPresence);
 }