From 99f93bb339a628e965dabad57a42d4dbf53b2af9 Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Tue, 11 Nov 2014 19:20:59 +0000 Subject: [PATCH 1/5] Add code testing for ephemeral node --- .../iq/namespace/pubsub/set/NodeDelete.java | 205 +++++++++--------- 1 file changed, 108 insertions(+), 97 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDelete.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDelete.java index 16202428..0089b2b5 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDelete.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDelete.java @@ -7,6 +7,7 @@ import org.apache.log4j.Logger; import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; +import org.buddycloud.channelserver.channel.node.configuration.field.Ephemeral; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.JabberPubsub; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.PubSubElementProcessorAbstract; @@ -25,119 +26,129 @@ public class NodeDelete extends PubSubElementProcessorAbstract { - private static final String NODE_REG_EX = "^/user/[^@]+@[^/]+/[^/]+$"; - private ResultSet subscriptions; + private static final String NODE_REG_EX = "^/user/[^@]+@[^/]+/[^/]+$"; + private ResultSet subscriptions; - private static final Logger LOGGER = Logger.getLogger(NodeThreadsGet.class); + private static final Logger LOGGER = Logger.getLogger(NodeThreadsGet.class); - public NodeDelete(BlockingQueue outQueue, ChannelManager channelManager) { - setChannelManager(channelManager); - setOutQueue(outQueue); + public NodeDelete(BlockingQueue outQueue, ChannelManager channelManager) { + setChannelManager(channelManager); + setOutQueue(outQueue); - acceptedElementName = "delete"; - } + acceptedElementName = "delete"; + } - public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) throws Exception { + public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) throws Exception { - this.element = elm; - this.response = IQ.createResultIQ(reqIQ); - this.request = reqIQ; - this.actor = actorJID; - this.node = element.attributeValue(XMLConstants.NODE_ATTR); + this.element = elm; + this.response = IQ.createResultIQ(reqIQ); + this.request = reqIQ; + this.actor = actorJID; + this.node = element.attributeValue(XMLConstants.NODE_ATTR); - if (actorJID == null) { - actor = request.getFrom(); - } - if (!nodePresent() || !nodeValid()) { - outQueue.put(response); - return; - } - if (!Configuration.getInstance().isLocalNode(node)) { - makeRemoteRequest(); - return; - } - if (!checkNodeExists() || !actorIsRegistered() || !nodeHandledByThisServer() || !actorAllowedToDelete()) { - outQueue.put(response); - return; - } - getNodeListeners(); - deleteNode(); - sendNotifications(); + if (actorJID == null) { + actor = request.getFrom(); } - - private void getNodeListeners() { - try { - subscriptions = channelManager.getNodeSubscriptionListeners(node); - } catch (NodeStoreException e) { - subscriptions = new ResultSetImpl(new ArrayList()); - } + if (!nodePresent() || !nodeValid()) { + outQueue.put(response); + return; } - - private void sendNotifications() throws NodeStoreException { - try { - Message notification = createNotificationMessage(); - if (subscriptions != null) { - for (NodeSubscription subscription : subscriptions) { - notification.setTo(subscription.getListener().toString()); - outQueue.put(notification.createCopy()); - } - } - Collection admins = getAdminUsers(); - for (JID admin : admins) { - notification.setTo(admin); - outQueue.put(notification.createCopy()); - } - } catch (Exception e) { - LOGGER.error(e); - } + if (!Configuration.getInstance().isLocalNode(node)) { + makeRemoteRequest(); + return; } - - private Message createNotificationMessage() { - Message notification = new Message(); - notification.setType(Message.Type.headline); - notification.getElement().addAttribute("remote-server-discover", "false"); - Element eventEl = notification.addChildElement("event", JabberPubsub.NS_PUBSUB_EVENT); - Element deleteEl = eventEl.addElement("delete"); - deleteEl.addAttribute("node", node); - return notification; + if (!checkNodeExists() || !actorIsRegistered() || !nodeHandledByThisServer() + || isEphemeralNode() || !actorAllowedToDelete()) { + outQueue.put(response); + return; } - - private void deleteNode() throws InterruptedException { - try { - channelManager.deleteNode(node); - } catch (NodeStoreException e) { - LOGGER.error(e); - setErrorCondition(PacketError.Type.wait, PacketError.Condition.internal_server_error); - outQueue.put(response); - return; + getNodeListeners(); + deleteNode(); + sendNotifications(); + } + + private boolean isEphemeralNode() throws NodeStoreException { + String ephemeral = channelManager.getNodeConfValue(node, Ephemeral.FIELD_NAME); + if ((null == ephemeral) || !ephemeral.equals("false")) { + return false; + } + return true; + } + + private void getNodeListeners() { + try { + subscriptions = channelManager.getNodeSubscriptionListeners(node); + } catch (NodeStoreException e) { + subscriptions = new ResultSetImpl(new ArrayList()); + } + } + + private void sendNotifications() throws NodeStoreException { + try { + Message notification = createNotificationMessage(); + if (subscriptions != null) { + for (NodeSubscription subscription : subscriptions) { + notification.setTo(subscription.getListener().toString()); + outQueue.put(notification.createCopy()); } - response.setType(IQ.Type.result); - outQueue.put(response); + } + Collection admins = getAdminUsers(); + for (JID admin : admins) { + notification.setTo(admin); + outQueue.put(notification.createCopy()); + } + } catch (Exception e) { + LOGGER.error(e); + } + } + + private Message createNotificationMessage() { + Message notification = new Message(); + notification.setType(Message.Type.headline); + notification.getElement().addAttribute("remote-server-discover", "false"); + Element eventEl = notification.addChildElement("event", JabberPubsub.NS_PUBSUB_EVENT); + Element deleteEl = eventEl.addElement("delete"); + deleteEl.addAttribute("node", node); + return notification; + } + + private void deleteNode() throws InterruptedException { + try { + channelManager.deleteNode(node); + } catch (NodeStoreException e) { + LOGGER.error(e); + setErrorCondition(PacketError.Type.wait, PacketError.Condition.internal_server_error); + outQueue.put(response); + return; } + response.setType(IQ.Type.result); + outQueue.put(response); + } - private boolean actorAllowedToDelete() throws NodeStoreException { - boolean isOwner = channelManager.getNodeMembership(node, actor).getAffiliation().equals(Affiliations.owner); + private boolean actorAllowedToDelete() throws NodeStoreException { + boolean isOwner = + channelManager.getNodeMembership(node, actor).getAffiliation().equals(Affiliations.owner); - if (isOwner) { - return true; - } - setErrorCondition(PacketError.Type.auth, PacketError.Condition.not_authorized); - return false; + if (isOwner) { + return true; } - - private boolean nodeHandledByThisServer() { - if (!node.contains("@" + getServerDomain()) && !node.contains("@" + getTopicsDomain())) { - setErrorCondition(PacketError.Type.modify, PacketError.Condition.not_acceptable); - return false; - } - return true; + setErrorCondition(PacketError.Type.auth, PacketError.Condition.not_authorized); + return false; + } + + private boolean nodeHandledByThisServer() { + if (!node.contains("@" + getServerDomain()) && !node.contains("@" + getTopicsDomain())) { + setErrorCondition(PacketError.Type.modify, PacketError.Condition.not_acceptable); + return false; } + return true; + } - private boolean nodeValid() { - if (!node.matches(NODE_REG_EX)) { - setErrorCondition(PacketError.Type.modify, PacketError.Condition.bad_request); - return false; - } - return true; + private boolean nodeValid() { + if (!node.matches(NODE_REG_EX)) { + setErrorCondition(PacketError.Type.modify, PacketError.Condition.bad_request); + return false; } + return true; + } } From c95b877d3545a1a00b231ddcba9704786a6ab153 Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Tue, 11 Nov 2014 19:34:11 +0000 Subject: [PATCH 2/5] Add test for deleting ephemeral nodes --- .../iq/namespace/pubsub/set/NodeDelete.java | 7 ++++- .../channelserver/utils/XMLConstants.java | 2 ++ .../namespace/pubsub/set/NodeDeleteTest.java | 27 +++++++++++++++++-- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDelete.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDelete.java index 0089b2b5..1958ca81 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDelete.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDelete.java @@ -15,6 +15,7 @@ import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; import org.buddycloud.channelserver.pubsub.model.NodeSubscription; import org.buddycloud.channelserver.utils.XMLConstants; +import org.buddycloud.channelserver.utils.node.item.payload.Buddycloud; import org.dom4j.Element; import org.xmpp.packet.IQ; import org.xmpp.packet.JID; @@ -23,6 +24,9 @@ import org.xmpp.packet.PacketError; import org.xmpp.resultsetmanagement.ResultSet; import org.xmpp.resultsetmanagement.ResultSetImpl; +import org.xmpp.util.XMPPConstants; + +import sun.tools.tree.AddExpression; public class NodeDelete extends PubSubElementProcessorAbstract { @@ -69,9 +73,10 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) throws Exc private boolean isEphemeralNode() throws NodeStoreException { String ephemeral = channelManager.getNodeConfValue(node, Ephemeral.FIELD_NAME); - if ((null == ephemeral) || !ephemeral.equals("false")) { + if ((null == ephemeral) || !ephemeral.equals("true")) { return false; } + createExtendedErrorReply(PacketError.Type.cancel, PacketError.Condition.not_allowed, XMLConstants.CAN_NOT_DELETE_EPHEMERAL_NODE, Buddycloud.NS_ERROR); return true; } diff --git a/src/main/java/org/buddycloud/channelserver/utils/XMLConstants.java b/src/main/java/org/buddycloud/channelserver/utils/XMLConstants.java index f8d2ce6c..8ce9d65e 100644 --- a/src/main/java/org/buddycloud/channelserver/utils/XMLConstants.java +++ b/src/main/java/org/buddycloud/channelserver/utils/XMLConstants.java @@ -136,6 +136,8 @@ public class XMLConstants { public static final String SUBSCRIPTION_ATTR = "subscription"; + public static final String CAN_NOT_DELETE_EPHEMERAL_NODE = "can-not-delete-ephemeral-node"; + // Private (hidden) constructor private XMLConstants() { diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDeleteTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDeleteTest.java index e1a9a74f..4fd5810d 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDeleteTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDeleteTest.java @@ -8,6 +8,7 @@ import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; +import org.buddycloud.channelserver.channel.node.configuration.field.Ephemeral; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; @@ -15,6 +16,8 @@ import org.buddycloud.channelserver.pubsub.model.impl.NodeMembershipImpl; import org.buddycloud.channelserver.pubsub.model.impl.NodeSubscriptionImpl; import org.buddycloud.channelserver.pubsub.subscription.Subscriptions; +import org.buddycloud.channelserver.utils.XMLConstants; +import org.buddycloud.channelserver.utils.node.item.payload.Buddycloud; import org.dom4j.Element; import org.dom4j.tree.BaseElement; import org.junit.After; @@ -36,6 +39,8 @@ public class NodeDeleteTest extends IQTestHandler { private NodeDelete nodeDelete; private BaseElement element; private JID jid = new JID("juliet@shakespeare.lit"); + private IQ request; + private Element deleteEl; @Before public void setUp() throws Exception { @@ -46,6 +51,8 @@ public void setUp() throws Exception { this.element = new BaseElement("delete"); Configuration.getInstance().putProperty( Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); + request = readStanzaAsIq("/iq/pubsub/delete/request-with-node.stanza"); + deleteEl = request.getChildElement().element("delete"); } @After @@ -288,8 +295,6 @@ public void testSuccessfulDeleteWithSubscribers() throws Exception { @Test public void databaseExceptionWhenGettingListenersSendsMinimalNotifications() throws Exception { - IQ request = readStanzaAsIq("/iq/pubsub/delete/request-with-node.stanza"); - Element deleteEl = request.getChildElement().element("delete"); String node = deleteEl.attributeValue("node"); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); @@ -311,4 +316,22 @@ public void databaseExceptionWhenGettingListenersSendsMinimalNotifications() thr int adminCount = Configuration.getInstance().getAdminUsers().size(); Assert.assertEquals(adminCount, queue.size()); } + + @Test + public void canNotDeleteAnEphemeralNode() throws Exception { + + Mockito.when(channelManager.nodeExists(Mockito.anyString())).thenReturn(true); + Mockito.when(channelManager.getNodeConfValue(Mockito.anyString(), Mockito.eq(Ephemeral.FIELD_NAME))).thenReturn("true"); + + nodeDelete.process(deleteEl, jid, request, null); + Packet response = queue.poll(); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.cancel, error.getType()); + Assert.assertEquals(PacketError.Condition.not_allowed, + error.getCondition()); + Assert.assertEquals(XMLConstants.CAN_NOT_DELETE_EPHEMERAL_NODE, error.getApplicationConditionName()); + Assert.assertEquals(Buddycloud.NS_ERROR, error.getApplicationConditionNamespaceURI()); + } } From fdf1abafed9c12ca37e257f1f5ff1bdd1cdf8d67 Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Tue, 11 Nov 2014 19:51:30 +0000 Subject: [PATCH 3/5] Add channel manager convenience method --- .../channelserver/channel/ChannelManager.java | 9 +++++++++ .../channel/ChannelManagerImpl.java | 10 ++++++++++ .../iq/namespace/pubsub/set/NodeDelete.java | 3 +-- .../channel/ChannelManagerImplTest.java | 19 +++++++++++++++++++ .../namespace/pubsub/set/NodeDeleteTest.java | 5 ++++- 5 files changed, 43 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/channel/ChannelManager.java b/src/main/java/org/buddycloud/channelserver/channel/ChannelManager.java index 3eea26ea..b295b757 100644 --- a/src/main/java/org/buddycloud/channelserver/channel/ChannelManager.java +++ b/src/main/java/org/buddycloud/channelserver/channel/ChannelManager.java @@ -47,4 +47,13 @@ public interface ChannelManager extends NodeStore { */ CloseableIterator performSearch(JID searcher, List content, JID author, int page, int rpp) throws NodeStoreException; + /** + * Returns true if node is ephemeral + * + * @param node + * @return + * @throws NodeStoreException + */ + boolean isEphemeralNode(String node) throws NodeStoreException; + } diff --git a/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java b/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java index 93d94247..fff5b0bf 100644 --- a/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java +++ b/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java @@ -7,6 +7,7 @@ import org.apache.log4j.Logger; import org.buddycloud.channelserver.Configuration; +import org.buddycloud.channelserver.channel.node.configuration.field.Ephemeral; import org.buddycloud.channelserver.db.ClosableIteratorImpl; import org.buddycloud.channelserver.db.CloseableIterator; import org.buddycloud.channelserver.db.NodeStore; @@ -412,4 +413,13 @@ public List getRemoteNodesList() throws NodeStoreException { return nodeStore.getRemoteNodesList(); } + @Override + public boolean isEphemeralNode(String node) throws NodeStoreException { + String ephemeral = getNodeConfValue(node, Ephemeral.FIELD_NAME); + if ((null == ephemeral) || !ephemeral.equals("true")) { + return false; + } + return true; + } + } diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDelete.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDelete.java index 1958ca81..f5b14164 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDelete.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDelete.java @@ -72,8 +72,7 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) throws Exc } private boolean isEphemeralNode() throws NodeStoreException { - String ephemeral = channelManager.getNodeConfValue(node, Ephemeral.FIELD_NAME); - if ((null == ephemeral) || !ephemeral.equals("true")) { + if (!channelManager.isEphemeralNode(node)) { return false; } createExtendedErrorReply(PacketError.Type.cancel, PacketError.Condition.not_allowed, XMLConstants.CAN_NOT_DELETE_EPHEMERAL_NODE, Buddycloud.NS_ERROR); diff --git a/src/test/java/org/buddycloud/channelserver/channel/ChannelManagerImplTest.java b/src/test/java/org/buddycloud/channelserver/channel/ChannelManagerImplTest.java index 5a8c402a..ecbe181a 100644 --- a/src/test/java/org/buddycloud/channelserver/channel/ChannelManagerImplTest.java +++ b/src/test/java/org/buddycloud/channelserver/channel/ChannelManagerImplTest.java @@ -11,6 +11,7 @@ import java.util.List; import org.buddycloud.channelserver.Configuration; +import org.buddycloud.channelserver.channel.node.configuration.field.Ephemeral; import org.buddycloud.channelserver.db.NodeStore; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; import org.junit.After; @@ -165,4 +166,22 @@ public void testGetNodeDefaultAffiliationForNodeWithoutConf() throws Exception { // If nothing is specified, the default affiliation is "member" assertEquals("Incorrect default affiliation", Affiliations.member, affiliation); } + + @Test + public void returnsEphemeralNodeIsFalseIfNoConfiguratonVaueProvided() throws Exception { + Mockito.when(nodeStore.getNodeConfValue(Mockito.anyString(), Mockito.eq(Ephemeral.FIELD_NAME))).thenReturn(null); + assertFalse(channelManager.isEphemeralNode(user1)); + } + + @Test + public void returnsEphemeralNodeIsFalseIfConfigurationValueIsNotTrue() throws Exception { + Mockito.when(nodeStore.getNodeConfValue(Mockito.anyString(), Mockito.eq(Ephemeral.FIELD_NAME))).thenReturn("no way is this true"); + assertFalse(channelManager.isEphemeralNode(user1)); + } + + @Test + public void returnsEphemeralNodeIsTrueIfConfigurationValueIsTrue() throws Exception { + Mockito.when(nodeStore.getNodeConfValue(Mockito.anyString(), Mockito.eq(Ephemeral.FIELD_NAME))).thenReturn("true"); + assertTrue(channelManager.isEphemeralNode(user1)); + } } diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDeleteTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDeleteTest.java index 4fd5810d..a97f9811 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDeleteTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDeleteTest.java @@ -45,6 +45,9 @@ public class NodeDeleteTest extends IQTestHandler { @Before public void setUp() throws Exception { this.channelManager = Mockito.mock(ChannelManager.class); + + Mockito.when(channelManager.isEphemeralNode(Mockito.anyString())).thenReturn(false); + this.queue = new LinkedBlockingQueue(); this.nodeDelete = new NodeDelete(queue, channelManager); this.nodeDelete.setServerDomain("shakespeare.lit"); @@ -321,7 +324,7 @@ public void databaseExceptionWhenGettingListenersSendsMinimalNotifications() thr public void canNotDeleteAnEphemeralNode() throws Exception { Mockito.when(channelManager.nodeExists(Mockito.anyString())).thenReturn(true); - Mockito.when(channelManager.getNodeConfValue(Mockito.anyString(), Mockito.eq(Ephemeral.FIELD_NAME))).thenReturn("true"); + Mockito.when(channelManager.isEphemeralNode(Mockito.anyString())).thenReturn(true); nodeDelete.process(deleteEl, jid, request, null); Packet response = queue.poll(); From 05820c0605a0d2f32909d814be3a0f1a9fca0f47 Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Tue, 11 Nov 2014 19:53:39 +0000 Subject: [PATCH 4/5] Organise imports and formatting --- .../iq/namespace/pubsub/set/NodeDelete.java | 7 +- .../channel/ChannelManagerImplTest.java | 327 +++++----- .../namespace/pubsub/set/NodeDeleteTest.java | 591 +++++++++--------- 3 files changed, 458 insertions(+), 467 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDelete.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDelete.java index f5b14164..3a9779c4 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDelete.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDelete.java @@ -7,7 +7,6 @@ import org.apache.log4j.Logger; import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; -import org.buddycloud.channelserver.channel.node.configuration.field.Ephemeral; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.JabberPubsub; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.PubSubElementProcessorAbstract; @@ -24,9 +23,6 @@ import org.xmpp.packet.PacketError; import org.xmpp.resultsetmanagement.ResultSet; import org.xmpp.resultsetmanagement.ResultSetImpl; -import org.xmpp.util.XMPPConstants; - -import sun.tools.tree.AddExpression; public class NodeDelete extends PubSubElementProcessorAbstract { @@ -75,7 +71,8 @@ private boolean isEphemeralNode() throws NodeStoreException { if (!channelManager.isEphemeralNode(node)) { return false; } - createExtendedErrorReply(PacketError.Type.cancel, PacketError.Condition.not_allowed, XMLConstants.CAN_NOT_DELETE_EPHEMERAL_NODE, Buddycloud.NS_ERROR); + createExtendedErrorReply(PacketError.Type.cancel, PacketError.Condition.not_allowed, + XMLConstants.CAN_NOT_DELETE_EPHEMERAL_NODE, Buddycloud.NS_ERROR); return true; } diff --git a/src/test/java/org/buddycloud/channelserver/channel/ChannelManagerImplTest.java b/src/test/java/org/buddycloud/channelserver/channel/ChannelManagerImplTest.java index ecbe181a..568ff7b6 100644 --- a/src/test/java/org/buddycloud/channelserver/channel/ChannelManagerImplTest.java +++ b/src/test/java/org/buddycloud/channelserver/channel/ChannelManagerImplTest.java @@ -25,163 +25,172 @@ public class ChannelManagerImplTest { - private static final String TEST_DOMAIN = "domain.com"; - private static final String TEST_TOPICS_DOMAIN = "topics.domain.com"; - - @Mock - NodeStore nodeStore; - - String user1 = "/user/user@" + TEST_DOMAIN + "/posts"; - String user2 = "/user/user@server2.com/posts"; - String user3 = "/user/user@topics.server3.com/posts"; - String user4 = "/user/user@" + TEST_TOPICS_DOMAIN + "/status"; - String user5 = "/user/user@server1.com/meta"; - - /** - * Class under test - */ - ChannelManagerImpl channelManager; - - @Before - public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); - channelManager = new ChannelManagerImpl(nodeStore); - - // This is used loads - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_SERVER_DOMAIN, TEST_DOMAIN); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_SERVER_TOPICS_DOMAIN, - TEST_TOPICS_DOMAIN); - Configuration.getInstance().remove( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); - } - - @After - public void tearDown() throws Exception { - channelManager = null; - } - - @Test - @Ignore("Until we can so something about the millisecond matching") - public void testCreatePersonalChannel() throws Exception { - JID channelJID = new JID("testchannel@domain.com"); - - channelManager.createPersonalChannel(channelJID); - - verify(nodeStore).createNode(channelJID, Conf.getPostChannelNodename(channelJID), Conf.getDefaultPostChannelConf(channelJID)); - verify(nodeStore).createNode(channelJID, Conf.getStatusChannelNodename(channelJID), Conf.getDefaultStatusChannelConf(channelJID)); - verify(nodeStore).createNode(channelJID, Conf.getGeoPreviousChannelNodename(channelJID), Conf.getDefaultGeoPreviousChannelConf(channelJID)); - verify(nodeStore).createNode(channelJID, Conf.getGeoCurrentChannelNodename(channelJID), Conf.getDefaultGeoCurrentChannelConf(channelJID)); - verify(nodeStore).createNode(channelJID, Conf.getGeoNextChannelNodename(channelJID), Conf.getDefaultGeoNextChannelConf(channelJID)); - } - - @Test(expected = IllegalArgumentException.class) - public void testCreatePersonalChannelFailsForRemoteUser() throws Exception { - JID channelJID = new JID("testchannel@otherdomain.com"); - - channelManager.createPersonalChannel(channelJID); - } - - @Test - public void testCreatePersonalWorksForExternallyValidatedDomain() throws Exception { - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, - Boolean.TRUE.toString()); - JID channelJID = new JID("testchannel@otherdomain.com"); - channelManager.createPersonalChannel(channelJID); - } - - @Test - @Ignore("Until we can so something about the millisecond matching") - public void testCreatePersonalChannelSomeNodesExist() throws Exception { - JID channelJID = new JID("testchannel@domain.com"); - - when(nodeStore.nodeExists(Conf.getPostChannelNodename(channelJID))).thenReturn(true); - - channelManager.createPersonalChannel(new JID("testchannel@domain.com")); - - verify(nodeStore, never()).createNode(channelJID, Conf.getPostChannelNodename(channelJID), Conf.getDefaultPostChannelConf(channelJID)); - verify(nodeStore).createNode(channelJID, Conf.getStatusChannelNodename(channelJID), Conf.getDefaultStatusChannelConf(channelJID)); - verify(nodeStore).createNode(channelJID, Conf.getGeoPreviousChannelNodename(channelJID), Conf.getDefaultGeoPreviousChannelConf(channelJID)); - verify(nodeStore).createNode(channelJID, Conf.getGeoCurrentChannelNodename(channelJID), Conf.getDefaultGeoCurrentChannelConf(channelJID)); - verify(nodeStore).createNode(channelJID, Conf.getGeoNextChannelNodename(channelJID), Conf.getDefaultGeoNextChannelConf(channelJID)); - } - - @Test - public void testIsLocalNodeSuccess() throws Exception { - assertTrue(Configuration.getInstance().isLocalNode("/user/test@domain.com/posts")); - } - - @Test - public void testIsLocalNodeFailure() throws Exception { - assertFalse(Configuration.getInstance().isLocalNode("/user/test@otherdomain.com/posts")); - } - - @Test(expected = IllegalArgumentException.class) - public void testIsLocalNodeWithInvalidNodeThrowsException() throws Exception { - Configuration.getInstance().isLocalNode("somerandomnodeid"); - } - - @Test - public void testIsLocalJidForLocaJid() throws Exception { - assertTrue(Configuration.getInstance().isLocalJID(new JID("user@" + TEST_DOMAIN))); - } - - @Test - public void testIsLocalJidForNonLocaJid() throws Exception { - assertFalse(Configuration.getInstance().isLocalJID(new JID("user@server1.com"))); - } - - @Test - public void testDeleteRemoteDataDeletesRemoteData() throws Exception { - - List remoteNodes = new ArrayList(); - remoteNodes.add(user2); - remoteNodes.add(user3); - remoteNodes.add(user5); - - when(nodeStore.getRemoteNodesList()).thenReturn(remoteNodes); - - channelManager.deleteRemoteData(); - - verify(nodeStore).getRemoteNodesList(); - verify(nodeStore, Mockito.times(3)).purgeNodeItems(Mockito.anyString()); - } - - @Test - public void testGetNodeDefaultAffiliationForNodeWithConf() throws Exception { - when(nodeStore.getNodeConfValue(user1, Conf.DEFAULT_AFFILIATION)).thenReturn("moderator"); - - Affiliations affiliation = channelManager.getDefaultNodeAffiliation(user1); - - assertEquals("Incorrect default affiliation", Affiliations.moderator, affiliation); - } - - - @Test - public void testGetNodeDefaultAffiliationForNodeWithoutConf() throws Exception { - Affiliations affiliation = channelManager.getDefaultNodeAffiliation(user1); - - // If nothing is specified, the default affiliation is "member" - assertEquals("Incorrect default affiliation", Affiliations.member, affiliation); - } - - @Test - public void returnsEphemeralNodeIsFalseIfNoConfiguratonVaueProvided() throws Exception { - Mockito.when(nodeStore.getNodeConfValue(Mockito.anyString(), Mockito.eq(Ephemeral.FIELD_NAME))).thenReturn(null); - assertFalse(channelManager.isEphemeralNode(user1)); - } - - @Test - public void returnsEphemeralNodeIsFalseIfConfigurationValueIsNotTrue() throws Exception { - Mockito.when(nodeStore.getNodeConfValue(Mockito.anyString(), Mockito.eq(Ephemeral.FIELD_NAME))).thenReturn("no way is this true"); - assertFalse(channelManager.isEphemeralNode(user1)); - } - - @Test - public void returnsEphemeralNodeIsTrueIfConfigurationValueIsTrue() throws Exception { - Mockito.when(nodeStore.getNodeConfValue(Mockito.anyString(), Mockito.eq(Ephemeral.FIELD_NAME))).thenReturn("true"); - assertTrue(channelManager.isEphemeralNode(user1)); - } + private static final String TEST_DOMAIN = "domain.com"; + private static final String TEST_TOPICS_DOMAIN = "topics.domain.com"; + + @Mock + NodeStore nodeStore; + + String user1 = "/user/user@" + TEST_DOMAIN + "/posts"; + String user2 = "/user/user@server2.com/posts"; + String user3 = "/user/user@topics.server3.com/posts"; + String user4 = "/user/user@" + TEST_TOPICS_DOMAIN + "/status"; + String user5 = "/user/user@server1.com/meta"; + + /** + * Class under test + */ + ChannelManagerImpl channelManager; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + channelManager = new ChannelManagerImpl(nodeStore); + + // This is used loads + Configuration.getInstance().putProperty(Configuration.CONFIGURATION_SERVER_DOMAIN, TEST_DOMAIN); + Configuration.getInstance().putProperty(Configuration.CONFIGURATION_SERVER_TOPICS_DOMAIN, + TEST_TOPICS_DOMAIN); + Configuration.getInstance().remove(Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + } + + @After + public void tearDown() throws Exception { + channelManager = null; + } + + @Test + @Ignore("Until we can so something about the millisecond matching") + public void testCreatePersonalChannel() throws Exception { + JID channelJID = new JID("testchannel@domain.com"); + + channelManager.createPersonalChannel(channelJID); + + verify(nodeStore).createNode(channelJID, Conf.getPostChannelNodename(channelJID), + Conf.getDefaultPostChannelConf(channelJID)); + verify(nodeStore).createNode(channelJID, Conf.getStatusChannelNodename(channelJID), + Conf.getDefaultStatusChannelConf(channelJID)); + verify(nodeStore).createNode(channelJID, Conf.getGeoPreviousChannelNodename(channelJID), + Conf.getDefaultGeoPreviousChannelConf(channelJID)); + verify(nodeStore).createNode(channelJID, Conf.getGeoCurrentChannelNodename(channelJID), + Conf.getDefaultGeoCurrentChannelConf(channelJID)); + verify(nodeStore).createNode(channelJID, Conf.getGeoNextChannelNodename(channelJID), + Conf.getDefaultGeoNextChannelConf(channelJID)); + } + + @Test(expected = IllegalArgumentException.class) + public void testCreatePersonalChannelFailsForRemoteUser() throws Exception { + JID channelJID = new JID("testchannel@otherdomain.com"); + + channelManager.createPersonalChannel(channelJID); + } + + @Test + public void testCreatePersonalWorksForExternallyValidatedDomain() throws Exception { + Configuration.getInstance().putProperty(Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, + Boolean.TRUE.toString()); + JID channelJID = new JID("testchannel@otherdomain.com"); + channelManager.createPersonalChannel(channelJID); + } + + @Test + @Ignore("Until we can so something about the millisecond matching") + public void testCreatePersonalChannelSomeNodesExist() throws Exception { + JID channelJID = new JID("testchannel@domain.com"); + + when(nodeStore.nodeExists(Conf.getPostChannelNodename(channelJID))).thenReturn(true); + + channelManager.createPersonalChannel(new JID("testchannel@domain.com")); + + verify(nodeStore, never()).createNode(channelJID, Conf.getPostChannelNodename(channelJID), + Conf.getDefaultPostChannelConf(channelJID)); + verify(nodeStore).createNode(channelJID, Conf.getStatusChannelNodename(channelJID), + Conf.getDefaultStatusChannelConf(channelJID)); + verify(nodeStore).createNode(channelJID, Conf.getGeoPreviousChannelNodename(channelJID), + Conf.getDefaultGeoPreviousChannelConf(channelJID)); + verify(nodeStore).createNode(channelJID, Conf.getGeoCurrentChannelNodename(channelJID), + Conf.getDefaultGeoCurrentChannelConf(channelJID)); + verify(nodeStore).createNode(channelJID, Conf.getGeoNextChannelNodename(channelJID), + Conf.getDefaultGeoNextChannelConf(channelJID)); + } + + @Test + public void testIsLocalNodeSuccess() throws Exception { + assertTrue(Configuration.getInstance().isLocalNode("/user/test@domain.com/posts")); + } + + @Test + public void testIsLocalNodeFailure() throws Exception { + assertFalse(Configuration.getInstance().isLocalNode("/user/test@otherdomain.com/posts")); + } + + @Test(expected = IllegalArgumentException.class) + public void testIsLocalNodeWithInvalidNodeThrowsException() throws Exception { + Configuration.getInstance().isLocalNode("somerandomnodeid"); + } + + @Test + public void testIsLocalJidForLocaJid() throws Exception { + assertTrue(Configuration.getInstance().isLocalJID(new JID("user@" + TEST_DOMAIN))); + } + + @Test + public void testIsLocalJidForNonLocaJid() throws Exception { + assertFalse(Configuration.getInstance().isLocalJID(new JID("user@server1.com"))); + } + + @Test + public void testDeleteRemoteDataDeletesRemoteData() throws Exception { + + List remoteNodes = new ArrayList(); + remoteNodes.add(user2); + remoteNodes.add(user3); + remoteNodes.add(user5); + + when(nodeStore.getRemoteNodesList()).thenReturn(remoteNodes); + + channelManager.deleteRemoteData(); + + verify(nodeStore).getRemoteNodesList(); + verify(nodeStore, Mockito.times(3)).purgeNodeItems(Mockito.anyString()); + } + + @Test + public void testGetNodeDefaultAffiliationForNodeWithConf() throws Exception { + when(nodeStore.getNodeConfValue(user1, Conf.DEFAULT_AFFILIATION)).thenReturn("moderator"); + + Affiliations affiliation = channelManager.getDefaultNodeAffiliation(user1); + + assertEquals("Incorrect default affiliation", Affiliations.moderator, affiliation); + } + + + @Test + public void testGetNodeDefaultAffiliationForNodeWithoutConf() throws Exception { + Affiliations affiliation = channelManager.getDefaultNodeAffiliation(user1); + + // If nothing is specified, the default affiliation is "member" + assertEquals("Incorrect default affiliation", Affiliations.member, affiliation); + } + + @Test + public void returnsEphemeralNodeIsFalseIfNoConfiguratonVaueProvided() throws Exception { + Mockito.when(nodeStore.getNodeConfValue(Mockito.anyString(), Mockito.eq(Ephemeral.FIELD_NAME))) + .thenReturn(null); + assertFalse(channelManager.isEphemeralNode(user1)); + } + + @Test + public void returnsEphemeralNodeIsFalseIfConfigurationValueIsNotTrue() throws Exception { + Mockito.when(nodeStore.getNodeConfValue(Mockito.anyString(), Mockito.eq(Ephemeral.FIELD_NAME))) + .thenReturn("no way is this true"); + assertFalse(channelManager.isEphemeralNode(user1)); + } + + @Test + public void returnsEphemeralNodeIsTrueIfConfigurationValueIsTrue() throws Exception { + Mockito.when(nodeStore.getNodeConfValue(Mockito.anyString(), Mockito.eq(Ephemeral.FIELD_NAME))) + .thenReturn("true"); + assertTrue(channelManager.isEphemeralNode(user1)); + } } diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDeleteTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDeleteTest.java index a97f9811..e3cdde70 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDeleteTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDeleteTest.java @@ -34,307 +34,292 @@ public class NodeDeleteTest extends IQTestHandler { - private ChannelManager channelManager; - private LinkedBlockingQueue queue; - private NodeDelete nodeDelete; - private BaseElement element; - private JID jid = new JID("juliet@shakespeare.lit"); - private IQ request; - private Element deleteEl; - - @Before - public void setUp() throws Exception { - this.channelManager = Mockito.mock(ChannelManager.class); - - Mockito.when(channelManager.isEphemeralNode(Mockito.anyString())).thenReturn(false); - - this.queue = new LinkedBlockingQueue(); - this.nodeDelete = new NodeDelete(queue, channelManager); - this.nodeDelete.setServerDomain("shakespeare.lit"); - this.element = new BaseElement("delete"); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); - request = readStanzaAsIq("/iq/pubsub/delete/request-with-node.stanza"); - deleteEl = request.getChildElement().element("delete"); - } - - @After - public void tearDown() { - Mockito.reset(channelManager); - } - - @Test - public void testPassingDeleteAsElementName() { - Assert.assertTrue(nodeDelete.accept(element)); - } - - @Test - public void testPassingNotDeleteAsElementName() { - Element element = new BaseElement("not-delete"); - Assert.assertFalse(nodeDelete.accept(element)); - } - - @Test - public void testStanzaWithNoNode() throws Exception { - IQ request = readStanzaAsIq("/iq/pubsub/delete/request-no-node.stanza"); - Element deleteEl = request.getChildElement().element("delete"); - nodeDelete.process(deleteEl, jid, request, null); - Packet response = queue.poll(); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.modify, error.getType()); - Assert.assertEquals("nodeid-required", - error.getApplicationConditionName()); - } - - @Test - public void testStanzaWithEmptyNode() throws Exception { - IQ request = readStanzaAsIq("/iq/pubsub/delete/request-empty-node.stanza"); - Element deleteEl = request.getChildElement().element("delete"); - nodeDelete.process(deleteEl, jid, request, null); - Packet response = queue.poll(); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.modify, error.getType()); - Assert.assertEquals("nodeid-required", - error.getApplicationConditionName()); - } - - @Test - public void testNonLocalNode() throws Exception { - IQ request = readStanzaAsIq("/iq/pubsub/delete/request-with-node.stanza"); - Element deleteEl = request.getChildElement().element("delete"); - - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); - - nodeDelete.process(deleteEl, jid, request, null); - Packet response = queue.poll(); - - Assert.assertNull(response.getError()); - Element actorEl = response.getElement().element("pubsub") - .element("actor"); - Assert.assertEquals(jid.toBareJID(), actorEl.getText()); - } - - @Test - public void testInexistentNode() throws Exception { - IQ request = readStanzaAsIq("/iq/pubsub/delete/request-with-node.stanza"); - Element deleteEl = request.getChildElement().element("delete"); - - String node = deleteEl.attributeValue("node"); - Mockito.when(channelManager.nodeExists(node)).thenReturn(false); - - nodeDelete.process(deleteEl, jid, request, null); - Packet response = queue.poll(); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.cancel, error.getType()); - Assert.assertEquals(PacketError.Condition.item_not_found, - error.getCondition()); - } - - @Test - public void testNotRegisteredActor() throws Exception { - IQ request = readStanzaAsIq("/iq/pubsub/delete/request-with-node.stanza"); - Element deleteEl = request.getChildElement().element("delete"); - - String node = deleteEl.attributeValue("node"); - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - nodeDelete.setServerDomain("fake.domain"); - - nodeDelete.process(deleteEl, jid, request, null); - Packet response = queue.poll(); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.auth, error.getType()); - Assert.assertEquals(PacketError.Condition.forbidden, - error.getCondition()); - } - - @Test - public void testNotAffiliatedActor() throws Exception { - IQ request = readStanzaAsIq("/iq/pubsub/delete/request-with-node.stanza"); - Element deleteEl = request.getChildElement().element("delete"); - - String node = deleteEl.attributeValue("node"); - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( - new NodeMembershipImpl(node, jid, Subscriptions.subscribed, - Affiliations.none, null)); - - nodeDelete.process(deleteEl, jid, request, null); - Packet response = queue.poll(); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.auth, error.getType()); - Assert.assertEquals(PacketError.Condition.not_authorized, - error.getCondition()); - } - - @Test - public void testActorIsNotOwner() throws Exception { - IQ request = readStanzaAsIq("/iq/pubsub/delete/request-with-node.stanza"); - Element deleteEl = request.getChildElement().element("delete"); - - String node = deleteEl.attributeValue("node"); - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - - Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( - new NodeMembershipImpl(node, jid, Subscriptions.subscribed, - Affiliations.moderator, null)); - - nodeDelete.process(deleteEl, jid, request, null); - Packet response = queue.poll(); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.auth, error.getType()); - Assert.assertEquals(PacketError.Condition.not_authorized, - error.getCondition()); - } - - @Test - public void testBadFormattedNode() throws Exception { - IQ request = readStanzaAsIq("/iq/pubsub/delete/request-bad-formatted-node.stanza"); - Element deleteEl = request.getChildElement().element("delete"); - - String node = deleteEl.attributeValue("node"); - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - - nodeDelete.process(deleteEl, jid, request, null); - Packet response = queue.poll(); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.modify, error.getType()); - Assert.assertEquals(PacketError.Condition.bad_request, - error.getCondition()); - } - - @Test - public void testNodeFromUnknownDomain() throws Exception { - IQ request = readStanzaAsIq("/iq/pubsub/delete/request-unknown-domain-node.stanza"); - Element deleteEl = request.getChildElement().element("delete"); - - String node = deleteEl.attributeValue("node"); - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - - nodeDelete.process(deleteEl, jid, request, null); - Packet response = queue.poll(); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.modify, error.getType()); - Assert.assertEquals(PacketError.Condition.not_acceptable, - error.getCondition()); - } - - @Test - public void testSuccessfulDeleteNoSubscribers() throws Exception { - IQ request = readStanzaAsIq("/iq/pubsub/delete/request-with-node.stanza"); - Element deleteEl = request.getChildElement().element("delete"); - - String node = deleteEl.attributeValue("node"); - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - - Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( - new NodeMembershipImpl(node, jid, Subscriptions.subscribed, - Affiliations.owner, null)); - - nodeDelete.process(deleteEl, jid, request, null); - IQ response = (IQ) queue.poll(); - - Assert.assertNull(response.getError()); - Assert.assertEquals(request.getID(), response.getID()); - Assert.assertEquals(Type.result, response.getType()); - - int adminCount = Configuration.getInstance().getAdminUsers().size(); - Assert.assertEquals(adminCount, queue.size()); - } - - @Test - public void testSuccessfulDeleteWithSubscribers() throws Exception { - IQ request = readStanzaAsIq("/iq/pubsub/delete/request-with-node.stanza"); - Element deleteEl = request.getChildElement().element("delete"); - - String node = deleteEl.attributeValue("node"); - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - - Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( - new NodeMembershipImpl(node, jid, Subscriptions.subscribed, - Affiliations.owner, null)); - - JID subscriberJid = new JID("subscriber@shakespeare.lit"); - NodeSubscriptionImpl subscription = new NodeSubscriptionImpl(node, - subscriberJid, subscriberJid, Subscriptions.subscribed, null); - List subscriptions = new LinkedList(); - subscriptions.add(subscription); - - Mockito.when(channelManager.getNodeSubscriptionListeners(node)) - .thenReturn(new ResultSetImpl(subscriptions)); - - nodeDelete.process(deleteEl, jid, request, null); - IQ response = (IQ) queue.poll(); - - Assert.assertNull(response.getError()); - Assert.assertEquals(request.getID(), response.getID()); - Assert.assertEquals(Type.result, response.getType()); - - Message subscriberNotification = (Message) queue.poll(); - Assert.assertNotNull(subscriberNotification); - Assert.assertEquals(subscriberJid, subscriberNotification.getTo()); - - Element eventEl = subscriberNotification.getElement().element("event"); - Assert.assertNotNull(eventEl); - Assert.assertEquals(node, - eventEl.element("delete").attributeValue("node")); - } - - @Test - public void databaseExceptionWhenGettingListenersSendsMinimalNotifications() throws Exception { - - String node = deleteEl.attributeValue("node"); - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - - Mockito.doThrow(new NodeStoreException()).when(channelManager) - .getNodeSubscriptionListeners(Mockito.anyString()); - - Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( - new NodeMembershipImpl(node, jid, Subscriptions.subscribed, - Affiliations.owner, null)); - - nodeDelete.process(deleteEl, jid, request, null); - IQ response = (IQ) queue.poll(); - - Assert.assertNull(response.getError()); - Assert.assertEquals(request.getID(), response.getID()); - Assert.assertEquals(Type.result, response.getType()); - - int adminCount = Configuration.getInstance().getAdminUsers().size(); - Assert.assertEquals(adminCount, queue.size()); - } - - @Test - public void canNotDeleteAnEphemeralNode() throws Exception { - - Mockito.when(channelManager.nodeExists(Mockito.anyString())).thenReturn(true); - Mockito.when(channelManager.isEphemeralNode(Mockito.anyString())).thenReturn(true); - - nodeDelete.process(deleteEl, jid, request, null); - Packet response = queue.poll(); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.cancel, error.getType()); - Assert.assertEquals(PacketError.Condition.not_allowed, - error.getCondition()); - Assert.assertEquals(XMLConstants.CAN_NOT_DELETE_EPHEMERAL_NODE, error.getApplicationConditionName()); - Assert.assertEquals(Buddycloud.NS_ERROR, error.getApplicationConditionNamespaceURI()); - } + private ChannelManager channelManager; + private LinkedBlockingQueue queue; + private NodeDelete nodeDelete; + private BaseElement element; + private JID jid = new JID("juliet@shakespeare.lit"); + private IQ request; + private Element deleteEl; + + @Before + public void setUp() throws Exception { + this.channelManager = Mockito.mock(ChannelManager.class); + + Mockito.when(channelManager.isEphemeralNode(Mockito.anyString())).thenReturn(false); + + this.queue = new LinkedBlockingQueue(); + this.nodeDelete = new NodeDelete(queue, channelManager); + this.nodeDelete.setServerDomain("shakespeare.lit"); + this.element = new BaseElement("delete"); + Configuration.getInstance().putProperty(Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, + Boolean.TRUE.toString()); + request = readStanzaAsIq("/iq/pubsub/delete/request-with-node.stanza"); + deleteEl = request.getChildElement().element("delete"); + } + + @After + public void tearDown() { + Mockito.reset(channelManager); + } + + @Test + public void testPassingDeleteAsElementName() { + Assert.assertTrue(nodeDelete.accept(element)); + } + + @Test + public void testPassingNotDeleteAsElementName() { + Element element = new BaseElement("not-delete"); + Assert.assertFalse(nodeDelete.accept(element)); + } + + @Test + public void testStanzaWithNoNode() throws Exception { + IQ request = readStanzaAsIq("/iq/pubsub/delete/request-no-node.stanza"); + Element deleteEl = request.getChildElement().element("delete"); + nodeDelete.process(deleteEl, jid, request, null); + Packet response = queue.poll(); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.modify, error.getType()); + Assert.assertEquals("nodeid-required", error.getApplicationConditionName()); + } + + @Test + public void testStanzaWithEmptyNode() throws Exception { + IQ request = readStanzaAsIq("/iq/pubsub/delete/request-empty-node.stanza"); + Element deleteEl = request.getChildElement().element("delete"); + nodeDelete.process(deleteEl, jid, request, null); + Packet response = queue.poll(); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.modify, error.getType()); + Assert.assertEquals("nodeid-required", error.getApplicationConditionName()); + } + + @Test + public void testNonLocalNode() throws Exception { + IQ request = readStanzaAsIq("/iq/pubsub/delete/request-with-node.stanza"); + Element deleteEl = request.getChildElement().element("delete"); + + Configuration.getInstance().putProperty(Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, + Boolean.FALSE.toString()); + + nodeDelete.process(deleteEl, jid, request, null); + Packet response = queue.poll(); + + Assert.assertNull(response.getError()); + Element actorEl = response.getElement().element("pubsub").element("actor"); + Assert.assertEquals(jid.toBareJID(), actorEl.getText()); + } + + @Test + public void testInexistentNode() throws Exception { + IQ request = readStanzaAsIq("/iq/pubsub/delete/request-with-node.stanza"); + Element deleteEl = request.getChildElement().element("delete"); + + String node = deleteEl.attributeValue("node"); + Mockito.when(channelManager.nodeExists(node)).thenReturn(false); + + nodeDelete.process(deleteEl, jid, request, null); + Packet response = queue.poll(); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.cancel, error.getType()); + Assert.assertEquals(PacketError.Condition.item_not_found, error.getCondition()); + } + + @Test + public void testNotRegisteredActor() throws Exception { + IQ request = readStanzaAsIq("/iq/pubsub/delete/request-with-node.stanza"); + Element deleteEl = request.getChildElement().element("delete"); + + String node = deleteEl.attributeValue("node"); + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + nodeDelete.setServerDomain("fake.domain"); + + nodeDelete.process(deleteEl, jid, request, null); + Packet response = queue.poll(); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.auth, error.getType()); + Assert.assertEquals(PacketError.Condition.forbidden, error.getCondition()); + } + + @Test + public void testNotAffiliatedActor() throws Exception { + IQ request = readStanzaAsIq("/iq/pubsub/delete/request-with-node.stanza"); + Element deleteEl = request.getChildElement().element("delete"); + + String node = deleteEl.attributeValue("node"); + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( + new NodeMembershipImpl(node, jid, Subscriptions.subscribed, Affiliations.none, null)); + + nodeDelete.process(deleteEl, jid, request, null); + Packet response = queue.poll(); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.auth, error.getType()); + Assert.assertEquals(PacketError.Condition.not_authorized, error.getCondition()); + } + + @Test + public void testActorIsNotOwner() throws Exception { + IQ request = readStanzaAsIq("/iq/pubsub/delete/request-with-node.stanza"); + Element deleteEl = request.getChildElement().element("delete"); + + String node = deleteEl.attributeValue("node"); + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + + Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( + new NodeMembershipImpl(node, jid, Subscriptions.subscribed, Affiliations.moderator, null)); + + nodeDelete.process(deleteEl, jid, request, null); + Packet response = queue.poll(); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.auth, error.getType()); + Assert.assertEquals(PacketError.Condition.not_authorized, error.getCondition()); + } + + @Test + public void testBadFormattedNode() throws Exception { + IQ request = readStanzaAsIq("/iq/pubsub/delete/request-bad-formatted-node.stanza"); + Element deleteEl = request.getChildElement().element("delete"); + + String node = deleteEl.attributeValue("node"); + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + + nodeDelete.process(deleteEl, jid, request, null); + Packet response = queue.poll(); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.modify, error.getType()); + Assert.assertEquals(PacketError.Condition.bad_request, error.getCondition()); + } + + @Test + public void testNodeFromUnknownDomain() throws Exception { + IQ request = readStanzaAsIq("/iq/pubsub/delete/request-unknown-domain-node.stanza"); + Element deleteEl = request.getChildElement().element("delete"); + + String node = deleteEl.attributeValue("node"); + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + + nodeDelete.process(deleteEl, jid, request, null); + Packet response = queue.poll(); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.modify, error.getType()); + Assert.assertEquals(PacketError.Condition.not_acceptable, error.getCondition()); + } + + @Test + public void testSuccessfulDeleteNoSubscribers() throws Exception { + IQ request = readStanzaAsIq("/iq/pubsub/delete/request-with-node.stanza"); + Element deleteEl = request.getChildElement().element("delete"); + + String node = deleteEl.attributeValue("node"); + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + + Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( + new NodeMembershipImpl(node, jid, Subscriptions.subscribed, Affiliations.owner, null)); + + nodeDelete.process(deleteEl, jid, request, null); + IQ response = (IQ) queue.poll(); + + Assert.assertNull(response.getError()); + Assert.assertEquals(request.getID(), response.getID()); + Assert.assertEquals(Type.result, response.getType()); + + int adminCount = Configuration.getInstance().getAdminUsers().size(); + Assert.assertEquals(adminCount, queue.size()); + } + + @Test + public void testSuccessfulDeleteWithSubscribers() throws Exception { + IQ request = readStanzaAsIq("/iq/pubsub/delete/request-with-node.stanza"); + Element deleteEl = request.getChildElement().element("delete"); + + String node = deleteEl.attributeValue("node"); + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + + Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( + new NodeMembershipImpl(node, jid, Subscriptions.subscribed, Affiliations.owner, null)); + + JID subscriberJid = new JID("subscriber@shakespeare.lit"); + NodeSubscriptionImpl subscription = + new NodeSubscriptionImpl(node, subscriberJid, subscriberJid, Subscriptions.subscribed, null); + List subscriptions = new LinkedList(); + subscriptions.add(subscription); + + Mockito.when(channelManager.getNodeSubscriptionListeners(node)).thenReturn( + new ResultSetImpl(subscriptions)); + + nodeDelete.process(deleteEl, jid, request, null); + IQ response = (IQ) queue.poll(); + + Assert.assertNull(response.getError()); + Assert.assertEquals(request.getID(), response.getID()); + Assert.assertEquals(Type.result, response.getType()); + + Message subscriberNotification = (Message) queue.poll(); + Assert.assertNotNull(subscriberNotification); + Assert.assertEquals(subscriberJid, subscriberNotification.getTo()); + + Element eventEl = subscriberNotification.getElement().element("event"); + Assert.assertNotNull(eventEl); + Assert.assertEquals(node, eventEl.element("delete").attributeValue("node")); + } + + @Test + public void databaseExceptionWhenGettingListenersSendsMinimalNotifications() throws Exception { + + String node = deleteEl.attributeValue("node"); + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + + Mockito.doThrow(new NodeStoreException()).when(channelManager) + .getNodeSubscriptionListeners(Mockito.anyString()); + + Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( + new NodeMembershipImpl(node, jid, Subscriptions.subscribed, Affiliations.owner, null)); + + nodeDelete.process(deleteEl, jid, request, null); + IQ response = (IQ) queue.poll(); + + Assert.assertNull(response.getError()); + Assert.assertEquals(request.getID(), response.getID()); + Assert.assertEquals(Type.result, response.getType()); + + int adminCount = Configuration.getInstance().getAdminUsers().size(); + Assert.assertEquals(adminCount, queue.size()); + } + + @Test + public void canNotDeleteAnEphemeralNode() throws Exception { + + Mockito.when(channelManager.nodeExists(Mockito.anyString())).thenReturn(true); + Mockito.when(channelManager.isEphemeralNode(Mockito.anyString())).thenReturn(true); + + nodeDelete.process(deleteEl, jid, request, null); + Packet response = queue.poll(); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.cancel, error.getType()); + Assert.assertEquals(PacketError.Condition.not_allowed, error.getCondition()); + Assert.assertEquals(XMLConstants.CAN_NOT_DELETE_EPHEMERAL_NODE, + error.getApplicationConditionName()); + Assert.assertEquals(Buddycloud.NS_ERROR, error.getApplicationConditionNamespaceURI()); + } } From 15d48d2e1ebf27b19441dfae3704308200e56178 Mon Sep 17 00:00:00 2001 From: Lloyd Watkin Date: Tue, 11 Nov 2014 19:54:30 +0000 Subject: [PATCH 5/5] More formatting updates --- .../channelserver/channel/ChannelManager.java | 89 +- .../channel/ChannelManagerImpl.java | 786 +++++++++--------- .../namespace/pubsub/set/NodeDeleteTest.java | 1 - 3 files changed, 442 insertions(+), 434 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/channel/ChannelManager.java b/src/main/java/org/buddycloud/channelserver/channel/ChannelManager.java index b295b757..dd358a9d 100644 --- a/src/main/java/org/buddycloud/channelserver/channel/ChannelManager.java +++ b/src/main/java/org/buddycloud/channelserver/channel/ChannelManager.java @@ -11,49 +11,50 @@ public interface ChannelManager extends NodeStore { - /** - * Creates a channel. - * - * @param channelJID the JID of the channel. - * @throws NodeStoreException - */ - void createPersonalChannel(JID ownerJID) throws NodeStoreException; - - /** - * Deletes all data from remote nodes - * - * @throws NodeStoreException - */ - void deleteRemoteData() throws NodeStoreException; - - /** - * Gets the default affiliation for a node - * - * @return - * - * @throws NodeStoreException - */ - Affiliations getDefaultNodeAffiliation(String nodeId) throws NodeStoreException; - - /** - * Searches for the provided content or author, or both, across nodes the searcher has access to - * - * @param searcher - * @param content - * @param author - * @param page - * @param rpp - * @return - */ - CloseableIterator performSearch(JID searcher, List content, JID author, int page, int rpp) throws NodeStoreException; - - /** - * Returns true if node is ephemeral - * - * @param node - * @return - * @throws NodeStoreException - */ - boolean isEphemeralNode(String node) throws NodeStoreException; + /** + * Creates a channel. + * + * @param channelJID the JID of the channel. + * @throws NodeStoreException + */ + void createPersonalChannel(JID ownerJID) throws NodeStoreException; + + /** + * Deletes all data from remote nodes + * + * @throws NodeStoreException + */ + void deleteRemoteData() throws NodeStoreException; + + /** + * Gets the default affiliation for a node + * + * @return + * + * @throws NodeStoreException + */ + Affiliations getDefaultNodeAffiliation(String nodeId) throws NodeStoreException; + + /** + * Searches for the provided content or author, or both, across nodes the searcher has access to + * + * @param searcher + * @param content + * @param author + * @param page + * @param rpp + * @return + */ + CloseableIterator performSearch(JID searcher, List content, JID author, int page, + int rpp) throws NodeStoreException; + + /** + * Returns true if node is ephemeral + * + * @param node + * @return + * @throws NodeStoreException + */ + boolean isEphemeralNode(String node) throws NodeStoreException; } diff --git a/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java b/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java index fff5b0bf..3a34dfc2 100644 --- a/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java +++ b/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java @@ -28,398 +28,406 @@ */ public class ChannelManagerImpl implements ChannelManager { - private final NodeStore nodeStore; - - private static final Logger logger = Logger.getLogger(ChannelManagerImpl.class); - private static final String REMOTE_NODE = "Illegal remote node"; - - /** - * Create an instance backed by a {@link NodeStore}. - * - * @param nodeStore - * the backing {@link NodeStore}. - */ - public ChannelManagerImpl(final NodeStore nodeStore) { - this.nodeStore = nodeStore; - } - - @Override - public void createNode(JID owner, String nodeId, Map nodeConf) throws NodeStoreException { - nodeStore.createNode(owner, nodeId, nodeConf); - } - - @Override - public void setNodeConfValue(String nodeId, String key, String value) throws NodeStoreException { - nodeStore.setNodeConfValue(nodeId, key, value); - } - - @Override - public void setNodeConf(String nodeId, Map conf) throws NodeStoreException { - nodeStore.setNodeConf(nodeId, conf); - } - - @Override - public String getNodeConfValue(String nodeId, String key) throws NodeStoreException { - return nodeStore.getNodeConfValue(nodeId, key); - } - - @Override - public void deleteNodeConfiguration(String nodeId) throws NodeStoreException { - nodeStore.deleteNodeConfiguration(nodeId); - } - - @Override - public Map getNodeConf(String nodeId) throws NodeStoreException { - return nodeStore.getNodeConf(nodeId); - } - - @Override - public boolean isCachedNodeConfig(String nodeId) throws NodeStoreException { - return nodeStore.isCachedNodeConfig(nodeId); - } - - @Override - public boolean nodeExists(String nodeId) throws NodeStoreException { - return nodeStore.nodeExists(nodeId); - } - - @Override - public void setUserAffiliation(String nodeId, JID user, Affiliations affiliation) throws NodeStoreException { - nodeStore.setUserAffiliation(nodeId, user, affiliation); - } - - @Override - public void addUserSubscription(NodeSubscription subscription) throws NodeStoreException { - nodeStore.addUserSubscription(subscription); - } - - @Override - public ResultSet getAffiliationChanges(JID user, Date startDate, Date endDate) throws NodeStoreException { - return nodeStore.getAffiliationChanges(user, startDate, endDate); - } - - @Override - public ArrayList getNodeOwners(String node) throws NodeStoreException { - return nodeStore.getNodeOwners(node); - } - - @Override - public ResultSet getSubscriptionChanges(JID user, Date startDate, Date endDate) throws NodeStoreException { - return nodeStore.getSubscriptionChanges(user, startDate, endDate); - } - - @Override - public CloseableIterator getNodeItems(String nodeId, String afterItemId, int count) throws NodeStoreException { - return nodeStore.getNodeItems(nodeId, afterItemId, count); - } - - @Override - public CloseableIterator getNodeItems(String nodeId) throws NodeStoreException { - return nodeStore.getNodeItems(nodeId); - } - - @Override - public ClosableIteratorImpl getNodeItemReplies(String nodeId, String itemId, String afterItemId, int limit) throws NodeStoreException { - return nodeStore.getNodeItemReplies(nodeId, itemId, afterItemId, limit); - } - - @Override - public int getCountNodeItemReplies(String nodeId, String itemId) throws NodeStoreException { - return nodeStore.getCountNodeItemReplies(nodeId, itemId); - } - - @Override - public ClosableIteratorImpl getNodeItemThread(String nodeId, String itemId, String afterItemId, int limit) throws NodeStoreException { - return nodeStore.getNodeItemThread(nodeId, itemId, afterItemId, limit); - } - - @Override - public int getCountNodeThread(String nodeId, String itemId) throws NodeStoreException { - return nodeStore.getCountNodeThread(nodeId, itemId); - } - - @Override - public CloseableIterator getNewNodeItemsForUser(JID user, Date startDate, Date endDate) throws NodeStoreException { - return nodeStore.getNewNodeItemsForUser(user, startDate, endDate); - } - - @Override - public int countNodeItems(String nodeId) throws NodeStoreException { - return nodeStore.countNodeItems(nodeId); - } - - public boolean isCachedNode(String nodeId) throws NodeStoreException { - return nodeStore.isCachedNode(nodeId); - } - - @Override - public boolean nodeHasSubscriptions(String nodeId) throws NodeStoreException { - return (nodeStore.getNodeMemberships(nodeId).size() > 0); - } - - public boolean isCachedJID(JID jid) throws NodeStoreException { - return nodeStore.isCachedJID(jid); - } - - @Override - public NodeItem getNodeItem(String nodeId, String nodeItemId) throws NodeStoreException { - return nodeStore.getNodeItem(nodeId, nodeItemId); - } - - @Override - public NodeItem getNodeItem(GlobalItemID item) throws NodeStoreException { - return nodeStore.getNodeItem(item); - } - - @Override - public void addNodeItem(NodeItem item) throws NodeStoreException { - nodeStore.addNodeItem(item); - } - - @Override - public void updateNodeItem(NodeItem item) throws NodeStoreException { - nodeStore.updateNodeItem(item); - } - - @Override - public void deleteNodeItemById(String nodeId, String nodeItemId) throws NodeStoreException { - nodeStore.deleteNodeItemById(nodeId, nodeItemId); - } - - @Override - public Transaction beginTransaction() throws NodeStoreException { - return nodeStore.beginTransaction(); - } - - @Override - public void createPersonalChannel(JID owner) throws NodeStoreException { - if (false == Configuration.getInstance().isLocalJID(owner)) { - throw new IllegalArgumentException(REMOTE_NODE); - } - if (!nodeExists(Conf.getPostChannelNodename(owner))) { - this.createNode(owner, Conf.getPostChannelNodename(owner), - Conf.getDefaultPostChannelConf(owner)); - } - if (!nodeExists(Conf.getStatusChannelNodename(owner))) { - this.createNode(owner, Conf.getStatusChannelNodename(owner), - Conf.getDefaultStatusChannelConf(owner)); - } - if (!nodeExists(Conf.getSubscriptionsChannelNodename(owner))) { - this.createNode(owner, Conf.getSubscriptionsChannelNodename(owner), - Conf.getDefaultSubscriptionsChannelConf(owner)); - } - if (!nodeExists(Conf.getGeoPreviousChannelNodename(owner))) { - this.createNode(owner, Conf.getGeoPreviousChannelNodename(owner), - Conf.getDefaultGeoPreviousChannelConf(owner)); + private final NodeStore nodeStore; + + private static final Logger logger = Logger.getLogger(ChannelManagerImpl.class); + private static final String REMOTE_NODE = "Illegal remote node"; + + /** + * Create an instance backed by a {@link NodeStore}. + * + * @param nodeStore the backing {@link NodeStore}. + */ + public ChannelManagerImpl(final NodeStore nodeStore) { + this.nodeStore = nodeStore; + } + + @Override + public void createNode(JID owner, String nodeId, Map nodeConf) + throws NodeStoreException { + nodeStore.createNode(owner, nodeId, nodeConf); + } + + @Override + public void setNodeConfValue(String nodeId, String key, String value) throws NodeStoreException { + nodeStore.setNodeConfValue(nodeId, key, value); + } + + @Override + public void setNodeConf(String nodeId, Map conf) throws NodeStoreException { + nodeStore.setNodeConf(nodeId, conf); + } + + @Override + public String getNodeConfValue(String nodeId, String key) throws NodeStoreException { + return nodeStore.getNodeConfValue(nodeId, key); + } + + @Override + public void deleteNodeConfiguration(String nodeId) throws NodeStoreException { + nodeStore.deleteNodeConfiguration(nodeId); + } + + @Override + public Map getNodeConf(String nodeId) throws NodeStoreException { + return nodeStore.getNodeConf(nodeId); + } + + @Override + public boolean isCachedNodeConfig(String nodeId) throws NodeStoreException { + return nodeStore.isCachedNodeConfig(nodeId); + } + + @Override + public boolean nodeExists(String nodeId) throws NodeStoreException { + return nodeStore.nodeExists(nodeId); + } + + @Override + public void setUserAffiliation(String nodeId, JID user, Affiliations affiliation) + throws NodeStoreException { + nodeStore.setUserAffiliation(nodeId, user, affiliation); + } + + @Override + public void addUserSubscription(NodeSubscription subscription) throws NodeStoreException { + nodeStore.addUserSubscription(subscription); + } + + @Override + public ResultSet getAffiliationChanges(JID user, Date startDate, Date endDate) + throws NodeStoreException { + return nodeStore.getAffiliationChanges(user, startDate, endDate); + } + + @Override + public ArrayList getNodeOwners(String node) throws NodeStoreException { + return nodeStore.getNodeOwners(node); + } + + @Override + public ResultSet getSubscriptionChanges(JID user, Date startDate, Date endDate) + throws NodeStoreException { + return nodeStore.getSubscriptionChanges(user, startDate, endDate); + } + + @Override + public CloseableIterator getNodeItems(String nodeId, String afterItemId, int count) + throws NodeStoreException { + return nodeStore.getNodeItems(nodeId, afterItemId, count); + } + + @Override + public CloseableIterator getNodeItems(String nodeId) throws NodeStoreException { + return nodeStore.getNodeItems(nodeId); + } + + @Override + public ClosableIteratorImpl getNodeItemReplies(String nodeId, String itemId, + String afterItemId, int limit) throws NodeStoreException { + return nodeStore.getNodeItemReplies(nodeId, itemId, afterItemId, limit); + } + + @Override + public int getCountNodeItemReplies(String nodeId, String itemId) throws NodeStoreException { + return nodeStore.getCountNodeItemReplies(nodeId, itemId); + } + + @Override + public ClosableIteratorImpl getNodeItemThread(String nodeId, String itemId, + String afterItemId, int limit) throws NodeStoreException { + return nodeStore.getNodeItemThread(nodeId, itemId, afterItemId, limit); + } + + @Override + public int getCountNodeThread(String nodeId, String itemId) throws NodeStoreException { + return nodeStore.getCountNodeThread(nodeId, itemId); + } + + @Override + public CloseableIterator getNewNodeItemsForUser(JID user, Date startDate, Date endDate) + throws NodeStoreException { + return nodeStore.getNewNodeItemsForUser(user, startDate, endDate); + } + + @Override + public int countNodeItems(String nodeId) throws NodeStoreException { + return nodeStore.countNodeItems(nodeId); + } + + public boolean isCachedNode(String nodeId) throws NodeStoreException { + return nodeStore.isCachedNode(nodeId); + } + + @Override + public boolean nodeHasSubscriptions(String nodeId) throws NodeStoreException { + return (nodeStore.getNodeMemberships(nodeId).size() > 0); + } + + public boolean isCachedJID(JID jid) throws NodeStoreException { + return nodeStore.isCachedJID(jid); + } + + @Override + public NodeItem getNodeItem(String nodeId, String nodeItemId) throws NodeStoreException { + return nodeStore.getNodeItem(nodeId, nodeItemId); + } + + @Override + public NodeItem getNodeItem(GlobalItemID item) throws NodeStoreException { + return nodeStore.getNodeItem(item); + } + + @Override + public void addNodeItem(NodeItem item) throws NodeStoreException { + nodeStore.addNodeItem(item); + } + + @Override + public void updateNodeItem(NodeItem item) throws NodeStoreException { + nodeStore.updateNodeItem(item); + } + + @Override + public void deleteNodeItemById(String nodeId, String nodeItemId) throws NodeStoreException { + nodeStore.deleteNodeItemById(nodeId, nodeItemId); + } + + @Override + public Transaction beginTransaction() throws NodeStoreException { + return nodeStore.beginTransaction(); + } + + @Override + public void createPersonalChannel(JID owner) throws NodeStoreException { + if (false == Configuration.getInstance().isLocalJID(owner)) { + throw new IllegalArgumentException(REMOTE_NODE); + } + if (!nodeExists(Conf.getPostChannelNodename(owner))) { + this.createNode(owner, Conf.getPostChannelNodename(owner), + Conf.getDefaultPostChannelConf(owner)); + } + if (!nodeExists(Conf.getStatusChannelNodename(owner))) { + this.createNode(owner, Conf.getStatusChannelNodename(owner), + Conf.getDefaultStatusChannelConf(owner)); + } + if (!nodeExists(Conf.getSubscriptionsChannelNodename(owner))) { + this.createNode(owner, Conf.getSubscriptionsChannelNodename(owner), + Conf.getDefaultSubscriptionsChannelConf(owner)); + } + if (!nodeExists(Conf.getGeoPreviousChannelNodename(owner))) { + this.createNode(owner, Conf.getGeoPreviousChannelNodename(owner), + Conf.getDefaultGeoPreviousChannelConf(owner)); + } + if (!nodeExists(Conf.getGeoCurrentChannelNodename(owner))) { + this.createNode(owner, Conf.getGeoCurrentChannelNodename(owner), + Conf.getDefaultGeoCurrentChannelConf(owner)); + } + if (!nodeExists(Conf.getGeoNextChannelNodename(owner))) { + this.createNode(owner, Conf.getGeoNextChannelNodename(owner), + Conf.getDefaultGeoNextChannelConf(owner)); + } + } + + @Override + public void close() throws NodeStoreException { + nodeStore.close(); + } + + @Override + public void addRemoteNode(String node) throws NodeStoreException { + nodeStore.addRemoteNode(node); + } + + @Override + public ResultSet getNodeSubscriptionListeners(String nodeId) + throws NodeStoreException { + return nodeStore.getNodeSubscriptionListeners(nodeId); + } + + @Override + public ResultSet getNodeSubscriptionListeners() throws NodeStoreException { + return nodeStore.getNodeSubscriptionListeners(); + } + + @Override + public void deleteNode(String nodeId) throws NodeStoreException { + nodeStore.deleteNode(nodeId); + } + + @Override + public void deleteRemoteData() throws NodeStoreException { + List nodes = this.getRemoteNodesList(); + for (String node : nodes) { + try { + if (true == node.equals(("/firehose"))) { + continue; } - if (!nodeExists(Conf.getGeoCurrentChannelNodename(owner))) { - this.createNode(owner, Conf.getGeoCurrentChannelNodename(owner), - Conf.getDefaultGeoCurrentChannelConf(owner)); - } - if (!nodeExists(Conf.getGeoNextChannelNodename(owner))) { - this.createNode(owner, Conf.getGeoNextChannelNodename(owner), - Conf.getDefaultGeoNextChannelConf(owner)); - } - } - - @Override - public void close() throws NodeStoreException { - nodeStore.close(); - } - - @Override - public void addRemoteNode(String node) throws NodeStoreException { - nodeStore.addRemoteNode(node); - } - - @Override - public ResultSet getNodeSubscriptionListeners( - String nodeId) throws NodeStoreException { - return nodeStore.getNodeSubscriptionListeners(nodeId); - } - - @Override - public ResultSet getNodeSubscriptionListeners() - throws NodeStoreException { - return nodeStore.getNodeSubscriptionListeners(); - } - - @Override - public void deleteNode(String nodeId) throws NodeStoreException { - nodeStore.deleteNode(nodeId); - } - - @Override - public void deleteRemoteData() throws NodeStoreException { - List nodes = this.getRemoteNodesList(); - for (String node : nodes) { - try { - if (true == node.equals(("/firehose"))) { - continue; - } - nodeStore.purgeNodeItems(node); - } catch (IllegalArgumentException e) { - logger.error("Invalid remote node in datastore " + node, e); - } - } - } - - @Override - public void purgeNodeItems(String nodeId) throws NodeStoreException { - nodeStore.purgeNodeItems(nodeId); - } - - @Override - public ArrayList getNodeList() throws NodeStoreException { - return nodeStore.getNodeList(); - } - - @Override - public CloseableIterator getRecentItems(JID user, Date since, int maxPerNode, int limit, GlobalItemID afterItemId, String node, - boolean parentOnly) throws NodeStoreException { - return nodeStore.getRecentItems(user, since, maxPerNode, limit, afterItemId, node, parentOnly); - } - - @Override - public int getCountRecentItems(JID user, Date since, int maxPerNode, String node, boolean parentOnly) throws NodeStoreException { - return nodeStore.getCountRecentItems(user, since, maxPerNode, node, parentOnly); - } - - @Override - public CloseableIterator getFirehose(int limit, - String afterItemId, boolean isAdmin, String actorDomain) throws NodeStoreException { - return nodeStore.getFirehose(limit, afterItemId, isAdmin, actorDomain); - } - - @Override - public int getFirehoseItemCount(boolean isAdmin, String actorDomain) throws NodeStoreException { - return nodeStore.getFirehoseItemCount(isAdmin, actorDomain); - } - - @Override - public Affiliations getDefaultNodeAffiliation(String nodeId) throws NodeStoreException { - String affiliationString = getNodeConfValue(nodeId, Conf.DEFAULT_AFFILIATION); - - if (affiliationString != null) { - try { - return Affiliations.valueOf(affiliationString); - } catch (IllegalArgumentException e) { - logger.error("Invalid default affiliation stored for node " + nodeId + ": " + affiliationString, e); - } - } - - return Affiliations.member; - } - - @SuppressWarnings("rawtypes") - @Override - public CloseableIterator performSearch(JID searcher, - List content, JID author, int page, int rpp) - throws NodeStoreException { - return nodeStore.performSearch(searcher, content, author, page, rpp); - } - - @Override - public ResultSet getUserPublishedItems(JID userJid) - throws NodeStoreException { - return nodeStore.getUserPublishedItems(userJid); - } - - @Override - public void deleteUserItems(JID userJid) throws NodeStoreException { - nodeStore.deleteUserItems(userJid); - } - - @Override - public void deleteUserAffiliations(JID userJid) throws NodeStoreException { - nodeStore.deleteUserAffiliations(userJid); - } - - @Override - public void deleteUserSubscriptions(JID userJid) throws NodeStoreException { - nodeStore.deleteUserSubscriptions(userJid); - } - - @Override - public ResultSet getNodeThreads(String node, String afterId, - int limit) throws NodeStoreException { - return nodeStore.getNodeThreads(node, afterId, limit); - } - - @Override - public int countNodeThreads(String node) throws NodeStoreException { - return nodeStore.countNodeThreads(node); - } - - @Override - public boolean userHasRatedPost(String node, JID user, GlobalItemID id) throws NodeStoreException { - return nodeStore.userHasRatedPost(node, user, id); - } - - @Override - public void updateThreadParent(String node, String itemId) throws NodeStoreException { - nodeStore.updateThreadParent(node, itemId); - - } - - @Override - public NodeMembership getNodeMembership(String nodeId, JID user) throws NodeStoreException { - return nodeStore.getNodeMembership(nodeId, user); - } - - @Override - public ResultSet getUserMemberships(JID jid) throws NodeStoreException { - return nodeStore.getUserMemberships(jid); - } - - @Override - public ResultSet getNodeMemberships(String nodeId) throws NodeStoreException { - return nodeStore.getNodeMemberships(nodeId); - } - - @Override - public CloseableIterator getUserFeedItems(JID user, Date since, int limit, GlobalItemID afterItemId, boolean parentOnly) - throws NodeStoreException { - return nodeStore.getUserFeedItems(user, since, limit, afterItemId, parentOnly); - } - - @Override - public int getCountUserFeedItems(JID user, Date since, boolean parentOnly) throws NodeStoreException { - return nodeStore.getCountUserFeedItems(user, since, parentOnly); - } - - @Override - public void jidOnline(JID jid) throws NodeStoreException { - nodeStore.jidOnline(jid); - } - - @Override - public void jidOffline(JID jid) throws NodeStoreException { - nodeStore.jidOffline(jid); - } - - @Override - public ArrayList onlineJids(JID jid) throws NodeStoreException { - return nodeStore.onlineJids(jid); - } - - @Override - public List getLocalNodesList() throws NodeStoreException { - return nodeStore.getLocalNodesList(); - } - - @Override - public List getRemoteNodesList() throws NodeStoreException { - return nodeStore.getRemoteNodesList(); + nodeStore.purgeNodeItems(node); + } catch (IllegalArgumentException e) { + logger.error("Invalid remote node in datastore " + node, e); + } } - - @Override - public boolean isEphemeralNode(String node) throws NodeStoreException { - String ephemeral = getNodeConfValue(node, Ephemeral.FIELD_NAME); - if ((null == ephemeral) || !ephemeral.equals("true")) { - return false; + } + + @Override + public void purgeNodeItems(String nodeId) throws NodeStoreException { + nodeStore.purgeNodeItems(nodeId); + } + + @Override + public ArrayList getNodeList() throws NodeStoreException { + return nodeStore.getNodeList(); + } + + @Override + public CloseableIterator getRecentItems(JID user, Date since, int maxPerNode, + int limit, GlobalItemID afterItemId, String node, boolean parentOnly) + throws NodeStoreException { + return nodeStore.getRecentItems(user, since, maxPerNode, limit, afterItemId, node, parentOnly); + } + + @Override + public int getCountRecentItems(JID user, Date since, int maxPerNode, String node, + boolean parentOnly) throws NodeStoreException { + return nodeStore.getCountRecentItems(user, since, maxPerNode, node, parentOnly); + } + + @Override + public CloseableIterator getFirehose(int limit, String afterItemId, boolean isAdmin, + String actorDomain) throws NodeStoreException { + return nodeStore.getFirehose(limit, afterItemId, isAdmin, actorDomain); + } + + @Override + public int getFirehoseItemCount(boolean isAdmin, String actorDomain) throws NodeStoreException { + return nodeStore.getFirehoseItemCount(isAdmin, actorDomain); + } + + @Override + public Affiliations getDefaultNodeAffiliation(String nodeId) throws NodeStoreException { + String affiliationString = getNodeConfValue(nodeId, Conf.DEFAULT_AFFILIATION); + + if (affiliationString != null) { + try { + return Affiliations.valueOf(affiliationString); + } catch (IllegalArgumentException e) { + logger.error("Invalid default affiliation stored for node " + nodeId + ": " + + affiliationString, e); } - return true; } + return Affiliations.member; + } + + @SuppressWarnings("rawtypes") + @Override + public CloseableIterator performSearch(JID searcher, List content, JID author, + int page, int rpp) throws NodeStoreException { + return nodeStore.performSearch(searcher, content, author, page, rpp); + } + + @Override + public ResultSet getUserPublishedItems(JID userJid) throws NodeStoreException { + return nodeStore.getUserPublishedItems(userJid); + } + + @Override + public void deleteUserItems(JID userJid) throws NodeStoreException { + nodeStore.deleteUserItems(userJid); + } + + @Override + public void deleteUserAffiliations(JID userJid) throws NodeStoreException { + nodeStore.deleteUserAffiliations(userJid); + } + + @Override + public void deleteUserSubscriptions(JID userJid) throws NodeStoreException { + nodeStore.deleteUserSubscriptions(userJid); + } + + @Override + public ResultSet getNodeThreads(String node, String afterId, int limit) + throws NodeStoreException { + return nodeStore.getNodeThreads(node, afterId, limit); + } + + @Override + public int countNodeThreads(String node) throws NodeStoreException { + return nodeStore.countNodeThreads(node); + } + + @Override + public boolean userHasRatedPost(String node, JID user, GlobalItemID id) throws NodeStoreException { + return nodeStore.userHasRatedPost(node, user, id); + } + + @Override + public void updateThreadParent(String node, String itemId) throws NodeStoreException { + nodeStore.updateThreadParent(node, itemId); + + } + + @Override + public NodeMembership getNodeMembership(String nodeId, JID user) throws NodeStoreException { + return nodeStore.getNodeMembership(nodeId, user); + } + + @Override + public ResultSet getUserMemberships(JID jid) throws NodeStoreException { + return nodeStore.getUserMemberships(jid); + } + + @Override + public ResultSet getNodeMemberships(String nodeId) throws NodeStoreException { + return nodeStore.getNodeMemberships(nodeId); + } + + @Override + public CloseableIterator getUserFeedItems(JID user, Date since, int limit, + GlobalItemID afterItemId, boolean parentOnly) throws NodeStoreException { + return nodeStore.getUserFeedItems(user, since, limit, afterItemId, parentOnly); + } + + @Override + public int getCountUserFeedItems(JID user, Date since, boolean parentOnly) + throws NodeStoreException { + return nodeStore.getCountUserFeedItems(user, since, parentOnly); + } + + @Override + public void jidOnline(JID jid) throws NodeStoreException { + nodeStore.jidOnline(jid); + } + + @Override + public void jidOffline(JID jid) throws NodeStoreException { + nodeStore.jidOffline(jid); + } + + @Override + public ArrayList onlineJids(JID jid) throws NodeStoreException { + return nodeStore.onlineJids(jid); + } + + @Override + public List getLocalNodesList() throws NodeStoreException { + return nodeStore.getLocalNodesList(); + } + + @Override + public List getRemoteNodesList() throws NodeStoreException { + return nodeStore.getRemoteNodesList(); + } + + @Override + public boolean isEphemeralNode(String node) throws NodeStoreException { + String ephemeral = getNodeConfValue(node, Ephemeral.FIELD_NAME); + if ((null == ephemeral) || !ephemeral.equals("true")) { + return false; + } + return true; + } + } diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDeleteTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDeleteTest.java index e3cdde70..717795db 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDeleteTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeDeleteTest.java @@ -8,7 +8,6 @@ import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; -import org.buddycloud.channelserver.channel.node.configuration.field.Ephemeral; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations;