From e1f47c181f1fb5eef0b0f406c3f7f1b3c56b4672 Mon Sep 17 00:00:00 2001 From: Matt Tucker Date: Fri, 5 Nov 2004 05:25:24 +0000 Subject: [PATCH] Code cleanup. git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/trunk@2409 b35dd754-fafc-0310-a699-88a17e54d16e --- source/org/jivesoftware/smack/Roster.java | 37 ++++++++++++++--------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/source/org/jivesoftware/smack/Roster.java b/source/org/jivesoftware/smack/Roster.java index 61aba637f..25c6256e0 100644 --- a/source/org/jivesoftware/smack/Roster.java +++ b/source/org/jivesoftware/smack/Roster.java @@ -484,7 +484,7 @@ public class Roster { public Presence getPresenceResource(String userResource) { String key = getPresenceMapKey(userResource); String resource = StringUtils.parseResource(userResource); - Map userPresences = (Map) presenceMap.get(key); + Map userPresences = (Map)presenceMap.get(key); if (userPresences == null) { return null; } @@ -494,22 +494,25 @@ public class Roster { } /** - * Returns an iterator for all the user's current presences or null if the user - * is unavailable (offline) or if no presence information is available, such as - * when you are not subscribed to the user's presence updates. + * Returns an iterator (of Presence objects) for all the user's current presences + * or null if the user is unavailable (offline) or if no presence information + * is available, such as when you are not subscribed to the user's presence updates. * * @param user a fully qualified xmpp ID, e.g. jdoe@example.com - * @return an iterator for all the user's current presences, or null if the user is - * unavailable or if no presence information is available. + * @return an iterator (of Presence objects) for all the user's current presences, + * or null if the user is unavailable or if no presence information + * is available. */ public Iterator getPresences(String user) { String key = getPresenceMapKey(user); - Map userPresences = (Map) presenceMap.get(key); + Map userPresences = (Map)presenceMap.get(key); if (userPresences == null) { return null; } else { - return userPresences.values().iterator(); + synchronized (userPresences) { + return new HashMap(userPresences).values().iterator(); + } } } @@ -577,11 +580,14 @@ public class Roster { if (presenceMap.get(key) == null) { userPresences = new HashMap(); presenceMap.put(key, userPresences); - } else { - userPresences = (Map) presenceMap.get(key); } - // Add the new presence taking in consideration the presence´s resource - userPresences.put(StringUtils.parseResource(from), presence); + else { + userPresences = (Map)presenceMap.get(key); + } + // Add the new presence, using the resources as a key. + synchronized (userPresences) { + userPresences.put(StringUtils.parseResource(from), presence); + } // If the user is in the roster, fire an event. synchronized (entries) { for (Iterator i = entries.iterator(); i.hasNext();) { @@ -596,7 +602,9 @@ public class Roster { else if (presence.getType() == Presence.Type.UNAVAILABLE) { if (presenceMap.get(key) != null) { Map userPresences = (Map) presenceMap.get(key); - userPresences.remove(StringUtils.parseResource(from)); + synchronized (userPresences) { + userPresences.remove(StringUtils.parseResource(from)); + } if (userPresences.isEmpty()) { presenceMap.remove(key); } @@ -663,7 +671,8 @@ public class Roster { // Make sure the entry is in the entry list. if (!entries.contains(entry)) { entries.add(entry); - } else { + } + else { // If the entry was in then list then update its state with the new values RosterEntry existingEntry = (RosterEntry) entries.get(entries.indexOf(entry));