From a56bc6cac62efeff8494730281017c439686649a Mon Sep 17 00:00:00 2001 From: Damian Minkov Date: Mon, 21 Jul 2014 11:20:35 +0300 Subject: [PATCH] Does not try to modify metacontact list storage when adding contact to a non persistent group. --- .../impl/contactlist/MclStorageManager.java | 5 ++ .../impl/protocol/mock/MockContact.java | 5 ++ .../impl/protocol/mock/MockContactGroup.java | 4 ++ .../MockPersistentPresenceOperationSet.java | 68 +++++++++++++++++++ .../contactlist/TestMetaContactList.java | 7 ++ 5 files changed, 89 insertions(+) diff --git a/src/net/java/sip/communicator/impl/contactlist/MclStorageManager.java b/src/net/java/sip/communicator/impl/contactlist/MclStorageManager.java index ae89f00f3..0183ae3fd 100644 --- a/src/net/java/sip/communicator/impl/contactlist/MclStorageManager.java +++ b/src/net/java/sip/communicator/impl/contactlist/MclStorageManager.java @@ -1265,6 +1265,11 @@ private Element createMetaContactGroupNode(MetaContactGroup metaGroup) */ public void metaContactAdded(MetaContactEvent evt) { + // if the parent group is not persistent, do not do anything + // cause its missing in xml + if(!evt.getParentGroup().isPersistent()) + return; + Element parentGroupNode = findMetaContactGroupNode(evt.getParentGroup().getMetaUID()); diff --git a/src/net/java/sip/communicator/impl/protocol/mock/MockContact.java b/src/net/java/sip/communicator/impl/protocol/mock/MockContact.java index a2bb441fa..bb5ab80ed 100644 --- a/src/net/java/sip/communicator/impl/protocol/mock/MockContact.java +++ b/src/net/java/sip/communicator/impl/protocol/mock/MockContact.java @@ -294,4 +294,9 @@ public Collection getResources() { return null; } + + public void setPersistent(boolean isPersistent) + { + this.isPersistent = isPersistent; + } } diff --git a/src/net/java/sip/communicator/impl/protocol/mock/MockContactGroup.java b/src/net/java/sip/communicator/impl/protocol/mock/MockContactGroup.java index 4287cc60e..f1352aed8 100644 --- a/src/net/java/sip/communicator/impl/protocol/mock/MockContactGroup.java +++ b/src/net/java/sip/communicator/impl/protocol/mock/MockContactGroup.java @@ -495,5 +495,9 @@ public boolean equals(Object obj) return true; } + public void setPersistent(boolean isPersistent) + { + this.isPersistent = isPersistent; + } } diff --git a/src/net/java/sip/communicator/impl/protocol/mock/MockPersistentPresenceOperationSet.java b/src/net/java/sip/communicator/impl/protocol/mock/MockPersistentPresenceOperationSet.java index dcccdc78c..b8371fd9f 100644 --- a/src/net/java/sip/communicator/impl/protocol/mock/MockPersistentPresenceOperationSet.java +++ b/src/net/java/sip/communicator/impl/protocol/mock/MockPersistentPresenceOperationSet.java @@ -529,4 +529,72 @@ public ContactGroup createUnresolvedContactGroup(String groupUID, return newGroup; } + + /** + * Creates a non persistent contact for the specified id. This would + * also create (if necessary) a group for volatile contacts. + * @param id the address of the contact to create. + * @return the newly created volatile MockContact + */ + public MockContact createVolatileContact( + String id) + { + MockContact newVolatileContact + = new MockContact(id, parentProvider); + newVolatileContact.setResolved(false); + newVolatileContact.setPersistent(false); + + //Check whether a volatile group already exists and if not create + //one + MockContactGroup theVolatileGroup = getNonPersistentGroup(); + + //if the parent group is null then add necessary create the group + if (theVolatileGroup == null) + { + theVolatileGroup = new MockContactGroup( + "Not-In-Contactlist", + parentProvider); + theVolatileGroup.setResolved(false); + theVolatileGroup.setPersistent(false); + + theVolatileGroup.addContact(newVolatileContact); + + this.contactListRoot.addSubgroup(theVolatileGroup); + + fireServerStoredGroupEvent(theVolatileGroup + , ServerStoredGroupEvent.GROUP_CREATED_EVENT); + } + else + { + theVolatileGroup.addContact(newVolatileContact); + + fireSubscriptionEvent( + newVolatileContact, + theVolatileGroup, + SubscriptionEvent.SUBSCRIPTION_CREATED); + } + + return newVolatileContact; + } + + /** + * Returns the volatile group that we use when creating volatile contacts. + * + * @return MockContactGroup + */ + public MockContactGroup getNonPersistentGroup() + { + String groupName = "Not-In-Contactlist"; + + for (int i = 0; i < contactListRoot.countSubgroups(); i++) + { + MockContactGroup gr = + (MockContactGroup)contactListRoot.getGroup(i); + + if(!gr.isPersistent() && gr.getGroupName().equals(groupName)) + return gr; + } + + return null; + } } diff --git a/test/net/java/sip/communicator/slick/contactlist/TestMetaContactList.java b/test/net/java/sip/communicator/slick/contactlist/TestMetaContactList.java index 1a1d27e88..f9344bf3b 100644 --- a/test/net/java/sip/communicator/slick/contactlist/TestMetaContactList.java +++ b/test/net/java/sip/communicator/slick/contactlist/TestMetaContactList.java @@ -476,6 +476,13 @@ public void testSubscriptionHandling() throws Exception assertEquals("Source meta contact." , newMetaContact, evt.getSourceMetaContact()); + MclSlickFixture.mockPresOpSet.createVolatileContact( + newSubscriptionName + "1"); + MclSlickFixture.mockPresOpSet.createVolatileContact( + newSubscriptionName + "2"); + // and now clear volatile + MclSlickFixture.mockPresOpSet.removeServerStoredContactGroup( + MclSlickFixture.mockPresOpSet.getNonPersistentGroup()); }