diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/PresenceFilter.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/PresenceFilter.java index 64ed8b050..b30a517bc 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/PresenceFilter.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/PresenceFilter.java @@ -311,20 +311,36 @@ private void addMatching( MetaContactGroup metaGroup, UIContact newUIContact; synchronized (metaContact) { - newUIContact = MetaContactListSource - .createUIContact(metaContact); - } + newUIContact + = MetaContactListSource.getUIContact(metaContact); - GuiActivator.getContactList().addContact( - newUIContact, - uiGroup, - true, - true); + if (newUIContact == null) + { + newUIContact = MetaContactListSource + .createUIContact(metaContact); + + GuiActivator.getContactList().addContact( + newUIContact, + uiGroup, + true, + true); + } + + } query.setInitialResultCount(resultCount); } else - query.fireQueryEvent(metaContact); + { + synchronized (metaContact) + { + if (MetaContactListSource.getUIContact(metaContact) + == null) + { + query.fireQueryEvent(metaContact); + } + } + } } } diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/TreeContactList.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/TreeContactList.java index e614a4ba5..7da4d5e6b 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/TreeContactList.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/TreeContactList.java @@ -569,24 +569,34 @@ private void createMetaUIRootGroup() { MetaContactGroup rootGroup = GuiActivator.getContactListService().getRoot(); - UIGroup uiGroup = MetaContactListSource - .getUIGroup(rootGroup); + UIGroup uiGroup; + synchronized (rootGroup) + { + uiGroup = MetaContactListSource + .getUIGroup(rootGroup); - if (uiGroup != null) - return; + if (uiGroup != null) + return; - uiGroup = MetaContactListSource - .createUIGroup(rootGroup); - + uiGroup = MetaContactListSource + .createUIGroup(rootGroup); + } treeModel.getRoot().sortedAddContactGroup((UIGroupImpl)uiGroup); Iterator i = rootGroup.getChildContacts(); while (i.hasNext()) { MetaContact contact = i.next(); - UIContact uiContact = MetaContactListSource.getUIContact(contact); - removeContact(uiContact); - uiContact = MetaContactListSource.createUIContact(contact); + UIContact uiContact; + synchronized (contact) + { + uiContact + = MetaContactListSource.getUIContact(contact); + if(uiContact == null) + continue; + removeContact(uiContact); + uiContact = MetaContactListSource.createUIContact(contact); + } if (currentFilter.isMatching(uiContact)) addContact(uiContact, uiGroup, true, true); else @@ -602,11 +612,15 @@ private void removeMetaUIRootGroup() MetaContactGroup rootGroup = GuiActivator.getContactListService().getRoot(); - UIGroup uiGroup = MetaContactListSource - .getUIGroup(rootGroup); + UIGroup uiGroup; + synchronized (rootGroup) + { + uiGroup = MetaContactListSource + .getUIGroup(rootGroup); - if (uiGroup == null) - return; + if (uiGroup == null) + return; + } GroupNode parentNode = treeModel.getRoot(); @@ -614,10 +628,16 @@ private void removeMetaUIRootGroup() while (i.hasNext()) { MetaContact contact = i.next(); - UIContact uiContact - = MetaContactListSource.getUIContact(contact); - removeContact(uiContact); - uiContact = MetaContactListSource.createUIContact(contact); + UIContact uiContact; + synchronized (contact) + { + uiContact + = MetaContactListSource.getUIContact(contact); + if(uiContact == null) + continue; + removeContact(uiContact); + uiContact = MetaContactListSource.createUIContact(contact); + } if (currentFilter.isMatching(uiContact)) addContact(uiContact, treeModel.getRoot().getGroupDescriptor(), true, true); diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/MetaContactListSource.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/MetaContactListSource.java index e182b3e37..cdc47815b 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/MetaContactListSource.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/MetaContactListSource.java @@ -258,22 +258,40 @@ public void queryMetaContactSource(Pattern filterPattern, } UIContact newUIContact; + boolean uiContactCreated = false; synchronized (metaContact) { - newUIContact - = MetaContactListSource.createUIContact(metaContact); + newUIContact + = MetaContactListSource.getUIContact(metaContact); + + if (newUIContact == null) + { + newUIContact + = MetaContactListSource + .createUIContact(metaContact); + + GuiActivator.getContactList().addContact( + newUIContact, + uiGroup, + true, + true); + } + } - - GuiActivator.getContactList().addContact( - newUIContact, - uiGroup, - true, - true); - + query.setInitialResultCount(resultCount); } else - query.fireQueryEvent(metaContact); + { + synchronized (metaContact) + { + if (MetaContactListSource.getUIContact(metaContact) + == null) + { + query.fireQueryEvent(metaContact); + } + } + } } }