package org.limewire.xmpp.client.impl; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.limewire.friend.api.Friend; import org.limewire.friend.api.FriendPresence; import org.limewire.friend.api.PresenceEvent; import org.limewire.friend.api.RosterEvent; import org.limewire.friend.api.feature.FeatureEvent; import org.limewire.friend.impl.util.PresenceUtils; import org.limewire.listener.EventListener; import org.limewire.logging.Log; import org.limewire.logging.LogFactory; public class RosterListenerMock implements EventListener<RosterEvent> { private static final Log LOG = LogFactory.getLog(RosterListenerMock.class); private HashMap<String, Friend> users = new HashMap<String, Friend>(); private HashMap<String, ArrayList<FriendPresence>> roster = new HashMap<String, ArrayList<FriendPresence>>(); IncomingChatListenerMock listener = new IncomingChatListenerMock(); @Override public void handleEvent(RosterEvent event) { for (Friend friend : event.getData()) { if(event.getType().equals(RosterEvent.Type.FRIENDS_ADDED)) { friendAdded(friend); } else if(event.getType().equals(RosterEvent.Type.FRIENDS_DELETED)) { friendDeleted(friend.getId()); } else if(event.getType().equals(RosterEvent.Type.FRIENDS_UPDATED)) { friendUpdated(friend); } } } public synchronized int getRosterSize() { return roster.size(); } public synchronized String getFirstRosterEntry() { return roster.keySet().iterator().next(); } public synchronized int countPresences(String username) { ArrayList<FriendPresence> presences = roster.get(username); return presences == null ? 0 : presences.size(); } public synchronized FriendPresence getFirstPresence(String username) { ArrayList<FriendPresence> presences = roster.get(username); return (presences == null || presences.isEmpty()) ? null : presences.get(0); } public synchronized Friend getUser(String username) { return users.get(username); } private synchronized void friendAdded(Friend friend) { LOG.debugf("friend added: {0}", friend); users.put(friend.getId(), friend); if(roster.get(friend.getId()) == null) { roster.put(friend.getId(), new ArrayList<FriendPresence>()); } friend.addPresenceListener(new EventListener<PresenceEvent>() { public void handleEvent(PresenceEvent event) { synchronized (RosterListenerMock.this) { FriendPresence presence = event.getData(); String id = PresenceUtils.parseBareAddress(presence.getPresenceId()); if(presence.getType().equals(FriendPresence.Type.available)) { if(roster.get(id) == null) { roster.put(id, new ArrayList<FriendPresence>()); } if(!contains(roster.get(id), presence.getPresenceId())) { roster.get(id).add(presence); presence.getFriend().setChatListenerIfNecessary(listener); LOG.debugf("presence {0}", presence); } else { replace(roster.get(id), presence); } } else if(presence.getType().equals(FriendPresence.Type.unavailable)) { if(roster.get(id) == null) { roster.put(id, new ArrayList<FriendPresence>()); } remove(id, presence); } else { LOG.debugf("user presence changed: {0}", presence.getType()); } } } }); } private synchronized void replace(ArrayList<FriendPresence> presences, FriendPresence presence) { FriendPresence oldPresence = null; for(FriendPresence p : presences) { if(p.getPresenceId().equals(presence.getPresenceId())) { oldPresence = p; break; } } if (oldPresence != null) { presences.remove(oldPresence); presences.add(presence); } } private synchronized boolean contains(ArrayList<FriendPresence> presences, String jid) { for(FriendPresence presence : presences) { if(presence.getPresenceId().equals(jid)) { return true; } } return false; } private synchronized void remove(String id, FriendPresence p) { for(FriendPresence presence : roster.get(id)) { if(presence.getPresenceId().equals(p.getPresenceId())) { roster.get(id).remove(presence); if(roster.get(id).size() == 0) { roster.remove(id); } break; } } } private void friendUpdated(Friend friend) { LOG.debugf("friend updated: {0}", friend); } private void friendDeleted(String id) { LOG.debugf("friend deleted: {0}", id); } class FeatureEventListener implements EventListener<FeatureEvent> { List<FeatureEvent> featureEvents = new ArrayList<FeatureEvent>(); public void handleEvent(FeatureEvent event) { featureEvents.add(event); } } }