From 0434fb21b3fc1a460d7bc16f5c6a1d3b9443894c Mon Sep 17 00:00:00 2001 From: abmargb Date: Fri, 19 Sep 2014 11:42:38 -0300 Subject: [PATCH 01/18] Removing unused variables and useless imports. --- .../pubsub/get/items/special/FirehoseGet.java | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java index ad829d16..5d51dd07 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java @@ -1,25 +1,15 @@ package org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.get.items.special; import java.io.StringReader; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.TimeZone; import java.util.concurrent.BlockingQueue; import org.apache.log4j.Logger; import org.buddycloud.channelserver.channel.ChannelManager; -import org.buddycloud.channelserver.channel.Conf; import org.buddycloud.channelserver.db.CloseableIterator; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.JabberPubsub; -import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.PubSubElementProcessor; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.PubSubElementProcessorAbstract; -import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.PubSubGet; -import org.buddycloud.channelserver.pubsub.model.NodeAffiliation; import org.buddycloud.channelserver.pubsub.model.NodeItem; -import org.buddycloud.channelserver.pubsub.model.NodeSubscription; -import org.buddycloud.channelserver.queue.FederatedQueueManager; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; @@ -27,16 +17,11 @@ import org.xmpp.packet.JID; import org.xmpp.packet.Packet; import org.xmpp.packet.PacketError; -import org.xmpp.resultsetmanagement.ResultSet; public class FirehoseGet extends PubSubElementProcessorAbstract { - private Date maxAge; - private Integer maxItems; - private Element pubsub; private SAXReader xmlReader; - private String nodeEnding = "/posts"; // RSM details private String firstItemId = null; From 542c8ff40252f497f3c76ea1882353b325d1846a Mon Sep 17 00:00:00 2001 From: abmargb Date: Fri, 19 Sep 2014 11:49:54 -0300 Subject: [PATCH 02/18] Removing unused fields from tests --- .../pubsub/get/items/special/FirehoseGetTest.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGetTest.java index aae4eba9..ad5c40a2 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGetTest.java @@ -13,6 +13,7 @@ import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.JabberPubsub; +import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.get.RecentItemsGet; import org.buddycloud.channelserver.pubsub.model.NodeItem; import org.buddycloud.channelserver.pubsub.model.impl.NodeItemImpl; import org.dom4j.Element; @@ -32,16 +33,12 @@ public class FirehoseGetTest extends IQTestHandler { private Element element; private BlockingQueue queue = new LinkedBlockingQueue(); - private String node = "/user/pamela@denmark.lit/posts"; private JID jid = new JID("user1@server1"); private ChannelManager channelManager; private String TEST_NODE_1 = "node1"; private String TEST_NODE_2 = "node2"; - private JID TEST_JID_1 = new JID("user1@server1"); - private JID TEST_JID_2 = new JID("user2@server1"); - @Before public void setUp() throws Exception { @@ -103,6 +100,7 @@ public void testItemsReturnsEmptyStanza() throws Exception { pubsub.getNamespaceURI()); } + @SuppressWarnings("unchecked") @Test public void testOutgoingStanzaFormattedAsExpected() throws Exception { @@ -169,6 +167,7 @@ public void testUnparsableItemEntriesAreSimplyIgnored() throws Exception { .elements("item").size()); } + @SuppressWarnings("unchecked") @Test public void testCanControlGatheredEntriesUsingRsm() throws Exception { @@ -188,7 +187,7 @@ public void testCanControlGatheredEntriesUsingRsm() throws Exception { channelManager.getFirehoseItemCount(Mockito.anyBoolean())).thenReturn(2); Element rsm = request.getElement().addElement("rsm"); - rsm.addNamespace("", recentItemsGet.NS_RSM); + rsm.addNamespace("", RecentItemsGet.NS_RSM); rsm.addElement("max").addText("2"); rsm.addElement("after").addText("node1:1"); From a0141de92d34123fa6179a15735e12639118c4a0 Mon Sep 17 00:00:00 2001 From: abmargb Date: Fri, 19 Sep 2014 11:50:39 -0300 Subject: [PATCH 03/18] Fixing style (missing brackets, weird one-liners...) --- .../pubsub/get/items/special/FirehoseGet.java | 49 ++++++++++--------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java index 5d51dd07..445b124a 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java @@ -20,8 +20,12 @@ public class FirehoseGet extends PubSubElementProcessorAbstract { + private static final int DEF_MAX_RESULTS = 50; + private static final Logger LOGGER = Logger.getLogger(FirehoseGet.class); + private Element pubsub; private SAXReader xmlReader; + private boolean isAdmin = false; // RSM details private String firstItemId = null; @@ -29,15 +33,10 @@ public class FirehoseGet extends PubSubElementProcessorAbstract { private String afterItemId = null; private int maxResults = -1; - private boolean isAdmin = false; - - private static final Logger logger = Logger.getLogger(FirehoseGet.class); - public FirehoseGet(BlockingQueue outQueue, ChannelManager channelManager) { setChannelManager(channelManager); setOutQueue(outQueue); - xmlReader = new SAXReader(); } @@ -55,9 +54,10 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) } determineAdminUserStatus(); - if (false == channelManager.isLocalJID(request.getFrom())) + if (false == channelManager.isLocalJID(request.getFrom())) { response.getElement().addAttribute("remote-server-discover", "false"); + } pubsub = response.getElement().addElement("pubsub", JabberPubsub.NAMESPACE_URI); @@ -67,7 +67,7 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) addRsmElement(); outQueue.put(response); } catch (NodeStoreException e) { - logger.error(e); + LOGGER.error(e); response.getElement().remove(pubsub); setErrorCondition(PacketError.Type.wait, PacketError.Condition.internal_server_error); @@ -78,7 +78,7 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) private void determineAdminUserStatus() { for (JID user : getAdminUsers()) { - if (true == user.toBareJID().equals(actor.toBareJID())) { + if (user.toBareJID().equals(actor.toBareJID())) { isAdmin = true; return; } @@ -87,18 +87,23 @@ private void determineAdminUserStatus() { private void parseRsmElement() { Element rsmElement = pubsub.element("set"); - if (null == rsmElement) + if (null == rsmElement) { return; - Element max; - Element after; - if (null != (max = rsmElement.element("max"))) + } + Element max = rsmElement.element("max"); + if (max != null) { maxResults = Integer.parseInt(max.getTextTrim()); - if (null != (after = rsmElement.element("after"))) + } + Element after = rsmElement.element("after"); + if (after != null) { afterItemId = after.getTextTrim(); + } } private void addRsmElement() throws NodeStoreException { - if (null == firstItemId) return; + if (firstItemId == null) { + return; + } Element rsm = pubsub.addElement("set"); rsm.addNamespace("", NS_RSM); rsm.addElement("first").setText(firstItemId); @@ -108,32 +113,30 @@ private void addRsmElement() throws NodeStoreException { } private void addItems() throws NodeStoreException { - if (-1 == maxResults) maxResults = 50; + if (-1 == maxResults) { + maxResults = DEF_MAX_RESULTS; + } CloseableIterator items = channelManager.getFirehose(maxResults, afterItemId, isAdmin); String lastNode = ""; - NodeItem item; Element itemsElement = null; - Element itemElement; - Element entry; while (items.hasNext()) { - item = items.next(); - + NodeItem item = items.next(); if (false == item.getNodeId().equals(lastNode)) { itemsElement = pubsub.addElement("items"); itemsElement.addAttribute("node", item.getNodeId()); lastNode = item.getNodeId(); } try { - entry = xmlReader.read(new StringReader(item.getPayload())) + Element entry = xmlReader.read(new StringReader(item.getPayload())) .getRootElement(); - itemElement = itemsElement.addElement("item"); + Element itemElement = itemsElement.addElement("item"); itemElement.addAttribute("id", item.getId()); if (null == firstItemId) firstItemId = item.getId(); lastItemId = item.getId(); itemElement.add(entry); } catch (DocumentException e) { - logger.error("Error parsing a node entry, ignoring. " + LOGGER.error("Error parsing a node entry, ignoring. " + item.getId()); } } From 123ed4771bda17e0202574555d6fd569399ad30a Mon Sep 17 00:00:00 2001 From: abmargb Date: Fri, 19 Sep 2014 11:56:27 -0300 Subject: [PATCH 04/18] more missing braces --- .../iq/namespace/pubsub/get/items/special/FirehoseGet.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java index 445b124a..b4bf878a 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java @@ -131,8 +131,9 @@ private void addItems() throws NodeStoreException { .getRootElement(); Element itemElement = itemsElement.addElement("item"); itemElement.addAttribute("id", item.getId()); - if (null == firstItemId) + if (null == firstItemId) { firstItemId = item.getId(); + } lastItemId = item.getId(); itemElement.add(entry); } catch (DocumentException e) { From 80968eb6ac37313cf72957cbb27930e7053919da Mon Sep 17 00:00:00 2001 From: abmargb Date: Fri, 19 Sep 2014 14:27:30 -0300 Subject: [PATCH 05/18] Fixes #235 --- .../org/buddycloud/channelserver/db/jdbc/DatabaseTester.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/test/java/org/buddycloud/channelserver/db/jdbc/DatabaseTester.java b/src/test/java/org/buddycloud/channelserver/db/jdbc/DatabaseTester.java index fd7b7bee..df373043 100644 --- a/src/test/java/org/buddycloud/channelserver/db/jdbc/DatabaseTester.java +++ b/src/test/java/org/buddycloud/channelserver/db/jdbc/DatabaseTester.java @@ -1,11 +1,9 @@ package org.buddycloud.channelserver.db.jdbc; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; import java.io.BufferedReader; -import java.io.File; import java.io.IOException; -import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.net.URL; @@ -114,6 +112,7 @@ public Connection getConnection() throws SQLException { private void createSchema(final Connection conn) throws SQLException, IOException { executeDDL(conn, "SET DATABASE SQL SYNTAX PGS TRUE;"); + executeDDL(conn, "SET DATABASE SQL REFERENCES TRUE;"); loadData("base"); } From f717b6164c780fb68166d7b9fd7f8442f6ca705f Mon Sep 17 00:00:00 2001 From: abmargb Date: Fri, 19 Sep 2014 14:57:48 -0300 Subject: [PATCH 06/18] Returns every node from every domain in /firehose. Refers to #234. --- .../channelserver/Configuration.java | 7 +- .../channelserver/db/jdbc/JDBCNodeStore.java | 50 +++----- .../jdbc/dialect/Sql92NodeStoreDialect.java | 26 ++-- .../db/jdbc/JDBCNodeStoreFirehoseTest.java | 117 ++++++++++++++++++ 4 files changed, 155 insertions(+), 45 deletions(-) create mode 100644 src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreFirehoseTest.java diff --git a/src/main/java/org/buddycloud/channelserver/Configuration.java b/src/main/java/org/buddycloud/channelserver/Configuration.java index 7eb1756c..9e0de699 100644 --- a/src/main/java/org/buddycloud/channelserver/Configuration.java +++ b/src/main/java/org/buddycloud/channelserver/Configuration.java @@ -75,7 +75,7 @@ private Configuration() { System.exit(1); } } - + private void setupCollections() { adminUsers = getJIDArrayProperty(CONFIGURATION_ADMIN_USERS); autosubscribeChannels = getJIDArrayProperty(CONFIGURATION_CHANNELS_AUTOSUBSCRIBE); @@ -99,6 +99,11 @@ public static Configuration getInstance() { public String getProperty(String key) { return conf.getProperty(key); } + + @Override + public synchronized Object remove(Object key) { + return conf.remove(key); + } public void clear() { conf.clear(); diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java index c262aa69..ed18e024 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java @@ -733,20 +733,14 @@ public CloseableIterator getFirehose(int limit, stmt.setTimestamp(1, new java.sql.Timestamp(beforeDate.getTime())); stmt.setString(2, Conf.ACCESS_MODEL); stmt.setString(3, accessModel); - stmt.setString( - 4, - "%@" - + Configuration.getInstance().getProperty( - Configuration.CONFIGURATION_SERVER_DOMAIN) - + "%"); - stmt.setString( - 5, - "%@" - + Configuration - .getInstance() - .getProperty( - Configuration.CONFIGURATION_SERVER_TOPICS_DOMAIN) - + "%"); + + String serverDomain = Configuration.getInstance().getProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN); + String serverTopicsDomain = Configuration.getInstance().getProperty( + Configuration.CONFIGURATION_SERVER_TOPICS_DOMAIN); + stmt.setString(4, serverDomain == null ? "%" : "%@" + serverDomain + "%"); + stmt.setString(5, serverTopicsDomain == null ? "%" : "%@" + serverTopicsDomain + "%"); + stmt.setInt(6, limit); java.sql.ResultSet rs = stmt.executeQuery(); @@ -773,32 +767,22 @@ public int getFirehoseItemCount(boolean isAdmin) throws NodeStoreException { String accessModel = "open"; if (true == isAdmin) accessModel = "%"; - try { stmt = conn.prepareStatement(dialect.countItemsForLocalNodes()); stmt.setString(1, Conf.ACCESS_MODEL); stmt.setString(2, accessModel); - stmt.setString( - 3, - "%@" - + Configuration.getInstance().getProperty( - Configuration.CONFIGURATION_SERVER_DOMAIN) - + "%"); - stmt.setString( - 4, - "%@" - + Configuration - .getInstance() - .getProperty( - Configuration.CONFIGURATION_SERVER_TOPICS_DOMAIN) - + "%"); + String serverDomain = Configuration.getInstance().getProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN); + String serverTopicsDomain = Configuration.getInstance().getProperty( + Configuration.CONFIGURATION_SERVER_TOPICS_DOMAIN); + stmt.setString(3, serverDomain == null ? "%" : "%@" + serverDomain + "%"); + stmt.setString(4, serverTopicsDomain == null ? "%" : "%@" + serverTopicsDomain + "%"); + java.sql.ResultSet rs = stmt.executeQuery(); - - if (rs.next()) { - return rs.getInt(1); - } else { + if (!rs.next()) { return 0; // This really shouldn't happen! } + return rs.getInt(1); } catch (SQLException e) { throw new NodeStoreException(e); } finally { diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java index 0b664fcd..57cf1615 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java @@ -228,17 +228,21 @@ public class Sql92NodeStoreDialect implements NodeStoreSQLDialect { private static final String DELETE_ITEMS = "DELETE FROM \"items\" WHERE \"node\" = ?;"; - private static final String COUNT_ITEMS_FROM_LOCAL_NODES = "" - + "SELECT COUNT(\"id\") FROM \"items\" " - + "WHERE \"node\" IN (SELECT \"node\" FROM \"node_config\" " - + "WHERE \"key\" = ? AND \"value\" LIKE ? " - + "AND (\"node\" LIKE ? OR \"node\" LIKE ?))"; - - private static final String SELECT_ITEMS_FROM_LOCAL_NODES_BEFORE_DATE = "" - + "SELECT \"node\", \"id\", \"updated\", \"xml\", \"in_reply_to\", \"created\" " - + "FROM \"items\" WHERE \"updated\" < ? " - + "AND \"node\" IN (SELECT \"node\" FROM \"node_config\" WHERE \"key\" = ? AND \"value\" LIKE ? AND (\"node\" LIKE ? OR \"node\" LIKE ?)) " - + "ORDER BY \"updated\" DESC, \"id\" ASC LIMIT ?"; + private static final String COUNT_ITEMS_FROM_LOCAL_NODES = + "SELECT COUNT(\"id\") " + + "FROM \"items\", \"node_config\" " + + "WHERE \"items\".\"node\" = \"node_config\".\"node\" " + + "AND \"key\" = ? AND \"value\" LIKE ? " + + "AND (\"items\".\"node\" LIKE ? OR \"items\".\"node\" LIKE ?)"; + + private static final String SELECT_ITEMS_FROM_LOCAL_NODES_BEFORE_DATE = + "SELECT \"items\".\"node\", \"id\", \"items\".\"updated\", \"xml\", \"in_reply_to\", \"created\" " + + "FROM \"items\", \"node_config\" " + + "WHERE \"items\".\"updated\" < ? " + + "AND \"items\".\"node\" = \"node_config\".\"node\" " + + "AND \"key\" = ? AND \"value\" LIKE ? " + + "AND (\"items\".\"node\" LIKE ? OR \"items\".\"node\" LIKE ?) " + + "ORDER BY \"updated\" DESC, \"id\" ASC LIMIT ?"; private static final String SELECT_USER_ITEMS = "SELECT \"node\", \"id\", \"updated\", \"xml\", \"in_reply_to\", \"created\"" + " FROM \"items\" WHERE (CAST(xpath('//atom:author/atom:name/text()', xmlparse(document \"xml\")," + diff --git a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreFirehoseTest.java b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreFirehoseTest.java new file mode 100644 index 00000000..2e5104ea --- /dev/null +++ b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreFirehoseTest.java @@ -0,0 +1,117 @@ +package org.buddycloud.channelserver.db.jdbc; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.sql.SQLException; + +import org.buddycloud.channelserver.Configuration; +import org.buddycloud.channelserver.channel.Conf; +import org.buddycloud.channelserver.db.CloseableIterator; +import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; +import org.buddycloud.channelserver.pubsub.model.NodeItem; +import org.junit.Before; +import org.junit.Test; + +public class JDBCNodeStoreFirehoseTest extends JDBCNodeStoreAbstract { + + public JDBCNodeStoreFirehoseTest() throws SQLException, IOException, + ClassNotFoundException { + dbTester = new DatabaseTester(); + IQTestHandler.readConf(); + } + + @Before + public void setup() throws SQLException, IOException { + dbTester.loadData("node_1"); + } + + @Test + public void testGetFirehoseOpenNode() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, "open"); + CloseableIterator firehose = store.getFirehose( + Integer.MAX_VALUE, null, false); + int itemCount = 0; + while (firehose.hasNext()) { + firehose.next(); + itemCount++; + } + assertEquals(5, itemCount); + } + + @Test + public void testNonAdminGetFirehoseAuthorizedNode() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, "authorized"); + CloseableIterator firehose = store.getFirehose( + Integer.MAX_VALUE, null, false); + int itemCount = 0; + while (firehose.hasNext()) { + firehose.next(); + itemCount++; + } + assertEquals(0, itemCount); + } + + @Test + public void testAdminGetFirehoseAuthorizedNode() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, "authorized"); + CloseableIterator firehose = store.getFirehose( + Integer.MAX_VALUE, null, true); + int itemCount = 0; + while (firehose.hasNext()) { + firehose.next(); + itemCount++; + } + assertEquals(5, itemCount); + } + + @Test + public void testGetFirehoseNoDomainSet() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, "open"); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_SERVER_DOMAIN); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_SERVER_TOPICS_DOMAIN); + CloseableIterator firehose = store.getFirehose( + Integer.MAX_VALUE, null, false); + int itemCount = 0; + while (firehose.hasNext()) { + firehose.next(); + itemCount++; + } + assertEquals(5, itemCount); + } + + @Test + public void testCountFirehoseItemsOpenNode() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, "open"); + int firehoseItemCount = store.getFirehoseItemCount(false); + assertEquals(5, firehoseItemCount); + } + + @Test + public void testNonAdminCountFirehoseItemsAuthorizeNode() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, "authorize"); + int firehoseItemCount = store.getFirehoseItemCount(false); + assertEquals(0, firehoseItemCount); + } + + @Test + public void testAdminCountFirehoseItemsAuthorizeNode() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, "authorize"); + int firehoseItemCount = store.getFirehoseItemCount(true); + assertEquals(5, firehoseItemCount); + } + + @Test + public void testCountFirehoseItemsNoDomainSet() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, "open"); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_SERVER_DOMAIN); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_SERVER_TOPICS_DOMAIN); + int firehoseItemCount = store.getFirehoseItemCount(false); + assertEquals(5, firehoseItemCount); + } + +} \ No newline at end of file From 7aaf8537a9a51984f41ee67aa64c541d084cf0dd Mon Sep 17 00:00:00 2001 From: abmargb Date: Tue, 23 Sep 2014 09:37:09 -0300 Subject: [PATCH 07/18] firehose: fixing pagination with rsm --- .../channelserver/db/jdbc/JDBCNodeStore.java | 10 +++++----- .../pubsub/get/items/special/FirehoseGet.java | 7 +++---- .../db/jdbc/JDBCNodeStoreAbstract.java | 4 ++++ .../db/jdbc/JDBCNodeStoreFirehoseTest.java | 13 +++++++++++++ 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java index ed18e024..b6c4f62c 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java @@ -712,12 +712,12 @@ public CloseableIterator getFirehose(int limit, PreparedStatement stmt = null; Date beforeDate = null; -// if (afterItemId != null) { -// beforeDate = getNodeItemById(afterItemId).getUpdated(); -// } else { + if (afterItemId != null) { + beforeDate = getNodeItem(GlobalItemIDImpl.fromBuddycloudString( + afterItemId)).getUpdated(); + } else { beforeDate = new Date(); - afterItemId = ""; -// } + } if (limit < 0) { throw new IllegalArgumentException( diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java index b4bf878a..c80593c8 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java @@ -86,15 +86,14 @@ private void determineAdminUserStatus() { } private void parseRsmElement() { - Element rsmElement = pubsub.element("set"); - if (null == rsmElement) { + if (null == resultSetManagement) { return; } - Element max = rsmElement.element("max"); + Element max = resultSetManagement.element("max"); if (max != null) { maxResults = Integer.parseInt(max.getTextTrim()); } - Element after = rsmElement.element("after"); + Element after = resultSetManagement.element("after"); if (after != null) { afterItemId = after.getTextTrim(); } diff --git a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreAbstract.java b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreAbstract.java index 061ca422..fa7626d3 100644 --- a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreAbstract.java +++ b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreAbstract.java @@ -9,9 +9,11 @@ import java.util.Map; import java.util.Map.Entry; +import org.apache.bcel.generic.NEW; import org.buddycloud.channelserver.db.jdbc.dialect.Sql92NodeStoreDialect; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; import org.buddycloud.channelserver.pubsub.model.NodeItem; +import org.buddycloud.channelserver.pubsub.model.impl.GlobalItemIDImpl; import org.junit.After; import org.junit.Before; import org.xmpp.packet.JID; @@ -35,6 +37,8 @@ public abstract class JDBCNodeStoreAbstract { protected static final String TEST_SERVER1_NODE1_ITEM3_CONTENT = "Test 3"; protected static final String TEST_SERVER1_NODE1_ITEM4_ID = "a4"; + protected static final String TEST_SERVER1_NODE1_ITEM4_GLOBAL_ID = new GlobalItemIDImpl( + new JID("server1"), TEST_SERVER1_NODE1_ID, TEST_SERVER1_NODE1_ITEM4_ID).toString(); protected static final String TEST_SERVER1_NODE1_ITEM4_CONTENT = "Test 4"; protected static final String TEST_SERVER1_NODE1_ITEM5_ID = "a5"; diff --git a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreFirehoseTest.java b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreFirehoseTest.java index 2e5104ea..f2057a94 100644 --- a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreFirehoseTest.java +++ b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreFirehoseTest.java @@ -82,6 +82,19 @@ public void testGetFirehoseNoDomainSet() throws Exception { assertEquals(5, itemCount); } + @Test + public void testGetFirehoseRSM() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, "open"); + CloseableIterator firehose = store.getFirehose( + Integer.MAX_VALUE, TEST_SERVER1_NODE1_ITEM4_GLOBAL_ID, false); + int itemCount = 0; + while (firehose.hasNext()) { + firehose.next(); + itemCount++; + } + assertEquals(3, itemCount); + } + @Test public void testCountFirehoseItemsOpenNode() throws Exception { store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, "open"); From dd68f8c12220100fb5e74f983294e28519f806a6 Mon Sep 17 00:00:00 2001 From: abmargb Date: Tue, 23 Sep 2014 10:54:17 -0300 Subject: [PATCH 08/18] Addressing @lloydwatkin 's comments on https://github.com/buddycloud/buddycloud-server-java/pull/236 --- .../channelserver/db/jdbc/JDBCNodeStore.java | 12 ++++-------- .../pubsub/get/items/special/FirehoseGet.java | 4 ++-- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java index b6c4f62c..6dcf1dac 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java @@ -734,10 +734,8 @@ public CloseableIterator getFirehose(int limit, stmt.setString(2, Conf.ACCESS_MODEL); stmt.setString(3, accessModel); - String serverDomain = Configuration.getInstance().getProperty( - Configuration.CONFIGURATION_SERVER_DOMAIN); - String serverTopicsDomain = Configuration.getInstance().getProperty( - Configuration.CONFIGURATION_SERVER_TOPICS_DOMAIN); + String serverDomain = Configuration.getInstance().getServerDomain(); + String serverTopicsDomain = Configuration.getInstance().getServerTopicsDomain(); stmt.setString(4, serverDomain == null ? "%" : "%@" + serverDomain + "%"); stmt.setString(5, serverTopicsDomain == null ? "%" : "%@" + serverTopicsDomain + "%"); @@ -771,10 +769,8 @@ public int getFirehoseItemCount(boolean isAdmin) throws NodeStoreException { stmt = conn.prepareStatement(dialect.countItemsForLocalNodes()); stmt.setString(1, Conf.ACCESS_MODEL); stmt.setString(2, accessModel); - String serverDomain = Configuration.getInstance().getProperty( - Configuration.CONFIGURATION_SERVER_DOMAIN); - String serverTopicsDomain = Configuration.getInstance().getProperty( - Configuration.CONFIGURATION_SERVER_TOPICS_DOMAIN); + String serverDomain = Configuration.getInstance().getServerDomain(); + String serverTopicsDomain = Configuration.getInstance().getServerTopicsDomain(); stmt.setString(3, serverDomain == null ? "%" : "%@" + serverDomain + "%"); stmt.setString(4, serverTopicsDomain == null ? "%" : "%@" + serverTopicsDomain + "%"); diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java index c80593c8..d0acbdcd 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java @@ -20,7 +20,7 @@ public class FirehoseGet extends PubSubElementProcessorAbstract { - private static final int DEF_MAX_RESULTS = 50; + private static final int DEFAULT_MAX_RESULTS = 50; private static final Logger LOGGER = Logger.getLogger(FirehoseGet.class); private Element pubsub; @@ -113,7 +113,7 @@ private void addRsmElement() throws NodeStoreException { private void addItems() throws NodeStoreException { if (-1 == maxResults) { - maxResults = DEF_MAX_RESULTS; + maxResults = DEFAULT_MAX_RESULTS; } CloseableIterator items = channelManager.getFirehose(maxResults, afterItemId, isAdmin); String lastNode = ""; From e1fa7756fd4dacdea60f8c085906292f77a64154 Mon Sep 17 00:00:00 2001 From: abmargb Date: Thu, 25 Sep 2014 11:19:09 -0300 Subject: [PATCH 09/18] Fixing ISO 8601 regex for timestamps with TZ != 0 --- .../channel/validate/AtomEntryTest.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/test/java/org/buddycloud/channelserver/channel/validate/AtomEntryTest.java b/src/test/java/org/buddycloud/channelserver/channel/validate/AtomEntryTest.java index d29e969c..e652aa13 100644 --- a/src/test/java/org/buddycloud/channelserver/channel/validate/AtomEntryTest.java +++ b/src/test/java/org/buddycloud/channelserver/channel/validate/AtomEntryTest.java @@ -8,9 +8,9 @@ import org.buddycloud.channelserver.packetHandler.iq.TestHandler; import org.buddycloud.channelserver.pubsub.model.GlobalItemID; import org.buddycloud.channelserver.pubsub.model.NodeItem; +import org.buddycloud.channelserver.pubsub.model.impl.GlobalItemIDImpl; import org.buddycloud.channelserver.pubsub.model.impl.NodeItemImpl; import org.buddycloud.channelserver.utils.node.item.payload.ActivityStreams; -import org.buddycloud.channelserver.pubsub.model.impl.GlobalItemIDImpl; import org.buddycloud.channelserver.utils.node.item.payload.Buddycloud; import org.dom4j.Element; import org.junit.Before; @@ -31,6 +31,8 @@ */ public class AtomEntryTest extends TestHandler { + private static final String ISO_8601_REGEX = "[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}(Z|[+-][0-9]{2}:[0-9]{2})"; + private AtomEntry validator; private IQ publishRequest; @@ -46,8 +48,6 @@ public class AtomEntryTest extends TestHandler { String node = "/users/romeo@shakespeare.lit/posts"; String server = "channels.shakespeare.lit"; - private Element emptyEntry; - @Before public void setUp() throws Exception { publishRequest = readStanzaAsIq("/iq/pubsub/publish/request.stanza"); @@ -170,10 +170,8 @@ public void missingUpdatedElementHasValueAdded() throws Exception { validator = getEntryObject(item); Assert.assertTrue(validator.isValid()); Element entry = validator.getPayload(); - Assert.assertTrue(entry - .elementText("updated") - .matches( - "[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z")); + System.out.println(entry.elementText("updated")); + Assert.assertTrue(entry.elementText("updated").matches(ISO_8601_REGEX)); } @Test From 67e95ff469bcd4fbbc2e8c90b6b1ab2765fa149d Mon Sep 17 00:00:00 2001 From: abmargb Date: Thu, 25 Sep 2014 11:39:33 -0300 Subject: [PATCH 10/18] Removing unnecessary syso --- src/main/java/org/buddycloud/channelserver/Configuration.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/buddycloud/channelserver/Configuration.java b/src/main/java/org/buddycloud/channelserver/Configuration.java index 9e0de699..4076ee16 100644 --- a/src/main/java/org/buddycloud/channelserver/Configuration.java +++ b/src/main/java/org/buddycloud/channelserver/Configuration.java @@ -129,7 +129,6 @@ private Collection getStringArrayProperty(String key) { } private Collection getJIDArrayProperty(String key) { - System.out.println(conf.getProperty(CONFIGURATION_CHANNELS_AUTOSUBSCRIBE)); Collection props = getStringArrayProperty(key); Collection jids = new ArrayList(props.size()); From afaf36faa6c8bb3238e702878e50b111515ee0c6 Mon Sep 17 00:00:00 2001 From: abmargb Date: Sat, 27 Sep 2014 11:39:56 -0300 Subject: [PATCH 11/18] external-domain-checker returning a csv list of local domains --- .../channelserver/channel/ChannelManager.java | 10 +++- .../channel/ChannelManagerImpl.java | 28 +++++++-- .../channel/LocalDomainChecker.java | 59 ++++++++++++++----- .../channelserver/db/jdbc/JDBCNodeStore.java | 51 ++++++++++++---- .../jdbc/dialect/Sql92NodeStoreDialect.java | 10 +++- .../namespace/discoitems/DiscoItemsGet.java | 11 +++- .../iq/namespace/pubsub/set/NodeCreate.java | 2 + .../iq/namespace/register/RegisterSet.java | 2 +- .../discoitems/DiscoItemsGetTest.java | 4 +- .../namespace/register/RegisterSetTest.java | 9 +++ 10 files changed, 144 insertions(+), 42 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/channel/ChannelManager.java b/src/main/java/org/buddycloud/channelserver/channel/ChannelManager.java index 2fd20861..55d46e55 100644 --- a/src/main/java/org/buddycloud/channelserver/channel/ChannelManager.java +++ b/src/main/java/org/buddycloud/channelserver/channel/ChannelManager.java @@ -1,15 +1,14 @@ package org.buddycloud.channelserver.channel; import java.util.List; +import java.util.Set; import org.buddycloud.channelserver.db.CloseableIterator; import org.buddycloud.channelserver.db.NodeStore; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; import org.buddycloud.channelserver.pubsub.model.NodeItem; -import org.buddycloud.channelserver.pubsub.model.NodeMembership; import org.xmpp.packet.JID; -import org.xmpp.resultsetmanagement.ResultSet; public interface ChannelManager extends NodeStore { @@ -87,4 +86,11 @@ Affiliations getDefaultNodeAffiliation(String nodeId) CloseableIterator performSearch(JID searcher, List content, JID author, int page, int rpp) throws NodeStoreException; + /** + * @return + */ + Set getLocalDomains(); + + boolean isLocalNode(String nodeId, Set localDomains); + } \ No newline at end of file diff --git a/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java b/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java index f5071eda..820dea13 100644 --- a/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java +++ b/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; import java.util.Properties; +import java.util.Set; import org.apache.log4j.Logger; import org.buddycloud.channelserver.db.ClosableIteratorImpl; @@ -250,20 +251,34 @@ public void createPersonalChannel(JID owner) throws NodeStoreException { } @Override - public boolean isLocalNode(String nodeId) { + public boolean isLocalNode(String nodeId, Set localDomains) { if (false == nodeId.matches("/user/.+@.+/.+")) { logger.debug("Node " + nodeId + " has an invalid format"); throw new IllegalArgumentException(INVALID_NODE); } String domain = new JID(nodeId.split("/")[2]).getDomain(); - return isLocalDomain(domain); + return isLocalDomain(domain, localDomains); } @Override public boolean isLocalDomain(String domain) { return LocalDomainChecker.isLocal(domain, configuration); } + + private boolean isLocalDomain(String domain, Set localDomains) { + return LocalDomainChecker.isLocal(domain, configuration, localDomains); + } + + @Override + public boolean isLocalNode(String nodeId) { + return isLocalNode(nodeId, null); + } + @Override + public Set getLocalDomains() { + return LocalDomainChecker.getLocalDomains(configuration); + } + @Override public boolean isLocalJID(JID jid) { String domain = jid.getDomain(); @@ -300,12 +315,15 @@ public void deleteNode(String nodeId) throws NodeStoreException { @Override public void deleteRemoteData() throws NodeStoreException { ArrayList nodes = this.getNodeList(); + Set localDomains = LocalDomainChecker.getLocalDomains(configuration); for (String node : nodes) { try { - if (true == node.equals(("/firehose"))) - return; - if (false == this.isLocalNode(node)) + if (true == node.equals(("/firehose"))) { + continue; + } + if (false == this.isLocalNode(node, localDomains)) { nodeStore.purgeNodeItems(node); + } } catch (IllegalArgumentException e) { logger.error("Invalid remote node in datastore " + node, e); } diff --git a/src/main/java/org/buddycloud/channelserver/channel/LocalDomainChecker.java b/src/main/java/org/buddycloud/channelserver/channel/LocalDomainChecker.java index 4401cbe9..c6845a7a 100644 --- a/src/main/java/org/buddycloud/channelserver/channel/LocalDomainChecker.java +++ b/src/main/java/org/buddycloud/channelserver/channel/LocalDomainChecker.java @@ -1,15 +1,22 @@ package org.buddycloud.channelserver.channel; -import java.io.IOException; +import java.io.InputStream; +import java.util.HashSet; import java.util.Properties; +import java.util.Set; +import org.apache.commons.io.IOUtils; import org.buddycloud.channelserver.Configuration; public class LocalDomainChecker { - private static final int IS_LOCAL_EXIT_VALUE = 0; + private static final String COMMA = ","; public static boolean isLocal(String domain, Properties configuration) { + return isLocal(domain, configuration, null); + } + + public static boolean isLocal(String domain, Properties configuration, Set localDomains) { if (configuration == null) { return false; } @@ -27,22 +34,44 @@ public static boolean isLocal(String domain, Properties configuration) { || domain.equals(channelDomain)); } - int exitValue; - try { - exitValue = runChecker(command, domain); - } catch (Exception e) { - return false; + if (command.equals(Boolean.TRUE.toString())) { + return true; + } + + if (localDomains == null) { + try { + localDomains = getLocalDomains(configuration); + } catch (Exception e) { + return false; + } } - return exitValue == IS_LOCAL_EXIT_VALUE; + return localDomains.contains(domain); } - private static int runChecker(String command, String domain) throws IOException, - InterruptedException { - if (command.equals(Boolean.TRUE.toString())) { - return IS_LOCAL_EXIT_VALUE; + public static Set getLocalDomains(Properties configuration) { + HashSet localDomains = new HashSet(); + String command = configuration.getProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + if (command == null) { + return localDomains; + } + + try { + ProcessBuilder processBuilder = new ProcessBuilder(command); + Process process = processBuilder.start(); + process.waitFor(); + InputStream inputStream = process.getInputStream(); + + String csvDomains = IOUtils.toString(inputStream); + for (String eachDomain : csvDomains.split(COMMA)) { + localDomains.add(eachDomain); + } + inputStream.close(); + } catch (Exception e) { + // Return empty set + e.printStackTrace(); } - ProcessBuilder processBuilder = new ProcessBuilder(command, domain); - Process process = processBuilder.start(); - return process.waitFor(); + + return localDomains; } } diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java index 6dcf1dac..0a328983 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java @@ -15,11 +15,13 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.Conf; +import org.buddycloud.channelserver.channel.LocalDomainChecker; import org.buddycloud.channelserver.db.ClosableIteratorImpl; import org.buddycloud.channelserver.db.CloseableIterator; import org.buddycloud.channelserver.db.NodeStore; @@ -728,18 +730,28 @@ public CloseableIterator getFirehose(int limit, if (true == isAdmin) accessModel = "%"; try { - stmt = conn.prepareStatement(dialect - .selectItemsForLocalNodesBeforeDate()); - stmt.setTimestamp(1, new java.sql.Timestamp(beforeDate.getTime())); - stmt.setString(2, Conf.ACCESS_MODEL); - stmt.setString(3, accessModel); - String serverDomain = Configuration.getInstance().getServerDomain(); String serverTopicsDomain = Configuration.getInstance().getServerTopicsDomain(); - stmt.setString(4, serverDomain == null ? "%" : "%@" + serverDomain + "%"); - stmt.setString(5, serverTopicsDomain == null ? "%" : "%@" + serverTopicsDomain + "%"); + List localDomains = new LinkedList(); + if (serverDomain != null) { + localDomains.add(Pattern.quote(serverDomain)); + } + if (serverTopicsDomain != null) { + localDomains.add(Pattern.quote(serverTopicsDomain)); + } + for (String localDomain : LocalDomainChecker.getLocalDomains(Configuration.getInstance())) { + localDomains.add(Pattern.quote(localDomain)); + } + + String domainRegex = localDomains.isEmpty() ? ".*" : + ".*@(" + StringUtils.join(localDomains, "|") + ")\\/.*"; - stmt.setInt(6, limit); + stmt = conn.prepareStatement(dialect.selectItemsForLocalNodesBeforeDate()); + stmt.setTimestamp(1, new java.sql.Timestamp(beforeDate.getTime())); + stmt.setString(2, Conf.ACCESS_MODEL); + stmt.setString(3, accessModel); + stmt.setString(4, domainRegex); + stmt.setInt(5, limit); java.sql.ResultSet rs = stmt.executeQuery(); @@ -766,13 +778,26 @@ public int getFirehoseItemCount(boolean isAdmin) throws NodeStoreException { if (true == isAdmin) accessModel = "%"; try { + String serverDomain = Configuration.getInstance().getServerDomain(); + String serverTopicsDomain = Configuration.getInstance().getServerTopicsDomain(); + List localDomains = new LinkedList(); + if (serverDomain != null) { + localDomains.add(Pattern.quote(serverDomain)); + } + if (serverTopicsDomain != null) { + localDomains.add(Pattern.quote(serverTopicsDomain)); + } + for (String localDomain : LocalDomainChecker.getLocalDomains(Configuration.getInstance())) { + localDomains.add(Pattern.quote(localDomain)); + } + + String domainRegex = localDomains.isEmpty() ? ".*" : + ".*@(" + StringUtils.join(localDomains, "|") + ")\\/.*"; + stmt = conn.prepareStatement(dialect.countItemsForLocalNodes()); stmt.setString(1, Conf.ACCESS_MODEL); stmt.setString(2, accessModel); - String serverDomain = Configuration.getInstance().getServerDomain(); - String serverTopicsDomain = Configuration.getInstance().getServerTopicsDomain(); - stmt.setString(3, serverDomain == null ? "%" : "%@" + serverDomain + "%"); - stmt.setString(4, serverTopicsDomain == null ? "%" : "%@" + serverTopicsDomain + "%"); + stmt.setString(3, domainRegex); java.sql.ResultSet rs = stmt.executeQuery(); if (!rs.next()) { diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java index 57cf1615..bbe6a643 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java @@ -1,5 +1,11 @@ package org.buddycloud.channelserver.db.jdbc.dialect; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +import org.apache.commons.lang.StringUtils; import org.buddycloud.channelserver.db.jdbc.JDBCNodeStore.NodeStoreSQLDialect; public class Sql92NodeStoreDialect implements NodeStoreSQLDialect { @@ -233,7 +239,7 @@ public class Sql92NodeStoreDialect implements NodeStoreSQLDialect { "FROM \"items\", \"node_config\" " + "WHERE \"items\".\"node\" = \"node_config\".\"node\" " + "AND \"key\" = ? AND \"value\" LIKE ? " + - "AND (\"items\".\"node\" LIKE ? OR \"items\".\"node\" LIKE ?)"; + "AND regexp_matches(\"items\".\"node\", ?)"; private static final String SELECT_ITEMS_FROM_LOCAL_NODES_BEFORE_DATE = "SELECT \"items\".\"node\", \"id\", \"items\".\"updated\", \"xml\", \"in_reply_to\", \"created\" " + @@ -241,7 +247,7 @@ public class Sql92NodeStoreDialect implements NodeStoreSQLDialect { "WHERE \"items\".\"updated\" < ? " + "AND \"items\".\"node\" = \"node_config\".\"node\" " + "AND \"key\" = ? AND \"value\" LIKE ? " + - "AND (\"items\".\"node\" LIKE ? OR \"items\".\"node\" LIKE ?) " + + "AND regexp_matches(\"items\".\"node\", ?) " + "ORDER BY \"updated\" DESC, \"id\" ASC LIMIT ?"; private static final String SELECT_USER_ITEMS = "SELECT \"node\", \"id\", \"updated\", \"xml\", \"in_reply_to\", \"created\"" + diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGet.java index 08c6faae..9705add6 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGet.java @@ -2,12 +2,14 @@ import java.util.ArrayList; import java.util.List; +import java.util.Set; import java.util.concurrent.BlockingQueue; import org.apache.log4j.Logger; import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.Conf; +import org.buddycloud.channelserver.channel.LocalDomainChecker; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetprocessor.PacketProcessor; import org.buddycloud.channelserver.packetprocessor.iq.namespace.discoinfo.DiscoInfoGet; @@ -71,17 +73,20 @@ private void addItems() throws NodeStoreException { Element query = response.getElement().addElement("query"); query.addNamespace("", JabberDiscoItems.NAMESPACE_URI); + Set localDomains = channelManager.getLocalDomains(); for (String node : nodes) { - if (false == isLocalNode(node)) continue; + if (false == isLocalNode(node, localDomains)) { + continue; + } Element item = query.addElement("item"); item.addAttribute("node", node); item.addAttribute("jid", jid); } } - private boolean isLocalNode(String node) throws NodeStoreException { + private boolean isLocalNode(String node, Set localDomains) throws NodeStoreException { try { - return channelManager.isLocalNode(node); + return channelManager.isLocalNode(node, localDomains); } catch (IllegalArgumentException e) { logger.error(e); return false; diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreate.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreate.java index 58d2e633..18d390de 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreate.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreate.java @@ -7,6 +7,7 @@ import org.apache.log4j.Logger; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.Conf; +import org.buddycloud.channelserver.channel.LocalDomainChecker; import org.buddycloud.channelserver.channel.node.configuration.NodeConfigurationException; import org.buddycloud.channelserver.channel.node.configuration.field.Creator; import org.buddycloud.channelserver.db.exception.NodeStoreException; @@ -44,6 +45,7 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) if (null == actorJID) { actor = request.getFrom(); } + if (false == channelManager.isLocalNode(node)) { makeRemoteRequest(); return; diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/RegisterSet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/RegisterSet.java index 23ebdd40..f5816d9e 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/RegisterSet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/RegisterSet.java @@ -51,7 +51,7 @@ public void process(IQ reqIQ) throws Exception { LOGGER.debug("Processing register request from " + request.getFrom()); String domain = reqIQ.getFrom().getDomain(); - if (!LocalDomainChecker.isLocal(domain, configuration)) { + if (!channelManager.isLocalDomain(domain)) { notThisDomain(reqIQ); return; } diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGetTest.java index 651d24fe..06d04798 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGetTest.java @@ -42,6 +42,7 @@ public void setUp() throws Exception { requestWithNode = readStanzaAsIq("/iq/discoitems/requestWithNode.stanza"); } + @SuppressWarnings("unchecked") @Test public void testReturnsListOfNodes() throws Exception { ArrayList nodes = new ArrayList(); @@ -52,6 +53,8 @@ public void testReturnsListOfNodes() throws Exception { Mockito.when(channelManager.getNodeList()).thenReturn(nodes); Mockito.when(channelManager.isLocalNode(Mockito.anyString())) .thenReturn(true); + Mockito.when(channelManager.isLocalNode(Mockito.anyString(), Mockito.anySet())) + .thenReturn(true); discoItems.process(request); @@ -61,7 +64,6 @@ public void testReturnsListOfNodes() throws Exception { String jid = Configuration.getInstance() .getProperty(Configuration.CONFIGURATION_SERVER_CHANNELS_DOMAIN); - @SuppressWarnings("unchecked") List items = iq.getElement().element("query").elements("item"); Assert.assertEquals(3, items.size()); Assert.assertEquals(jid, items.get(0).attributeValue("jid")); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/RegisterSetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/RegisterSetTest.java index aa95049f..47ddc90d 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/RegisterSetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/RegisterSetTest.java @@ -92,6 +92,8 @@ public void testRegisterNewUserAutoSubscribesLocalChannels() .thenReturn(true); when(channelManagerMock.isLocalJID(new JID("channel2@server1"))) .thenReturn(true); + when(channelManagerMock.isLocalDomain("server1")) + .thenReturn(true); registerSet.process(request); @@ -125,6 +127,8 @@ public void testRegisterNewUserAutoSubscribesRemoteChannels() .thenReturn(false); when(channelManagerMock.isLocalJID(new JID("channel2@server2"))) .thenReturn(false); + when(channelManagerMock.isLocalDomain("server1")) + .thenReturn(true); registerSet.process(request); @@ -176,6 +180,11 @@ public void testRegisterNewUserAutoApprovesOnlyLocalPrivateChannels() final JID localOpenChannel = new JID("channel2@server1"); final JID remoteChannel = new JID("channel1@server2"); + when(channelManagerMock.isLocalDomain("server1")) + .thenReturn(true); + when(channelManagerMock.isLocalDomain("server2")) + .thenReturn(false); + when(channelManagerMock.nodeExists(anyString())).thenReturn(false); when(configuration.getAutosubscribeChannels()).thenReturn( From 31ea9606b46d3767596e57ed9453c2058d109c75 Mon Sep 17 00:00:00 2001 From: abmargb Date: Sat, 27 Sep 2014 13:44:39 -0300 Subject: [PATCH 12/18] Making it work with Postgres' regex --- .../channel/LocalDomainChecker.java | 2 +- .../channelserver/db/jdbc/JDBCNodeStore.java | 63 +++++++++---------- .../jdbc/dialect/Sql92NodeStoreDialect.java | 7 ++- 3 files changed, 35 insertions(+), 37 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/channel/LocalDomainChecker.java b/src/main/java/org/buddycloud/channelserver/channel/LocalDomainChecker.java index c6845a7a..6237a047 100644 --- a/src/main/java/org/buddycloud/channelserver/channel/LocalDomainChecker.java +++ b/src/main/java/org/buddycloud/channelserver/channel/LocalDomainChecker.java @@ -64,7 +64,7 @@ public static Set getLocalDomains(Properties configuration) { String csvDomains = IOUtils.toString(inputStream); for (String eachDomain : csvDomains.split(COMMA)) { - localDomains.add(eachDomain); + localDomains.add(eachDomain.trim()); } inputStream.close(); } catch (Exception e) { diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java index 0a328983..bc194921 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java @@ -730,27 +730,11 @@ public CloseableIterator getFirehose(int limit, if (true == isAdmin) accessModel = "%"; try { - String serverDomain = Configuration.getInstance().getServerDomain(); - String serverTopicsDomain = Configuration.getInstance().getServerTopicsDomain(); - List localDomains = new LinkedList(); - if (serverDomain != null) { - localDomains.add(Pattern.quote(serverDomain)); - } - if (serverTopicsDomain != null) { - localDomains.add(Pattern.quote(serverTopicsDomain)); - } - for (String localDomain : LocalDomainChecker.getLocalDomains(Configuration.getInstance())) { - localDomains.add(Pattern.quote(localDomain)); - } - - String domainRegex = localDomains.isEmpty() ? ".*" : - ".*@(" + StringUtils.join(localDomains, "|") + ")\\/.*"; - stmt = conn.prepareStatement(dialect.selectItemsForLocalNodesBeforeDate()); stmt.setTimestamp(1, new java.sql.Timestamp(beforeDate.getTime())); stmt.setString(2, Conf.ACCESS_MODEL); stmt.setString(3, accessModel); - stmt.setString(4, domainRegex); + stmt.setString(4, getLocalDomainRegex()); stmt.setInt(5, limit); java.sql.ResultSet rs = stmt.executeQuery(); @@ -778,26 +762,10 @@ public int getFirehoseItemCount(boolean isAdmin) throws NodeStoreException { if (true == isAdmin) accessModel = "%"; try { - String serverDomain = Configuration.getInstance().getServerDomain(); - String serverTopicsDomain = Configuration.getInstance().getServerTopicsDomain(); - List localDomains = new LinkedList(); - if (serverDomain != null) { - localDomains.add(Pattern.quote(serverDomain)); - } - if (serverTopicsDomain != null) { - localDomains.add(Pattern.quote(serverTopicsDomain)); - } - for (String localDomain : LocalDomainChecker.getLocalDomains(Configuration.getInstance())) { - localDomains.add(Pattern.quote(localDomain)); - } - - String domainRegex = localDomains.isEmpty() ? ".*" : - ".*@(" + StringUtils.join(localDomains, "|") + ")\\/.*"; - stmt = conn.prepareStatement(dialect.countItemsForLocalNodes()); stmt.setString(1, Conf.ACCESS_MODEL); stmt.setString(2, accessModel); - stmt.setString(3, domainRegex); + stmt.setString(3, getLocalDomainRegex()); java.sql.ResultSet rs = stmt.executeQuery(); if (!rs.next()) { @@ -812,6 +780,33 @@ public int getFirehoseItemCount(boolean isAdmin) throws NodeStoreException { } } + private static final String POSIX_SPECIAL_CHARS = "\\.^$*+?()[{|"; + + private static String posixRegexQuote(String str) { + for (Character p : POSIX_SPECIAL_CHARS.toCharArray()) { + str = str.replace(p.toString(), "\\" + p.toString()); + } + return str; + } + + private static String getLocalDomainRegex() { + String serverDomain = Configuration.getInstance().getServerDomain(); + String serverTopicsDomain = Configuration.getInstance().getServerTopicsDomain(); + List localDomains = new LinkedList(); + if (serverDomain != null) { + localDomains.add(posixRegexQuote(serverDomain)); + } + if (serverTopicsDomain != null) { + localDomains.add(posixRegexQuote(serverTopicsDomain)); + } + for (String localDomain : LocalDomainChecker.getLocalDomains(Configuration.getInstance())) { + localDomains.add(posixRegexQuote(localDomain)); + } + + String domainRegex = localDomains.isEmpty() ? ".*" : + ".*@(" + StringUtils.join(localDomains, "|") + ")\\/.*"; + return domainRegex; + } @Override public CloseableIterator getUserFeedItems(JID user, Date since, diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java index bbe6a643..fa482087 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java @@ -239,7 +239,8 @@ public class Sql92NodeStoreDialect implements NodeStoreSQLDialect { "FROM \"items\", \"node_config\" " + "WHERE \"items\".\"node\" = \"node_config\".\"node\" " + "AND \"key\" = ? AND \"value\" LIKE ? " + - "AND regexp_matches(\"items\".\"node\", ?)"; + "AND \"items\".\"node\" ~ ? "; +// "AND regexp_matches(\"items\".\"node\", ?)"; private static final String SELECT_ITEMS_FROM_LOCAL_NODES_BEFORE_DATE = "SELECT \"items\".\"node\", \"id\", \"items\".\"updated\", \"xml\", \"in_reply_to\", \"created\" " + @@ -247,7 +248,9 @@ public class Sql92NodeStoreDialect implements NodeStoreSQLDialect { "WHERE \"items\".\"updated\" < ? " + "AND \"items\".\"node\" = \"node_config\".\"node\" " + "AND \"key\" = ? AND \"value\" LIKE ? " + - "AND regexp_matches(\"items\".\"node\", ?) " + +// "AND regexp_matches(\"items\".\"node\", ?) " + +// "AND \"items\".\"node\" SIMILAR TO ? " + + "AND \"items\".\"node\" ~ ? " + "ORDER BY \"updated\" DESC, \"id\" ASC LIMIT ?"; private static final String SELECT_USER_ITEMS = "SELECT \"node\", \"id\", \"updated\", \"xml\", \"in_reply_to\", \"created\"" + From 89d4e9c2a38c1421c50aec80c70282cc4d13828a Mon Sep 17 00:00:00 2001 From: abmargb Date: Sat, 27 Sep 2014 13:47:18 -0300 Subject: [PATCH 13/18] removing unnecessary commented lines --- .../channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java index fa482087..533b1136 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java @@ -240,7 +240,6 @@ public class Sql92NodeStoreDialect implements NodeStoreSQLDialect { "WHERE \"items\".\"node\" = \"node_config\".\"node\" " + "AND \"key\" = ? AND \"value\" LIKE ? " + "AND \"items\".\"node\" ~ ? "; -// "AND regexp_matches(\"items\".\"node\", ?)"; private static final String SELECT_ITEMS_FROM_LOCAL_NODES_BEFORE_DATE = "SELECT \"items\".\"node\", \"id\", \"items\".\"updated\", \"xml\", \"in_reply_to\", \"created\" " + @@ -248,8 +247,6 @@ public class Sql92NodeStoreDialect implements NodeStoreSQLDialect { "WHERE \"items\".\"updated\" < ? " + "AND \"items\".\"node\" = \"node_config\".\"node\" " + "AND \"key\" = ? AND \"value\" LIKE ? " + -// "AND regexp_matches(\"items\".\"node\", ?) " + -// "AND \"items\".\"node\" SIMILAR TO ? " + "AND \"items\".\"node\" ~ ? " + "ORDER BY \"updated\" DESC, \"id\" ASC LIMIT ?"; From a7392fdb7f2e196a8f7ed46efd1003c0e82dd1d0 Mon Sep 17 00:00:00 2001 From: abmargb Date: Sat, 27 Sep 2014 15:01:01 -0300 Subject: [PATCH 14/18] replacing ~ with regexp_matches in the DatabaseTester level --- .../channelserver/db/jdbc/DatabaseTester.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/buddycloud/channelserver/db/jdbc/DatabaseTester.java b/src/test/java/org/buddycloud/channelserver/db/jdbc/DatabaseTester.java index df373043..36f7e80d 100644 --- a/src/test/java/org/buddycloud/channelserver/db/jdbc/DatabaseTester.java +++ b/src/test/java/org/buddycloud/channelserver/db/jdbc/DatabaseTester.java @@ -19,6 +19,9 @@ import java.util.Map.Entry; import org.apache.log4j.Logger; +import org.mockito.Mockito; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; public class DatabaseTester { private static Logger log = Logger.getLogger(DatabaseTester.class); @@ -104,7 +107,17 @@ public void close() throws SQLException { public Connection getConnection() throws SQLException { if (conn == null) { - conn = DriverManager.getConnection("jdbc:log4jdbc:hsqldb:mem:test", "sa", ""); + final Connection originalConn = DriverManager.getConnection("jdbc:log4jdbc:hsqldb:mem:test", "sa", ""); + conn = Mockito.spy(originalConn); + Mockito.doAnswer(new Answer() { + @Override + public PreparedStatement answer(InvocationOnMock invocation) + throws Throwable { + String originalSQL = (String) invocation.getArguments()[0]; + String replacedSQL = originalSQL.replaceFirst("(\\S+) ~ \\?", "regexp_matches($1, ?)"); + return originalConn.prepareStatement(replacedSQL); + } + }).when(conn).prepareStatement(Mockito.anyString()); executeDDL(conn, "drop schema public cascade;"); } return conn; From 78fe33c5c2436ebda758e1c16a5ca3185d622ede Mon Sep 17 00:00:00 2001 From: abmargb Date: Mon, 29 Sep 2014 11:53:34 -0300 Subject: [PATCH 15/18] creates getLocalNodes and getRemoteNodes methods in the node store --- .../channelserver/channel/ChannelManager.java | 8 ---- .../channel/ChannelManagerImpl.java | 44 ++++++++----------- .../channelserver/db/NodeStore.java | 14 ++++++ .../channelserver/db/jdbc/JDBCNodeStore.java | 42 ++++++++++++++++++ .../jdbc/dialect/Sql92NodeStoreDialect.java | 22 +++++++++- .../namespace/discoitems/DiscoItemsGet.java | 15 +------ .../iq/namespace/pubsub/set/NodeCreate.java | 5 --- .../channel/ChannelManagerImplTest.java | 30 +++---------- .../channel/validate/AtomEntryTest.java | 1 - .../channelserver/db/jdbc/DatabaseTester.java | 1 + .../discoitems/DiscoItemsGetTest.java | 10 ++--- 11 files changed, 107 insertions(+), 85 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/channel/ChannelManager.java b/src/main/java/org/buddycloud/channelserver/channel/ChannelManager.java index 55d46e55..61ef90f1 100644 --- a/src/main/java/org/buddycloud/channelserver/channel/ChannelManager.java +++ b/src/main/java/org/buddycloud/channelserver/channel/ChannelManager.java @@ -1,7 +1,6 @@ package org.buddycloud.channelserver.channel; import java.util.List; -import java.util.Set; import org.buddycloud.channelserver.db.CloseableIterator; import org.buddycloud.channelserver.db.NodeStore; @@ -86,11 +85,4 @@ Affiliations getDefaultNodeAffiliation(String nodeId) CloseableIterator performSearch(JID searcher, List content, JID author, int page, int rpp) throws NodeStoreException; - /** - * @return - */ - Set getLocalDomains(); - - boolean isLocalNode(String nodeId, Set localDomains); - } \ No newline at end of file diff --git a/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java b/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java index 820dea13..f679e3ad 100644 --- a/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java +++ b/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java @@ -5,7 +5,6 @@ import java.util.List; import java.util.Map; import java.util.Properties; -import java.util.Set; import org.apache.log4j.Logger; import org.buddycloud.channelserver.db.ClosableIteratorImpl; @@ -250,33 +249,19 @@ public void createPersonalChannel(JID owner) throws NodeStoreException { } } - @Override - public boolean isLocalNode(String nodeId, Set localDomains) { - if (false == nodeId.matches("/user/.+@.+/.+")) { - logger.debug("Node " + nodeId + " has an invalid format"); - throw new IllegalArgumentException(INVALID_NODE); - } - String domain = new JID(nodeId.split("/")[2]).getDomain(); - return isLocalDomain(domain, localDomains); - } - @Override public boolean isLocalDomain(String domain) { return LocalDomainChecker.isLocal(domain, configuration); } - private boolean isLocalDomain(String domain, Set localDomains) { - return LocalDomainChecker.isLocal(domain, configuration, localDomains); - } - @Override public boolean isLocalNode(String nodeId) { - return isLocalNode(nodeId, null); - } - - @Override - public Set getLocalDomains() { - return LocalDomainChecker.getLocalDomains(configuration); + if (false == nodeId.matches("/user/.+@.+/.+")) { + logger.debug("Node " + nodeId + " has an invalid format"); + throw new IllegalArgumentException(INVALID_NODE); + } + String domain = new JID(nodeId.split("/")[2]).getDomain(); + return isLocalDomain(domain); } @Override @@ -314,16 +299,13 @@ public void deleteNode(String nodeId) throws NodeStoreException { @Override public void deleteRemoteData() throws NodeStoreException { - ArrayList nodes = this.getNodeList(); - Set localDomains = LocalDomainChecker.getLocalDomains(configuration); + List nodes = this.getRemoteNodesList(); for (String node : nodes) { try { if (true == node.equals(("/firehose"))) { continue; } - if (false == this.isLocalNode(node, localDomains)) { - nodeStore.purgeNodeItems(node); - } + nodeStore.purgeNodeItems(node); } catch (IllegalArgumentException e) { logger.error("Invalid remote node in datastore " + node, e); } @@ -481,4 +463,14 @@ 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(); + } + } \ No newline at end of file diff --git a/src/main/java/org/buddycloud/channelserver/db/NodeStore.java b/src/main/java/org/buddycloud/channelserver/db/NodeStore.java index 3cded483..bf29a130 100644 --- a/src/main/java/org/buddycloud/channelserver/db/NodeStore.java +++ b/src/main/java/org/buddycloud/channelserver/db/NodeStore.java @@ -495,7 +495,21 @@ void deleteNodeItemById(String nodeId, String nodeItemId) * @throws NodeStoreException */ ArrayList getNodeList() throws NodeStoreException; + + /** + * Retrieves a list of local nodes + * + * @throws NodeStoreException + */ + List getLocalNodesList() throws NodeStoreException; + /** + * Retrieves a list of remote nodes + * + * @throws NodeStoreException + */ + List getRemoteNodesList() throws NodeStoreException; + /** * Search subscribed nodes for content * diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java index bc194921..df53c59b 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java @@ -1724,6 +1724,44 @@ public ArrayList onlineJids(JID jid) throws NodeStoreException { } } + @Override + public List getLocalNodesList() throws NodeStoreException { + PreparedStatement stmt = null; + try { + stmt = conn.prepareStatement(dialect.selectLocalNodes()); + stmt.setString(1, getLocalDomainRegex()); + java.sql.ResultSet rs = stmt.executeQuery(); + List result = new ArrayList(); + while (rs.next()) { + result.add(rs.getString(1)); + } + return result; + } catch (SQLException e) { + throw new NodeStoreException(e); + } finally { + close(stmt); // Will implicitly close the resultset if required + } + } + + @Override + public List getRemoteNodesList() throws NodeStoreException { + PreparedStatement stmt = null; + try { + stmt = conn.prepareStatement(dialect.selectRemoteNodes()); + stmt.setString(1, getLocalDomainRegex()); + java.sql.ResultSet rs = stmt.executeQuery(); + List result = new ArrayList(); + while (rs.next()) { + result.add(rs.getString(1)); + } + return result; + } catch (SQLException e) { + throw new NodeStoreException(e); + } finally { + close(stmt); // Will implicitly close the resultset if required + } + } + @Override public Transaction beginTransaction() throws NodeStoreException { if (transactionHasBeenRolledBack) { @@ -1854,6 +1892,10 @@ private String getLocalId(String nodeItemId) { public interface NodeStoreSQLDialect { String insertNode(); + String selectRemoteNodes(); + + String selectLocalNodes(); + String addOnlineJid(); String deleteOnlineJid(); diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java index 533b1136..8d6b1836 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java @@ -240,7 +240,17 @@ public class Sql92NodeStoreDialect implements NodeStoreSQLDialect { "WHERE \"items\".\"node\" = \"node_config\".\"node\" " + "AND \"key\" = ? AND \"value\" LIKE ? " + "AND \"items\".\"node\" ~ ? "; - + + private static final String SELECT_LOCAL_NODES = + "SELECT \"node\" " + + "FROM \"items\" " + + "WHERE \"items\".\"node\" ~ ? "; + + private static final String SELECT_REMOTE_NODES = + "SELECT \"node\" " + + "FROM \"items\" " + + "WHERE \"items\".\"node\" !~ ? "; + private static final String SELECT_ITEMS_FROM_LOCAL_NODES_BEFORE_DATE = "SELECT \"items\".\"node\", \"id\", \"items\".\"updated\", \"xml\", \"in_reply_to\", \"created\" " + "FROM \"items\", \"node_config\" " + @@ -775,4 +785,14 @@ public String selectCountUserFeedItems() { return SELECT_COUNT_USER_FEED_ITEMS; } + @Override + public String selectRemoteNodes() { + return SELECT_REMOTE_NODES; + } + + @Override + public String selectLocalNodes() { + return SELECT_LOCAL_NODES; + } + } diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGet.java index 9705add6..55b0ec0f 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGet.java @@ -66,33 +66,20 @@ public void process(IQ reqIQ) throws Exception { } private void addItems() throws NodeStoreException { - ArrayList nodes = channelManager.getNodeList(); + List nodes = channelManager.getLocalNodesList(); String jid = Configuration.getInstance() .getProperty(Configuration.CONFIGURATION_SERVER_CHANNELS_DOMAIN); Element query = response.getElement().addElement("query"); query.addNamespace("", JabberDiscoItems.NAMESPACE_URI); - Set localDomains = channelManager.getLocalDomains(); for (String node : nodes) { - if (false == isLocalNode(node, localDomains)) { - continue; - } Element item = query.addElement("item"); item.addAttribute("node", node); item.addAttribute("jid", jid); } } - private boolean isLocalNode(String node, Set localDomains) throws NodeStoreException { - try { - return channelManager.isLocalNode(node, localDomains); - } catch (IllegalArgumentException e) { - logger.error(e); - return false; - } - } - private void setErrorCondition(Type type, Condition condition) { response.setType(IQ.Type.error); PacketError error = new PacketError(condition, type); diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreate.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreate.java index 18d390de..c876212f 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreate.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreate.java @@ -1,13 +1,10 @@ package org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.set; -import java.security.acl.Owner; import java.util.HashMap; import java.util.concurrent.BlockingQueue; -import org.apache.log4j.Logger; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.Conf; -import org.buddycloud.channelserver.channel.LocalDomainChecker; import org.buddycloud.channelserver.channel.node.configuration.NodeConfigurationException; import org.buddycloud.channelserver.channel.node.configuration.field.Creator; import org.buddycloud.channelserver.db.exception.NodeStoreException; @@ -26,8 +23,6 @@ public class NodeCreate extends PubSubElementProcessorAbstract { private static final String NODE_REG_EX = "^/user/[^@]+@[^/]+/[^/]+$"; private static final String INVALID_NODE_CONFIGURATION = "Invalid node configuration"; - private static final Logger LOGGER = Logger.getLogger(NodeCreate.class); - public NodeCreate(BlockingQueue outQueue, ChannelManager channelManager) { setChannelManager(channelManager); diff --git a/src/test/java/org/buddycloud/channelserver/channel/ChannelManagerImplTest.java b/src/test/java/org/buddycloud/channelserver/channel/ChannelManagerImplTest.java index f5aa47c5..4fee3a7b 100644 --- a/src/test/java/org/buddycloud/channelserver/channel/ChannelManagerImplTest.java +++ b/src/test/java/org/buddycloud/channelserver/channel/ChannelManagerImplTest.java @@ -8,6 +8,7 @@ import static org.mockito.Mockito.when; import java.util.ArrayList; +import java.util.List; import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.db.NodeStore; @@ -132,36 +133,19 @@ public void testIsLocalJidForNonLocaJid() throws Exception { @Test public void testDeleteRemoteDataDeletesRemoteData() throws Exception { - ArrayList nodes = new ArrayList(); - nodes.add(user2); - nodes.add(user3); - nodes.add(user5); + List remoteNodes = new ArrayList(); + remoteNodes.add(user2); + remoteNodes.add(user3); + remoteNodes.add(user5); - when(nodeStore.getNodeList()).thenReturn(nodes); + when(nodeStore.getRemoteNodesList()).thenReturn(remoteNodes); channelManager.deleteRemoteData(); - verify(nodeStore).getNodeList(); + verify(nodeStore).getRemoteNodesList(); verify(nodeStore, Mockito.times(3)).purgeNodeItems(Mockito.anyString()); } - @Test - public void testDeleteRemoteDoesNotPurgeLocalNodes() throws Exception { - - ArrayList nodes = new ArrayList(); - nodes.add(user1); - nodes.add(user2); - nodes.add(user3); - nodes.add(user4); - - when(nodeStore.getNodeList()).thenReturn(nodes); - - channelManager.deleteRemoteData(); - - verify(nodeStore).getNodeList(); - verify(nodeStore, Mockito.times(2)).purgeNodeItems(Mockito.anyString()); - } - @Test public void testGetNodeDefaultAffiliationForNodeWithConf() throws Exception { when(nodeStore.getNodeConfValue(user1, Conf.DEFAULT_AFFILIATION)).thenReturn("moderator"); diff --git a/src/test/java/org/buddycloud/channelserver/channel/validate/AtomEntryTest.java b/src/test/java/org/buddycloud/channelserver/channel/validate/AtomEntryTest.java index e652aa13..48599117 100644 --- a/src/test/java/org/buddycloud/channelserver/channel/validate/AtomEntryTest.java +++ b/src/test/java/org/buddycloud/channelserver/channel/validate/AtomEntryTest.java @@ -170,7 +170,6 @@ public void missingUpdatedElementHasValueAdded() throws Exception { validator = getEntryObject(item); Assert.assertTrue(validator.isValid()); Element entry = validator.getPayload(); - System.out.println(entry.elementText("updated")); Assert.assertTrue(entry.elementText("updated").matches(ISO_8601_REGEX)); } diff --git a/src/test/java/org/buddycloud/channelserver/db/jdbc/DatabaseTester.java b/src/test/java/org/buddycloud/channelserver/db/jdbc/DatabaseTester.java index 36f7e80d..5714f491 100644 --- a/src/test/java/org/buddycloud/channelserver/db/jdbc/DatabaseTester.java +++ b/src/test/java/org/buddycloud/channelserver/db/jdbc/DatabaseTester.java @@ -115,6 +115,7 @@ public PreparedStatement answer(InvocationOnMock invocation) throws Throwable { String originalSQL = (String) invocation.getArguments()[0]; String replacedSQL = originalSQL.replaceFirst("(\\S+) ~ \\?", "regexp_matches($1, ?)"); + replacedSQL = replacedSQL.replaceFirst("(\\S+) !~ \\?", "not regexp_matches($1, ?)"); return originalConn.prepareStatement(replacedSQL); } }).when(conn).prepareStatement(Mockito.anyString()); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGetTest.java index 06d04798..50c9fe89 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGetTest.java @@ -45,16 +45,12 @@ public void setUp() throws Exception { @SuppressWarnings("unchecked") @Test public void testReturnsListOfNodes() throws Exception { - ArrayList nodes = new ArrayList(); + List nodes = new ArrayList(); nodes.add("/user/user1@server1.com/posts"); nodes.add("/user/topic@topics.server1.com/posts"); nodes.add("/user/user2@server1.com/posts"); - Mockito.when(channelManager.getNodeList()).thenReturn(nodes); - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(true); - Mockito.when(channelManager.isLocalNode(Mockito.anyString(), Mockito.anySet())) - .thenReturn(true); + Mockito.when(channelManager.getLocalNodesList()).thenReturn(nodes); discoItems.process(request); @@ -93,7 +89,7 @@ public void testOnlyReturnsLocalNodes() throws Exception { @Test public void testReturnsErrorIfDataStoreException() throws Exception { - Mockito.when(channelManager.getNodeList()).thenThrow(new NodeStoreException()); + Mockito.when(channelManager.getLocalNodesList()).thenThrow(new NodeStoreException()); discoItems.process(request); Packet response = queue.poll(); From e7712ad621f81632838299f3351c0f21f5fcef1b Mon Sep 17 00:00:00 2001 From: abmargb Date: Tue, 30 Sep 2014 14:01:14 -0300 Subject: [PATCH 16/18] Considering 'local' access model when retrieving /firehose. Various enhancements as suggested by @lloydwatkin. --- .../channel/ChannelManagerImpl.java | 9 +- .../channel/LocalDomainChecker.java | 5 +- .../channelserver/db/NodeStore.java | 9 +- .../channelserver/db/jdbc/JDBCNodeStore.java | 37 ++++--- .../jdbc/dialect/Sql92NodeStoreDialect.java | 45 ++++---- .../pubsub/get/items/special/FirehoseGet.java | 6 +- .../channelserver/db/jdbc/DatabaseTester.java | 6 +- .../db/jdbc/JDBCNodeStoreAbstract.java | 1 - .../db/jdbc/JDBCNodeStoreFirehoseTest.java | 102 ++++++++++++++---- .../JDBCNodeStoreRemoteAndLocalNodesTest.java | 44 ++++++++ .../db/jdbc/JDBCNodeStoreTest.java | 15 +-- .../get/items/special/FirehoseGetTest.java | 21 ++-- 12 files changed, 215 insertions(+), 85 deletions(-) create mode 100644 src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreRemoteAndLocalNodesTest.java diff --git a/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java b/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java index f679e3ad..11d5fe14 100644 --- a/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java +++ b/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java @@ -339,13 +339,13 @@ public int getCountRecentItems(JID user, Date since, int maxPerNode, @Override public CloseableIterator getFirehose(int limit, - String afterItemId, boolean isAdmin) throws NodeStoreException { - return nodeStore.getFirehose(limit, afterItemId, isAdmin); + String afterItemId, boolean isAdmin, String actorDomain) throws NodeStoreException { + return nodeStore.getFirehose(limit, afterItemId, isAdmin, actorDomain); } @Override - public int getFirehoseItemCount(boolean isAdmin) throws NodeStoreException { - return nodeStore.getFirehoseItemCount(isAdmin); + public int getFirehoseItemCount(boolean isAdmin, String actorDomain) throws NodeStoreException { + return nodeStore.getFirehoseItemCount(isAdmin, actorDomain); } @Override @@ -366,6 +366,7 @@ public Affiliations getDefaultNodeAffiliation(String nodeId) return Affiliations.member; } + @SuppressWarnings("rawtypes") @Override public CloseableIterator performSearch(JID searcher, List content, JID author, int page, int rpp) diff --git a/src/main/java/org/buddycloud/channelserver/channel/LocalDomainChecker.java b/src/main/java/org/buddycloud/channelserver/channel/LocalDomainChecker.java index 6237a047..a5b528bd 100644 --- a/src/main/java/org/buddycloud/channelserver/channel/LocalDomainChecker.java +++ b/src/main/java/org/buddycloud/channelserver/channel/LocalDomainChecker.java @@ -45,7 +45,7 @@ public static boolean isLocal(String domain, Properties configuration, Set getLocalDomains(Properties configuration) { @@ -64,12 +64,11 @@ public static Set getLocalDomains(Properties configuration) { String csvDomains = IOUtils.toString(inputStream); for (String eachDomain : csvDomains.split(COMMA)) { - localDomains.add(eachDomain.trim()); + localDomains.add(eachDomain.trim().toLowerCase()); } inputStream.close(); } catch (Exception e) { // Return empty set - e.printStackTrace(); } return localDomains; diff --git a/src/main/java/org/buddycloud/channelserver/db/NodeStore.java b/src/main/java/org/buddycloud/channelserver/db/NodeStore.java index bf29a130..04cb9eb5 100644 --- a/src/main/java/org/buddycloud/channelserver/db/NodeStore.java +++ b/src/main/java/org/buddycloud/channelserver/db/NodeStore.java @@ -526,6 +526,7 @@ void deleteNodeItemById(String nodeId, String nodeItemId) * @return * @throws NodeStoreException */ + @SuppressWarnings("rawtypes") CloseableIterator performSearch(JID searcher, List content, JID author, int page, int rpp) throws NodeStoreException; @@ -538,20 +539,24 @@ CloseableIterator performSearch(JID searcher, List content, * after item ID# * @param isAdmin * show items from non-open nodes + * @param actorDomain + * the domain of the actor * @return * @throws NodeStoreException */ CloseableIterator getFirehose(int limit, String afterItemId, - boolean isAdmin) throws NodeStoreException; + boolean isAdmin, String actorDomain) throws NodeStoreException; /** * Get count of items from public channels "firehose" * * @param isAdmin * counts items from non-open nodes + * @param actorDomain + * the domain of the actor * @throws NodeStoreException */ - int getFirehoseItemCount(boolean isAdmin) throws NodeStoreException; + int getFirehoseItemCount(boolean isAdmin, String actorDomain) throws NodeStoreException; /** * Get a list of posts for a user diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java index df53c59b..50bedeae 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java @@ -15,7 +15,6 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; @@ -27,6 +26,7 @@ import org.buddycloud.channelserver.db.NodeStore; import org.buddycloud.channelserver.db.exception.ItemNotFoundException; import org.buddycloud.channelserver.db.exception.NodeStoreException; +import org.buddycloud.channelserver.pubsub.accessmodel.AccessModels; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; import org.buddycloud.channelserver.pubsub.model.GlobalItemID; import org.buddycloud.channelserver.pubsub.model.NodeAffiliation; @@ -709,7 +709,7 @@ public NodeItem convertRow(java.sql.ResultSet rs) @Override public CloseableIterator getFirehose(int limit, - String afterItemId, boolean isAdmin) throws NodeStoreException { + String afterItemId, boolean isAdmin, String actorDomain) throws NodeStoreException { PreparedStatement stmt = null; Date beforeDate = null; @@ -726,16 +726,17 @@ public CloseableIterator getFirehose(int limit, "Invalid value for parameter count: " + limit); } - String accessModel = "open"; - if (true == isAdmin) - accessModel = "%"; try { stmt = conn.prepareStatement(dialect.selectItemsForLocalNodesBeforeDate()); stmt.setTimestamp(1, new java.sql.Timestamp(beforeDate.getTime())); stmt.setString(2, Conf.ACCESS_MODEL); - stmt.setString(3, accessModel); - stmt.setString(4, getLocalDomainRegex()); - stmt.setInt(5, limit); + stmt.setBoolean(3, isAdmin); + stmt.setString(4, AccessModels.open.toString()); + stmt.setString(5, AccessModels.local.toString()); + stmt.setString(6, getDomainRegex(actorDomain)); + stmt.setBoolean(7, isAdmin); + stmt.setString(8, getLocalDomainRegex()); + stmt.setInt(9, limit); java.sql.ResultSet rs = stmt.executeQuery(); @@ -755,17 +756,19 @@ public CloseableIterator getFirehose(int limit, } @Override - public int getFirehoseItemCount(boolean isAdmin) throws NodeStoreException { + public int getFirehoseItemCount(boolean isAdmin, String actorDomain) + throws NodeStoreException { PreparedStatement stmt = null; - String accessModel = "open"; - if (true == isAdmin) - accessModel = "%"; try { stmt = conn.prepareStatement(dialect.countItemsForLocalNodes()); stmt.setString(1, Conf.ACCESS_MODEL); - stmt.setString(2, accessModel); - stmt.setString(3, getLocalDomainRegex()); + stmt.setBoolean(2, isAdmin); + stmt.setString(3, AccessModels.open.toString()); + stmt.setString(4, AccessModels.local.toString()); + stmt.setString(5, getDomainRegex(actorDomain)); + stmt.setBoolean(6, isAdmin); + stmt.setString(7, getLocalDomainRegex()); java.sql.ResultSet rs = stmt.executeQuery(); if (!rs.next()) { @@ -804,10 +807,14 @@ private static String getLocalDomainRegex() { } String domainRegex = localDomains.isEmpty() ? ".*" : - ".*@(" + StringUtils.join(localDomains, "|") + ")\\/.*"; + getDomainRegex(StringUtils.join(localDomains, "|")); return domainRegex; } + private static String getDomainRegex(String localDomains) { + return ".*@(" + localDomains + ")\\/.*"; + } + @Override public CloseableIterator getUserFeedItems(JID user, Date since, int limit, GlobalItemID afterItemId, boolean parentOnly) diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java index 8d6b1836..a81970cc 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java @@ -1,11 +1,5 @@ package org.buddycloud.channelserver.db.jdbc.dialect; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; - -import org.apache.commons.lang.StringUtils; import org.buddycloud.channelserver.db.jdbc.JDBCNodeStore.NodeStoreSQLDialect; public class Sql92NodeStoreDialect implements NodeStoreSQLDialect { @@ -84,9 +78,6 @@ public class Sql92NodeStoreDialect implements NodeStoreSQLDialect { private static final String DELETE_AFFILIATION = "DELETE FROM \"affiliations\" WHERE \"node\" = ? AND \"user\" = ?;"; - private static final String SELECT_SUBSCRIPTION = "SELECT \"node\", \"user\", \"listener\", \"subscription\", \"updated\"" - + " FROM \"subscriptions\" WHERE \"node\" = ? AND (\"user\" = ? OR \"listener\" = ? ) ORDER BY \"updated\" ASC"; - private static final String SELECT_SUBSCRIPTIONS_FOR_USER = "SELECT \"node\", \"user\", \"listener\", \"subscription\", \"updated\"" + " FROM \"subscriptions\" WHERE \"user\" = ? OR \"listener\" = ? ORDER BY \"updated\" ASC"; @@ -234,32 +225,42 @@ public class Sql92NodeStoreDialect implements NodeStoreSQLDialect { private static final String DELETE_ITEMS = "DELETE FROM \"items\" WHERE \"node\" = ?;"; - private static final String COUNT_ITEMS_FROM_LOCAL_NODES = - "SELECT COUNT(\"id\") " + - "FROM \"items\", \"node_config\" " + - "WHERE \"items\".\"node\" = \"node_config\".\"node\" " + - "AND \"key\" = ? AND \"value\" LIKE ? " + - "AND \"items\".\"node\" ~ ? "; - private static final String SELECT_LOCAL_NODES = "SELECT \"node\" " + - "FROM \"items\" " + - "WHERE \"items\".\"node\" ~ ? "; + "FROM \"nodes\" " + + "WHERE \"node\" ~ ? "; private static final String SELECT_REMOTE_NODES = "SELECT \"node\" " + - "FROM \"items\" " + - "WHERE \"items\".\"node\" !~ ? "; + "FROM \"nodes\" " + + "WHERE \"node\" !~ ?"; private static final String SELECT_ITEMS_FROM_LOCAL_NODES_BEFORE_DATE = "SELECT \"items\".\"node\", \"id\", \"items\".\"updated\", \"xml\", \"in_reply_to\", \"created\" " + "FROM \"items\", \"node_config\" " + "WHERE \"items\".\"updated\" < ? " + - "AND \"items\".\"node\" = \"node_config\".\"node\" " + - "AND \"key\" = ? AND \"value\" LIKE ? " + + "AND \"items\".\"node\" = \"node_config\".\"node\" "+ + "AND \"key\" = ? " + + "AND ((" + + "NOT ? AND " + + "(\"value\" LIKE ?) OR " + + "(\"value\" LIKE ? AND \"items\".\"node\" ~ ?)) " + + "OR ?) " + "AND \"items\".\"node\" ~ ? " + "ORDER BY \"updated\" DESC, \"id\" ASC LIMIT ?"; + private static final String COUNT_ITEMS_FROM_LOCAL_NODES = + "SELECT COUNT(\"id\") " + + "FROM \"items\", \"node_config\" " + + "WHERE \"items\".\"node\" = \"node_config\".\"node\" "+ + "AND \"key\" = ? " + + "AND ((" + + "NOT ? AND " + + "(\"value\" LIKE ?) OR " + + "(\"value\" LIKE ? AND \"items\".\"node\" ~ ?)) " + + "OR ?) " + + "AND \"items\".\"node\" ~ ?"; + private static final String SELECT_USER_ITEMS = "SELECT \"node\", \"id\", \"updated\", \"xml\", \"in_reply_to\", \"created\"" + " FROM \"items\" WHERE (CAST(xpath('//atom:author/atom:name/text()', xmlparse(document \"xml\")," + " ARRAY[ARRAY['atom', 'http://www.w3.org/2005/Atom']]) AS TEXT[]))[1] = ?"; diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java index b4b64b50..f142d4aa 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java @@ -108,14 +108,16 @@ private void addRsmElement() throws NodeStoreException { rsm.addElement("first").setText(firstItemId); rsm.addElement("last").setText(lastItemId); rsm.addElement("count").setText( - String.valueOf(channelManager.getFirehoseItemCount(isAdmin))); + String.valueOf(channelManager.getFirehoseItemCount( + isAdmin, actor.getDomain()))); } private void addItems() throws NodeStoreException { if (-1 == maxResults) { maxResults = DEFAULT_MAX_RESULTS; } - CloseableIterator items = channelManager.getFirehose(maxResults, afterItemId, isAdmin); + CloseableIterator items = channelManager.getFirehose( + maxResults, afterItemId, isAdmin, actor.getDomain()); String lastNode = ""; Element itemsElement = null; while (items.hasNext()) { diff --git a/src/test/java/org/buddycloud/channelserver/db/jdbc/DatabaseTester.java b/src/test/java/org/buddycloud/channelserver/db/jdbc/DatabaseTester.java index 5714f491..d1da0740 100644 --- a/src/test/java/org/buddycloud/channelserver/db/jdbc/DatabaseTester.java +++ b/src/test/java/org/buddycloud/channelserver/db/jdbc/DatabaseTester.java @@ -18,13 +18,11 @@ import java.util.Map; import java.util.Map.Entry; -import org.apache.log4j.Logger; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; public class DatabaseTester { - private static Logger log = Logger.getLogger(DatabaseTester.class); public class Assertions { private DatabaseTester tester; @@ -114,8 +112,8 @@ public Connection getConnection() throws SQLException { public PreparedStatement answer(InvocationOnMock invocation) throws Throwable { String originalSQL = (String) invocation.getArguments()[0]; - String replacedSQL = originalSQL.replaceFirst("(\\S+) ~ \\?", "regexp_matches($1, ?)"); - replacedSQL = replacedSQL.replaceFirst("(\\S+) !~ \\?", "not regexp_matches($1, ?)"); + String replacedSQL = originalSQL.replaceAll("(\\S+) ~ \\?", "regexp_matches($1, ?)"); + replacedSQL = replacedSQL.replaceAll("(\\S+) !~ \\?", "regexp_matches($1, ?) = FALSE"); return originalConn.prepareStatement(replacedSQL); } }).when(conn).prepareStatement(Mockito.anyString()); diff --git a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreAbstract.java b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreAbstract.java index fa7626d3..09c2ae67 100644 --- a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreAbstract.java +++ b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreAbstract.java @@ -9,7 +9,6 @@ import java.util.Map; import java.util.Map.Entry; -import org.apache.bcel.generic.NEW; import org.buddycloud.channelserver.db.jdbc.dialect.Sql92NodeStoreDialect; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; import org.buddycloud.channelserver.pubsub.model.NodeItem; diff --git a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreFirehoseTest.java b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreFirehoseTest.java index f2057a94..c85005ba 100644 --- a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreFirehoseTest.java +++ b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreFirehoseTest.java @@ -9,6 +9,7 @@ import org.buddycloud.channelserver.channel.Conf; import org.buddycloud.channelserver.db.CloseableIterator; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; +import org.buddycloud.channelserver.pubsub.accessmodel.AccessModels; import org.buddycloud.channelserver.pubsub.model.NodeItem; import org.junit.Before; import org.junit.Test; @@ -28,9 +29,9 @@ public void setup() throws SQLException, IOException { @Test public void testGetFirehoseOpenNode() throws Exception { - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, "open"); + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.open.toString()); CloseableIterator firehose = store.getFirehose( - Integer.MAX_VALUE, null, false); + Integer.MAX_VALUE, null, false, TEST_SERVER1_HOSTNAME); int itemCount = 0; while (firehose.hasNext()) { firehose.next(); @@ -41,9 +42,9 @@ public void testGetFirehoseOpenNode() throws Exception { @Test public void testNonAdminGetFirehoseAuthorizedNode() throws Exception { - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, "authorized"); + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.authorize.toString()); CloseableIterator firehose = store.getFirehose( - Integer.MAX_VALUE, null, false); + Integer.MAX_VALUE, null, false, TEST_SERVER1_HOSTNAME); int itemCount = 0; while (firehose.hasNext()) { firehose.next(); @@ -54,9 +55,9 @@ public void testNonAdminGetFirehoseAuthorizedNode() throws Exception { @Test public void testAdminGetFirehoseAuthorizedNode() throws Exception { - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, "authorized"); + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.authorize.toString()); CloseableIterator firehose = store.getFirehose( - Integer.MAX_VALUE, null, true); + Integer.MAX_VALUE, null, true, TEST_SERVER1_HOSTNAME); int itemCount = 0; while (firehose.hasNext()) { firehose.next(); @@ -65,15 +66,54 @@ public void testAdminGetFirehoseAuthorizedNode() throws Exception { assertEquals(5, itemCount); } + @Test + public void testAdminGetFirehoseLocalNode() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.local.toString()); + CloseableIterator firehose = store.getFirehose( + Integer.MAX_VALUE, null, true, TEST_SERVER2_HOSTNAME); + int itemCount = 0; + while (firehose.hasNext()) { + firehose.next(); + itemCount++; + } + assertEquals(5, itemCount); + } + + @Test + public void testNonAdminSameDomainGetFirehoseLocalNode() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.local.toString()); + CloseableIterator firehose = store.getFirehose( + Integer.MAX_VALUE, null, false, TEST_SERVER1_HOSTNAME); + int itemCount = 0; + while (firehose.hasNext()) { + firehose.next(); + itemCount++; + } + assertEquals(5, itemCount); + } + + @Test + public void testNonAdminGetFirehoseLocalNode() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.local.toString()); + CloseableIterator firehose = store.getFirehose( + Integer.MAX_VALUE, null, false, TEST_SERVER2_HOSTNAME); + int itemCount = 0; + while (firehose.hasNext()) { + firehose.next(); + itemCount++; + } + assertEquals(0, itemCount); + } + @Test public void testGetFirehoseNoDomainSet() throws Exception { - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, "open"); + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.open.toString()); Configuration.getInstance().remove( Configuration.CONFIGURATION_SERVER_DOMAIN); Configuration.getInstance().remove( Configuration.CONFIGURATION_SERVER_TOPICS_DOMAIN); CloseableIterator firehose = store.getFirehose( - Integer.MAX_VALUE, null, false); + Integer.MAX_VALUE, null, false, TEST_SERVER1_HOSTNAME); int itemCount = 0; while (firehose.hasNext()) { firehose.next(); @@ -84,9 +124,10 @@ public void testGetFirehoseNoDomainSet() throws Exception { @Test public void testGetFirehoseRSM() throws Exception { - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, "open"); + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.open.toString()); CloseableIterator firehose = store.getFirehose( - Integer.MAX_VALUE, TEST_SERVER1_NODE1_ITEM4_GLOBAL_ID, false); + Integer.MAX_VALUE, TEST_SERVER1_NODE1_ITEM4_GLOBAL_ID, + false, TEST_SERVER1_HOSTNAME); int itemCount = 0; while (firehose.hasNext()) { firehose.next(); @@ -97,33 +138,58 @@ public void testGetFirehoseRSM() throws Exception { @Test public void testCountFirehoseItemsOpenNode() throws Exception { - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, "open"); - int firehoseItemCount = store.getFirehoseItemCount(false); + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.open.toString()); + int firehoseItemCount = store.getFirehoseItemCount(false, + TEST_SERVER1_HOSTNAME); assertEquals(5, firehoseItemCount); } @Test public void testNonAdminCountFirehoseItemsAuthorizeNode() throws Exception { - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, "authorize"); - int firehoseItemCount = store.getFirehoseItemCount(false); + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.authorize.toString()); + int firehoseItemCount = store.getFirehoseItemCount(false, + TEST_SERVER1_HOSTNAME); assertEquals(0, firehoseItemCount); } @Test public void testAdminCountFirehoseItemsAuthorizeNode() throws Exception { - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, "authorize"); - int firehoseItemCount = store.getFirehoseItemCount(true); + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.authorize.toString()); + int firehoseItemCount = store.getFirehoseItemCount(true, + TEST_SERVER1_HOSTNAME); assertEquals(5, firehoseItemCount); } + @Test + public void testAdminCountFirehoseLocalNode() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.local.toString()); + int firehoseItemCount = store.getFirehoseItemCount(true, TEST_SERVER2_HOSTNAME); + assertEquals(5, firehoseItemCount); + } + + @Test + public void testNonAdminSameDomainCountFirehoseLocalNode() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.local.toString()); + int firehoseItemCount = store.getFirehoseItemCount(false, TEST_SERVER1_HOSTNAME); + assertEquals(5, firehoseItemCount); + } + + @Test + public void testNonAdminCounttFirehoseLocalNode() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.local.toString()); + int firehoseItemCount = store.getFirehoseItemCount(false, TEST_SERVER2_HOSTNAME); + assertEquals(0, firehoseItemCount); + } + @Test public void testCountFirehoseItemsNoDomainSet() throws Exception { - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, "open"); + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.open.toString()); Configuration.getInstance().remove( Configuration.CONFIGURATION_SERVER_DOMAIN); Configuration.getInstance().remove( Configuration.CONFIGURATION_SERVER_TOPICS_DOMAIN); - int firehoseItemCount = store.getFirehoseItemCount(false); + int firehoseItemCount = store.getFirehoseItemCount(false, + TEST_SERVER1_HOSTNAME); assertEquals(5, firehoseItemCount); } diff --git a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreRemoteAndLocalNodesTest.java b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreRemoteAndLocalNodesTest.java new file mode 100644 index 00000000..35782aa8 --- /dev/null +++ b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreRemoteAndLocalNodesTest.java @@ -0,0 +1,44 @@ +package org.buddycloud.channelserver.db.jdbc; + +import java.io.IOException; +import java.sql.SQLException; +import java.util.List; + +import org.buddycloud.channelserver.db.exception.NodeStoreException; +import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class JDBCNodeStoreRemoteAndLocalNodesTest extends JDBCNodeStoreAbstract { + + public JDBCNodeStoreRemoteAndLocalNodesTest() throws SQLException, IOException, + ClassNotFoundException { + dbTester = new DatabaseTester(); + IQTestHandler.readConf(); + } + + @Before + public void setup() throws SQLException, IOException, NodeStoreException { + dbTester.loadData("node_1"); + dbTester.loadData("node_2"); + store.addRemoteNode(TEST_SERVER2_NODE1_ID); + } + + @Test + public void testGetLocalNodesList() throws Exception { + List localNodes = store.getLocalNodesList(); + Assert.assertTrue(localNodes.contains(TEST_SERVER1_NODE1_ID)); + Assert.assertTrue(localNodes.contains(TEST_SERVER1_NODE2_ID)); + Assert.assertFalse(localNodes.contains(TEST_SERVER2_NODE1_ID)); + } + + @Test + public void testGetRemoteNodesList() throws Exception { + List remoteNodes = store.getRemoteNodesList(); + Assert.assertFalse(remoteNodes.contains(TEST_SERVER1_NODE1_ID)); + Assert.assertFalse(remoteNodes.contains(TEST_SERVER1_NODE2_ID)); + Assert.assertTrue(remoteNodes.contains(TEST_SERVER2_NODE1_ID)); + } + +} \ No newline at end of file diff --git a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java index a9f2e5b6..2923da1c 100644 --- a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java +++ b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java @@ -671,7 +671,7 @@ public void testGetIsCachedSubscriptionNodeReturnsFalseWhereThereAreNoSubscripti @Test(expected = IllegalArgumentException.class) public void testFirehoseItemsThrowsExceptionIfNegativeLimitRequested() throws Exception { - store.getFirehose(-1, null, false); + store.getFirehose(-1, null, false, TEST_SERVER1_HOSTNAME); } @Test @@ -695,7 +695,8 @@ public void testCanGetFirehoseItems() throws Exception { store.addNodeItem(new NodeItemImpl(TEST_SERVER1_NODE3_ID, "1111", new Date(), "")); Thread.sleep(4); - CloseableIterator items = store.getFirehose(50, null, false); + CloseableIterator items = store.getFirehose(50, null, + false, TEST_SERVER1_HOSTNAME); NodeItem item = null; int count = 0; while (items.hasNext()) { @@ -727,7 +728,8 @@ public void testCanGetFirehoseItemsIncludingPrivateAsAdminUser() store.addRemoteNode(TEST_SERVER2_NODE1_ID); store.setNodeConf(TEST_SERVER2_NODE1_ID, remoteNodeConf); - CloseableIterator items = store.getFirehose(50, null, true); + CloseableIterator items = store.getFirehose(50, null, + true, TEST_SERVER1_HOSTNAME); NodeItem item = null; int count = 0; while (items.hasNext()) { @@ -760,7 +762,8 @@ public void testCanGetFirehoseItemsWithRsm() throws Exception { store.addRemoteNode(TEST_SERVER2_NODE1_ID); store.setNodeConf(TEST_SERVER2_NODE1_ID, remoteNodeConf); - CloseableIterator items = store.getFirehose(2, "a3", false); + CloseableIterator items = store.getFirehose(2, "a3", + false, TEST_SERVER1_HOSTNAME); NodeItem item1 = items.next(); NodeItem item2 = items.next(); assertFalse(items.hasNext()); @@ -790,7 +793,7 @@ public void testCanGetFirehoseItemCount() throws Exception { remoteNodeConf.put("pubsub#access_model", "open"); store.addRemoteNode(TEST_SERVER2_NODE1_ID); store.setNodeConf(TEST_SERVER2_NODE1_ID, remoteNodeConf); - assertEquals(6, store.getFirehoseItemCount(false)); + assertEquals(6, store.getFirehoseItemCount(false, TEST_SERVER1_HOSTNAME)); } @Test @@ -814,7 +817,7 @@ public void testCanGetFirehostItemCountWithPrivateItemsAsAdmin() remoteNodeConf.put("pubsub#access_model", "open"); store.addRemoteNode(TEST_SERVER2_NODE1_ID); store.setNodeConf(TEST_SERVER2_NODE1_ID, remoteNodeConf); - assertEquals(7, store.getFirehoseItemCount(true)); + assertEquals(7, store.getFirehoseItemCount(true, TEST_SERVER1_HOSTNAME)); } @Test diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGetTest.java index ad5c40a2..fd8a58de 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGetTest.java @@ -69,7 +69,8 @@ public void testNodeStoreExceptionGeneratesAnErrorStanza() throws Exception { Mockito.when( channelManager.getFirehose(Mockito.anyInt(), - Mockito.anyString(), Mockito.anyBoolean())).thenThrow( + Mockito.anyString(), Mockito.anyBoolean(), + Mockito.anyString())).thenThrow( new NodeStoreException()); recentItemsGet.process(element, jid, request, null); @@ -86,7 +87,8 @@ public void testNodeStoreExceptionGeneratesAnErrorStanza() throws Exception { public void testItemsReturnsEmptyStanza() throws Exception { Mockito.when( - channelManager.getFirehose(Mockito.anyInt(), Mockito.anyString(), Mockito.anyBoolean())).thenReturn( + channelManager.getFirehose(Mockito.anyInt(), Mockito.anyString(), + Mockito.anyBoolean(), Mockito.anyString())).thenReturn( new ClosableIteratorImpl(new ArrayList() .iterator())); @@ -120,10 +122,10 @@ public void testOutgoingStanzaFormattedAsExpected() throws Exception { results.add(item4); Mockito.when( - channelManager.getFirehose(Mockito.anyInt(), Mockito.anyString(), Mockito.anyBoolean())).thenReturn( + channelManager.getFirehose(Mockito.anyInt(), Mockito.anyString(), Mockito.anyBoolean(), Mockito.anyString())).thenReturn( new ClosableIteratorImpl(results.iterator())); Mockito.when( - channelManager.getFirehoseItemCount(Mockito.anyBoolean())).thenReturn(4); + channelManager.getFirehoseItemCount(Mockito.anyBoolean(), Mockito.anyString())).thenReturn(4); recentItemsGet.process(element, jid, request, null); IQ response = (IQ) queue.poll(); @@ -158,7 +160,7 @@ public void testUnparsableItemEntriesAreSimplyIgnored() throws Exception { results.add(item2); Mockito.when( - channelManager.getFirehose(Mockito.anyInt(), Mockito.anyString(), Mockito.anyBoolean())).thenReturn( + channelManager.getFirehose(Mockito.anyInt(), Mockito.anyString(), Mockito.anyBoolean(), Mockito.anyString())).thenReturn( new ClosableIteratorImpl(results.iterator())); recentItemsGet.process(element, jid, request, null); @@ -181,10 +183,12 @@ public void testCanControlGatheredEntriesUsingRsm() throws Exception { results.add(item3); Mockito.when( - channelManager.getFirehose(Mockito.anyInt(), Mockito.anyString(), Mockito.anyBoolean())).thenReturn( + channelManager.getFirehose(Mockito.anyInt(), Mockito.anyString(), + Mockito.anyBoolean(), Mockito.anyString())).thenReturn( new ClosableIteratorImpl(results.iterator())); Mockito.when( - channelManager.getFirehoseItemCount(Mockito.anyBoolean())).thenReturn(2); + channelManager.getFirehoseItemCount(Mockito.anyBoolean(), + Mockito.anyString())).thenReturn(2); Element rsm = request.getElement().addElement("rsm"); rsm.addNamespace("", RecentItemsGet.NS_RSM); @@ -220,7 +224,8 @@ public void testAdminUsersHaveRequestsMadeAsExpected() throws Exception { ArrayList results = new ArrayList(); Mockito.when( - channelManager.getFirehose(Mockito.anyInt(), Mockito.anyString(), Mockito.eq(true))).thenReturn( + channelManager.getFirehose(Mockito.anyInt(), Mockito.anyString(), Mockito.eq(true), + Mockito.anyString())).thenReturn( new ClosableIteratorImpl(results.iterator())); recentItemsGet.process(element, jid, request, null); From ebdecf9125ea59da18e96d17932c85cdf598b7fd Mon Sep 17 00:00:00 2001 From: abmargb Date: Mon, 6 Oct 2014 14:42:35 -0300 Subject: [PATCH 17/18] Moving checks for local domains, jids and nodes to the Configuration class. --- .../channelserver/ChannelsEngine.java | 4 +- .../channelserver/Configuration.java | 28 +++++++++++++ .../channelserver/channel/ChannelManager.java | 34 ---------------- .../channel/ChannelManagerFactoryImpl.java | 8 +--- .../channel/ChannelManagerImpl.java | 31 ++------------- .../iq/namespace/discoinfo/DiscoInfoGet.java | 7 ++-- .../mam/MessageArchiveManagement.java | 3 +- .../namespace/pubsub/get/AffiliationsGet.java | 22 ++++------- .../pubsub/get/NodeConfigureGet.java | 5 ++- .../namespace/pubsub/get/NodeThreadsGet.java | 11 ++---- .../namespace/pubsub/get/RecentItemsGet.java | 3 +- .../iq/namespace/pubsub/get/RepliesGet.java | 19 ++------- .../pubsub/get/SubscriptionsGet.java | 22 +++-------- .../iq/namespace/pubsub/get/ThreadGet.java | 32 +++------------ .../iq/namespace/pubsub/get/UserItemsGet.java | 4 +- .../pubsub/get/items/NodeItemsGet.java | 17 +++----- .../pubsub/get/items/SpecialItemsGet.java | 20 ---------- .../pubsub/get/items/special/FirehoseGet.java | 3 +- .../namespace/pubsub/result/ItemsResult.java | 7 ++-- .../pubsub/result/SubscriptionsResult.java | 3 +- .../pubsub/set/AffiliationEvent.java | 12 ++++-- .../iq/namespace/pubsub/set/ItemDelete.java | 15 ++++--- .../namespace/pubsub/set/NodeConfigure.java | 10 +++-- .../iq/namespace/pubsub/set/NodeCreate.java | 11 ++++-- .../iq/namespace/pubsub/set/NodeDelete.java | 22 ++++++----- .../iq/namespace/pubsub/set/Publish.java | 5 ++- .../iq/namespace/pubsub/set/SubscribeSet.java | 8 ++-- .../pubsub/set/SubscriptionEvent.java | 12 ++++-- .../namespace/pubsub/set/UnsubscribeSet.java | 11 ++---- .../iq/namespace/register/RegisterSet.java | 7 ++-- .../iq/namespace/register/UnregisterSet.java | 7 ++-- .../iq/namespace/search/Search.java | 16 +------- .../iq/namespace/search/SearchGet.java | 10 ++--- .../iq/namespace/search/SearchSet.java | 6 +-- .../event/AbstractMessageProcessor.java | 13 +++---- .../message/event/AffiliationProcessor.java | 12 ++---- .../message/event/ConfigurationProcessor.java | 6 +-- .../message/event/DeleteProcessor.java | 5 ++- .../message/event/ItemsProcessor.java | 4 +- .../message/event/RetractItemProcessor.java | 8 ++-- .../message/event/SubscriptionProcessor.java | 11 +++--- .../channel/ChannelManagerImplTest.java | 30 +++++++------- .../channelserver/channel/TestHelper.java | 3 +- .../packetHandler/iq/TestHandler.java | 1 + .../discoitems/DiscoItemsGetTest.java | 2 - .../mam/MessageArchiveManagementTest.java | 15 +++---- .../pubsub/get/NodeConfigureGetTest.java | 17 ++++---- .../pubsub/get/NodeThreadsGetTest.java | 16 ++++---- .../pubsub/get/SubscriptionsGetTest.java | 16 ++++---- .../pubsub/get/items/NodeItemsGetTest.java | 13 +++---- .../get/items/UserSingleItemGetTest.java | 7 ++-- .../pubsub/result/ItemsResultTest.java | 4 ++ .../pubsub/set/AffiliationEventTest.java | 6 +-- .../namespace/pubsub/set/ItemDeleteTest.java | 20 ++-------- .../pubsub/set/NodeConfigureTest.java | 6 +-- .../namespace/pubsub/set/NodeCreateTest.java | 5 ++- .../namespace/pubsub/set/NodeDeleteTest.java | 16 ++------ .../iq/namespace/pubsub/set/PublishTest.java | 22 +++++------ .../pubsub/set/SubscribeSetTest.java | 39 +++++++++---------- .../pubsub/set/SubscriptionEventTest.java | 25 ++++++------ .../pubsub/set/UnsubscribeSetTest.java | 11 +++--- .../namespace/register/RegisterSetTest.java | 34 ++-------------- .../namespace/register/UnregisterSetTest.java | 22 +++++------ .../iq/namespace/search/SearchGetTest.java | 17 +++----- .../iq/namespace/search/SearchSetTest.java | 10 ++--- .../event/AffiliationProcessorTest.java | 22 +++++------ .../event/ConfigurationProcessorTest.java | 29 +++++--------- .../message/event/DeleteProcessorTest.java | 18 ++++----- .../message/event/ItemsProcessorTest.java | 14 ++++--- .../event/NotificationSendingMockTest.java | 10 +++-- .../event/RetractItemProcessorTest.java | 20 +++++----- .../event/SubscriptionProcessorTest.java | 20 +++++----- 72 files changed, 404 insertions(+), 580 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/ChannelsEngine.java b/src/main/java/org/buddycloud/channelserver/ChannelsEngine.java index 0cebcf78..d566e561 100644 --- a/src/main/java/org/buddycloud/channelserver/ChannelsEngine.java +++ b/src/main/java/org/buddycloud/channelserver/ChannelsEngine.java @@ -7,7 +7,6 @@ import org.apache.log4j.Logger; import org.buddycloud.channelserver.channel.ChannelManagerFactory; import org.buddycloud.channelserver.channel.ChannelManagerFactoryImpl; -import org.buddycloud.channelserver.channel.Conf; import org.buddycloud.channelserver.db.DefaultNodeStoreFactoryImpl; import org.buddycloud.channelserver.db.NodeStoreFactory; import org.buddycloud.channelserver.db.exception.NodeStoreException; @@ -109,8 +108,7 @@ private void setupManagers() throws ComponentException { throw new ComponentException(e); } - channelManagerFactory = new ChannelManagerFactoryImpl(configuration, - nodeStoreFactory); + channelManagerFactory = new ChannelManagerFactoryImpl(nodeStoreFactory); federatedQueueManager = new FederatedQueueManager(this, configuration); onlineUsers = new OnlineResourceManager(configuration, channelManagerFactory.create()); diff --git a/src/main/java/org/buddycloud/channelserver/Configuration.java b/src/main/java/org/buddycloud/channelserver/Configuration.java index 4076ee16..bc3277f5 100644 --- a/src/main/java/org/buddycloud/channelserver/Configuration.java +++ b/src/main/java/org/buddycloud/channelserver/Configuration.java @@ -11,6 +11,7 @@ import java.util.Properties; import org.apache.log4j.Logger; +import org.buddycloud.channelserver.channel.LocalDomainChecker; import org.xmpp.packet.JID; public class Configuration extends Properties { @@ -19,6 +20,7 @@ public class Configuration extends Properties { private static final long serialVersionUID = 1L; private static final String ARRAY_PROPERTY_SEPARATOR = ";"; + private static final String INVALID_NODE = "Illegal node format"; public static final String CONFIGURATION_SERVER_DOMAIN = "server.domain"; public static final String CONFIGURATION_SERVER_CHANNELS_DOMAIN = "server.domain.channels"; @@ -95,6 +97,10 @@ public static Configuration getInstance() { } return instance; } + + public static void reset() { + instance = null; + } public String getProperty(String key) { return conf.getProperty(key); @@ -112,6 +118,10 @@ public void clear() { public String getProperty(String key, String defaultValue) { return conf.getProperty(key, defaultValue); } + + public void putProperty(String key, String value) { + conf.put(key, value); + } public void load(InputStream inputStream) throws IOException { conf.load(inputStream); @@ -199,4 +209,22 @@ public String getComponentPort() { public String getXmppHost() { return this.getProperty(XMPP_HOST, "127.0.0.1"); } + + public boolean isLocalDomain(String domain) { + return LocalDomainChecker.isLocal(domain, this); + } + + public boolean isLocalNode(String nodeId) { + if (false == nodeId.matches("/user/.+@.+/.+")) { + LOGGER.debug("Node " + nodeId + " has an invalid format"); + throw new IllegalArgumentException(INVALID_NODE); + } + String domain = new JID(nodeId.split("/")[2]).getDomain(); + return isLocalDomain(domain); + } + + public boolean isLocalJID(JID jid) { + String domain = jid.getDomain(); + return isLocalDomain(domain); + } } diff --git a/src/main/java/org/buddycloud/channelserver/channel/ChannelManager.java b/src/main/java/org/buddycloud/channelserver/channel/ChannelManager.java index 61ef90f1..4b882548 100644 --- a/src/main/java/org/buddycloud/channelserver/channel/ChannelManager.java +++ b/src/main/java/org/buddycloud/channelserver/channel/ChannelManager.java @@ -19,40 +19,6 @@ public interface ChannelManager extends NodeStore { * @throws NodeStoreException */ void createPersonalChannel(JID ownerJID) throws NodeStoreException; - - /** - * Determines whether the node id given refers to a local node. - * - * @param nodeId - * the node id - * @return true if the node appears to be local, - * false otherwise. - * @throws NodeStoreException - */ - boolean isLocalNode(String nodeId) throws NodeStoreException; - - /** - * Determines whether the jid refers to a local user. - * - * @param jid - * the user's jid - * @return true if the jid appears to be local, - * false otherwise. - * @throws NodeStoreException - */ - boolean isLocalJID(JID jid) throws NodeStoreException; - - /** - * Determines whether the domain is served by this server. - * - * @param domain - * the domain name - * @return true if the domain appears to be local, - * false otherwise. - * @throws NodeStoreException - */ - boolean isLocalDomain(String domain) throws NodeStoreException; - /** * Deletes all data from remote nodes diff --git a/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerFactoryImpl.java b/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerFactoryImpl.java index 89a967e4..67bdbf7c 100644 --- a/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerFactoryImpl.java +++ b/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerFactoryImpl.java @@ -1,22 +1,18 @@ package org.buddycloud.channelserver.channel; -import java.util.Properties; - import org.buddycloud.channelserver.db.NodeStoreFactory; public class ChannelManagerFactoryImpl implements ChannelManagerFactory { - private final Properties configuration; private final NodeStoreFactory nodeStoreFactory; - public ChannelManagerFactoryImpl(final Properties configuration, final NodeStoreFactory nodeStoreFactory) { - this.configuration = configuration; + public ChannelManagerFactoryImpl(final NodeStoreFactory nodeStoreFactory) { this.nodeStoreFactory = nodeStoreFactory; } @Override public ChannelManager create() { - return new ChannelManagerImpl(nodeStoreFactory.create(), configuration); + return new ChannelManagerImpl(nodeStoreFactory.create()); } } diff --git a/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java b/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java index 11d5fe14..9375c87c 100644 --- a/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java +++ b/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java @@ -4,9 +4,9 @@ import java.util.Date; import java.util.List; import java.util.Map; -import java.util.Properties; import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.db.ClosableIteratorImpl; import org.buddycloud.channelserver.db.CloseableIterator; import org.buddycloud.channelserver.db.NodeStore; @@ -28,12 +28,10 @@ public class ChannelManagerImpl implements ChannelManager { private final NodeStore nodeStore; - private final Properties configuration; private static final Logger logger = Logger .getLogger(ChannelManagerImpl.class); - private static final String INVALID_NODE = "Illegal node format"; private static final String REMOTE_NODE = "Illegal remote node"; /** @@ -42,10 +40,8 @@ public class ChannelManagerImpl implements ChannelManager { * @param nodeStore * the backing {@link NodeStore}. */ - public ChannelManagerImpl(final NodeStore nodeStore, - final Properties configuration) { + public ChannelManagerImpl(final NodeStore nodeStore) { this.nodeStore = nodeStore; - this.configuration = configuration; } @Override @@ -220,7 +216,7 @@ public Transaction beginTransaction() throws NodeStoreException { @Override public void createPersonalChannel(JID owner) throws NodeStoreException { - if (false == isLocalJID(owner)) { + if (false == Configuration.getInstance().isLocalJID(owner)) { throw new IllegalArgumentException(REMOTE_NODE); } if (!nodeExists(Conf.getPostChannelNodename(owner))) { @@ -249,27 +245,6 @@ public void createPersonalChannel(JID owner) throws NodeStoreException { } } - @Override - public boolean isLocalDomain(String domain) { - return LocalDomainChecker.isLocal(domain, configuration); - } - - @Override - public boolean isLocalNode(String nodeId) { - if (false == nodeId.matches("/user/.+@.+/.+")) { - logger.debug("Node " + nodeId + " has an invalid format"); - throw new IllegalArgumentException(INVALID_NODE); - } - String domain = new JID(nodeId.split("/")[2]).getDomain(); - return isLocalDomain(domain); - } - - @Override - public boolean isLocalJID(JID jid) { - String domain = jid.getDomain(); - return isLocalDomain(domain); - } - @Override public void close() throws NodeStoreException { nodeStore.close(); diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoinfo/DiscoInfoGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoinfo/DiscoInfoGet.java index 7d8568a2..49a19094 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoinfo/DiscoInfoGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoinfo/DiscoInfoGet.java @@ -4,6 +4,7 @@ import java.util.TreeMap; import java.util.concurrent.BlockingQueue; import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.node.configuration.field.AccessModel; import org.buddycloud.channelserver.db.exception.NodeStoreException; @@ -46,14 +47,14 @@ public void process(IQ reqIQ) throws Exception { node = elm.attributeValue("node"); query = result.setChildElement(ELEMENT_NAME, JabberDiscoInfo.NAMESPACE_URI); - if (false == channelManager.isLocalJID(requestIq.getFrom())) { + if (false == Configuration.getInstance().isLocalJID(requestIq.getFrom())) { result.getElement().addAttribute("remote-server-discover", "false"); } if ((node == null) || (true == node.equals(""))) { sendServerDiscoInfo(); return; } - if (false == channelManager.isLocalNode(node) + if (false == Configuration.getInstance().isLocalNode(node) && (false == channelManager.isCachedNode(node))) { logger.info("Node " + node + " is remote and not cached so " + "we're going off to get disco#info"); @@ -92,7 +93,7 @@ private void sendNodeConfigurationInformation() throws Exception { value = configuration.get(key); if ((true == key.equals(AccessModel.FIELD_NAME)) && (value.equals(AccessModel.local.toString())) - && (false == channelManager.isLocalJID(requestIq.getFrom()))) { + && (false == Configuration.getInstance().isLocalJID(requestIq.getFrom()))) { value = AccessModel.authorize.toString(); } x.addField(key, null, null).addValue(value); diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/mam/MessageArchiveManagement.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/mam/MessageArchiveManagement.java index 36100009..3f15a52f 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/mam/MessageArchiveManagement.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/mam/MessageArchiveManagement.java @@ -5,6 +5,7 @@ import java.util.concurrent.BlockingQueue; import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.Conf; import org.buddycloud.channelserver.db.CloseableIterator; @@ -59,7 +60,7 @@ public void process(IQ reqIQ) throws Exception { requestIq = reqIQ; reply = IQ.createResultIQ(requestIq); - if (false == channelManager.isLocalJID(requestIq.getFrom())) { + if (false == Configuration.getInstance().isLocalJID(requestIq.getFrom())) { this._sendNotHandledStanza(); return; } diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/AffiliationsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/AffiliationsGet.java index d4608e45..49b4777c 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/AffiliationsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/AffiliationsGet.java @@ -3,16 +3,15 @@ import java.util.concurrent.BlockingQueue; import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.JabberPubsub; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.PubSubElementProcessor; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.PubSubGet; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; -import org.buddycloud.channelserver.pubsub.model.NodeAffiliation; import org.buddycloud.channelserver.pubsub.model.NodeMembership; import org.buddycloud.channelserver.pubsub.subscription.Subscriptions; -import org.buddycloud.channelserver.queue.FederatedQueueManager; import org.buddycloud.channelserver.utils.node.item.payload.Buddycloud; import org.dom4j.Element; import org.xmpp.packet.IQ; @@ -29,11 +28,7 @@ public class AffiliationsGet implements PubSubElementProcessor { private String node; private JID actorJid; private IQ result; - private Element resultSetManagement; private String firstItem; - private String lastItem; - private int totalEntriesCount; - private Boolean isOwnerModerator; private static final Logger logger = Logger .getLogger(AffiliationsGet.class); @@ -51,9 +46,8 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) requestIq = reqIQ; actorJid = actorJID; node = elm.attributeValue("node"); - resultSetManagement = rsm; - if (false == channelManager.isLocalJID(requestIq.getFrom())) { + if (false == Configuration.getInstance().isLocalJID(requestIq.getFrom())) { result.getElement().addAttribute("remote-server-discover", "false"); } String namespace = JabberPubsub.NS_PUBSUB_OWNER; @@ -82,7 +76,7 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) private boolean getNodeAffiliations(Element affiliations) throws NodeStoreException, InterruptedException { - if (false == channelManager.isLocalNode(node) + if (false == Configuration.getInstance().isLocalNode(node) && (false == channelManager.isCachedNode(node))) { makeRemoteRequest(node.split("/")[2]); return false; @@ -91,7 +85,7 @@ private boolean getNodeAffiliations(Element affiliations) nodeMemberships = channelManager.getNodeMemberships(node); if ((0 == nodeMemberships.size()) - && (false == channelManager.isLocalNode(node))) { + && (false == Configuration.getInstance().isLocalNode(node))) { makeRemoteRequest(node.split("/")[2]); return false; } @@ -111,8 +105,9 @@ private boolean getNodeAffiliations(Element affiliations) logger.trace("Adding affiliation for " + nodeMembership.getUser() + " affiliation " + nodeMembership.getAffiliation()); - if (null == firstItem) firstItem = nodeMembership.getUser().toString(); - lastItem = nodeMembership.getUser().toString(); + if (null == firstItem) { + firstItem = nodeMembership.getUser().toString(); + } affiliations .addElement("affiliation") @@ -132,7 +127,7 @@ private boolean isOwnerModerator() throws NodeStoreException { private boolean getUserMemberships(Element affiliations) throws NodeStoreException, InterruptedException { - if (false == channelManager.isLocalJID(actorJid) + if (false == Configuration.getInstance().isLocalJID(actorJid) && (false == channelManager.isCachedJID(requestIq.getFrom()))) { makeRemoteRequest(actorJid.getDomain()); return false; @@ -157,7 +152,6 @@ private boolean getUserMemberships(Element affiliations) + " (no node provided)"); if (null == firstItem) firstItem = membership.getNodeId(); - lastItem = membership.getNodeId(); affiliations .addElement("affiliation") diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeConfigureGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeConfigureGet.java index e13b29a7..b47ff2c8 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeConfigureGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeConfigureGet.java @@ -4,6 +4,7 @@ import java.util.concurrent.BlockingQueue; import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.node.configuration.field.AccessModel; import org.buddycloud.channelserver.db.exception.NodeStoreException; @@ -52,7 +53,7 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) return; } - if (!channelManager.isLocalNode(node) && !channelManager.isCachedNodeConfig(node)) { + if (!Configuration.getInstance().isLocalNode(node) && !channelManager.isCachedNodeConfig(node)) { makeRemoteRequest(); return; } @@ -90,7 +91,7 @@ private void getNodeConfiguration() throws Exception { value = nodeConf.get(key); if ((true == key.equals(AccessModel.FIELD_NAME)) && (value.equals(AccessModel.local.toString())) - && (false == channelManager.isLocalJID(actor))) { + && (false == Configuration.getInstance().isLocalJID(actor))) { value = AccessModel.authorize.toString(); } x.addField(key, null, null).addValue(value); diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeThreadsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeThreadsGet.java index 86e123c6..0dd88aba 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeThreadsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeThreadsGet.java @@ -4,6 +4,7 @@ import java.util.Map; import java.util.concurrent.BlockingQueue; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.Conf; import org.buddycloud.channelserver.channel.node.configuration.field.AccessModel; @@ -11,12 +12,8 @@ import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.JabberPubsub; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.PubSubElementProcessorAbstract; import org.buddycloud.channelserver.pubsub.accessmodel.AccessModels; -import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; -import org.buddycloud.channelserver.pubsub.model.NodeAffiliation; import org.buddycloud.channelserver.pubsub.model.NodeItem; -import org.buddycloud.channelserver.pubsub.model.NodeSubscription; import org.buddycloud.channelserver.pubsub.model.NodeThread; -import org.buddycloud.channelserver.pubsub.subscription.Subscriptions; import org.buddycloud.channelserver.utils.node.NodeAclRefuseReason; import org.buddycloud.channelserver.utils.node.NodeViewAcl; import org.buddycloud.channelserver.utils.node.item.payload.Buddycloud; @@ -54,7 +51,7 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) actor = request.getFrom(); } - if (!channelManager.isLocalJID(request.getFrom())) { + if (!Configuration.getInstance().isLocalJID(request.getFrom())) { response.getElement().addAttribute("remote-server-discover", "false"); } @@ -64,7 +61,7 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) return; } - if (!channelManager.isLocalNode(node) + if (!Configuration.getInstance().isLocalNode(node) && !channelManager.isCachedNode(node)) { logger.debug("Node " + node + " is remote and not cached, off to get some data"); @@ -173,7 +170,7 @@ private boolean userCanViewNode() throws NodeStoreException { if (nodeViewAcl.canViewNode(node, channelManager.getNodeMembership(node, actor), getNodeAccessModel(nodeConfiguration), - channelManager.isLocalJID(actor))) { + Configuration.getInstance().isLocalJID(actor))) { return true; } diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RecentItemsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RecentItemsGet.java index a10edba1..2340bc33 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RecentItemsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RecentItemsGet.java @@ -5,6 +5,7 @@ import java.util.concurrent.BlockingQueue; import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.Conf; import org.buddycloud.channelserver.db.CloseableIterator; @@ -67,7 +68,7 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) return; } - if (!channelManager.isLocalJID(request.getFrom())) { + if (!Configuration.getInstance().isLocalJID(request.getFrom())) { response.getElement().addAttribute("remote-server-discover", "false"); } diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGet.java index a5148f91..8cc91dfe 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGet.java @@ -1,11 +1,11 @@ package org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.get; import java.io.StringReader; -import java.util.Date; import java.util.Map; import java.util.concurrent.BlockingQueue; import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.node.configuration.field.AccessModel; import org.buddycloud.channelserver.db.CloseableIterator; @@ -13,11 +13,7 @@ import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.JabberPubsub; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.PubSubElementProcessorAbstract; import org.buddycloud.channelserver.pubsub.accessmodel.AccessModels; -import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; -import org.buddycloud.channelserver.pubsub.model.NodeAffiliation; import org.buddycloud.channelserver.pubsub.model.NodeItem; -import org.buddycloud.channelserver.pubsub.model.NodeSubscription; -import org.buddycloud.channelserver.pubsub.subscription.Subscriptions; import org.buddycloud.channelserver.utils.node.NodeAclRefuseReason; import org.buddycloud.channelserver.utils.node.NodeViewAcl; import org.dom4j.DocumentException; @@ -30,17 +26,8 @@ public class RepliesGet extends PubSubElementProcessorAbstract { - private Element resultSetManagement; - private String firstItem; - private String lastItem; - private int totalEntriesCount; - - private Date maxAge; - private Integer maxItems; - private Element pubsub; private SAXReader xmlReader; - private String nodeEnding = "/posts"; // RSM details private String firstItemId = null; @@ -79,7 +66,7 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) } try { - if (false == channelManager.isLocalJID(request.getFrom())) { + if (false == Configuration.getInstance().isLocalJID(request.getFrom())) { response.getElement().addAttribute("remote-server-discover", "false"); } @@ -197,7 +184,7 @@ private boolean userCanViewNode() throws NodeStoreException { if (nodeViewAcl.canViewNode(node, channelManager.getNodeMembership(node, actor), getNodeAccessModel(), - channelManager.isLocalJID(actor))) { + Configuration.getInstance().isLocalJID(actor))) { return true; } NodeAclRefuseReason reason = getNodeViewAcl().getReason(); diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGet.java index c46bd4c5..603b9f00 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGet.java @@ -2,16 +2,14 @@ import java.util.concurrent.BlockingQueue; -import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.JabberPubsub; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.PubSubElementProcessor; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.PubSubGet; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; -import org.buddycloud.channelserver.pubsub.model.NodeAffiliation; import org.buddycloud.channelserver.pubsub.model.NodeMembership; -import org.buddycloud.channelserver.pubsub.model.NodeSubscription; import org.buddycloud.channelserver.pubsub.subscription.Subscriptions; import org.buddycloud.channelserver.utils.node.item.payload.Buddycloud; import org.dom4j.Element; @@ -29,16 +27,7 @@ public class SubscriptionsGet implements PubSubElementProcessor { private String node; private JID actorJid; private IQ requestIq; - private Element resultSetManagement; - private String firstItem; - private String lastItem; - private int totalEntriesCount; - private Boolean isOwnerModerator;; - - private static final Logger logger = Logger - .getLogger(SubscriptionsGet.class); - public void setChannelManager(ChannelManager dataStore) { channelManager = dataStore; } @@ -55,7 +44,6 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) result = IQ.createResultIQ(reqIQ); actorJid = actorJID; requestIq = reqIQ; - resultSetManagement = rsm; Element pubsub = result.setChildElement(PubSubGet.ELEMENT_NAME, JabberPubsub.NAMESPACE_URI); @@ -72,7 +60,7 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) if (node == null) { isProcessedLocally = getUserMemberships(subscriptions); } else { - if (false == channelManager.isLocalNode(node)) { + if (false == Configuration.getInstance().isLocalNode(node)) { result.getElement().addAttribute("remote-server-discover", "false"); } isProcessedLocally = getNodeMemberships(subscriptions); @@ -84,7 +72,7 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) private boolean getNodeMemberships(Element subscriptions) throws NodeStoreException, InterruptedException { - if (false == channelManager.isLocalNode(node) + if (false == Configuration.getInstance().isLocalNode(node) && (false == channelManager.isCachedNode(node)) ) { makeRemoteRequest(new JID(node.split("/")[2]).getDomain()); @@ -97,7 +85,7 @@ private boolean getNodeMemberships(Element subscriptions) if ((null != requestIq.getElement().element("pubsub").element("set")) && (0 == cur.size()) - && (false == channelManager.isLocalNode(node))) { + && (false == Configuration.getInstance().isLocalNode(node))) { makeRemoteRequest(new JID(node.split("/")[2]).getDomain()); return false; } @@ -137,7 +125,7 @@ private boolean getUserMemberships(Element subscriptions) if ((null != requestIq.getElement().element("pubsub").element("set")) && (0 == cur.size()) - && (false == channelManager.isLocalJID(actorJid))) { + && (false == Configuration.getInstance().isLocalJID(actorJid))) { makeRemoteRequest(actorJid.getDomain()); return false; } diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/ThreadGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/ThreadGet.java index c1f1233e..a8361f0a 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/ThreadGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/ThreadGet.java @@ -1,30 +1,19 @@ package org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.get; import java.io.StringReader; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; import java.util.Map; -import java.util.TimeZone; import java.util.concurrent.BlockingQueue; import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; -import org.buddycloud.channelserver.channel.Conf; import org.buddycloud.channelserver.channel.node.configuration.field.AccessModel; import org.buddycloud.channelserver.db.CloseableIterator; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.JabberPubsub; -import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.PubSubElementProcessor; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.PubSubElementProcessorAbstract; -import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.PubSubGet; import org.buddycloud.channelserver.pubsub.accessmodel.AccessModels; -import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; -import org.buddycloud.channelserver.pubsub.model.NodeAffiliation; import org.buddycloud.channelserver.pubsub.model.NodeItem; -import org.buddycloud.channelserver.pubsub.model.NodeSubscription; -import org.buddycloud.channelserver.pubsub.subscription.Subscriptions; -import org.buddycloud.channelserver.queue.FederatedQueueManager; import org.buddycloud.channelserver.utils.node.NodeAclRefuseReason; import org.buddycloud.channelserver.utils.node.NodeViewAcl; import org.buddycloud.channelserver.utils.node.item.payload.Buddycloud; @@ -35,21 +24,11 @@ import org.xmpp.packet.JID; import org.xmpp.packet.Packet; import org.xmpp.packet.PacketError; -import org.xmpp.resultsetmanagement.ResultSet; public class ThreadGet extends PubSubElementProcessorAbstract { - private Element resultSetManagement; - private String firstItem; - private String lastItem; - private int totalEntriesCount; - - private Date maxAge; - private Integer maxItems; - private Element pubsub; private SAXReader xmlReader; - private String nodeEnding = "/posts"; // RSM details private String firstItemId = null; @@ -59,7 +38,6 @@ public class ThreadGet extends PubSubElementProcessorAbstract { private String parentId; private NodeViewAcl nodeViewAcl; private Map nodeConfiguration; - private NodeItem parentItem; private static final Logger logger = Logger.getLogger(RecentItemsGet.class); @@ -89,7 +67,7 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) } try { - if (false == channelManager.isLocalJID(request.getFrom())) { + if (false == Configuration.getInstance().isLocalJID(request.getFrom())) { response.getElement().addAttribute("remote-server-discover", "false"); } @@ -113,7 +91,9 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) } private boolean itemExists() throws NodeStoreException { - if (null != (parentItem = channelManager.getNodeItem(node, parentId))) return true; + if (null != channelManager.getNodeItem(node, parentId)) { + return true; + } createExtendedErrorReply(PacketError.Type.cancel, PacketError.Condition.item_not_found, "parent-item-not-found", Buddycloud.NS_ERROR); return false; @@ -206,7 +186,7 @@ private boolean userCanViewNode() throws NodeStoreException { if (getNodeViewAcl().canViewNode(node, channelManager.getNodeMembership(node, actor), getNodeAccessModel(), - channelManager.isLocalJID(actor))) { + Configuration.getInstance().isLocalJID(actor))) { return true; } NodeAclRefuseReason reason = getNodeViewAcl().getReason(); diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/UserItemsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/UserItemsGet.java index 5a14440a..7eddc868 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/UserItemsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/UserItemsGet.java @@ -5,6 +5,7 @@ import java.util.concurrent.BlockingQueue; import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.Conf; import org.buddycloud.channelserver.db.CloseableIterator; @@ -27,7 +28,6 @@ public class UserItemsGet extends PubSubElementProcessorAbstract { private static final Logger LOGGER = Logger.getLogger(UserItemsGet.class); - private static final String NODE_SUFFIX = "/posts"; private Date maxAge; @@ -66,7 +66,7 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) return; } - if (!channelManager.isLocalJID(request.getFrom())) { + if (!Configuration.getInstance().isLocalJID(request.getFrom())) { response.getElement().addAttribute("remote-server-discover", "false"); } diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java index 597033b1..8c55f360 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java @@ -5,6 +5,7 @@ import java.util.concurrent.BlockingQueue; import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.node.configuration.field.AccessModel; import org.buddycloud.channelserver.db.CloseableIterator; @@ -53,7 +54,6 @@ public class NodeItemsGet implements PubSubElementProcessor { private int rsmEntriesCount; private JID actor; - private Boolean isOwnerModerator; public NodeItemsGet(BlockingQueue outQueue, ChannelManager channelManager) { @@ -85,7 +85,7 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) element = elm; resultSetManagement = rsm; - if (!channelManager.isLocalJID(requestIq.getFrom())) { + if (!Configuration.getInstance().isLocalJID(requestIq.getFrom())) { reply.getElement().addAttribute("remote-server-discover", "false"); } @@ -96,7 +96,7 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) this.actor = requestIq.getFrom(); } - if (!channelManager.isLocalNode(node) && !isCached) { + if (!Configuration.getInstance().isLocalNode(node) && !isCached) { logger.debug("Node " + node + " is remote and not cached, off to get some data"); makeRemoteRequest(); @@ -135,7 +135,7 @@ private boolean getItem() throws Exception { NodeItem nodeItem = channelManager.getNodeItem(node, element.element("item").attributeValue("id")); if (nodeItem == null) { - if (!channelManager.isLocalNode(node)) { + if (!Configuration.getInstance().isLocalNode(node)) { makeRemoteRequest(); return false; } @@ -225,7 +225,7 @@ private void getItems() throws Exception { int totalEntriesCount = getNodeItems(items, maxItemsToReturn, afterItemId); - if ((false == channelManager.isLocalNode(node)) + if ((false == Configuration.getInstance().isLocalNode(node)) && (0 == rsmEntriesCount)) { logger.debug("No results in cache for remote node, so " + "we're going federated to get more"); @@ -261,7 +261,7 @@ private boolean userCanViewNode() throws NodeStoreException { actor); if (getNodeViewAcl().canViewNode(node, nodeMembership, - getNodeAccessModel(), channelManager.isLocalJID(actor))) { + getNodeAccessModel(), Configuration.getInstance().isLocalJID(actor))) { return true; } NodeAclRefuseReason reason = getNodeViewAcl().getReason(); @@ -322,11 +322,6 @@ private void addItemToResponse(NodeItem nodeItem, Element parent) { } } - private boolean isOwnerModerator() throws NodeStoreException { - return channelManager.getNodeMembership(node, actor).getAffiliation() - .canAuthorize(); - } - private void createExtendedErrorReply(Type type, Condition condition, String additionalElement) { reply.setType(IQ.Type.error); diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/SpecialItemsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/SpecialItemsGet.java index e0bb75b1..755816c3 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/SpecialItemsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/SpecialItemsGet.java @@ -1,39 +1,19 @@ package org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.get.items; -import java.io.StringReader; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.TimeZone; import java.util.concurrent.BlockingQueue; -import org.apache.log4j.Logger; import org.buddycloud.channelserver.channel.ChannelManager; -import org.buddycloud.channelserver.channel.Conf; -import org.buddycloud.channelserver.db.CloseableIterator; -import org.buddycloud.channelserver.db.exception.NodeStoreException; -import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.JabberPubsub; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.PubSubElementProcessor; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.PubSubElementProcessorAbstract; -import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.PubSubGet; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.get.items.special.FirehoseGet; -import org.buddycloud.channelserver.pubsub.model.NodeAffiliation; -import org.buddycloud.channelserver.pubsub.model.NodeItem; -import org.buddycloud.channelserver.pubsub.model.NodeSubscription; -import org.buddycloud.channelserver.queue.FederatedQueueManager; -import org.dom4j.DocumentException; import org.dom4j.Element; -import org.dom4j.io.SAXReader; import org.xmpp.packet.IQ; import org.xmpp.packet.JID; import org.xmpp.packet.Packet; import org.xmpp.packet.PacketError; -import org.xmpp.resultsetmanagement.ResultSet; public class SpecialItemsGet extends PubSubElementProcessorAbstract { - private static final Logger logger = Logger.getLogger(SpecialItemsGet.class); - private static final String FIREHOSE = "/firehose"; public SpecialItemsGet(BlockingQueue outQueue, diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java index f142d4aa..cc04ad99 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java @@ -4,6 +4,7 @@ import java.util.concurrent.BlockingQueue; import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.db.CloseableIterator; import org.buddycloud.channelserver.db.exception.NodeStoreException; @@ -54,7 +55,7 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) } determineAdminUserStatus(); - if (false == channelManager.isLocalJID(request.getFrom())) { + if (false == Configuration.getInstance().isLocalJID(request.getFrom())) { response.getElement().addAttribute("remote-server-discover", "false"); } diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/result/ItemsResult.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/result/ItemsResult.java index b9c07253..a2fbed0d 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/result/ItemsResult.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/result/ItemsResult.java @@ -4,6 +4,7 @@ import java.util.List; import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.Conf; import org.buddycloud.channelserver.db.exception.NodeStoreException; @@ -86,10 +87,10 @@ private void addSubscription(Element item, JID user) String node = item.attributeValue("node"); // If its a local JID and/or a local node, that's our turf! - if ((true == channelManager.isLocalNode(node)) - && (true == channelManager.isLocalJID(user))) + if ((true == Configuration.getInstance().isLocalNode(node)) + && (true == Configuration.getInstance().isLocalJID(user))) return; - if (true == channelManager.isLocalNode(node)) return; + if (true == Configuration.getInstance().isLocalNode(node)) return; JID listener = request.getFrom(); Subscriptions sub = Subscriptions.createFromString(item diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/result/SubscriptionsResult.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/result/SubscriptionsResult.java index 3ccddf35..e0004de6 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/result/SubscriptionsResult.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/result/SubscriptionsResult.java @@ -3,6 +3,7 @@ import java.util.List; import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.PubSubElementProcessorAbstract; @@ -62,7 +63,7 @@ private void addSubscription(Element subscription) JID jid = new JID(subscription.attributeValue("jid")); JID listener = request.getFrom(); - if (channelManager.isLocalJID(jid)) { + if (Configuration.getInstance().isLocalJID(jid)) { listener = jid; } JID invitedBy = null; diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/AffiliationEvent.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/AffiliationEvent.java index c8fc7348..5175b00b 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/AffiliationEvent.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/AffiliationEvent.java @@ -4,12 +4,12 @@ import java.util.concurrent.BlockingQueue; import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; 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; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; -import org.buddycloud.channelserver.pubsub.model.NodeAffiliation; import org.buddycloud.channelserver.pubsub.model.NodeMembership; import org.buddycloud.channelserver.pubsub.model.NodeSubscription; import org.buddycloud.channelserver.utils.node.item.payload.Buddycloud; @@ -63,13 +63,19 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) if (actor == null) { actor = request.getFrom(); } - if (false == channelManager.isLocalNode(node)) { + + if (false == nodeProvided()) { + outQueue.put(response); + return; + } + + if (false == Configuration.getInstance().isLocalNode(node)) { makeRemoteRequest(); return; } try { - if ((false == nodeProvided()) || (false == validRequestStanza()) + if ((false == validRequestStanza()) || (false == checkNodeExists()) || (false == actorHasPermissionToAuthorize()) || (false == subscriberHasCurrentAffiliation()) diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDelete.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDelete.java index 461703a8..5aa9fca4 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDelete.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDelete.java @@ -11,9 +11,7 @@ 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; -import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; import org.buddycloud.channelserver.pubsub.model.GlobalItemID; -import org.buddycloud.channelserver.pubsub.model.NodeAffiliation; import org.buddycloud.channelserver.pubsub.model.NodeItem; import org.buddycloud.channelserver.pubsub.model.NodeSubscription; import org.buddycloud.channelserver.pubsub.model.impl.GlobalItemIDImpl; @@ -55,14 +53,19 @@ public void process(Element elm, JID actor, IQ reqIQ, Element rsm) this.actor = actor; if (null == this.actor) { this.actor = request.getFrom(); - } - if (!channelManager.isLocalNode(node)) { + } + if (!validNodeProvided()) { + outQueue.put(response); + return; + } + + if (!Configuration.getInstance().isLocalNode(node)) { makeRemoteRequest(); return; } try { - if (!validNodeProvided() || !nodeExists() || !itemIdProvided() + if (!nodeExists() || !itemIdProvided() || !itemExists() || !validPayload() || !canDelete()) { outQueue.put(response); return; @@ -243,7 +246,7 @@ private boolean itemIdProvided() { } private boolean nodeExists() throws NodeStoreException { - if ((false == channelManager.isLocalNode(node)) + if ((false == Configuration.getInstance().isLocalNode(node)) || (false == channelManager.nodeExists(node))) { setErrorCondition(PacketError.Type.cancel, PacketError.Condition.item_not_found); diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeConfigure.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeConfigure.java index a494da75..a4dfb1b2 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeConfigure.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeConfigure.java @@ -6,6 +6,7 @@ import java.util.concurrent.BlockingQueue; import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.node.configuration.NodeConfigurationException; import org.buddycloud.channelserver.db.exception.NodeStoreException; @@ -13,7 +14,6 @@ import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.PubSubElementProcessorAbstract; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; import org.buddycloud.channelserver.pubsub.event.Event; -import org.buddycloud.channelserver.pubsub.model.NodeAffiliation; import org.buddycloud.channelserver.pubsub.model.NodeSubscription; import org.buddycloud.channelserver.utils.node.item.payload.Buddycloud; import org.dom4j.Document; @@ -50,12 +50,16 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) if (null == actor) { actor = request.getFrom(); } - if (!channelManager.isLocalNode(node)) { + if (!nodeProvided()) { + outQueue.put(response); + return; + } + if (!Configuration.getInstance().isLocalNode(node)) { makeRemoteRequest(); return; } try { - if (!nodeProvided() || !nodeExists() || !actorCanModify()) { + if (!nodeExists() || !actorCanModify()) { outQueue.put(response); return; } diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreate.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreate.java index c876212f..18744c7c 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreate.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreate.java @@ -3,6 +3,7 @@ import java.util.HashMap; import java.util.concurrent.BlockingQueue; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.Conf; import org.buddycloud.channelserver.channel.node.configuration.NodeConfigurationException; @@ -36,16 +37,18 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) request = reqIQ; actor = actorJID; node = element.attributeValue("node"); - if (null == actorJID) { actor = request.getFrom(); } - - if (false == channelManager.isLocalNode(node)) { + if (false == validateNode()) { + outQueue.put(response); + return; + } + if (false == Configuration.getInstance().isLocalNode(node)) { makeRemoteRequest(); return; } - if ((false == validateNode()) || (true == doesNodeExist()) + if ((true == doesNodeExist()) || (false == actorIsRegistered()) || (false == nodeHandledByThisServer())) { outQueue.put(response); 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 40558bde..a98a9023 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 @@ -3,13 +3,12 @@ import java.util.Collection; import java.util.concurrent.BlockingQueue; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; -import org.buddycloud.channelserver.channel.node.configuration.field.Affiliation; 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; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; -import org.buddycloud.channelserver.pubsub.model.NodeAffiliation; import org.buddycloud.channelserver.pubsub.model.NodeSubscription; import org.buddycloud.channelserver.utils.node.item.payload.Buddycloud; import org.dom4j.Element; @@ -44,11 +43,11 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) if (actorJID == null) { actor = request.getFrom(); } - if (!validateNode()) { + if (!nodePresent() || !nodeValid()) { outQueue.put(response); return; } - if (!channelManager.isLocalNode(node)) { + if (!Configuration.getInstance().isLocalNode(node)) { makeRemoteRequest(); return; } @@ -112,7 +111,7 @@ public boolean accept(Element elm) { return elm.getName().equals("delete"); } - private boolean validateNode() { + private boolean nodePresent() { if (node != null && !node.trim().equals("")) { return true; } @@ -161,16 +160,19 @@ private boolean actorAllowedToDelete() throws NodeStoreException { } private boolean nodeHandledByThisServer() { - if (!node.matches(NODE_REG_EX)) { + if (!node.contains("@" + getServerDomain()) + && !node.contains("@" + getTopicsDomain())) { setErrorCondition(PacketError.Type.modify, - PacketError.Condition.bad_request); + PacketError.Condition.not_acceptable); return false; } + return true; + } - if (!node.contains("@" + getServerDomain()) - && !node.contains("@" + getTopicsDomain())) { + private boolean nodeValid() { + if (!node.matches(NODE_REG_EX)) { setErrorCondition(PacketError.Type.modify, - PacketError.Condition.not_acceptable); + PacketError.Condition.bad_request); return false; } return true; diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/Publish.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/Publish.java index 4982e30c..2b019aff 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/Publish.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/Publish.java @@ -5,6 +5,7 @@ import java.util.concurrent.BlockingQueue; import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.ValidatePayload; import org.buddycloud.channelserver.channel.validate.PayloadValidator; @@ -68,7 +69,7 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) publishersJID = actorJID; } else { - isLocalSubscriber = channelManager.isLocalJID(publishersJID); + isLocalSubscriber = Configuration.getInstance().isLocalJID(publishersJID); // Check that user is registered. if (!isLocalSubscriber) { @@ -249,7 +250,7 @@ private boolean checkNode() throws InterruptedException, NodeStoreException { } boolean isLocalNode = false; try { - isLocalNode = channelManager.isLocalNode(node); + isLocalNode = Configuration.getInstance().isLocalNode(node); } catch (IllegalArgumentException e) { response.setType(Type.error); PacketError pe = new PacketError(PacketError.Condition.bad_request, diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscribeSet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscribeSet.java index 0cc1dbf3..1ed671cb 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscribeSet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscribeSet.java @@ -7,6 +7,7 @@ import java.util.concurrent.BlockingQueue; import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.Conf; import org.buddycloud.channelserver.db.exception.NodeStoreException; @@ -16,7 +17,6 @@ import org.buddycloud.channelserver.pubsub.accessmodel.AccessModels; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; import org.buddycloud.channelserver.pubsub.event.Event; -import org.buddycloud.channelserver.pubsub.model.NodeAffiliation; import org.buddycloud.channelserver.pubsub.model.NodeMembership; import org.buddycloud.channelserver.pubsub.model.NodeSubscription; import org.buddycloud.channelserver.pubsub.model.impl.NodeSubscriptionImpl; @@ -74,7 +74,7 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) if (actorJID != null) { subscribingJid = actorJID; } else { - isLocalSubscriber = channelManager.isLocalJID(subscribingJid); + isLocalSubscriber = Configuration.getInstance().isLocalJID(subscribingJid); // Check that user is registered. if (!isLocalSubscriber) { failAuthRequired(); @@ -158,7 +158,7 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) .toString()))) { defaultSubscription = Subscriptions.pending; } else if ((true == accessModel.equals(AccessModels.local - .toString()) && (false == channelManager + .toString()) && (false == Configuration.getInstance() .isLocalJID(subscribingJid)))) { defaultSubscription = Subscriptions.pending; } @@ -207,7 +207,7 @@ private boolean handleNodeSubscription(Element elm, JID actorJID, JID subscribingJid) throws NodeStoreException, InterruptedException { boolean isLocalNode = false; try { - isLocalNode = channelManager.isLocalNode(node); + isLocalNode = Configuration.getInstance().isLocalNode(node); } catch (IllegalArgumentException e) { LOGGER.debug(e); createExtendedErrorReply(PacketError.Type.modify, diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscriptionEvent.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscriptionEvent.java index 2cbc3ed0..1e015481 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscriptionEvent.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscriptionEvent.java @@ -4,6 +4,7 @@ import java.util.concurrent.BlockingQueue; import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.JabberPubsub; @@ -65,12 +66,17 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) if (actor == null) { actor = request.getFrom(); } - if (false == channelManager.isLocalNode(node)) { + if (false == nodeProvided()) { + outQueue.put(response); + return; + } + + if (false == Configuration.getInstance().isLocalNode(node)) { makeRemoteRequest(); return; } try { - if ((false == nodeProvided()) || (false == validRequestStanza()) + if ((false == validRequestStanza()) || (false == checkNodeExists()) || (false == actorHasPermissionToAuthorize()) || (true == actorIsModifyingTheirSubscription()) @@ -155,7 +161,7 @@ private void sendNotifications() throws Exception { JID to = jid; alertInvitedUser.getElement().attribute("remote-server-discover") .detach(); - if (!channelManager.isLocalJID(jid)) { + if (!Configuration.getInstance().isLocalJID(jid)) { to = invitedUsersDomain; } alertInvitedUser.setTo(to); diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/UnsubscribeSet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/UnsubscribeSet.java index 4f5562b9..c59d6dda 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/UnsubscribeSet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/UnsubscribeSet.java @@ -3,7 +3,7 @@ import java.util.Collection; import java.util.concurrent.BlockingQueue; -import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.PubSubElementProcessorAbstract; @@ -17,7 +17,6 @@ import org.dom4j.Document; import org.dom4j.Element; import org.xmpp.packet.IQ; -import org.xmpp.packet.IQ.Type; import org.xmpp.packet.JID; import org.xmpp.packet.Message; import org.xmpp.packet.Packet; @@ -26,7 +25,6 @@ public class UnsubscribeSet extends PubSubElementProcessorAbstract { - private static final Logger logger = Logger.getLogger(UnsubscribeSet.class); public static final String NODE_ID_REQUIRED = "nodeid-required"; public static final String CAN_NOT_UNSUBSCRIBE_ANOTHER_USER = "can-only-unsubscribe-self"; public static String MUST_HAVE_ONE_OWNER = "node-must-have-owner"; @@ -54,12 +52,11 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) } JID from = request.getFrom(); - if ((false == node.equals("/firehose")) && (false == channelManager.isLocalNode(node))) { + if ((false == node.equals("/firehose")) + && (false == Configuration.getInstance().isLocalNode(node))) { makeRemoteRequest(); return; } - boolean isLocalSubscriber = false; - if (actorJID != null) { from = actorJID; } @@ -81,8 +78,6 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) NodeMembership membership = channelManager.getNodeMembership(node, unsubscribingJid); - String fromJID = request.getFrom().toBareJID(); - // Check that the requesting user is allowed to unsubscribe according to // XEP-0060 section 6.2.3.3 diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/RegisterSet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/RegisterSet.java index f5816d9e..389720d8 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/RegisterSet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/RegisterSet.java @@ -7,7 +7,6 @@ import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.Conf; -import org.buddycloud.channelserver.channel.LocalDomainChecker; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetprocessor.PacketProcessor; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.JabberPubsub; @@ -51,7 +50,7 @@ public void process(IQ reqIQ) throws Exception { LOGGER.debug("Processing register request from " + request.getFrom()); String domain = reqIQ.getFrom().getDomain(); - if (!channelManager.isLocalDomain(domain)) { + if (!Configuration.getInstance().isLocalDomain(domain)) { notThisDomain(reqIQ); return; } @@ -130,7 +129,7 @@ private void autosubscribeToChannels(final JID from) { subscribeEl.addAttribute("jid", from.toBareJID().toString()); try { - if (channelManager.isLocalJID(channel)) { + if (Configuration.getInstance().isLocalJID(channel)) { subscribe.setFrom(from); subscribe.setTo(configuration.getServerChannelsDomain()); } else { @@ -150,7 +149,7 @@ private void autosubscribeToChannels(final JID from) { if (configuration.getBooleanProperty( Configuration.CONFIGURATION_CHANNELS_AUTOSUBSCRIBE_AUTOAPPROVE, false) - && channelManager.isLocalJID(channel) + && Configuration.getInstance().isLocalJID(channel) && AccessModels.authorize.toString().equals( channelManager.getNodeConfValue(channelNodeId, Conf.ACCESS_MODEL))) { diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/UnregisterSet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/UnregisterSet.java index ed7b304b..42c4a29b 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/UnregisterSet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/UnregisterSet.java @@ -18,7 +18,6 @@ import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.JabberPubsub; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; import org.buddycloud.channelserver.pubsub.event.Event; -import org.buddycloud.channelserver.pubsub.model.NodeAffiliation; import org.buddycloud.channelserver.pubsub.model.NodeItem; import org.buddycloud.channelserver.pubsub.model.NodeMembership; import org.buddycloud.channelserver.pubsub.model.NodeSubscription; @@ -99,7 +98,7 @@ private void unregister(IQ request, JID actorJID, boolean isRemote) throws Excep String nodeId = userMembership.getNodeId(); if (isPersonal(nodeId) || isSingleOwner(nodeId, actorJID)) { channelManager.deleteNode(nodeId); - if (channelManager.isLocalNode(nodeId)) { + if (Configuration.getInstance().isLocalNode(nodeId)) { addDeleteNodeNotifications(nodeId, notifications); } } @@ -111,7 +110,7 @@ private void unregister(IQ request, JID actorJID, boolean isRemote) throws Excep ResultSet userItems = channelManager.getUserPublishedItems(actorJID); for (NodeItem userItem : userItems) { - if (channelManager.isLocalNode(userItem.getNodeId())) { + if (Configuration.getInstance().isLocalNode(userItem.getNodeId())) { addDeleteItemNotifications(userItem.getNodeId(), userItem.getId(), notifications); } } @@ -158,7 +157,7 @@ private Set getRemoteDomains() throws NodeStoreException { Set remoteDomains = new HashSet(); for (String node : nodeList) { try { - if (!channelManager.isLocalNode(node)) { + if (!Configuration.getInstance().isLocalNode(node)) { remoteDomains.add(new JID(node.split("/")[2]).getDomain()); } } catch (IllegalArgumentException e) { diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/Search.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/Search.java index 590b243f..29653fa2 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/Search.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/Search.java @@ -1,23 +1,12 @@ package org.buddycloud.channelserver.packetprocessor.iq.namespace.search; -import java.util.Collection; import java.util.concurrent.BlockingQueue; import org.apache.log4j.Logger; -import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; -import org.buddycloud.channelserver.channel.Conf; -import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetprocessor.PacketProcessor; -import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.JabberPubsub; -import org.buddycloud.channelserver.pubsub.accessmodel.AccessModels; -import org.buddycloud.channelserver.pubsub.model.impl.NodeSubscriptionImpl; -import org.buddycloud.channelserver.pubsub.subscription.Subscriptions; -import org.dom4j.Element; -import org.dom4j.QName; import org.xmpp.packet.IQ; import org.xmpp.packet.IQ.Type; -import org.xmpp.packet.JID; import org.xmpp.packet.Packet; import org.xmpp.packet.PacketError; @@ -29,7 +18,6 @@ public class Search implements PacketProcessor { public static final String NAMESPACE_URI = "jabber:iq:search"; private final BlockingQueue outQueue; - private final ChannelManager channelManager; private IQ request; private SearchGet searchGet; @@ -38,9 +26,7 @@ public class Search implements PacketProcessor { public Search(BlockingQueue outQueue, ChannelManager channelManager) { this.outQueue = outQueue; - this.channelManager = channelManager; - - this.searchGet = new SearchGet(outQueue, channelManager); + this.searchGet = new SearchGet(outQueue); this.searchSet = new SearchSet(outQueue, channelManager); } diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchGet.java index 60258d5b..b55e563a 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchGet.java @@ -2,14 +2,13 @@ import java.util.concurrent.BlockingQueue; -import org.buddycloud.channelserver.channel.ChannelManager; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.packetprocessor.PacketProcessor; import org.dom4j.Element; import org.xmpp.forms.DataForm; import org.xmpp.packet.IQ; import org.xmpp.packet.Packet; import org.xmpp.packet.PacketError; -import org.xmpp.packet.PacketError.Type; public class SearchGet implements PacketProcessor { @@ -21,15 +20,12 @@ public class SearchGet implements PacketProcessor { public static final String RPP_FIELD_LABEL = "Results per page"; public static final String PAGE_FIELD_LABEL = "Page"; - private ChannelManager channelManager; private BlockingQueue outQueue; private IQ response; private Element x; - public SearchGet(BlockingQueue outQueue, - ChannelManager channelManager) { - this.channelManager = channelManager; + public SearchGet(BlockingQueue outQueue) { this.outQueue = outQueue; } @@ -37,7 +33,7 @@ public SearchGet(BlockingQueue outQueue, public void process(IQ request) throws Exception { response = IQ.createResultIQ(request); - if (false == channelManager.isLocalJID(request.getFrom())) { + if (false == Configuration.getInstance().isLocalJID(request.getFrom())) { sendErrorResponse(PacketError.Type.cancel, PacketError.Condition.not_allowed); return; diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchSet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchSet.java index d6539c75..7ae19e8e 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchSet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchSet.java @@ -2,11 +2,11 @@ import java.io.StringReader; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.concurrent.BlockingQueue; import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.db.CloseableIterator; import org.buddycloud.channelserver.db.exception.NodeStoreException; @@ -17,7 +17,6 @@ import org.dom4j.io.SAXReader; import org.dom4j.tree.DefaultElement; import org.xmpp.forms.DataForm; -import org.xmpp.forms.FormField; import org.xmpp.packet.IQ; import org.xmpp.packet.JID; import org.xmpp.packet.Packet; @@ -29,7 +28,6 @@ public class SearchSet implements PacketProcessor { private BlockingQueue outQueue; private IQ responseIq; private Element x; - private Element query; private IQ requestIq; private ArrayList content = new ArrayList(); private int page = 1; @@ -72,7 +70,7 @@ public void process(IQ request) throws Exception { private boolean isValidRequest() throws Exception { - if (false == channelManager.isLocalJID(searcher)) { + if (false == Configuration.getInstance().isLocalJID(searcher)) { sendErrorResponse(PacketError.Type.cancel, PacketError.Condition.not_allowed); return false; diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/AbstractMessageProcessor.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/AbstractMessageProcessor.java index 7a1901b8..be5c4eee 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/AbstractMessageProcessor.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/AbstractMessageProcessor.java @@ -8,7 +8,6 @@ import org.buddycloud.channelserver.packetprocessor.PacketProcessor; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; import org.buddycloud.channelserver.pubsub.model.NodeMembership; -import org.buddycloud.channelserver.pubsub.model.NodeSubscription; import org.buddycloud.channelserver.pubsub.subscription.Subscriptions; import org.buddycloud.channelserver.utils.NotificationScheme; import org.xmpp.packet.JID; @@ -16,10 +15,8 @@ import org.xmpp.packet.Packet; import org.xmpp.resultsetmanagement.ResultSet; -abstract public class AbstractMessageProcessor implements PacketProcessor { +public abstract class AbstractMessageProcessor implements PacketProcessor { - - protected Message message; protected String node; protected ChannelManager channelManager; @@ -49,11 +46,13 @@ void sendLocalNotifications(NotificationScheme scheme, JID user) throws Exceptio .getProperty(Configuration.CONFIGURATION_SERVER_CHANNELS_DOMAIN))); for (NodeMembership member : members) { - if (false == channelManager.isLocalJID(member.getUser())) continue; - + if (false == Configuration.getInstance().isLocalJID(member.getUser())) { + continue; + } if (scheme.equals(NotificationScheme.validSubscribers) && !userIsValidSubscriber(member)) { continue; - } else if (scheme.equals(NotificationScheme.ownerOrModerator) && !userIsOwnerOrModerator(member)) { + } + if (scheme.equals(NotificationScheme.ownerOrModerator) && !userIsOwnerOrModerator(member)) { continue; } diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/AffiliationProcessor.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/AffiliationProcessor.java index cdec8e41..2c83ae52 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/AffiliationProcessor.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/AffiliationProcessor.java @@ -3,11 +3,10 @@ import java.util.Properties; import java.util.concurrent.BlockingQueue; -import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; -import org.buddycloud.channelserver.pubsub.subscription.Subscriptions; import org.buddycloud.channelserver.utils.NotificationScheme; import org.dom4j.Element; import org.xmpp.packet.JID; @@ -19,9 +18,6 @@ public class AffiliationProcessor extends AbstractMessageProcessor { private JID jid; private Affiliations affiliation; - private static final Logger logger = Logger - .getLogger(AffiliationProcessor.class); - public AffiliationProcessor(BlockingQueue outQueue, Properties configuration, ChannelManager channelManager) { super(channelManager, configuration, outQueue); @@ -33,7 +29,7 @@ public void process(Message packet) throws Exception { handleAffiliationElement(); - if (true == channelManager.isLocalNode(node)) { + if (true == Configuration.getInstance().isLocalNode(node)) { return; } if (null == affiliation) { @@ -50,14 +46,14 @@ private void handleAffiliationElement() throws NodeStoreException { Element affiliationsElement = message.getElement().element("event") .element("affiliations"); Element affiliationElement = affiliationsElement.element("affiliation"); + node = affiliationsElement.attributeValue("node"); if (null == affiliationElement) { return; } jid = new JID(affiliationElement.attributeValue("jid")); - node = affiliationsElement.attributeValue("node"); affiliation = Affiliations.valueOf(affiliationElement .attributeValue("affiliation")); - if (true == channelManager.isLocalNode(node)) { + if (true == Configuration.getInstance().isLocalNode(node)) { return; } storeNewAffiliation(); diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/ConfigurationProcessor.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/ConfigurationProcessor.java index dc2b4ae9..58761af7 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/ConfigurationProcessor.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/ConfigurationProcessor.java @@ -4,6 +4,7 @@ import java.util.concurrent.BlockingQueue; import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.node.configuration.Helper; import org.buddycloud.channelserver.db.exception.NodeStoreException; @@ -34,7 +35,7 @@ public void process(Message packet) throws Exception { message = packet; getPacketDetails(); - if ((null == node) || (true == channelManager.isLocalNode(node))) { + if ((null == node) || (true == Configuration.getInstance().isLocalNode(node))) { return; } sendLocalNotifications(NotificationScheme.validSubscribers); @@ -52,8 +53,7 @@ private void getPacketDetails() { } private void handleDataForm() throws NodeStoreException { - - if (true == channelManager.isLocalNode(node)) { + if (true == Configuration.getInstance().isLocalNode(node)) { return; } setNodeConfiguration(); diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/DeleteProcessor.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/DeleteProcessor.java index fa2338a4..d6858d9b 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/DeleteProcessor.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/DeleteProcessor.java @@ -3,6 +3,7 @@ import java.util.Properties; import java.util.concurrent.BlockingQueue; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.utils.NotificationScheme; @@ -21,7 +22,7 @@ public DeleteProcessor(BlockingQueue outQueue, public void process(Message packet) throws Exception { message = packet; deleteNode(); - if (!channelManager.isLocalNode(node)) { + if (!Configuration.getInstance().isLocalNode(node)) { sendLocalNotifications(NotificationScheme.validSubscribers); } } @@ -33,7 +34,7 @@ private void deleteNode() throws NodeStoreException { return; } node = deleteElement.attributeValue("node"); - if (channelManager.isLocalNode(node)) { + if (Configuration.getInstance().isLocalNode(node)) { return; } channelManager.deleteNode(node); diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/ItemsProcessor.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/ItemsProcessor.java index 5a94a201..84e5f451 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/ItemsProcessor.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/ItemsProcessor.java @@ -5,6 +5,7 @@ import java.util.concurrent.BlockingQueue; import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.Conf; import org.buddycloud.channelserver.db.exception.ItemNotFoundException; @@ -32,8 +33,9 @@ public void process(Message packet) throws Exception { node = message.getElement().element("event").element("items") .attributeValue("node"); - if (true == channelManager.isLocalNode(node)) + if (true == Configuration.getInstance().isLocalNode(node)) { return; + } sendLocalNotifications(NotificationScheme.validSubscribers); handleItem(); } diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/RetractItemProcessor.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/RetractItemProcessor.java index 57cc591b..fb7a0d66 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/RetractItemProcessor.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/RetractItemProcessor.java @@ -3,7 +3,7 @@ import java.util.Properties; import java.util.concurrent.BlockingQueue; -import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.utils.NotificationScheme; @@ -12,9 +12,6 @@ public class RetractItemProcessor extends AbstractMessageProcessor { - private static final Logger logger = Logger - .getLogger(RetractItemProcessor.class); - public RetractItemProcessor(BlockingQueue outQueue, Properties configuration, ChannelManager channelManager) { super(channelManager, configuration, outQueue); @@ -25,8 +22,9 @@ public void process(Message packet) throws Exception { message = packet; node = message.getElement().element("event").element("items") .attributeValue("node"); - if (true == channelManager.isLocalNode(node)) + if (true == Configuration.getInstance().isLocalNode(node)) { return; + } sendLocalNotifications(NotificationScheme.validSubscribers); handleItem(); } diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/SubscriptionProcessor.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/SubscriptionProcessor.java index a23676ce..5ebfdce8 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/SubscriptionProcessor.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/SubscriptionProcessor.java @@ -4,6 +4,7 @@ import java.util.concurrent.BlockingQueue; import org.apache.log4j.Logger; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.pubsub.model.impl.NodeSubscriptionImpl; @@ -34,13 +35,13 @@ public void process(Message packet) throws Exception { handleSubscriptionElement(); - if (true == channelManager.isLocalNode(node)) { + if (null == subscription) { return; } - - if (null == subscription) { + if (true == Configuration.getInstance().isLocalNode(node)) { return; - } else if (subscription.equals(Subscriptions.pending)) { + } + if (subscription.equals(Subscriptions.pending)) { sendLocalNotifications(NotificationScheme.ownerOrModerator, jid); } else if (subscription.equals(Subscriptions.invited)) { sendLocalNotifications(NotificationScheme.ownerOrModerator, jid); @@ -66,7 +67,7 @@ private void handleSubscriptionElement() throws NodeStoreException { invitedBy = new JID(subscriptionElement.attributeValue("invited-by")); } - if (true == channelManager.isLocalNode(node)) { + if (true == Configuration.getInstance().isLocalNode(node)) { return; } storeNewSubscription(); diff --git a/src/test/java/org/buddycloud/channelserver/channel/ChannelManagerImplTest.java b/src/test/java/org/buddycloud/channelserver/channel/ChannelManagerImplTest.java index 4fee3a7b..26a9fc9e 100644 --- a/src/test/java/org/buddycloud/channelserver/channel/ChannelManagerImplTest.java +++ b/src/test/java/org/buddycloud/channelserver/channel/ChannelManagerImplTest.java @@ -30,9 +30,6 @@ public class ChannelManagerImplTest { @Mock NodeStore nodeStore; - @Mock - Configuration configuration; - String user1 = "/user/user@" + TEST_DOMAIN + "/posts"; String user2 = "/user/user@server2.com/posts"; String user3 = "/user/user@topics.server3.com/posts"; @@ -47,11 +44,16 @@ public class ChannelManagerImplTest { @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - channelManager = new ChannelManagerImpl(nodeStore, configuration); + channelManager = new ChannelManagerImpl(nodeStore); // This is used loads - when(configuration.getProperty(Configuration.CONFIGURATION_SERVER_DOMAIN)).thenReturn(TEST_DOMAIN); - when(configuration.getProperty(Configuration.CONFIGURATION_SERVER_TOPICS_DOMAIN)).thenReturn(TEST_TOPICS_DOMAIN); + 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 @@ -82,9 +84,9 @@ public void testCreatePersonalChannelFailsForRemoteUser() throws Exception { @Test public void testCreatePersonalWorksForExternallyValidatedDomain() throws Exception { - when(configuration.getProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER)).thenReturn( - Boolean.TRUE.toString()); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, + Boolean.TRUE.toString()); JID channelJID = new JID("testchannel@otherdomain.com"); channelManager.createPersonalChannel(channelJID); } @@ -107,27 +109,27 @@ public void testCreatePersonalChannelSomeNodesExist() throws Exception { @Test public void testIsLocalNodeSuccess() throws Exception { - assertTrue(channelManager.isLocalNode("/user/test@domain.com/posts")); + assertTrue(Configuration.getInstance().isLocalNode("/user/test@domain.com/posts")); } @Test public void testIsLocalNodeFailure() throws Exception { - assertFalse(channelManager.isLocalNode("/user/test@otherdomain.com/posts")); + assertFalse(Configuration.getInstance().isLocalNode("/user/test@otherdomain.com/posts")); } @Test(expected=IllegalArgumentException.class) public void testIsLocalNodeWithInvalidNodeThrowsException() throws Exception { - channelManager.isLocalNode("somerandomnodeid"); + Configuration.getInstance().isLocalNode("somerandomnodeid"); } @Test public void testIsLocalJidForLocaJid() throws Exception { - assertTrue(channelManager.isLocalJID(new JID("user@" + TEST_DOMAIN))); + assertTrue(Configuration.getInstance().isLocalJID(new JID("user@" + TEST_DOMAIN))); } @Test public void testIsLocalJidForNonLocaJid() throws Exception { - assertFalse(channelManager.isLocalJID(new JID("user@server1.com"))); + assertFalse(Configuration.getInstance().isLocalJID(new JID("user@server1.com"))); } @Test diff --git a/src/test/java/org/buddycloud/channelserver/channel/TestHelper.java b/src/test/java/org/buddycloud/channelserver/channel/TestHelper.java index 452bf19c..56c706b6 100644 --- a/src/test/java/org/buddycloud/channelserver/channel/TestHelper.java +++ b/src/test/java/org/buddycloud/channelserver/channel/TestHelper.java @@ -69,7 +69,8 @@ public NodeStore create() { }; try { - channelManagerFactory = new ChannelManagerFactoryImpl(IQTestHandler.readConf(), nsFactory); + IQTestHandler.readConf(); + channelManagerFactory = new ChannelManagerFactoryImpl(nsFactory); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); diff --git a/src/test/java/org/buddycloud/channelserver/packetHandler/iq/TestHandler.java b/src/test/java/org/buddycloud/channelserver/packetHandler/iq/TestHandler.java index 6dde8274..63f9932c 100644 --- a/src/test/java/org/buddycloud/channelserver/packetHandler/iq/TestHandler.java +++ b/src/test/java/org/buddycloud/channelserver/packetHandler/iq/TestHandler.java @@ -23,6 +23,7 @@ public class TestHandler { public static Properties readConf() throws FileNotFoundException, IOException { + Configuration.reset(); Configuration conf = Configuration.getInstance(); try { conf.load(new FileInputStream(CONFIGURATION_PROPERTIES)); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGetTest.java index 50c9fe89..8dd569ea 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGetTest.java @@ -76,8 +76,6 @@ public void testOnlyReturnsLocalNodes() throws Exception { nodes.add("/user/user2@server1.com/posts"); Mockito.when(channelManager.getNodeList()).thenReturn(nodes); - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(false); discoItems.process(request); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/mam/MessageArchiveManagementTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/mam/MessageArchiveManagementTest.java index fb55112c..119694f1 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/mam/MessageArchiveManagementTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/mam/MessageArchiveManagementTest.java @@ -1,18 +1,15 @@ package org.buddycloud.channelserver.packetprocessor.iq.namespace.mam; import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; -import java.util.Iterator; import java.util.LinkedList; -import java.util.List; -import java.util.TimeZone; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import junit.framework.Assert; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.ChannelManagerImpl; import org.buddycloud.channelserver.channel.Conf; @@ -70,9 +67,6 @@ public void setUp() throws Exception { request = readStanzaAsIq("/iq/mam/request.stanza"); - Mockito.when(channelManager.isLocalJID(Mockito.any(JID.class))) - .thenReturn(true); - noAffiliations = new ResultSetImpl( new ArrayList()); noSubscriptions = new ResultSetImpl( @@ -102,12 +96,15 @@ public void setUp() throws Exception { Mockito.when( channelManager.getNodeMembership(Mockito.anyString(), Mockito.any(JID.class))).thenReturn(membership); + + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); } @Test public void testRequestsOnlyHonouredForLocalUsers() throws Exception { - Mockito.when(channelManager.isLocalJID(Mockito.any(JID.class))) - .thenReturn(false); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); mam.process(request); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeConfigureGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeConfigureGetTest.java index a9a0f141..e9f700f1 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeConfigureGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeConfigureGetTest.java @@ -8,6 +8,7 @@ import junit.framework.Assert; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; import org.buddycloud.channelserver.pubsub.accessmodel.AccessModels; @@ -37,6 +38,8 @@ public void setUp() throws Exception { element = new BaseElement("configure"); channelManager = Mockito.mock(ChannelManager.class); configureGet.setChannelManager(channelManager); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); } @After @@ -75,8 +78,6 @@ public void testInexistentNodeAttributeReturnsErrorStanza() IQ request = readStanzaAsIq("/iq/pubsub/configure/request-with-node.stanza"); Element configure = request.getChildElement().element("configure"); - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(true); configureGet.process(configure, jid, request, null); Packet response = queue.poll(); @@ -93,8 +94,8 @@ public void testRemoteNodeNoError() throws Exception { IQ request = readStanzaAsIq("/iq/pubsub/configure/request-with-node.stanza"); Element configure = request.getChildElement().element("configure"); - String node = configure.attributeValue("node"); - Mockito.when(channelManager.isLocalNode(node)).thenReturn(false); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); configureGet.process(configure, jid, request, null); Packet response = queue.poll(); @@ -124,7 +125,6 @@ public void testLocalNodeNoError() throws Exception { conf.put("pubsub#att2", "value2"); String node = configure.attributeValue("node"); - Mockito.when(channelManager.isLocalNode(node)).thenReturn(true); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); Mockito.when(channelManager.getNodeConf(node)).thenReturn(conf); @@ -152,8 +152,10 @@ public void testLocalNodeNoError() throws Exception { public void testLocalAccessModelGetsReportedAsAuthorizeToRemoveUsers() throws Exception { - Mockito.when(channelManager.isLocalJID(Mockito.any(JID.class))) - .thenReturn(false); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); IQ request = readStanzaAsIq("/iq/pubsub/configure/request-with-node.stanza"); Element configure = request.getChildElement().element("configure"); @@ -162,7 +164,6 @@ public void testLocalAccessModelGetsReportedAsAuthorizeToRemoveUsers() conf.put("pubsub#access_model", AccessModels.local.toString()); String node = configure.attributeValue("node"); - Mockito.when(channelManager.isLocalNode(node)).thenReturn(true); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); Mockito.when(channelManager.getNodeConf(node)).thenReturn(conf); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeThreadsGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeThreadsGetTest.java index 1aae5bf3..60c3df9c 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeThreadsGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeThreadsGetTest.java @@ -10,6 +10,7 @@ import junit.framework.Assert; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.node.configuration.field.AccessModel; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; @@ -45,9 +46,9 @@ public class NodeThreadsGetTest extends IQTestHandler { public void setUp() throws Exception { this.queue = new LinkedBlockingQueue(); this.channelManager = Mockito.mock(ChannelManager.class); - Mockito.when(channelManager.isLocalNode(Mockito.anyString())).thenReturn(true); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); Mockito.when(channelManager.nodeExists(Mockito.anyString())).thenReturn(true); - Mockito.when(channelManager.isLocalJID(Mockito.any(JID.class))).thenReturn(true); request = readStanzaAsIq("/iq/pubsub/threads/request-with-node.stanza"); node = request.getChildElement().attributeValue("node"); @@ -73,8 +74,6 @@ public void testPassingNoThreadsAsElementName() { public void testMissingNodeAttribute() throws Exception { IQ request = readStanzaAsIq("/iq/pubsub/threads/request-no-node.stanza"); - Mockito.when(channelManager.isLocalJID(request.getFrom())).thenReturn(true); - threadsGet.process(element, request.getFrom(), request, null); Packet response = queue.poll(); @@ -217,8 +216,8 @@ public void testSucessfulNonEmptyResponse() throws Exception { @Test public void testRemoteNodeNoError() throws Exception { - - Mockito.when(channelManager.isLocalNode(Mockito.anyString())).thenReturn(false); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); Mockito.when(channelManager.isCachedNode(Mockito.anyString())).thenReturn(false); JID from = request.getFrom(); threadsGet.process(element, from, request, null); @@ -245,7 +244,10 @@ public void testRemoteNodeNoError() throws Exception { @Test public void testRemoteRequest() throws Exception { JID from = request.getFrom(); - Mockito.when(channelManager.isLocalJID(from)).thenReturn(false); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); Map conf = new HashMap(); conf.put(AccessModel.FIELD_NAME, AccessModels.open.toString()); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGetTest.java index 8f25ffa9..78a44229 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGetTest.java @@ -6,6 +6,7 @@ import junit.framework.Assert; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; @@ -15,7 +16,6 @@ import org.dom4j.Element; import org.dom4j.tree.BaseElement; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.mockito.Mockito; import org.xmpp.packet.IQ; @@ -45,10 +45,8 @@ public void setUp() throws Exception { element = new BaseElement("subscriptions"); channelManager = Mockito.mock(ChannelManager.class); - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(true); - Mockito.when(channelManager.isLocalJID(Mockito.any(JID.class))) - .thenReturn(true); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); NodeMembership nodeMembership = new NodeMembershipImpl(node, jid, Subscriptions.subscribed, Affiliations.member, null); @@ -100,10 +98,12 @@ public void addsInvitedByToUserSubscriptionsList() throws Exception { @Test public void remoteNodeForwardsStanza() throws Exception { - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(false); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, + Boolean.FALSE.toString()); + Mockito.when(channelManager.isCachedNode(Mockito.anyString())) - .thenReturn(false); + .thenReturn(false); subscriptionsGet.process(element, jid, nodeRequest, null); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGetTest.java index f93a085e..07f7b11d 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGetTest.java @@ -12,6 +12,7 @@ import junit.framework.Assert; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.db.ClosableIteratorImpl; import org.buddycloud.channelserver.db.CloseableIterator; @@ -65,10 +66,8 @@ public void setUp() throws Exception { element = new BaseElement("items"); channelManager = Mockito.mock(ChannelManager.class); - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(true); - Mockito.when(channelManager.isLocalJID(Mockito.any(JID.class))) - .thenReturn(true); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); itemsGet.setChannelManager(channelManager); ArrayList nodeMemberships = new ArrayList(); @@ -105,8 +104,8 @@ public void testPassingNotItemsAsElementNameReturnsFalse() { @Test public void testExternalNodeReturnsExpectedStanzaEarly() throws Exception { - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(false); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); element.addAttribute("node", "/user/user@remote-server.com/posts"); @@ -429,8 +428,6 @@ public void canRetrieveSingleItem() throws Exception { element.addAttribute("node", node); element.addElement("item").addAttribute("id", id); - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(true); Mockito.when(channelManager.nodeExists(Mockito.anyString())) .thenReturn(true); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/UserSingleItemGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/UserSingleItemGetTest.java index c9bdb155..218b5ee1 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/UserSingleItemGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/UserSingleItemGetTest.java @@ -6,6 +6,7 @@ import junit.framework.Assert; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.JabberPubsub; @@ -50,10 +51,8 @@ public void setUp() throws Exception { channelManager = Mockito.mock(ChannelManager.class); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(true); - Mockito.when(channelManager.isLocalJID(Mockito.any(JID.class))) - .thenReturn(true); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( new NodeMembershipImpl(node, jid, Subscriptions.subscribed, Affiliations.member, null)); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/result/ItemsResultTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/result/ItemsResultTest.java index 1e7ad277..0670f0b5 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/result/ItemsResultTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/result/ItemsResultTest.java @@ -37,6 +37,10 @@ public void setUp() throws Exception { channelManager = Mockito.mock(ChannelManager.class); itemsResult.setChannelManager(channelManager); + + org.buddycloud.channelserver.Configuration.getInstance().putProperty( + org.buddycloud.channelserver.Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, + Boolean.FALSE.toString()); } @Test diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/AffiliationEventTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/AffiliationEventTest.java index 84371020..369cc128 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/AffiliationEventTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/AffiliationEventTest.java @@ -5,10 +5,10 @@ import java.util.ArrayList; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.TimeUnit; import junit.framework.Assert; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; @@ -48,8 +48,8 @@ public class AffiliationEventTest extends IQTestHandler { public void setUp() throws Exception { channelManager = Mockito.mock(ChannelManager.class); - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(true); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); Mockito.when(channelManager.nodeExists(Mockito.anyString())) .thenReturn(true); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDeleteTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDeleteTest.java index 4206dc05..ad6e5171 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDeleteTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDeleteTest.java @@ -8,15 +8,14 @@ import junit.framework.Assert; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.db.ClosableIteratorImpl; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; -import org.buddycloud.channelserver.pubsub.model.NodeAffiliation; import org.buddycloud.channelserver.pubsub.model.NodeItem; import org.buddycloud.channelserver.pubsub.model.NodeSubscription; -import org.buddycloud.channelserver.pubsub.model.impl.NodeAffiliationImpl; import org.buddycloud.channelserver.pubsub.model.impl.NodeItemImpl; import org.buddycloud.channelserver.pubsub.model.impl.NodeMembershipImpl; import org.buddycloud.channelserver.pubsub.model.impl.NodeSubscriptionImpl; @@ -45,8 +44,8 @@ public class ItemDeleteTest extends IQTestHandler { @Before public void setUp() throws Exception { channelManager = Mockito.mock(ChannelManager.class); - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(true); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); queue = new LinkedBlockingQueue(); itemDelete = new ItemDelete(queue, channelManager); @@ -94,7 +93,6 @@ public void testPassingNoNodeResultsInErrorStanza() throws Exception { @Test public void testNodeStoreExceptionReturnsErrorStanza() throws Exception { - Mockito.when(channelManager.isLocalNode(node)).thenReturn(true); Mockito.doThrow(new NodeStoreException()).when(channelManager) .nodeExists(node); @@ -113,7 +111,6 @@ public void testNodeStoreExceptionReturnsErrorStanza() throws Exception { @Test public void testProvidingNodeWhichDoesntExistReturnsError() throws Exception { - Mockito.when(channelManager.isLocalNode(node)).thenReturn(true); Mockito.when(channelManager.nodeExists(node)).thenReturn(false); itemDelete.setChannelManager(channelManager); @@ -130,7 +127,6 @@ public void testProvidingNodeWhichDoesntExistReturnsError() @Test public void testProvidingInvalidStanzaReturnsError() throws Exception { - Mockito.when(channelManager.isLocalNode(node)).thenReturn(true); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); itemDelete.setChannelManager(channelManager); @@ -149,7 +145,6 @@ public void testProvidingInvalidStanzaReturnsError() throws Exception { @Test public void testNotProvidingItemIdReturnsError() throws Exception { - Mockito.when(channelManager.isLocalNode(node)).thenReturn(true); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); itemDelete.setChannelManager(channelManager); @@ -169,7 +164,6 @@ public void testNotProvidingItemIdReturnsError() throws Exception { @Test public void testProvidingEmptyItemIdReturnsError() throws Exception { - Mockito.when(channelManager.isLocalNode(node)).thenReturn(true); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); itemDelete.setChannelManager(channelManager); @@ -190,7 +184,6 @@ public void testProvidingEmptyItemIdReturnsError() throws Exception { @Test public void testItemWhichDoesntExistReturnsItemNotFoundError() throws Exception { - Mockito.when(channelManager.isLocalNode(node)).thenReturn(true); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); Mockito.when(channelManager.getNodeItem(node, "item-id")).thenReturn( null); @@ -212,7 +205,6 @@ public void testInvalidPayloadMessageReturnsErrorStanza() throws Exception { NodeItem nodeItem = new NodeItemImpl(node, "item-id", new Date(), payload.replaceFirst("", ""), "12345") { }; - Mockito.when(channelManager.isLocalNode(node)).thenReturn(true); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); Mockito.when(channelManager.getNodeItem(node, "item-id")).thenReturn( nodeItem); @@ -238,7 +230,6 @@ public void userDoesNotOwnItemCanNotDelete() throws Exception { NodeItem nodeItem = new NodeItemImpl(node, "item-id", new Date(), payload.replace("juliet@shakespeare.lit", "romeo@shakespeare.lit"), "12345"); - Mockito.when(channelManager.isLocalNode(node)).thenReturn(true); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); Mockito.when(channelManager.getNodeItem(node, "item-id")).thenReturn( nodeItem); @@ -285,7 +276,6 @@ public void testSuccessfulRequestSendsResponseStanza() throws Exception { payload.replaceAll("romeo@shakespeare.lit", "juliet@shakespeare.lit"), "12345"); - Mockito.when(channelManager.isLocalNode(node)).thenReturn(true); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); Mockito.when( channelManager.getNodeItem(Mockito.anyString(), @@ -326,7 +316,6 @@ public void testRequestingNotificationsSendsRetractionNotifications() subscriptions.add(subscription1); subscriptions.add(subscription2); - Mockito.when(channelManager.isLocalNode(node)).thenReturn(true); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); Mockito.when(channelManager.getNodeItem(node, "item-id")).thenReturn( nodeItem); @@ -373,7 +362,6 @@ public void testNoNotifyAttributeStillSendsNotifications() throws Exception { subscriptions.add(subscription1); subscriptions.add(subscription2); - Mockito.when(channelManager.isLocalNode(node)).thenReturn(true); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); Mockito.when(channelManager.getNodeItem(node, "item-id")).thenReturn( nodeItem); @@ -402,7 +390,6 @@ public void doesNotRequestThreadWhenDealingWithReply() throws Exception { new JID("romeo@shakespeare.lit"), Subscriptions.pending, null); subscriptions.add(subscription1); - Mockito.when(channelManager.isLocalNode(node)).thenReturn(true); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); Mockito.when(channelManager.getNodeItem(node, "item-id")).thenReturn( nodeItem); @@ -440,7 +427,6 @@ public void requestsThreadWhenDeletingParentPost() throws Exception { payload)); - Mockito.when(channelManager.isLocalNode(node)).thenReturn(true); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); Mockito.when(channelManager.getNodeItem(node, "item-id")).thenReturn( nodeItem); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeConfigureTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeConfigureTest.java index 7bab2058..c6a5b954 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeConfigureTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeConfigureTest.java @@ -8,6 +8,7 @@ import junit.framework.Assert; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.node.configuration.Helper; import org.buddycloud.channelserver.channel.node.configuration.NodeConfigurationException; @@ -15,7 +16,6 @@ import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; import org.buddycloud.channelserver.pubsub.model.NodeSubscription; -import org.buddycloud.channelserver.pubsub.model.impl.NodeAffiliationImpl; import org.buddycloud.channelserver.pubsub.model.impl.NodeMembershipImpl; import org.buddycloud.channelserver.pubsub.subscription.NodeSubscriptionMock; import org.buddycloud.channelserver.pubsub.subscription.Subscriptions; @@ -42,8 +42,8 @@ public class NodeConfigureTest extends IQTestHandler { @Before public void setUp() throws Exception { channelManager = Mockito.mock(ChannelManager.class); - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(true); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); queue = new LinkedBlockingQueue(); nodeConfigure = new NodeConfigure(queue, channelManager); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreateTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreateTest.java index 00bd668f..c581dd76 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreateTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreateTest.java @@ -8,6 +8,7 @@ import junit.framework.Assert; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.node.configuration.Helper; import org.buddycloud.channelserver.channel.node.configuration.NodeConfigurationException; @@ -36,8 +37,8 @@ public class NodeCreateTest extends IQTestHandler { @Before public void setUp() throws Exception { channelManager = Mockito.mock(ChannelManager.class); - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(true); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); queue = new LinkedBlockingQueue(); nodeCreate = new NodeCreate(queue, channelManager); 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 20b95160..60482228 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 @@ -1,6 +1,5 @@ package org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.set; -import java.util.Date; import java.util.LinkedList; import java.util.List; import java.util.concurrent.LinkedBlockingQueue; @@ -12,7 +11,6 @@ import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; import org.buddycloud.channelserver.pubsub.model.NodeSubscription; -import org.buddycloud.channelserver.pubsub.model.impl.NodeAffiliationImpl; import org.buddycloud.channelserver.pubsub.model.impl.NodeMembershipImpl; import org.buddycloud.channelserver.pubsub.model.impl.NodeSubscriptionImpl; import org.buddycloud.channelserver.pubsub.subscription.Subscriptions; @@ -45,6 +43,8 @@ public void setUp() throws Exception { 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()); } @After @@ -96,8 +96,8 @@ public void testNonLocalNode() 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.isLocalNode(node)).thenReturn(false); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); nodeDelete.process(deleteEl, jid, request, null); Packet response = queue.poll(); @@ -114,7 +114,6 @@ public void testInexistentNode() throws Exception { Element deleteEl = request.getChildElement().element("delete"); String node = deleteEl.attributeValue("node"); - Mockito.when(channelManager.isLocalNode(node)).thenReturn(true); Mockito.when(channelManager.nodeExists(node)).thenReturn(false); nodeDelete.process(deleteEl, jid, request, null); @@ -133,7 +132,6 @@ public void testNotRegisteredActor() throws Exception { Element deleteEl = request.getChildElement().element("delete"); String node = deleteEl.attributeValue("node"); - Mockito.when(channelManager.isLocalNode(node)).thenReturn(true); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); nodeDelete.setServerDomain("fake.domain"); @@ -153,7 +151,6 @@ public void testNotAffiliatedActor() throws Exception { Element deleteEl = request.getChildElement().element("delete"); String node = deleteEl.attributeValue("node"); - Mockito.when(channelManager.isLocalNode(node)).thenReturn(true); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( new NodeMembershipImpl(node, jid, Subscriptions.subscribed, @@ -175,7 +172,6 @@ public void testActorIsNotOwner() throws Exception { Element deleteEl = request.getChildElement().element("delete"); String node = deleteEl.attributeValue("node"); - Mockito.when(channelManager.isLocalNode(node)).thenReturn(true); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( @@ -198,7 +194,6 @@ public void testBadFormattedNode() throws Exception { Element deleteEl = request.getChildElement().element("delete"); String node = deleteEl.attributeValue("node"); - Mockito.when(channelManager.isLocalNode(node)).thenReturn(true); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); nodeDelete.process(deleteEl, jid, request, null); @@ -217,7 +212,6 @@ public void testNodeFromUnknownDomain() throws Exception { Element deleteEl = request.getChildElement().element("delete"); String node = deleteEl.attributeValue("node"); - Mockito.when(channelManager.isLocalNode(node)).thenReturn(true); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); nodeDelete.process(deleteEl, jid, request, null); @@ -236,7 +230,6 @@ public void testSuccessfulDeleteNoSubscribers() throws Exception { Element deleteEl = request.getChildElement().element("delete"); String node = deleteEl.attributeValue("node"); - Mockito.when(channelManager.isLocalNode(node)).thenReturn(true); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( @@ -260,7 +253,6 @@ public void testSuccessfulDeleteWithSubscribers() throws Exception { Element deleteEl = request.getChildElement().element("delete"); String node = deleteEl.attributeValue("node"); - Mockito.when(channelManager.isLocalNode(node)).thenReturn(true); Mockito.when(channelManager.nodeExists(node)).thenReturn(true); Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/PublishTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/PublishTest.java index c78ca373..ae1de82f 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/PublishTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/PublishTest.java @@ -1,26 +1,21 @@ package org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.set; import java.util.ArrayList; -import java.util.Date; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import junit.framework.Assert; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; -import org.buddycloud.channelserver.channel.ValidatePayload; import org.buddycloud.channelserver.channel.validate.AtomEntry; -import org.buddycloud.channelserver.channel.validate.PayloadValidator; -import org.buddycloud.channelserver.channel.validate.UnknownContentTypeException; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.JabberPubsub; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; -import org.buddycloud.channelserver.pubsub.model.NodeAffiliation; import org.buddycloud.channelserver.pubsub.model.NodeMembership; import org.buddycloud.channelserver.pubsub.model.NodeSubscription; import org.buddycloud.channelserver.pubsub.model.impl.GlobalItemIDImpl; -import org.buddycloud.channelserver.pubsub.model.impl.NodeAffiliationImpl; import org.buddycloud.channelserver.pubsub.model.impl.NodeItemImpl; import org.buddycloud.channelserver.pubsub.model.impl.NodeMembershipImpl; import org.buddycloud.channelserver.pubsub.model.impl.NodeSubscriptionImpl; @@ -56,8 +51,8 @@ public void setUp() throws Exception { channelManager = Mockito.mock(ChannelManager.class); validateEntry = Mockito.mock(AtomEntry.class); - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(true); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); queue = new LinkedBlockingQueue(); publish = new Publish(queue, channelManager); @@ -73,8 +68,6 @@ public void setUp() throws Exception { element = new BaseElement("publish"); - Mockito.when(channelManager.isLocalNode(node)).thenReturn(true); - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); NodeMembership membership = new NodeMembershipImpl(node, jid, @@ -165,18 +158,23 @@ public void providingNodeWhichDoesntExistReturnsError() throws Exception { @Test public void requestToRemoteNodeResultsInForwardedPacket() throws Exception { - Mockito.when(channelManager.isLocalNode(node)).thenReturn(false); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); Assert.assertEquals(new JID("channels.shakespeare.lit"), request.getTo()); + request.getElement().element("pubsub").element( + "publish").addAttribute("node", "/user/romeo@barracks.lit/posts"); publish.process(element, jid, request, null); Assert.assertEquals(1, queue.size()); Packet response = queue.poll(); - Assert.assertEquals(new JID("shakespeare.lit"), response.getTo()); + Assert.assertEquals(new JID("barracks.lit"), response.getTo()); } @Test diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscribeSetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscribeSetTest.java index 421ea3c5..1cc9362a 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscribeSetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscribeSetTest.java @@ -1,7 +1,6 @@ package org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.set; import java.util.ArrayList; -import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.concurrent.BlockingQueue; @@ -9,15 +8,14 @@ import junit.framework.Assert; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.Conf; import org.buddycloud.channelserver.channel.node.configuration.field.AccessModel; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; -import org.buddycloud.channelserver.pubsub.model.NodeAffiliation; import org.buddycloud.channelserver.pubsub.model.NodeMembership; import org.buddycloud.channelserver.pubsub.model.NodeSubscription; -import org.buddycloud.channelserver.pubsub.model.impl.NodeAffiliationImpl; import org.buddycloud.channelserver.pubsub.model.impl.NodeMembershipImpl; import org.buddycloud.channelserver.pubsub.model.impl.NodeSubscriptionImpl; import org.buddycloud.channelserver.pubsub.subscription.Subscriptions; @@ -49,8 +47,8 @@ public class SubscribeSetTest extends IQTestHandler { public void setUp() throws Exception { channelManager = Mockito.mock(ChannelManager.class); - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(true); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); Mockito.when(channelManager.nodeExists(Mockito.anyString())) .thenReturn(true); @@ -64,9 +62,6 @@ public void setUp() throws Exception { subscribe.setChannelManager(channelManager); - Mockito.when(channelManager.isLocalJID(Mockito.any(JID.class))) - .thenReturn(true); - membership = new NodeMembershipImpl(node, jid, Subscriptions.none, Affiliations.none, null); @@ -112,7 +107,7 @@ public void testMissingNodeAttributeReturnsError() throws Exception { Assert.assertEquals(PacketError.Type.modify, error.getType()); Assert.assertEquals(PacketError.Condition.bad_request, error.getCondition()); - Assert.assertEquals(subscribe.MISSING_NODE_ID, + Assert.assertEquals(SubscribeSet.MISSING_NODE_ID, error.getApplicationConditionName()); } @@ -140,7 +135,7 @@ public void testTryingToSubscribeSomeoneElseReturnsError() throws Exception { Assert.assertEquals(PacketError.Type.modify, error.getType()); Assert.assertEquals(PacketError.Condition.bad_request, error.getCondition()); - Assert.assertEquals(subscribe.INVALID_JID, + Assert.assertEquals(SubscribeSet.INVALID_JID, error.getApplicationConditionName()); } @@ -148,8 +143,8 @@ public void testTryingToSubscribeSomeoneElseReturnsError() throws Exception { @Test public void testUnRegisteedLocalUserReturnsError() throws Exception { - Mockito.when(channelManager.isLocalJID(Mockito.any(JID.class))) - .thenReturn(false); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); IQ request = this.request.createCopy(); @@ -190,15 +185,16 @@ public void testLocalUserGetsSubscriptionToLocalAccessModelNode() Assert.assertEquals(Subscriptions.subscribed, Subscriptions .valueOf(response.getChildElement().element("subscription") .attributeValue("subscription"))); - } @Test public void testRemoteUserGetsPendingSubscriptionToLocalAccessModelNode() throws Exception { - Mockito.when(channelManager.isLocalJID(Mockito.any(JID.class))) - .thenReturn(false); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); Map configuration = new HashMap(); configuration.put(Conf.ACCESS_MODEL, AccessModel.local.toString()); @@ -208,8 +204,10 @@ public void testRemoteUserGetsPendingSubscriptionToLocalAccessModelNode() Mockito.when(channelManager.getNodeConf(Mockito.anyString())) .thenReturn(configuration); - subscribe.process(element, new JID("francisco@denmark.lit"), request, - null); + request.setFrom("francisco@barracks.lit"); + request.getElement().element("pubsub").element( + "subscribe").addAttribute("jid", request.getFrom().toBareJID()); + subscribe.process(element, request.getFrom(), request, null); IQ response = (IQ) queue.poll(); @@ -310,8 +308,9 @@ public void canSubscribeIfInvited() throws Exception { @Test public void illegalNodeFormatReturnsAppropriateError() throws Exception { - Mockito.doThrow(new IllegalArgumentException()).when(channelManager) - .isLocalNode(Mockito.anyString()); + + request.getElement().element("pubsub").element( + "subscribe").addAttribute("node", "illegalformat"); subscribe.process(element, new JID("francisco@denmark.lit"), request, null); IQ response = (IQ) queue.poll(); @@ -320,7 +319,7 @@ public void illegalNodeFormatReturnsAppropriateError() throws Exception { Assert.assertEquals(PacketError.Type.modify, error.getType()); Assert.assertEquals(PacketError.Condition.bad_request, error.getCondition()); - Assert.assertEquals(subscribe.INVALID_NODE_FORMAT, + Assert.assertEquals(SubscribeSet.INVALID_NODE_FORMAT, error.getApplicationConditionName()); Assert.assertEquals(Buddycloud.NS_ERROR, error.getApplicationConditionNamespaceURI()); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscriptionEventTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscriptionEventTest.java index 2ab49cea..fdc979d6 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscriptionEventTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscriptionEventTest.java @@ -15,6 +15,7 @@ import junit.framework.Assert; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; @@ -31,7 +32,6 @@ import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; -import org.mockito.Mockito; import org.xmpp.packet.IQ; import org.xmpp.packet.JID; import org.xmpp.packet.Message; @@ -62,7 +62,8 @@ public void setUp() throws Exception { element.addAttribute("node", node); dataStore = mock(ChannelManager.class); - when(dataStore.isLocalNode(anyString())).thenReturn(true); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); when(dataStore.nodeExists(anyString())).thenReturn(true); NodeMembership membership = new NodeMembershipImpl(node, jid, @@ -79,9 +80,6 @@ public void setUp() throws Exception { doReturn(new ResultSetImpl(subscribers)).when( dataStore).getNodeSubscriptionListeners(anyString()); - Mockito.when(dataStore.isLocalJID(Mockito.any(JID.class))).thenReturn( - false); - event.setChannelManager(dataStore); } @@ -163,6 +161,7 @@ public void testNotProvidingSubscriptionAttributeReturnsErrorStanza() error.getCondition()); } + @SuppressWarnings("unchecked") @Test public void testNodeStoreExceptionResultsInInternalServerErrorStanza() throws Exception { @@ -395,8 +394,6 @@ public void invitedByIsSetAsActorJid() throws Exception { event.process(element, jid, request, null); - IQ result = (IQ) queue.poll(); - ArgumentCaptor subscription = ArgumentCaptor .forClass(NodeSubscription.class); @@ -417,7 +414,6 @@ public void standardSubscribeDoesNotSetInvitedBy() throws Exception { subscriber), Subscriptions.subscribed, Affiliations.moderator, null); - JID invitee = new JID("francisco@denmark.lit"); when(dataStore.getNodeMembership(eq(node), any(JID.class))).thenReturn( membership); @@ -441,9 +437,6 @@ public void standardSubscribeDoesNotSetInvitedBy() throws Exception { @Test public void sendsNotificationToInvitedUserIfTheyAreLocal() throws Exception { - Mockito.when(dataStore.isLocalJID(Mockito.any(JID.class))).thenReturn( - true); - JID invitee = new JID("francisco@denmark.lit"); NodeMembership membership = new NodeMembershipImpl(node, invitee, @@ -482,13 +475,18 @@ public void sendsNotificationToInvitedUsersServerIfTheyAreNotLocal() JID invitee = new JID("francisco@denmark.lit"); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); + NodeMembership membership = new NodeMembershipImpl(node, invitee, Subscriptions.none, Affiliations.none, null); when(dataStore.getNodeMembership(eq(node), eq(invitee))).thenReturn( membership); IQ request = readStanzaAsIq("/iq/pubsub/subscribe/invite.stanza"); - + element.addAttribute("node", "/user/pamela@shakespeare.lit/posts"); event.process(element, jid, request, null); IQ result = (IQ) queue.poll(); @@ -523,7 +521,6 @@ public void userCanNotModifyOwnSubscription() throws Exception { NodeMembership membership = new NodeMembershipImpl(node, new JID( subscriber), Subscriptions.subscribed, Affiliations.moderator, null); - when(dataStore.getNodeMembership(eq(node), any(JID.class))).thenReturn( membership); @@ -535,7 +532,7 @@ public void userCanNotModifyOwnSubscription() throws Exception { Assert.assertEquals(PacketError.Type.cancel, error.getType()); Assert.assertEquals(PacketError.Condition.not_allowed, error.getCondition()); - Assert.assertEquals(event.CAN_NOT_MODIFY_OWN_SUBSCRIPTION, + Assert.assertEquals(SubscriptionEvent.CAN_NOT_MODIFY_OWN_SUBSCRIPTION, error.getApplicationConditionName()); Assert.assertEquals(Buddycloud.NS_ERROR, error.getApplicationConditionNamespaceURI()); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/UnsubscribeSetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/UnsubscribeSetTest.java index 9242176a..2b36614b 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/UnsubscribeSetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/UnsubscribeSetTest.java @@ -6,6 +6,7 @@ import junit.framework.Assert; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; @@ -46,8 +47,8 @@ public class UnsubscribeSetTest extends IQTestHandler { public void setUp() throws Exception { channelManager = Mockito.mock(ChannelManager.class); - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(true); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); Mockito.when(channelManager.nodeExists(Mockito.anyString())) .thenReturn(true); @@ -123,9 +124,9 @@ public void emptyNodeAttributeReturnsError() throws Exception { @Test public void makesRemoteRequest() throws Exception { - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(false); - + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + unsubscribe.process(element, jid, request, null); Assert.assertEquals(1, queue.size()); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/RegisterSetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/RegisterSetTest.java index 47ddc90d..2857c51b 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/RegisterSetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/RegisterSetTest.java @@ -26,7 +26,6 @@ import org.junit.Before; import org.junit.Test; import org.mockito.Mock; -import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.xmpp.packet.IQ; import org.xmpp.packet.JID; @@ -57,8 +56,10 @@ public class RegisterSetTest extends IQTestHandler { public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - Mockito.when(channelManagerMock.isLocalNode(Mockito.anyString())) - .thenReturn(true); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, REGISTER_REQUEST_DOMAIN); queue = new LinkedBlockingQueue(); registerSet = new RegisterSet(configuration, queue, channelManagerMock); @@ -88,13 +89,6 @@ public void testRegisterNewUserAutoSubscribesLocalChannels() } }); - when(channelManagerMock.isLocalJID(new JID("channel1@server1"))) - .thenReturn(true); - when(channelManagerMock.isLocalJID(new JID("channel2@server1"))) - .thenReturn(true); - when(channelManagerMock.isLocalDomain("server1")) - .thenReturn(true); - registerSet.process(request); // Check that there are subscribe stanzas in the outqueue @@ -123,13 +117,6 @@ public void testRegisterNewUserAutoSubscribesRemoteChannels() } }); - when(channelManagerMock.isLocalJID(new JID("channel1@server2"))) - .thenReturn(false); - when(channelManagerMock.isLocalJID(new JID("channel2@server2"))) - .thenReturn(false); - when(channelManagerMock.isLocalDomain("server1")) - .thenReturn(true); - registerSet.process(request); // Check that there are subscribe stanzas in the outqueue @@ -180,11 +167,6 @@ public void testRegisterNewUserAutoApprovesOnlyLocalPrivateChannels() final JID localOpenChannel = new JID("channel2@server1"); final JID remoteChannel = new JID("channel1@server2"); - when(channelManagerMock.isLocalDomain("server1")) - .thenReturn(true); - when(channelManagerMock.isLocalDomain("server2")) - .thenReturn(false); - when(channelManagerMock.nodeExists(anyString())).thenReturn(false); when(configuration.getAutosubscribeChannels()).thenReturn( @@ -213,11 +195,6 @@ public void testRegisterNewUserAutoApprovesOnlyLocalPrivateChannels() .getDefaultNodeAffiliation(localPrivateChannelNode)) .thenReturn(Affiliations.moderator); - when(channelManagerMock.isLocalJID(localPrivateChannel)).thenReturn( - true); - when(channelManagerMock.isLocalJID(localOpenChannel)).thenReturn(true); - when(channelManagerMock.isLocalJID(remoteChannel)).thenReturn(false); - registerSet.process(request); // Check that a subscription has been added, but only for @@ -258,9 +235,6 @@ public void testRegisterNewUserDoesntAutoApprove() throws Exception { Conf.ACCESS_MODEL)).thenReturn( AccessModels.authorize.toString()); - when(channelManagerMock.isLocalJID(localPrivateChannel)).thenReturn( - true); - registerSet.process(request); // Check that a subscription and affiliation has been added, but only diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/UnregisterSetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/UnregisterSetTest.java index c8df0c49..0a8fc92b 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/UnregisterSetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/UnregisterSetTest.java @@ -59,6 +59,8 @@ private void recordEmptyMockResponses(JID actorJid) new ResultSetImpl(new LinkedList())); Mockito.when(channelManager.beginTransaction()).thenReturn( Mockito.mock(Transaction.class)); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); } @Test @@ -132,9 +134,6 @@ public void notifyDeletePersonalNode() throws Exception { Mockito.when(channelManager.getUserMemberships(Mockito.eq(actorJid))).thenReturn( new ResultSetImpl(memberships)); - // Record local node - Mockito.when(channelManager.isLocalNode(Mockito.eq(personalNode))).thenReturn(true); - // Record channel type Mockito.when( channelManager @@ -181,7 +180,8 @@ public void dontNotifyDeleteRemoteTopicNode() throws Exception { channelManager.getNodeMemberships(Mockito.eq(topicNode))).thenReturn( new ResultSetImpl(memberships)); - Mockito.when(channelManager.isLocalNode(Mockito.anyString())).thenReturn(false); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); // Record channel type Mockito.when( @@ -217,9 +217,6 @@ public void notifyDeleteLocalTopicNode() throws Exception { channelManager.getNodeMemberships(Mockito.eq(topicNode))).thenReturn( new ResultSetImpl(memberships)); - // Record local node - Mockito.when(channelManager.isLocalNode(topicNode)).thenReturn(true); - // Record channel type Mockito.when( channelManager.getNodeConfValue(topicNode, Conf.CHANNEL_TYPE)) @@ -252,7 +249,8 @@ public void testDontNotifyDeleteRemoteNodeItem() throws Exception { String topicNode = "/user/topic@shakespeare.lit/posts"; // Record remote node - Mockito.when(channelManager.isLocalNode(topicNode)).thenReturn(false); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); // Record node items NodeItem nodeItem = new NodeItemImpl(topicNode, "entry1", new Date(), @@ -279,9 +277,6 @@ public void testNotifyDeleteLocalNodeItem() throws Exception { String topicNode = "/user/topic@shakespeare.lit/posts"; - // Record remote node - Mockito.when(channelManager.isLocalNode(topicNode)).thenReturn(true); - // Record node items String itemId = "entry1"; NodeItem nodeItem = new NodeItemImpl(topicNode, itemId, new Date(), @@ -362,6 +357,11 @@ public void testForwardRemoteRequests() throws Exception { remoteNodes.add(remoteNode); Mockito.when(channelManager.getNodeList()).thenReturn(remoteNodes); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_CHANNELS_DOMAIN, "shakespeare.lit"); + unregisterSet.process(request); IQ response = (IQ) queue.poll(); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchGetTest.java index 31b40839..ad373431 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchGetTest.java @@ -5,12 +5,11 @@ import junit.framework.Assert; -import org.buddycloud.channelserver.channel.ChannelManager; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; import org.dom4j.Element; import org.junit.Before; import org.junit.Test; -import org.mockito.Mockito; import org.xmpp.forms.DataForm; import org.xmpp.packet.IQ; import org.xmpp.packet.JID; @@ -20,11 +19,8 @@ public class SearchGetTest extends IQTestHandler { private IQ request; - private Element element; private BlockingQueue queue = new LinkedBlockingQueue(); - private ChannelManager channelManager; - private SearchGet search; private JID sender; private JID receiver; @@ -33,9 +29,8 @@ public class SearchGetTest extends IQTestHandler { public void setUp() throws Exception { queue = new LinkedBlockingQueue(); - channelManager = Mockito.mock(ChannelManager.class); - search = new SearchGet(queue, channelManager); + search = new SearchGet(queue); sender = new JID("channels.shakespeare.lit"); receiver = new JID("romeo@shakespeare.lit/home"); @@ -47,15 +42,15 @@ public void setUp() throws Exception { Element query = request.getElement().addElement("query"); query.addNamespace("", Search.NAMESPACE_URI); - Mockito.when(channelManager.isLocalJID(Mockito.any(JID.class))) - .thenReturn(true); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); } @Test public void testOnlyAcceptsPacketsFromLocalUsers() throws Exception { - Mockito.when(channelManager.isLocalJID(Mockito.any(JID.class))) - .thenReturn(false); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); search.process(request); Packet response = queue.poll(); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchSetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchSetTest.java index 38cd07fb..b8922248 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchSetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchSetTest.java @@ -8,6 +8,7 @@ import junit.framework.Assert; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.db.ClosableIteratorImpl; import org.buddycloud.channelserver.db.CloseableIterator; @@ -28,7 +29,6 @@ public class SearchSetTest extends IQTestHandler { private IQ request; - private Element element; private BlockingQueue queue = new LinkedBlockingQueue(); private ChannelManager channelManager; @@ -61,8 +61,8 @@ public void setUp() throws Exception { Element query = request.getElement().addElement("query"); query.addNamespace("", Search.NAMESPACE_URI); - Mockito.when(channelManager.isLocalJID(Mockito.any(JID.class))) - .thenReturn(true); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); setStanza = readStanzaAsIq("/iq/search/set.stanza"); } @@ -70,8 +70,8 @@ public void setUp() throws Exception { @Test public void testOnlyAcceptsPacketsFromLocalUsers() throws Exception { - Mockito.when(channelManager.isLocalJID(Mockito.any(JID.class))) - .thenReturn(false); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); search.process(request); Packet response = queue.poll(); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/AffiliationProcessorTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/AffiliationProcessorTest.java index fa713d54..4ef1c53e 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/AffiliationProcessorTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/AffiliationProcessorTest.java @@ -7,6 +7,7 @@ import junit.framework.Assert; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; @@ -27,7 +28,6 @@ public class AffiliationProcessorTest extends IQTestHandler { private Message message; private AffiliationProcessor affiliationProcessor; - private Element subscription; private Element affiliation; private Element affiliations; @@ -44,14 +44,12 @@ public void setUp() throws Exception { "channels.shakespeare.lit"); channelManager = Mockito.mock(ChannelManager.class); - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(false); - Mockito.when(channelManager.isLocalJID(Mockito.any(JID.class))) - .thenReturn(true); - + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + ArrayList subscribers = new ArrayList(); subscribers.add(new NodeMembershipImpl( - "/users/romeo@shakespeare.lit/posts", jid, + "/user/romeo@shakespeare.lit/posts", jid, Subscriptions.subscribed, Affiliations.member, null)); Mockito.doReturn(new ResultSetImpl(subscribers)) .when(channelManager).getNodeMemberships(Mockito.anyString()); @@ -65,7 +63,7 @@ public void setUp() throws Exception { JabberPubsub.NS_PUBSUB_EVENT); affiliations = event.addElement("affiliations"); - affiliations.addAttribute("node", "/users/juliet@shakespeare.lit/posts"); + affiliations.addAttribute("node", "/user/juliet@denmark.lit/posts"); affiliation = affiliations.addElement("affiliation"); affiliation.addAttribute("jid", "romeo@shakespeare.lit"); @@ -92,9 +90,8 @@ public void testMissingAffiliationElementDoesNotCauseError() @Test public void testEventForLocalNodeIsIgnored() throws Exception { - - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(true); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); affiliationProcessor.process(message); Assert.assertEquals(0, queue.size()); } @@ -111,7 +108,8 @@ public void testNodeStoreExceptionIsThrownWhenExpected() throws Exception { @Test public void testNotificationsAreSentOutAsExpected() throws Exception { - + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); affiliationProcessor.process(message); Assert.assertEquals(1, queue.size()); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/ConfigurationProcessorTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/ConfigurationProcessorTest.java index 5f517a1d..8d2bb5ef 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/ConfigurationProcessorTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/ConfigurationProcessorTest.java @@ -8,9 +8,9 @@ import junit.framework.Assert; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.node.configuration.Helper; -import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.JabberPubsub; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; @@ -45,14 +45,14 @@ public void setUp() throws Exception { "chgnnels.shakespeare.lit"); channelManager = Mockito.mock(ChannelManager.class); - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(false); - Mockito.when(channelManager.isLocalJID(Mockito.any(JID.class))) - .thenReturn(true); - + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); + ArrayList members = new ArrayList(); members.add(new NodeMembershipImpl( - "/users/romeo@shakespeare.lit/posts", jid, + "/user/romeo@denmark.lit/posts", jid, Subscriptions.subscribed, Affiliations.member, null)); Mockito.doReturn(new ResultSetImpl(members)) .when(channelManager).getNodeMemberships(Mockito.anyString()); @@ -75,7 +75,7 @@ public void setUp() throws Exception { configurationElement = event.addElement("configuration"); configurationElement.addAttribute("jid", "romeo@shakespeare.lit"); configurationElement.addAttribute("node", - "/users/juliet@shakespeare.lit/posts"); + "/user/juliet@denmark.lit/posts"); dataForm = configurationElement.addElement("x"); dataForm.addNamespace("", "jabber:x:data"); dataForm.addAttribute("type", "result"); @@ -87,21 +87,12 @@ public void setUp() throws Exception { @Test public void testEventForLocalNodeIsIgnored() throws Exception { - - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(true); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); configurationProcessor.process(message); Assert.assertEquals(0, queue.size()); } - @Test(expected = NodeStoreException.class) - public void testNodeStoreExceptionIsThrownWhenExpected() throws Exception { - - Mockito.doThrow(new NodeStoreException()).when(channelManager) - .isLocalNode(Mockito.anyString()); - configurationProcessor.process(message); - } - @Test public void testRemoteNodeIsCreatedIfNotInDataStore() throws Exception { Mockito.when(channelManager.nodeExists(Mockito.anyString())) diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/DeleteProcessorTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/DeleteProcessorTest.java index 3307f7b8..de274067 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/DeleteProcessorTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/DeleteProcessorTest.java @@ -7,6 +7,7 @@ import junit.framework.Assert; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; @@ -42,14 +43,14 @@ public void setUp() throws Exception { "chgnnels.shakespeare.lit"); channelManager = Mockito.mock(ChannelManager.class); - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(false); - Mockito.when(channelManager.isLocalJID(Mockito.any(JID.class))) - .thenReturn(true); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); ArrayList members = new ArrayList(); members.add(new NodeMembershipImpl( - "/users/romeo@shakespeare.lit/posts", jid, + "/user/romeo@denmark.lit/posts", jid, Subscriptions.subscribed, Affiliations.member, null)); Mockito.doReturn(new ResultSetImpl(members)) .when(channelManager).getNodeMemberships(Mockito.anyString()); @@ -63,14 +64,13 @@ public void setUp() throws Exception { JabberPubsub.NS_PUBSUB_EVENT); delete = event.addElement("delete"); - delete.addAttribute("node", "/users/juliet@shakespeare.lit/posts"); + delete.addAttribute("node", "/user/juliet@denmark.lit/posts"); } @Test public void testEventForLocalNodeIsIgnored() throws Exception { - - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(true); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); deleteProcessor.process(message); Assert.assertEquals(0, queue.size()); } diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/ItemsProcessorTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/ItemsProcessorTest.java index 4b4f5651..65895505 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/ItemsProcessorTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/ItemsProcessorTest.java @@ -7,6 +7,7 @@ import junit.framework.Assert; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; @@ -49,9 +50,10 @@ public void setUp() throws Exception { Subscriptions.subscribed, Affiliations.member, null)); Mockito.doReturn(new ResultSetImpl(members)) .when(channelManager).getNodeMemberships(Mockito.anyString()); - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(false); - Mockito.when(channelManager.isLocalJID(Mockito.any(JID.class))).thenReturn(true); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); itemsProcessor = new ItemsProcessor(queue, configuration, channelManager); @@ -69,7 +71,7 @@ public void setUp() throws Exception { Element updated = entry.addElement("updated"); updated.setText("2012-10-10T08:37:02.000Z"); - items.addAttribute("node", "/users/romeo@shakespeare.lit/posts"); + items.addAttribute("node", "/user/romeo@denmark.lit/posts"); item.addAttribute("id", "publish:1"); entry.addElement("thr:in-reply-to", "http://purl.org/syndication/thread/1.0").addAttribute("ref", "123455"); @@ -77,8 +79,8 @@ public void setUp() throws Exception { @Test public void testLocalNodeEventDoesNotSendNotiifcations() throws Exception { - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(true); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); itemsProcessor.process(message); Assert.assertEquals(0, queue.size()); } diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/NotificationSendingMockTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/NotificationSendingMockTest.java index ae5278b1..dbea78df 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/NotificationSendingMockTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/NotificationSendingMockTest.java @@ -39,8 +39,10 @@ public void setUp() throws Exception { channelManager = Mockito.mock(ChannelManager.class); - Mockito.when(channelManager.isLocalJID(Mockito.any(JID.class))) - .thenReturn(true); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); Properties configuration = new Properties(); configuration.setProperty(Configuration.CONFIGURATION_SERVER_CHANNELS_DOMAIN, CHANNEL_SERVER); @@ -57,8 +59,8 @@ public void noNotificationSentForRemoteUser() throws Exception { registerUserResponse(Subscriptions.none, Affiliations.none); - Mockito.when(channelManager.isLocalJID(Mockito.any(JID.class))) - .thenReturn(false); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); notificationSending.process(message); Assert.assertEquals(0, queue.size()); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/RetractItemProcessorTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/RetractItemProcessorTest.java index 185b7dab..73f9bd6f 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/RetractItemProcessorTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/RetractItemProcessorTest.java @@ -7,6 +7,7 @@ import junit.framework.Assert; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; @@ -31,12 +32,10 @@ public class RetractItemProcessorTest extends IQTestHandler { private BlockingQueue queue = new LinkedBlockingQueue(); private ChannelManager channelManager; - private Element entry; - @Before public void setUp() throws Exception { - JID jid = new JID("juliet@shakespeare.lit"); + JID jid = new JID("juliet@denmark.lit"); Properties configuration = new Properties(); configuration.setProperty("server.domain.channels", "channels.shakespeare.lit"); @@ -44,13 +43,14 @@ public void setUp() throws Exception { ArrayList subscribers = new ArrayList(); subscribers.add(new NodeMembershipImpl( - "/users/romeo@shakespeare.lit/posts", jid, + "/user/romeo@shakespeare.lit/posts", jid, Subscriptions.subscribed, Affiliations.member, null)); Mockito.doReturn(new ResultSetImpl(subscribers)) .when(channelManager).getNodeMemberships(Mockito.anyString()); - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(false); - Mockito.when(channelManager.isLocalJID(Mockito.any(JID.class))).thenReturn(true); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); retractItemProcessor = new RetractItemProcessor(queue, configuration, channelManager); @@ -62,15 +62,15 @@ public void setUp() throws Exception { Element items = event.addElement("items"); Element retract = items.addElement("retract"); - items.addAttribute("node", "/users/romeo@shakespeare.lit/posts"); + items.addAttribute("node", "/user/romeo@shakespeare.lit/posts"); retract.addAttribute("id", "publish:1"); } @Test public void testLocalNodeEventDoesNotSendNotiifcations() throws Exception { - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(true); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); retractItemProcessor.process(message); Assert.assertEquals(0, queue.size()); diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/SubscriptionProcessorTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/SubscriptionProcessorTest.java index 6551aef1..4a01ea1c 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/SubscriptionProcessorTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/SubscriptionProcessorTest.java @@ -10,6 +10,7 @@ import junit.framework.Assert; +import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; @@ -36,8 +37,8 @@ public class SubscriptionProcessorTest extends IQTestHandler { private BlockingQueue queue = new LinkedBlockingQueue(); private ChannelManager channelManager; - private JID jid = new JID("juliet@shakespeare.lit"); - private String node = "/users/juliet@shakespeare.lit/posts"; + private JID jid = new JID("juliet@denmark.lit"); + private String node = "/user/juliet@shakespeare.lit/posts"; @Before public void setUp() throws Exception { @@ -47,14 +48,14 @@ public void setUp() throws Exception { "channels.shakespeare.lit"); channelManager = Mockito.mock(ChannelManager.class); - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(false); - Mockito.when(channelManager.isLocalJID(Mockito.any(JID.class))) - .thenReturn(true); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); ArrayList members = new ArrayList(); members.add(new NodeMembershipImpl( - "/users/romeo@shakespeare.lit/posts", jid, + "/user/romeo@shakespeare.lit/posts", jid, Subscriptions.subscribed, Affiliations.member, null)); Mockito.doReturn(new ResultSetImpl(members)).when(channelManager) .getNodeMemberships(Mockito.anyString()); @@ -95,9 +96,8 @@ public void testMissingSubscriptionElementDoesNotCauseError() @Test public void testEventForLocalNodeIsIgnored() throws Exception { - - Mockito.when(channelManager.isLocalNode(Mockito.anyString())) - .thenReturn(true); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); subscriptionProcessor.process(message); Assert.assertEquals(0, queue.size()); } From 102761cdcc334f1a87d6dd14e5ec7c1bfc4333ae Mon Sep 17 00:00:00 2001 From: abmargb Date: Thu, 9 Oct 2014 23:22:18 -0300 Subject: [PATCH 18/18] fixing checkstyle violations --- .../channelserver/ChannelsEngine.java | 10 +- .../channelserver/Configuration.java | 382 +-- .../channel/ChannelManagerImpl.java | 252 +- .../channel/LocalDomainChecker.java | 124 +- .../channelserver/db/NodeStore.java | 136 +- .../channelserver/db/jdbc/JDBCNodeStore.java | 294 +-- .../jdbc/dialect/Sql92NodeStoreDialect.java | 90 +- .../iq/namespace/discoinfo/DiscoInfoGet.java | 86 +- .../namespace/discoitems/DiscoItemsGet.java | 26 +- .../mam/MessageArchiveManagement.java | 10 +- .../namespace/pubsub/get/AffiliationsGet.java | 322 +-- .../pubsub/get/NodeConfigureGet.java | 44 +- .../namespace/pubsub/get/NodeThreadsGet.java | 32 +- .../namespace/pubsub/get/RecentItemsGet.java | 36 +- .../iq/namespace/pubsub/get/RepliesGet.java | 392 +-- .../pubsub/get/SubscriptionsGet.java | 262 +- .../iq/namespace/pubsub/get/ThreadGet.java | 392 +-- .../iq/namespace/pubsub/get/UserItemsGet.java | 346 +-- .../pubsub/get/items/NodeItemsGet.java | 116 +- .../pubsub/get/items/special/FirehoseGet.java | 256 +- .../namespace/pubsub/result/ItemsResult.java | 14 +- .../pubsub/set/AffiliationEvent.java | 414 ++-- .../iq/namespace/pubsub/set/ItemDelete.java | 454 ++-- .../namespace/pubsub/set/NodeConfigure.java | 50 +- .../iq/namespace/pubsub/set/NodeCreate.java | 64 +- .../iq/namespace/pubsub/set/NodeDelete.java | 124 +- .../iq/namespace/pubsub/set/SubscribeSet.java | 126 +- .../pubsub/set/SubscriptionEvent.java | 86 +- .../namespace/pubsub/set/UnsubscribeSet.java | 314 +-- .../iq/namespace/register/RegisterSet.java | 298 +-- .../iq/namespace/register/UnregisterSet.java | 512 ++-- .../iq/namespace/search/Search.java | 74 +- .../iq/namespace/search/SearchGet.java | 134 +- .../iq/namespace/search/SearchSet.java | 534 ++--- .../event/AbstractMessageProcessor.java | 132 +- .../message/event/AffiliationProcessor.java | 95 +- .../message/event/ConfigurationProcessor.java | 93 +- .../message/event/DeleteProcessor.java | 48 +- .../message/event/ItemsProcessor.java | 108 +- .../message/event/RetractItemProcessor.java | 46 +- .../message/event/SubscriptionProcessor.java | 117 +- .../channel/ChannelManagerImplTest.java | 270 +-- .../channelserver/channel/TestHelper.java | 111 +- .../channel/validate/AtomEntryTest.java | 14 +- .../channelserver/db/jdbc/DatabaseTester.java | 277 +-- .../db/jdbc/JDBCNodeStoreAbstract.java | 8 +- .../db/jdbc/JDBCNodeStoreFirehoseTest.java | 352 +-- .../JDBCNodeStoreRemoteAndLocalNodesTest.java | 57 +- .../db/jdbc/JDBCNodeStoreTest.java | 2131 ++++++++--------- .../packetHandler/iq/TestHandler.java | 28 +- .../discoitems/DiscoItemsGetTest.java | 166 +- .../mam/MessageArchiveManagementTest.java | 760 +++--- .../pubsub/get/NodeConfigureGetTest.java | 346 +-- .../pubsub/get/NodeThreadsGetTest.java | 432 ++-- .../pubsub/get/RecentItemsGetTest.java | 4 +- .../namespace/pubsub/get/RepliesGetTest.java | 2 +- .../pubsub/get/SubscriptionsGetTest.java | 382 +-- .../namespace/pubsub/get/ThreadGetTest.java | 2 +- .../pubsub/get/UserItemsGetTest.java | 4 +- .../pubsub/get/items/NodeItemsGetTest.java | 795 +++--- .../get/items/UserSingleItemGetTest.java | 204 +- .../get/items/special/FirehoseGetTest.java | 406 ++-- .../pubsub/result/ItemsResultTest.java | 350 +-- .../pubsub/set/AffiliationEventTest.java | 822 +++---- .../namespace/pubsub/set/ItemDeleteTest.java | 884 +++---- .../pubsub/set/NodeConfigureTest.java | 574 ++--- .../namespace/pubsub/set/NodeCreateTest.java | 488 ++-- .../namespace/pubsub/set/NodeDeleteTest.java | 508 ++-- .../iq/namespace/pubsub/set/PublishTest.java | 716 +++--- .../pubsub/set/SubscribeSetTest.java | 456 ++-- .../pubsub/set/SubscriptionEventTest.java | 882 +++---- .../pubsub/set/UnsubscribeSetTest.java | 522 ++-- .../namespace/register/RegisterSetTest.java | 612 ++--- .../namespace/register/UnregisterSetTest.java | 690 +++--- .../iq/namespace/search/SearchGetTest.java | 524 ++-- .../iq/namespace/search/SearchSetTest.java | 894 +++---- .../event/AffiliationProcessorTest.java | 184 +- .../event/ConfigurationProcessorTest.java | 206 +- .../message/event/DeleteProcessorTest.java | 134 +- .../message/event/ItemsProcessorTest.java | 220 +- .../event/NotificationSendingMockTest.java | 270 +-- .../event/RetractItemProcessorTest.java | 152 +- .../event/SubscriptionProcessorTest.java | 218 +- 83 files changed, 12256 insertions(+), 12246 deletions(-) diff --git a/src/main/java/org/buddycloud/channelserver/ChannelsEngine.java b/src/main/java/org/buddycloud/channelserver/ChannelsEngine.java index a57a33a1..98f8e4ea 100644 --- a/src/main/java/org/buddycloud/channelserver/ChannelsEngine.java +++ b/src/main/java/org/buddycloud/channelserver/ChannelsEngine.java @@ -110,11 +110,11 @@ private void setupManagers() throws ComponentException { throw new ComponentException(e); } - channelManagerFactory = new ChannelManagerFactoryImpl(nodeStoreFactory); - federatedQueueManager = new FederatedQueueManager(this, - configuration); - onlineUsers = new OnlineResourceManager(configuration, channelManagerFactory.create()); - } + channelManagerFactory = new ChannelManagerFactoryImpl(nodeStoreFactory); + federatedQueueManager = new FederatedQueueManager(this, + configuration); + onlineUsers = new OnlineResourceManager(configuration, channelManagerFactory.create()); + } @Override public void processPacket(Packet p) { diff --git a/src/main/java/org/buddycloud/channelserver/Configuration.java b/src/main/java/org/buddycloud/channelserver/Configuration.java index bc3277f5..dd2869c2 100644 --- a/src/main/java/org/buddycloud/channelserver/Configuration.java +++ b/src/main/java/org/buddycloud/channelserver/Configuration.java @@ -15,216 +15,216 @@ import org.xmpp.packet.JID; public class Configuration extends Properties { - private static final Logger LOGGER = Logger.getLogger(Configuration.class); - - private static final long serialVersionUID = 1L; - - private static final String ARRAY_PROPERTY_SEPARATOR = ";"; - private static final String INVALID_NODE = "Illegal node format"; - - public static final String CONFIGURATION_SERVER_DOMAIN = "server.domain"; - public static final String CONFIGURATION_SERVER_CHANNELS_DOMAIN = "server.domain.channels"; - public static final String CONFIGURATION_SERVER_TOPICS_DOMAIN = "server.domain.topics"; - public static final String CONFIGURATION_LOCAL_DOMAIN_CHECKER = "server.domain.checker"; - - public static final String CONFIGURATION_ADMIN_USERS = "users.admin"; - - public static final String CONFIGURATION_CHANNELS_AUTOSUBSCRIBE = "channels.autosubscribe"; - public static final String CONFIGURATION_CHANNELS_AUTOSUBSCRIBE_AUTOAPPROVE = "channels.autosubscribe.autoapprove"; - public static final String CONFIGURATION_CHANNELS_DEFAULT_AFFILIATION = "channel.configuration.default.affiliation"; - public static final String CONFIGURATION_CHANNELS_DEFAULT_ACCESSMODEL = "channel.configuration.default.accessmodel"; - public static final String CONFIGURATION_CHANNELS_DEFAULT_DESCRIPTION = "channel.configuration.default.description"; - public static final String CONFIGURATION_CHANNELS_DEFAULT_TITLE = "channel.configuration.default.title"; - - public static final String DISCOVERY_USE_DNS = "discovery.dns.enabled"; - - public static final String PERSIST_PRESENCE_DATA = "users.presence.persist"; - - public static final String NOTIFICATIONS_SENDTO = "notifications.sendTo"; - public static final String NOTIFICATIONS_CONNECTED = "notifications.connected"; - - private static final String CONFIGURATION_FILE = "configuration.properties"; + private static final Logger LOGGER = Logger.getLogger(Configuration.class); + + private static final long serialVersionUID = 1L; + + private static final String ARRAY_PROPERTY_SEPARATOR = ";"; + private static final String INVALID_NODE = "Illegal node format"; + + public static final String CONFIGURATION_SERVER_DOMAIN = "server.domain"; + public static final String CONFIGURATION_SERVER_CHANNELS_DOMAIN = "server.domain.channels"; + public static final String CONFIGURATION_SERVER_TOPICS_DOMAIN = "server.domain.topics"; + public static final String CONFIGURATION_LOCAL_DOMAIN_CHECKER = "server.domain.checker"; + + public static final String CONFIGURATION_ADMIN_USERS = "users.admin"; + + public static final String CONFIGURATION_CHANNELS_AUTOSUBSCRIBE = "channels.autosubscribe"; + public static final String CONFIGURATION_CHANNELS_AUTOSUBSCRIBE_AUTOAPPROVE = "channels.autosubscribe.autoapprove"; + public static final String CONFIGURATION_CHANNELS_DEFAULT_AFFILIATION = "channel.configuration.default.affiliation"; + public static final String CONFIGURATION_CHANNELS_DEFAULT_ACCESSMODEL = "channel.configuration.default.accessmodel"; + public static final String CONFIGURATION_CHANNELS_DEFAULT_DESCRIPTION = "channel.configuration.default.description"; + public static final String CONFIGURATION_CHANNELS_DEFAULT_TITLE = "channel.configuration.default.title"; + + public static final String DISCOVERY_USE_DNS = "discovery.dns.enabled"; + + public static final String PERSIST_PRESENCE_DATA = "users.presence.persist"; + + public static final String NOTIFICATIONS_SENDTO = "notifications.sendTo"; + public static final String NOTIFICATIONS_CONNECTED = "notifications.connected"; + + private static final String CONFIGURATION_FILE = "configuration.properties"; public static final String PURGE_REMOTE_ON_START = "sync.purge-on-start"; - public static final String XMPP_PORT = "xmpp.port"; - - public static final String XMPP_HOST = "xmpp.host"; - - private static Configuration instance = null; - - private Collection adminUsers = new ArrayList(); - private Collection autosubscribeChannels = new ArrayList(); - - private Properties conf; - - private Configuration() { - try { - conf = new Properties(); - InputStream confFile = this.getClass().getClassLoader() - .getResourceAsStream(CONFIGURATION_FILE); - if (confFile != null) { - load(confFile); - LOGGER.info("Loaded " + CONFIGURATION_FILE + " from classpath."); - } else { - File f = new File(CONFIGURATION_FILE); - load(new FileInputStream(f)); - LOGGER.info("Loaded " + CONFIGURATION_FILE - + " from working directory."); - } - } catch (Exception e) { - LOGGER.error("Could not load " + CONFIGURATION_FILE + "!"); - System.exit(1); - } - } - - private void setupCollections() { - adminUsers = getJIDArrayProperty(CONFIGURATION_ADMIN_USERS); - autosubscribeChannels = getJIDArrayProperty(CONFIGURATION_CHANNELS_AUTOSUBSCRIBE); - } - - public Collection getAdminUsers() { - return adminUsers; - } - - public Collection getAutosubscribeChannels() { - return autosubscribeChannels; - } - - public static Configuration getInstance() { - if (null == instance) { - instance = new Configuration(); - } - return instance; - } - - public static void reset() { - instance = null; - } - - public String getProperty(String key) { - return conf.getProperty(key); - } - - @Override - public synchronized Object remove(Object key) { - return conf.remove(key); - } + public static final String XMPP_PORT = "xmpp.port"; + + public static final String XMPP_HOST = "xmpp.host"; + + private static Configuration instance = null; + + private Collection adminUsers = new ArrayList(); + private Collection autosubscribeChannels = new ArrayList(); + + private Properties conf; + + private Configuration() { + try { + conf = new Properties(); + InputStream confFile = this.getClass().getClassLoader() + .getResourceAsStream(CONFIGURATION_FILE); + if (confFile != null) { + load(confFile); + LOGGER.info("Loaded " + CONFIGURATION_FILE + " from classpath."); + } else { + File f = new File(CONFIGURATION_FILE); + load(new FileInputStream(f)); + LOGGER.info("Loaded " + CONFIGURATION_FILE + + " from working directory."); + } + } catch (Exception e) { + LOGGER.error("Could not load " + CONFIGURATION_FILE + "!"); + System.exit(1); + } + } + + private void setupCollections() { + adminUsers = getJIDArrayProperty(CONFIGURATION_ADMIN_USERS); + autosubscribeChannels = getJIDArrayProperty(CONFIGURATION_CHANNELS_AUTOSUBSCRIBE); + } + + public Collection getAdminUsers() { + return adminUsers; + } + + public Collection getAutosubscribeChannels() { + return autosubscribeChannels; + } + + public static Configuration getInstance() { + if (null == instance) { + instance = new Configuration(); + } + return instance; + } + + public static void reset() { + instance = null; + } + + public String getProperty(String key) { + return conf.getProperty(key); + } + + @Override + public synchronized Object remove(Object key) { + return conf.remove(key); + } public void clear() { conf.clear(); } - public String getProperty(String key, String defaultValue) { - return conf.getProperty(key, defaultValue); - } - - public void putProperty(String key, String value) { - conf.put(key, value); - } + public String getProperty(String key, String defaultValue) { + return conf.getProperty(key, defaultValue); + } + + public void putProperty(String key, String value) { + conf.put(key, value); + } - public void load(InputStream inputStream) throws IOException { - conf.load(inputStream); - setupCollections(); - } + public void load(InputStream inputStream) throws IOException { + conf.load(inputStream); + setupCollections(); + } + + private Collection getStringArrayProperty(String key) { + String prop = getProperty(key); - private Collection getStringArrayProperty(String key) { - String prop = getProperty(key); + if (null == prop) { + return Collections.emptyList(); + } - if (null == prop) { - return Collections.emptyList(); - } + return Arrays.asList(prop.split(ARRAY_PROPERTY_SEPARATOR)); + } - return Arrays.asList(prop.split(ARRAY_PROPERTY_SEPARATOR)); - } + private Collection getJIDArrayProperty(String key) { + Collection props = getStringArrayProperty(key); - private Collection getJIDArrayProperty(String key) { - Collection props = getStringArrayProperty(key); + Collection jids = new ArrayList(props.size()); - Collection jids = new ArrayList(props.size()); + for (String prop : props) { + try { + jids.add(new JID(prop)); + } catch (IllegalArgumentException e) { + LOGGER.error(e); + } + } - for (String prop : props) { + return jids; + } + + public ArrayList getNotificationsList(String event) { + ArrayList notify = new ArrayList(); + if (!getBooleanProperty(event, false)) { + return notify; + } + String[] users = getProperty(NOTIFICATIONS_SENDTO).split(";"); + JID userJid; + for (String user : users) { try { - jids.add(new JID(prop)); + userJid = new JID(user); + notify.add(userJid); } catch (IllegalArgumentException e) { LOGGER.error(e); } - } - - return jids; - } - - public ArrayList getNotificationsList(String event) { - ArrayList notify = new ArrayList(); - if (!getBooleanProperty(event, false)) { - return notify; - } - String[] users = getProperty(NOTIFICATIONS_SENDTO).split(";"); - JID userJid; - for (String user : users) { - try { - userJid = new JID(user); - notify.add(userJid); - } catch (IllegalArgumentException e) { - LOGGER.error(e); - } - } - return notify; - } - - public String getServerDomain() { - return getProperty(CONFIGURATION_SERVER_DOMAIN); - } - - public String getServerChannelsDomain() { - return getProperty(CONFIGURATION_SERVER_CHANNELS_DOMAIN); - } - - public String getServerTopicsDomain() { - return getProperty(CONFIGURATION_SERVER_TOPICS_DOMAIN); - } - - public boolean getBooleanProperty(final String key, - final boolean defaultValue) { - String value = getProperty(key); - - if (value != null) { - if (value.equalsIgnoreCase("true")) { - return true; - } - if (value.equalsIgnoreCase("false")) { - return false; - } - LOGGER.warn("Invalid boolean property value for " + key + ": " - + value); - } - - return defaultValue; - } + } + return notify; + } + + public String getServerDomain() { + return getProperty(CONFIGURATION_SERVER_DOMAIN); + } + + public String getServerChannelsDomain() { + return getProperty(CONFIGURATION_SERVER_CHANNELS_DOMAIN); + } + + public String getServerTopicsDomain() { + return getProperty(CONFIGURATION_SERVER_TOPICS_DOMAIN); + } + + public boolean getBooleanProperty(final String key, + final boolean defaultValue) { + String value = getProperty(key); + + if (value != null) { + if (value.equalsIgnoreCase("true")) { + return true; + } + if (value.equalsIgnoreCase("false")) { + return false; + } + LOGGER.warn("Invalid boolean property value for " + key + ": " + + value); + } + + return defaultValue; + } public String getComponentPort() { - return this.getProperty(XMPP_PORT, "5347"); - } - - public String getXmppHost() { - return this.getProperty(XMPP_HOST, "127.0.0.1"); - } - - public boolean isLocalDomain(String domain) { - return LocalDomainChecker.isLocal(domain, this); - } - - public boolean isLocalNode(String nodeId) { - if (false == nodeId.matches("/user/.+@.+/.+")) { - LOGGER.debug("Node " + nodeId + " has an invalid format"); - throw new IllegalArgumentException(INVALID_NODE); - } - String domain = new JID(nodeId.split("/")[2]).getDomain(); - return isLocalDomain(domain); - } - - public boolean isLocalJID(JID jid) { - String domain = jid.getDomain(); - return isLocalDomain(domain); - } + return this.getProperty(XMPP_PORT, "5347"); + } + + public String getXmppHost() { + return this.getProperty(XMPP_HOST, "127.0.0.1"); + } + + public boolean isLocalDomain(String domain) { + return LocalDomainChecker.isLocal(domain, this); + } + + public boolean isLocalNode(String nodeId) { + if (false == nodeId.matches("/user/.+@.+/.+")) { + LOGGER.debug("Node " + nodeId + " has an invalid format"); + throw new IllegalArgumentException(INVALID_NODE); + } + String domain = new JID(nodeId.split("/")[2]).getDomain(); + return isLocalDomain(domain); + } + + public boolean isLocalJID(JID jid) { + String domain = jid.getDomain(); + return isLocalDomain(domain); + } } diff --git a/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java b/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java index ed3d16f1..93d94247 100644 --- a/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java +++ b/src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java @@ -27,20 +27,20 @@ */ public class ChannelManagerImpl implements ChannelManager { - private final NodeStore nodeStore; + private final NodeStore nodeStore; - private static final Logger logger = Logger.getLogger(ChannelManagerImpl.class); - private static final String REMOTE_NODE = "Illegal remote node"; + 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; - } + /** + * 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 { @@ -185,84 +185,84 @@ public void deleteNodeItemById(String nodeId, String nodeItemId) throws NodeStor 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; - } - nodeStore.purgeNodeItems(node); - } catch (IllegalArgumentException e) { - logger.error("Invalid remote node in datastore " + node, e); - } - } - } - + @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; + } + 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); @@ -284,17 +284,17 @@ public int getCountRecentItems(JID user, Date since, int maxPerNode, String node 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 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 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); @@ -310,19 +310,19 @@ public Affiliations getDefaultNodeAffiliation(String nodeId) throws NodeStoreExc 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); - } + @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 { @@ -339,11 +339,11 @@ 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 ResultSet getNodeThreads(String node, String afterId, + int limit) throws NodeStoreException { + return nodeStore.getNodeThreads(node, afterId, limit); + } @Override public int countNodeThreads(String node) throws NodeStoreException { @@ -402,14 +402,14 @@ public ArrayList onlineJids(JID jid) throws NodeStoreException { return nodeStore.onlineJids(jid); } - @Override - public List getLocalNodesList() throws NodeStoreException { - return nodeStore.getLocalNodesList(); - } + @Override + public List getLocalNodesList() throws NodeStoreException { + return nodeStore.getLocalNodesList(); + } - @Override - public List getRemoteNodesList() throws NodeStoreException { - return nodeStore.getRemoteNodesList(); - } + @Override + public List getRemoteNodesList() throws NodeStoreException { + return nodeStore.getRemoteNodesList(); + } } diff --git a/src/main/java/org/buddycloud/channelserver/channel/LocalDomainChecker.java b/src/main/java/org/buddycloud/channelserver/channel/LocalDomainChecker.java index a5b528bd..479a3179 100644 --- a/src/main/java/org/buddycloud/channelserver/channel/LocalDomainChecker.java +++ b/src/main/java/org/buddycloud/channelserver/channel/LocalDomainChecker.java @@ -10,67 +10,67 @@ public class LocalDomainChecker { - private static final String COMMA = ","; - - public static boolean isLocal(String domain, Properties configuration) { - return isLocal(domain, configuration, null); - } - - public static boolean isLocal(String domain, Properties configuration, Set localDomains) { - if (configuration == null) { - return false; - } - String command = configuration.getProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); - - if (command == null) { - String serverDomain = configuration - .getProperty(Configuration.CONFIGURATION_SERVER_DOMAIN); - String topicDomain = configuration - .getProperty(Configuration.CONFIGURATION_SERVER_TOPICS_DOMAIN); - String channelDomain = configuration - .getProperty(Configuration.CONFIGURATION_SERVER_CHANNELS_DOMAIN); - return (domain.equals(serverDomain) || domain.equals(topicDomain) - || domain.equals(channelDomain)); - } - - if (command.equals(Boolean.TRUE.toString())) { - return true; - } - - if (localDomains == null) { - try { - localDomains = getLocalDomains(configuration); - } catch (Exception e) { - return false; - } - } - return localDomains.contains(domain.toLowerCase()); - } + private static final String COMMA = ","; + + public static boolean isLocal(String domain, Properties configuration) { + return isLocal(domain, configuration, null); + } + + public static boolean isLocal(String domain, Properties configuration, Set localDomains) { + if (configuration == null) { + return false; + } + String command = configuration.getProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + + if (command == null) { + String serverDomain = configuration + .getProperty(Configuration.CONFIGURATION_SERVER_DOMAIN); + String topicDomain = configuration + .getProperty(Configuration.CONFIGURATION_SERVER_TOPICS_DOMAIN); + String channelDomain = configuration + .getProperty(Configuration.CONFIGURATION_SERVER_CHANNELS_DOMAIN); + return (domain.equals(serverDomain) || domain.equals(topicDomain) + || domain.equals(channelDomain)); + } + + if (command.equals(Boolean.TRUE.toString())) { + return true; + } + + if (localDomains == null) { + try { + localDomains = getLocalDomains(configuration); + } catch (Exception e) { + return false; + } + } + return localDomains.contains(domain.toLowerCase()); + } - public static Set getLocalDomains(Properties configuration) { - HashSet localDomains = new HashSet(); - String command = configuration.getProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); - if (command == null) { - return localDomains; - } - - try { - ProcessBuilder processBuilder = new ProcessBuilder(command); - Process process = processBuilder.start(); - process.waitFor(); - InputStream inputStream = process.getInputStream(); - - String csvDomains = IOUtils.toString(inputStream); - for (String eachDomain : csvDomains.split(COMMA)) { - localDomains.add(eachDomain.trim().toLowerCase()); - } - inputStream.close(); - } catch (Exception e) { - // Return empty set - } - - return localDomains; - } + public static Set getLocalDomains(Properties configuration) { + HashSet localDomains = new HashSet(); + String command = configuration.getProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + if (command == null) { + return localDomains; + } + + try { + ProcessBuilder processBuilder = new ProcessBuilder(command); + Process process = processBuilder.start(); + process.waitFor(); + InputStream inputStream = process.getInputStream(); + + String csvDomains = IOUtils.toString(inputStream); + for (String eachDomain : csvDomains.split(COMMA)) { + localDomains.add(eachDomain.trim().toLowerCase()); + } + inputStream.close(); + } catch (Exception e) { + // Return empty set + } + + return localDomains; + } } diff --git a/src/main/java/org/buddycloud/channelserver/db/NodeStore.java b/src/main/java/org/buddycloud/channelserver/db/NodeStore.java index 6d5ec949..3317b00b 100644 --- a/src/main/java/org/buddycloud/channelserver/db/NodeStore.java +++ b/src/main/java/org/buddycloud/channelserver/db/NodeStore.java @@ -408,74 +408,74 @@ CloseableIterator getRecentItems(JID user, Date since, int maxPerNode, */ void purgeNodeItems(String nodeId) throws NodeStoreException; - /** - * Retrieves a list of nodes - * - * @throws NodeStoreException - */ - ArrayList getNodeList() throws NodeStoreException; - - /** - * Retrieves a list of local nodes - * - * @throws NodeStoreException - */ - List getLocalNodesList() throws NodeStoreException; - - /** - * Retrieves a list of remote nodes - * - * @throws NodeStoreException - */ - List getRemoteNodesList() throws NodeStoreException; - - /** - * Search subscribed nodes for content - * - * @param searcher - * JID of user performing the search - * @param content - * Keywords upon which to search - * @param author - * JID of the content author - * @param page - * Page number of results (>= 1) - * @param rpp - * Results per page (>= 1) - * @return - * @throws NodeStoreException - */ - @SuppressWarnings("rawtypes") - CloseableIterator performSearch(JID searcher, List content, - JID author, int page, int rpp) throws NodeStoreException; - - /** - * Retrieves a list of items from public channels "firehose" - * - * @param limit - * limit the number of results - * @param afterItemId - * after item ID# - * @param isAdmin - * show items from non-open nodes - * @param actorDomain - * the domain of the actor - * @return - * @throws NodeStoreException - */ - CloseableIterator getFirehose(int limit, String afterItemId, - boolean isAdmin, String actorDomain) throws NodeStoreException; - - /** - * Get count of items from public channels "firehose" - * - * @param isAdmin - * counts items from non-open nodes - * @param actorDomain - * the domain of the actor - * @throws NodeStoreException - */ - int getFirehoseItemCount(boolean isAdmin, String actorDomain) throws NodeStoreException; + /** + * Retrieves a list of nodes + * + * @throws NodeStoreException + */ + ArrayList getNodeList() throws NodeStoreException; + + /** + * Retrieves a list of local nodes + * + * @throws NodeStoreException + */ + List getLocalNodesList() throws NodeStoreException; + + /** + * Retrieves a list of remote nodes + * + * @throws NodeStoreException + */ + List getRemoteNodesList() throws NodeStoreException; + + /** + * Search subscribed nodes for content + * + * @param searcher + * JID of user performing the search + * @param content + * Keywords upon which to search + * @param author + * JID of the content author + * @param page + * Page number of results (>= 1) + * @param rpp + * Results per page (>= 1) + * @return + * @throws NodeStoreException + */ + @SuppressWarnings("rawtypes") + CloseableIterator performSearch(JID searcher, List content, + JID author, int page, int rpp) throws NodeStoreException; + + /** + * Retrieves a list of items from public channels "firehose" + * + * @param limit + * limit the number of results + * @param afterItemId + * after item ID# + * @param isAdmin + * show items from non-open nodes + * @param actorDomain + * the domain of the actor + * @return + * @throws NodeStoreException + */ + CloseableIterator getFirehose(int limit, String afterItemId, + boolean isAdmin, String actorDomain) throws NodeStoreException; + + /** + * Get count of items from public channels "firehose" + * + * @param isAdmin + * counts items from non-open nodes + * @param actorDomain + * the domain of the actor + * @throws NodeStoreException + */ + int getFirehoseItemCount(boolean isAdmin, String actorDomain) throws NodeStoreException; /** * Get a list of posts for a user diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java index 9ba3a4c9..1cd31193 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java @@ -506,151 +506,151 @@ public ResultSet getNodeMemberships(String nodeId) throws NodeSt } } - @Override - public CloseableIterator getFirehose(int limit, - String afterItemId, boolean isAdmin, String actorDomain) throws NodeStoreException { - - PreparedStatement stmt = null; - Date beforeDate = null; - - if (afterItemId != null) { - beforeDate = getNodeItem(GlobalItemIDImpl.fromBuddycloudString( - afterItemId)).getUpdated(); - } else { - beforeDate = new Date(); - } - - if (limit < 0) { - throw new IllegalArgumentException( - "Invalid value for parameter count: " + limit); - } - - try { - stmt = conn.prepareStatement(dialect.selectItemsForLocalNodesBeforeDate()); - stmt.setTimestamp(1, new java.sql.Timestamp(beforeDate.getTime())); - stmt.setString(2, Conf.ACCESS_MODEL); - stmt.setBoolean(3, isAdmin); - stmt.setString(4, AccessModels.open.toString()); - stmt.setString(5, AccessModels.local.toString()); - stmt.setString(6, getDomainRegex(actorDomain)); - stmt.setBoolean(7, isAdmin); - stmt.setString(8, getLocalDomainRegex()); - stmt.setInt(9, limit); - - java.sql.ResultSet rs = stmt.executeQuery(); - - LinkedList results = new LinkedList(); - - while (rs.next()) { - results.push(new NodeItemImpl(rs.getString(1), rs.getString(2), - rs.getTimestamp(3), rs.getString(4), rs.getString(5), rs.getTimestamp(6))); - } - - return new ClosableIteratorImpl(results.iterator()); - } catch (SQLException e) { - throw new NodeStoreException(e); - } finally { - close(stmt); // Will implicitly close the resultset if required - } - } - - @Override - public int getFirehoseItemCount(boolean isAdmin, String actorDomain) - throws NodeStoreException { - PreparedStatement stmt = null; - - try { - stmt = conn.prepareStatement(dialect.countItemsForLocalNodes()); - stmt.setString(1, Conf.ACCESS_MODEL); - stmt.setBoolean(2, isAdmin); - stmt.setString(3, AccessModels.open.toString()); - stmt.setString(4, AccessModels.local.toString()); - stmt.setString(5, getDomainRegex(actorDomain)); - stmt.setBoolean(6, isAdmin); - stmt.setString(7, getLocalDomainRegex()); - - java.sql.ResultSet rs = stmt.executeQuery(); - if (!rs.next()) { - return 0; // This really shouldn't happen! - } - return rs.getInt(1); - } catch (SQLException e) { - throw new NodeStoreException(e); - } finally { - close(stmt); // Will implicitly close the resultset if - // required - } - } - - private static final String POSIX_SPECIAL_CHARS = "\\.^$*+?()[{|"; - - private static String posixRegexQuote(String str) { - for (Character p : POSIX_SPECIAL_CHARS.toCharArray()) { - str = str.replace(p.toString(), "\\" + p.toString()); - } - return str; - } - - private static String getLocalDomainRegex() { - String serverDomain = Configuration.getInstance().getServerDomain(); - String serverTopicsDomain = Configuration.getInstance().getServerTopicsDomain(); - List localDomains = new LinkedList(); - if (serverDomain != null) { - localDomains.add(posixRegexQuote(serverDomain)); - } - if (serverTopicsDomain != null) { - localDomains.add(posixRegexQuote(serverTopicsDomain)); - } - for (String localDomain : LocalDomainChecker.getLocalDomains(Configuration.getInstance())) { - localDomains.add(posixRegexQuote(localDomain)); - } - - String domainRegex = localDomains.isEmpty() ? ".*" : - getDomainRegex(StringUtils.join(localDomains, "|")); - return domainRegex; - } - - private static String getDomainRegex(String localDomains) { - return ".*@(" + localDomains + ")\\/.*"; - } - - @Override - public List getLocalNodesList() throws NodeStoreException { - PreparedStatement stmt = null; - try { - stmt = conn.prepareStatement(dialect.selectLocalNodes()); - stmt.setString(1, getLocalDomainRegex()); - java.sql.ResultSet rs = stmt.executeQuery(); - List result = new ArrayList(); - while (rs.next()) { - result.add(rs.getString(1)); - } - return result; - } catch (SQLException e) { - throw new NodeStoreException(e); - } finally { - close(stmt); // Will implicitly close the resultset if required - } - } - - @Override - public List getRemoteNodesList() throws NodeStoreException { - PreparedStatement stmt = null; - try { - stmt = conn.prepareStatement(dialect.selectRemoteNodes()); - stmt.setString(1, getLocalDomainRegex()); - java.sql.ResultSet rs = stmt.executeQuery(); - List result = new ArrayList(); - while (rs.next()) { - result.add(rs.getString(1)); - } - return result; - } catch (SQLException e) { - throw new NodeStoreException(e); - } finally { - close(stmt); // Will implicitly close the resultset if required - } - } + @Override + public CloseableIterator getFirehose(int limit, + String afterItemId, boolean isAdmin, String actorDomain) throws NodeStoreException { + + PreparedStatement stmt = null; + Date beforeDate = null; + + if (afterItemId != null) { + beforeDate = getNodeItem(GlobalItemIDImpl.fromBuddycloudString( + afterItemId)).getUpdated(); + } else { + beforeDate = new Date(); + } + + if (limit < 0) { + throw new IllegalArgumentException( + "Invalid value for parameter count: " + limit); + } + + try { + stmt = conn.prepareStatement(dialect.selectItemsForLocalNodesBeforeDate()); + stmt.setTimestamp(1, new java.sql.Timestamp(beforeDate.getTime())); + stmt.setString(2, Conf.ACCESS_MODEL); + stmt.setBoolean(3, isAdmin); + stmt.setString(4, AccessModels.open.toString()); + stmt.setString(5, AccessModels.local.toString()); + stmt.setString(6, getDomainRegex(actorDomain)); + stmt.setBoolean(7, isAdmin); + stmt.setString(8, getLocalDomainRegex()); + stmt.setInt(9, limit); + + java.sql.ResultSet rs = stmt.executeQuery(); + + LinkedList results = new LinkedList(); + + while (rs.next()) { + results.push(new NodeItemImpl(rs.getString(1), rs.getString(2), + rs.getTimestamp(3), rs.getString(4), rs.getString(5), rs.getTimestamp(6))); + } + + return new ClosableIteratorImpl(results.iterator()); + } catch (SQLException e) { + throw new NodeStoreException(e); + } finally { + close(stmt); // Will implicitly close the resultset if required + } + } + + @Override + public int getFirehoseItemCount(boolean isAdmin, String actorDomain) + throws NodeStoreException { + PreparedStatement stmt = null; + + try { + stmt = conn.prepareStatement(dialect.countItemsForLocalNodes()); + stmt.setString(1, Conf.ACCESS_MODEL); + stmt.setBoolean(2, isAdmin); + stmt.setString(3, AccessModels.open.toString()); + stmt.setString(4, AccessModels.local.toString()); + stmt.setString(5, getDomainRegex(actorDomain)); + stmt.setBoolean(6, isAdmin); + stmt.setString(7, getLocalDomainRegex()); + + java.sql.ResultSet rs = stmt.executeQuery(); + if (!rs.next()) { + return 0; // This really shouldn't happen! + } + return rs.getInt(1); + } catch (SQLException e) { + throw new NodeStoreException(e); + } finally { + close(stmt); // Will implicitly close the resultset if + // required + } + } + + private static final String POSIX_SPECIAL_CHARS = "\\.^$*+?()[{|"; + + private static String posixRegexQuote(String str) { + for (Character p : POSIX_SPECIAL_CHARS.toCharArray()) { + str = str.replace(p.toString(), "\\" + p.toString()); + } + return str; + } + + private static String getLocalDomainRegex() { + String serverDomain = Configuration.getInstance().getServerDomain(); + String serverTopicsDomain = Configuration.getInstance().getServerTopicsDomain(); + List localDomains = new LinkedList(); + if (serverDomain != null) { + localDomains.add(posixRegexQuote(serverDomain)); + } + if (serverTopicsDomain != null) { + localDomains.add(posixRegexQuote(serverTopicsDomain)); + } + for (String localDomain : LocalDomainChecker.getLocalDomains(Configuration.getInstance())) { + localDomains.add(posixRegexQuote(localDomain)); + } + + String domainRegex = localDomains.isEmpty() ? ".*" : + getDomainRegex(StringUtils.join(localDomains, "|")); + return domainRegex; + } + + private static String getDomainRegex(String localDomains) { + return ".*@(" + localDomains + ")\\/.*"; + } + + @Override + public List getLocalNodesList() throws NodeStoreException { + PreparedStatement stmt = null; + try { + stmt = conn.prepareStatement(dialect.selectLocalNodes()); + stmt.setString(1, getLocalDomainRegex()); + java.sql.ResultSet rs = stmt.executeQuery(); + List result = new ArrayList(); + while (rs.next()) { + result.add(rs.getString(1)); + } + return result; + } catch (SQLException e) { + throw new NodeStoreException(e); + } finally { + close(stmt); // Will implicitly close the resultset if required + } + } + + @Override + public List getRemoteNodesList() throws NodeStoreException { + PreparedStatement stmt = null; + try { + stmt = conn.prepareStatement(dialect.selectRemoteNodes()); + stmt.setString(1, getLocalDomainRegex()); + java.sql.ResultSet rs = stmt.executeQuery(); + List result = new ArrayList(); + while (rs.next()) { + result.add(rs.getString(1)); + } + return result; + } catch (SQLException e) { + throw new NodeStoreException(e); + } finally { + close(stmt); // Will implicitly close the resultset if required + } + } @Override public ResultSet getSubscriptionChanges(JID user, Date startDate, Date endDate) throws NodeStoreException { @@ -1797,9 +1797,9 @@ public interface NodeStoreSQLDialect { String countNodeAffiliations(); - String selectRemoteNodes(); + String selectRemoteNodes(); - String selectLocalNodes(); + String selectLocalNodes(); String countNodeAffiliationsForOwner(); diff --git a/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java b/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java index c4948d87..f4fd58a7 100644 --- a/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java +++ b/src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java @@ -143,46 +143,46 @@ public class Sql92NodeStoreDialect implements NodeStoreSQLDialect { private static final String SELECT_COUNT_ITEM_THREAD = "" + "SELECT COUNT(\"id\") " + "FROM \"items\" WHERE \"node\" = ? " + "AND (\"in_reply_to\" LIKE ? OR \"id\" = ?) "; - private static final String SELECT_LOCAL_NODES = - "SELECT \"node\" " + - "FROM \"nodes\" " + - "WHERE \"node\" ~ ? "; - - private static final String SELECT_REMOTE_NODES = - "SELECT \"node\" " + - "FROM \"nodes\" " + - "WHERE \"node\" !~ ?"; - - private static final String SELECT_ITEMS_FROM_LOCAL_NODES_BEFORE_DATE = - "SELECT \"items\".\"node\", \"id\", \"items\".\"updated\", \"xml\", \"in_reply_to\", \"created\" " + - "FROM \"items\", \"node_config\" " + - "WHERE \"items\".\"updated\" < ? " + - "AND \"items\".\"node\" = \"node_config\".\"node\" "+ - "AND \"key\" = ? " + - "AND ((" + - "NOT ? AND " + - "(\"value\" LIKE ?) OR " + - "(\"value\" LIKE ? AND \"items\".\"node\" ~ ?)) " + - "OR ?) " + - "AND \"items\".\"node\" ~ ? " + - "ORDER BY \"updated\" DESC, \"id\" ASC LIMIT ?"; - - private static final String COUNT_SUBSCRIPTIONS_FOR_NODE = "SELECT COUNT(*) " + "FROM \"subscriptions\", \"affiliations\" WHERE " + private static final String SELECT_LOCAL_NODES = + "SELECT \"node\" " + + "FROM \"nodes\" " + + "WHERE \"node\" ~ ? "; + + private static final String SELECT_REMOTE_NODES = + "SELECT \"node\" " + + "FROM \"nodes\" " + + "WHERE \"node\" !~ ?"; + + private static final String SELECT_ITEMS_FROM_LOCAL_NODES_BEFORE_DATE = + "SELECT \"items\".\"node\", \"id\", \"items\".\"updated\", \"xml\", \"in_reply_to\", \"created\" " + + "FROM \"items\", \"node_config\" " + + "WHERE \"items\".\"updated\" < ? " + + "AND \"items\".\"node\" = \"node_config\".\"node\" " + + "AND \"key\" = ? " + + "AND ((" + + "NOT ? AND " + + "(\"value\" LIKE ?) OR " + + "(\"value\" LIKE ? AND \"items\".\"node\" ~ ?)) " + + "OR ?) " + + "AND \"items\".\"node\" ~ ? " + + "ORDER BY \"updated\" DESC, \"id\" ASC LIMIT ?"; + + private static final String COUNT_SUBSCRIPTIONS_FOR_NODE = "SELECT COUNT(*) " + "FROM \"subscriptions\", \"affiliations\" WHERE " + "\"subscriptions\".\"node\" = ? AND \"affiliations\".\"node\" = \"subscriptions\".\"node\" " + "AND \"affiliations\".\"user\" = \"subscriptions\".\"user\" " + "AND \"affiliations\".\"affiliation\" != 'outcast';"; - private static final String COUNT_ITEMS_FROM_LOCAL_NODES = - "SELECT COUNT(\"id\") " + - "FROM \"items\", \"node_config\" " + - "WHERE \"items\".\"node\" = \"node_config\".\"node\" "+ - "AND \"key\" = ? " + - "AND ((" + - "NOT ? AND " + - "(\"value\" LIKE ?) OR " + - "(\"value\" LIKE ? AND \"items\".\"node\" ~ ?)) " + - "OR ?) " + - "AND \"items\".\"node\" ~ ?"; - + private static final String COUNT_ITEMS_FROM_LOCAL_NODES = + "SELECT COUNT(\"id\") " + + "FROM \"items\", \"node_config\" " + + "WHERE \"items\".\"node\" = \"node_config\".\"node\" " + + "AND \"key\" = ? " + + "AND ((" + + "NOT ? AND " + + "(\"value\" LIKE ?) OR " + + "(\"value\" LIKE ? AND \"items\".\"node\" ~ ?)) " + + "OR ?) " + + "AND \"items\".\"node\" ~ ?"; + private static final String COUNT_SUBSCRIPTIONS_TO_NODE_FOR_OWNER = "SELECT COUNT(*) " + "FROM \"subscriptions\" WHERE " + "\"subscriptions\".\"node\" = ?;"; @@ -648,14 +648,14 @@ public String selectCountUserFeedItems() { return SELECT_COUNT_USER_FEED_ITEMS; } - @Override - public String selectRemoteNodes() { - return SELECT_REMOTE_NODES; - } + @Override + public String selectRemoteNodes() { + return SELECT_REMOTE_NODES; + } - @Override - public String selectLocalNodes() { - return SELECT_LOCAL_NODES; - } + @Override + public String selectLocalNodes() { + return SELECT_LOCAL_NODES; + } } diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoinfo/DiscoInfoGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoinfo/DiscoInfoGet.java index 7d32631e..00458149 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoinfo/DiscoInfoGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoinfo/DiscoInfoGet.java @@ -41,39 +41,39 @@ public DiscoInfoGet(BlockingQueue outQueue, ChannelManager channelManage @Override public void process(IQ reqIQ) throws Exception { - requestIq = reqIQ; - result = IQ.createResultIQ(reqIQ); - Element elm = reqIQ.getChildElement(); - node = elm.attributeValue("node"); - query = result.setChildElement(ELEMENT_NAME, - JabberDiscoInfo.NAMESPACE_URI); - if (false == Configuration.getInstance().isLocalJID(requestIq.getFrom())) { - result.getElement().addAttribute("remote-server-discover", "false"); - } - if ((node == null) || (true == node.equals(""))) { - sendServerDiscoInfo(); - return; - } - if (false == Configuration.getInstance().isLocalNode(node) - && (false == channelManager.isCachedNode(node))) { - logger.info("Node " + node + " is remote and not cached so " - + "we're going off to get disco#info"); - makeRemoteRequest(); - return; - } - conf = channelManager.getNodeConf(node); - if (conf.isEmpty()) { - nodeDoesntExistResponse(); - return; - } - try { - sendNodeConfigurationInformation(); - } catch (NodeStoreException e) { - logger.error(e); - setErrorResponse(PacketError.Type.wait, - PacketError.Condition.internal_server_error); - } - } + requestIq = reqIQ; + result = IQ.createResultIQ(reqIQ); + Element elm = reqIQ.getChildElement(); + node = elm.attributeValue("node"); + query = result.setChildElement(ELEMENT_NAME, + JabberDiscoInfo.NAMESPACE_URI); + if (false == Configuration.getInstance().isLocalJID(requestIq.getFrom())) { + result.getElement().addAttribute("remote-server-discover", "false"); + } + if ((node == null) || (true == node.equals(""))) { + sendServerDiscoInfo(); + return; + } + if (false == Configuration.getInstance().isLocalNode(node) + && (false == channelManager.isCachedNode(node))) { + logger.info("Node " + node + " is remote and not cached so " + + "we're going off to get disco#info"); + makeRemoteRequest(); + return; + } + conf = channelManager.getNodeConf(node); + if (conf.isEmpty()) { + nodeDoesntExistResponse(); + return; + } + try { + sendNodeConfigurationInformation(); + } catch (NodeStoreException e) { + logger.error(e); + setErrorResponse(PacketError.Type.wait, + PacketError.Condition.internal_server_error); + } + } private void sendNodeConfigurationInformation() throws Exception { @@ -88,16 +88,16 @@ private void sendNodeConfigurationInformation() throws Exception { String value; - configuration.putAll(conf); - for (String key : configuration.keySet()) { - value = configuration.get(key); - if ((true == key.equals(AccessModel.FIELD_NAME)) - && (value.equals(AccessModel.local.toString())) - && (false == Configuration.getInstance().isLocalJID(requestIq.getFrom()))) { - value = AccessModel.authorize.toString(); - } - x.addField(key, null, null).addValue(value); - } + configuration.putAll(conf); + for (String key : configuration.keySet()) { + value = configuration.get(key); + if ((true == key.equals(AccessModel.FIELD_NAME)) + && (value.equals(AccessModel.local.toString())) + && (false == Configuration.getInstance().isLocalJID(requestIq.getFrom()))) { + value = AccessModel.authorize.toString(); + } + x.addField(key, null, null).addValue(value); + } query.addAttribute("node", node); query.addElement("identity").addAttribute("category", "pubsub").addAttribute("type", "leaf"); diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGet.java index 93d7b528..bfef61ce 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGet.java @@ -51,20 +51,20 @@ public void process(IQ reqIQ) throws Exception { outQueue.add(response); } - private void addItems() throws NodeStoreException { - List nodes = channelManager.getLocalNodesList(); + private void addItems() throws NodeStoreException { + List nodes = channelManager.getLocalNodesList(); - String jid = Configuration.getInstance() - .getProperty(Configuration.CONFIGURATION_SERVER_CHANNELS_DOMAIN); - - Element query = response.getElement().addElement("query"); - query.addNamespace("", JabberDiscoItems.NAMESPACE_URI); - for (String node : nodes) { - Element item = query.addElement("item"); - item.addAttribute("node", node); - item.addAttribute("jid", jid); - } - } + String jid = Configuration.getInstance() + .getProperty(Configuration.CONFIGURATION_SERVER_CHANNELS_DOMAIN); + + Element query = response.getElement().addElement("query"); + query.addNamespace("", JabberDiscoItems.NAMESPACE_URI); + for (String node : nodes) { + Element item = query.addElement("item"); + item.addAttribute("node", node); + item.addAttribute("jid", jid); + } + } private void setErrorCondition(Type type, Condition condition) { response.setType(IQ.Type.error); diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/mam/MessageArchiveManagement.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/mam/MessageArchiveManagement.java index 556fb5f5..57df9698 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/mam/MessageArchiveManagement.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/mam/MessageArchiveManagement.java @@ -58,10 +58,10 @@ public void process(IQ reqIQ) throws Exception { requestIq = reqIQ; reply = IQ.createResultIQ(requestIq); - if (false == Configuration.getInstance().isLocalJID(requestIq.getFrom())) { - this._sendNotHandledStanza(); - return; - } + if (false == Configuration.getInstance().isLocalJID(requestIq.getFrom())) { + this.sendNotHandledStanza(); + return; + } if (false == isValidRequest()) { return; @@ -210,7 +210,7 @@ private void sendSubscriptionUpdates() { } } - private void _sendNotHandledStanza() throws InterruptedException { + private void sendNotHandledStanza() throws InterruptedException { sendErrorPacket(PacketError.Type.cancel, PacketError.Condition.service_unavailable); } diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/AffiliationsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/AffiliationsGet.java index 909b3ed3..b8ea8a5f 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/AffiliationsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/AffiliationsGet.java @@ -21,163 +21,165 @@ public class AffiliationsGet implements PubSubElementProcessor { - private final BlockingQueue outQueue; - private final ChannelManager channelManager; - - private IQ requestIq; - private String node; - private JID actorJid; - private IQ result; - private String firstItem; - - private static final Logger logger = Logger - .getLogger(AffiliationsGet.class); - - public AffiliationsGet(BlockingQueue outQueue, - ChannelManager channelManager) { - this.outQueue = outQueue; - this.channelManager = channelManager; - } - - @Override - public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) - throws Exception { - result = IQ.createResultIQ(reqIQ); - requestIq = reqIQ; - actorJid = actorJID; - node = elm.attributeValue("node"); - - if (false == Configuration.getInstance().isLocalJID(requestIq.getFrom())) { - result.getElement().addAttribute("remote-server-discover", "false"); - } - String namespace = JabberPubsub.NS_PUBSUB_OWNER; - if (node == null) { - namespace = JabberPubsub.NAMESPACE_URI; - } - - Element pubsub = result.setChildElement(PubSubGet.ELEMENT_NAME, - namespace); - Element affiliations = pubsub.addElement("affiliations"); - - if (actorJid == null) { - actorJid = requestIq.getFrom(); - } - - boolean isProcessedLocally = true; - if (node == null) { - isProcessedLocally = getUserMemberships(affiliations); - } else { - isProcessedLocally = getNodeAffiliations(affiliations); - } - if (false == isProcessedLocally) return; - - outQueue.put(result); - } - - private boolean getNodeAffiliations(Element affiliations) - throws NodeStoreException, InterruptedException { - if (false == Configuration.getInstance().isLocalNode(node) - && (false == channelManager.isCachedNode(node))) { - makeRemoteRequest(node.split("/")[2]); - return false; - } - ResultSet nodeMemberships; - nodeMemberships = channelManager.getNodeMemberships(node); - - if ((0 == nodeMemberships.size()) - && (false == Configuration.getInstance().isLocalNode(node))) { - makeRemoteRequest(node.split("/")[2]); - return false; - } - - boolean isOwnerModerator = isOwnerModerator(); - - for (NodeMembership nodeMembership : nodeMemberships) { - - if (false == actorJid.toBareJID().equals(nodeMembership.getUser())) { - if ((false == isOwnerModerator) && nodeMembership.getAffiliation().in(Affiliations.outcast, Affiliations.none)) { - continue; - } - if ((false == isOwnerModerator) && !nodeMembership.getSubscription().equals(Subscriptions.subscribed)) { - continue; - } - } - logger.trace("Adding affiliation for " + nodeMembership.getUser() - + " affiliation " + nodeMembership.getAffiliation()); - - if (null == firstItem) { - firstItem = nodeMembership.getUser().toString(); - } - - affiliations - .addElement("affiliation") - .addAttribute("node", nodeMembership.getNodeId()) - .addAttribute("affiliation", - nodeMembership.getAffiliation().toString()) - .addAttribute("jid", nodeMembership.getUser().toString()); - } - return true; - } - - private boolean isOwnerModerator() throws NodeStoreException { - return channelManager.getNodeMembership(node, - actorJid).getAffiliation().canAuthorize(); - } - - private boolean getUserMemberships(Element affiliations) - throws NodeStoreException, InterruptedException { - - if (false == Configuration.getInstance().isLocalJID(actorJid) - && (false == channelManager.isCachedJID(requestIq.getFrom()))) { - makeRemoteRequest(actorJid.getDomain()); - return false; - } - - ResultSet memberships; - memberships = channelManager.getUserMemberships(actorJid); - boolean isOwnerModerator = isOwnerModerator(); - - for (NodeMembership membership : memberships) { - - if (false == actorJid.toBareJID().equals(membership.getUser())) { - if ((false == isOwnerModerator) && membership.getAffiliation().in(Affiliations.outcast, Affiliations.none)) { - continue; - } - if ((false == isOwnerModerator) && !membership.getSubscription().equals(Subscriptions.subscribed)) { - continue; - } - } - logger.trace("Adding affiliation for " + membership.getUser() - + " affiliation " + membership.getAffiliation() - + " (no node provided)"); - - if (null == firstItem) { - firstItem = membership.getNodeId(); - } - - affiliations - .addElement("affiliation") - .addAttribute("node", membership.getNodeId()) - .addAttribute("affiliation", - membership.getAffiliation().toString()) - .addAttribute("jid", membership.getUser().toBareJID()); - } - return true; - } - - private void makeRemoteRequest(String node) throws InterruptedException { - logger.info("Going federated for "); - requestIq.setTo(new JID(node).getDomain()); - if (null == requestIq.getElement().element("pubsub").element("actor")) { - Element actor = requestIq.getElement().element("pubsub") - .addElement("actor", Buddycloud.NS); - actor.addText(requestIq.getFrom().toBareJID()); - } - outQueue.put(requestIq); - } - - @Override - public boolean accept(Element elm) { - return elm.getName().equals("affiliations"); - } -} \ No newline at end of file + private final BlockingQueue outQueue; + private final ChannelManager channelManager; + + private IQ requestIq; + private String node; + private JID actorJid; + private IQ result; + private String firstItem; + + private static final Logger logger = Logger + .getLogger(AffiliationsGet.class); + + public AffiliationsGet(BlockingQueue outQueue, + ChannelManager channelManager) { + this.outQueue = outQueue; + this.channelManager = channelManager; + } + + @Override + public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) + throws Exception { + result = IQ.createResultIQ(reqIQ); + requestIq = reqIQ; + actorJid = actorJID; + node = elm.attributeValue("node"); + + if (false == Configuration.getInstance().isLocalJID(requestIq.getFrom())) { + result.getElement().addAttribute("remote-server-discover", "false"); + } + String namespace = JabberPubsub.NS_PUBSUB_OWNER; + if (node == null) { + namespace = JabberPubsub.NAMESPACE_URI; + } + + Element pubsub = result.setChildElement(PubSubGet.ELEMENT_NAME, + namespace); + Element affiliations = pubsub.addElement("affiliations"); + + if (actorJid == null) { + actorJid = requestIq.getFrom(); + } + + boolean isProcessedLocally = true; + if (node == null) { + isProcessedLocally = getUserMemberships(affiliations); + } else { + isProcessedLocally = getNodeAffiliations(affiliations); + } + if (false == isProcessedLocally) { + return; + } + + outQueue.put(result); + } + + private boolean getNodeAffiliations(Element affiliations) + throws NodeStoreException, InterruptedException { + if (false == Configuration.getInstance().isLocalNode(node) + && (false == channelManager.isCachedNode(node))) { + makeRemoteRequest(node.split("/")[2]); + return false; + } + ResultSet nodeMemberships; + nodeMemberships = channelManager.getNodeMemberships(node); + + if ((0 == nodeMemberships.size()) + && (false == Configuration.getInstance().isLocalNode(node))) { + makeRemoteRequest(node.split("/")[2]); + return false; + } + + boolean isOwnerModerator = isOwnerModerator(); + + for (NodeMembership nodeMembership : nodeMemberships) { + + if (false == actorJid.toBareJID().equals(nodeMembership.getUser())) { + if ((false == isOwnerModerator) && nodeMembership.getAffiliation().in(Affiliations.outcast, Affiliations.none)) { + continue; + } + if ((false == isOwnerModerator) && !nodeMembership.getSubscription().equals(Subscriptions.subscribed)) { + continue; + } + } + logger.trace("Adding affiliation for " + nodeMembership.getUser() + + " affiliation " + nodeMembership.getAffiliation()); + + if (null == firstItem) { + firstItem = nodeMembership.getUser().toString(); + } + + affiliations + .addElement("affiliation") + .addAttribute("node", nodeMembership.getNodeId()) + .addAttribute("affiliation", + nodeMembership.getAffiliation().toString()) + .addAttribute("jid", nodeMembership.getUser().toString()); + } + return true; + } + + private boolean isOwnerModerator() throws NodeStoreException { + return channelManager.getNodeMembership(node, + actorJid).getAffiliation().canAuthorize(); + } + + private boolean getUserMemberships(Element affiliations) + throws NodeStoreException, InterruptedException { + + if (false == Configuration.getInstance().isLocalJID(actorJid) + && (false == channelManager.isCachedJID(requestIq.getFrom()))) { + makeRemoteRequest(actorJid.getDomain()); + return false; + } + + ResultSet memberships; + memberships = channelManager.getUserMemberships(actorJid); + boolean isOwnerModerator = isOwnerModerator(); + + for (NodeMembership membership : memberships) { + + if (false == actorJid.toBareJID().equals(membership.getUser())) { + if ((false == isOwnerModerator) && membership.getAffiliation().in(Affiliations.outcast, Affiliations.none)) { + continue; + } + if ((false == isOwnerModerator) && !membership.getSubscription().equals(Subscriptions.subscribed)) { + continue; + } + } + logger.trace("Adding affiliation for " + membership.getUser() + + " affiliation " + membership.getAffiliation() + + " (no node provided)"); + + if (null == firstItem) { + firstItem = membership.getNodeId(); + } + + affiliations + .addElement("affiliation") + .addAttribute("node", membership.getNodeId()) + .addAttribute("affiliation", + membership.getAffiliation().toString()) + .addAttribute("jid", membership.getUser().toBareJID()); + } + return true; + } + + private void makeRemoteRequest(String node) throws InterruptedException { + logger.info("Going federated for "); + requestIq.setTo(new JID(node).getDomain()); + if (null == requestIq.getElement().element("pubsub").element("actor")) { + Element actor = requestIq.getElement().element("pubsub") + .addElement("actor", Buddycloud.NS); + actor.addText(requestIq.getFrom().toBareJID()); + } + outQueue.put(requestIq); + } + + @Override + public boolean accept(Element elm) { + return elm.getName().equals("affiliations"); + } +} diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeConfigureGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeConfigureGet.java index abaa80e7..f70883fe 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeConfigureGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeConfigureGet.java @@ -50,10 +50,10 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) throws Exc return; } - if (!Configuration.getInstance().isLocalNode(node) && !channelManager.isCachedNodeConfig(node)) { - makeRemoteRequest(); - return; - } + if (!Configuration.getInstance().isLocalNode(node) && !channelManager.isCachedNodeConfig(node)) { + makeRemoteRequest(); + return; + } try { if (!nodeExists()) { @@ -81,24 +81,24 @@ private void getNodeConfiguration() throws Exception { String value; - for (String key : nodeConf.keySet()) { - // If access model is 'local' and its not a local user return - // 'authorize' - value = nodeConf.get(key); - if ((true == key.equals(AccessModel.FIELD_NAME)) - && (value.equals(AccessModel.local.toString())) - && (false == Configuration.getInstance().isLocalJID(actor))) { - value = AccessModel.authorize.toString(); - } - x.addField(key, null, null).addValue(value); - } - Element pubsub = response.setChildElement(PubSubGet.ELEMENT_NAME, - JabberPubsub.NS_PUBSUB_OWNER); - Element configure = pubsub.addElement("configure"); - configure.addAttribute("node", node); - configure.add(x.getElement()); - outQueue.put(response); - } + for (String key : nodeConf.keySet()) { + // If access model is 'local' and its not a local user return + // 'authorize' + value = nodeConf.get(key); + if ((true == key.equals(AccessModel.FIELD_NAME)) + && (value.equals(AccessModel.local.toString())) + && (false == Configuration.getInstance().isLocalJID(actor))) { + value = AccessModel.authorize.toString(); + } + x.addField(key, null, null).addValue(value); + } + Element pubsub = response.setChildElement(PubSubGet.ELEMENT_NAME, + JabberPubsub.NS_PUBSUB_OWNER); + Element configure = pubsub.addElement("configure"); + configure.addAttribute("node", node); + configure.add(x.getElement()); + outQueue.put(response); + } private boolean nodeExists() throws NodeStoreException { if (channelManager.nodeExists(node)) { diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeThreadsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeThreadsGet.java index fdc0065e..f18c2a84 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeThreadsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeThreadsGet.java @@ -49,23 +49,23 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) throws Exc actor = request.getFrom(); } - if (!Configuration.getInstance().isLocalJID(request.getFrom())) { - response.getElement().addAttribute("remote-server-discover", - "false"); - } + if (!Configuration.getInstance().isLocalJID(request.getFrom())) { + response.getElement().addAttribute("remote-server-discover", + "false"); + } if (!isValidStanza()) { outQueue.put(response); return; } - if (!Configuration.getInstance().isLocalNode(node) - && !channelManager.isCachedNode(node)) { - logger.debug("Node " + node - + " is remote and not cached, off to get some data"); - makeRemoteRequest(); - return; - } + if (!Configuration.getInstance().isLocalNode(node) + && !channelManager.isCachedNode(node)) { + logger.debug("Node " + node + + " is remote and not cached, off to get some data"); + makeRemoteRequest(); + return; + } if (!checkNodeExists() || !userCanViewNode() || !parseRsmElement()) { outQueue.put(response); @@ -155,11 +155,11 @@ private boolean userCanViewNode() throws NodeStoreException { Map nodeConfiguration = channelManager.getNodeConf(node); if (nodeViewAcl.canViewNode(node, - channelManager.getNodeMembership(node, actor), - getNodeAccessModel(nodeConfiguration), - Configuration.getInstance().isLocalJID(actor))) { - return true; - } + channelManager.getNodeMembership(node, actor), + getNodeAccessModel(nodeConfiguration), + Configuration.getInstance().isLocalJID(actor))) { + return true; + } NodeAclRefuseReason reason = nodeViewAcl.getReason(); createExtendedErrorReply(reason.getType(), reason.getCondition(), reason.getAdditionalErrorElement()); diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RecentItemsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RecentItemsGet.java index 59236f6a..a091e4ec 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RecentItemsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RecentItemsGet.java @@ -66,24 +66,24 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) throws Exc return; } - if (!Configuration.getInstance().isLocalJID(request.getFrom())) { - response.getElement().addAttribute("remote-server-discover", - "false"); - } - pubsub = response.getElement().addElement("pubsub", - JabberPubsub.NAMESPACE_URI); - try { - parseRsmElement(); - addRecentItems(); - addRsmElement(); - outQueue.put(response); - } catch (NodeStoreException e) { - LOGGER.error(e); - response.getElement().remove(pubsub); - setErrorCondition(PacketError.Type.wait, - PacketError.Condition.internal_server_error); - } - outQueue.put(response); + if (!Configuration.getInstance().isLocalJID(request.getFrom())) { + response.getElement().addAttribute("remote-server-discover", + "false"); + } + pubsub = response.getElement().addElement("pubsub", + JabberPubsub.NAMESPACE_URI); + try { + parseRsmElement(); + addRecentItems(); + addRsmElement(); + outQueue.put(response); + } catch (NodeStoreException e) { + LOGGER.error(e); + response.getElement().remove(pubsub); + setErrorCondition(PacketError.Type.wait, + PacketError.Condition.internal_server_error); + } + outQueue.put(response); } private void parseRsmElement() { diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGet.java index 8cc91dfe..8c0a1a93 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGet.java @@ -26,194 +26,204 @@ public class RepliesGet extends PubSubElementProcessorAbstract { - private Element pubsub; - private SAXReader xmlReader; - - // RSM details - private String firstItemId = null; - private String lastItemId = null; - private String afterItemId = null; - private int maxResults = -1; - private String parentId; - private NodeViewAcl nodeViewAcl; - private Map nodeConfiguration; - - private static final Logger logger = Logger.getLogger(RecentItemsGet.class); - - public static final String NS_RSM = "http://jabber.org/protocol/rsm"; - - public RepliesGet(BlockingQueue outQueue, - ChannelManager channelManager) { - setChannelManager(channelManager); - setOutQueue(outQueue); - - xmlReader = new SAXReader(); - } - - @Override - public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) - throws Exception { - response = IQ.createResultIQ(reqIQ); - request = reqIQ; - actor = actorJID; - resultSetManagement = rsm; - - if (null == actor) actor = request.getFrom(); - - if (false == isValidStanza()) { - outQueue.put(response); - return; - } - - try { - if (false == Configuration.getInstance().isLocalJID(request.getFrom())) { - response.getElement().addAttribute("remote-server-discover", - "false"); - } - pubsub = response.getElement().addElement("pubsub", - JabberPubsub.NAMESPACE_URI); - if ((false == userCanViewNode()) || (false == itemExists())) { - outQueue.put(response); - return; - } - parseRsmElement(); - addReplies(); - addRsmElement(); - outQueue.put(response); - } catch (NodeStoreException e) { - logger.error(e); - response.getElement().remove(pubsub); - setErrorCondition(PacketError.Type.wait, - PacketError.Condition.internal_server_error); - } - outQueue.put(response); - - } - - private boolean itemExists() throws NodeStoreException { - if (null != channelManager.getNodeItem(node, parentId)) return true; - setErrorCondition(PacketError.Type.modify, - PacketError.Condition.bad_request); - return false; - } - - private void parseRsmElement() { - Element rsmElement = request.getChildElement().element("set"); - if (null == rsmElement) - return; - Element max; - Element after; - if (null != (max = rsmElement.element("max"))) - maxResults = Integer.parseInt(max.getTextTrim()); - if (null != (after = rsmElement.element("after"))) - afterItemId = after.getTextTrim(); - } - - private void addRsmElement() throws NodeStoreException { - if (null == firstItemId) return; - Element rsm = pubsub.addElement("set"); - rsm.addNamespace("", NS_RSM); - rsm.addElement("first").setText(firstItemId); - rsm.addElement("last").setText(lastItemId); - rsm.addElement("count").setText( - String.valueOf(channelManager.getCountNodeItemReplies(node, parentId))); - } - - private void addReplies() throws NodeStoreException { - - CloseableIterator items = channelManager.getNodeItemReplies(node, parentId, afterItemId, maxResults); - NodeItem item; - Element entry; - Element itemElement; - Element itemsElement = pubsub.addElement("items"); - itemsElement.addAttribute("node", node); - - while (items.hasNext()) { - item = items.next(); - - try { - entry = xmlReader.read(new StringReader(item.getPayload())) - .getRootElement(); - itemElement = itemsElement.addElement("item"); - itemElement.addAttribute("id", item.getId()); - if (null == firstItemId) - firstItemId = item.getId(); - lastItemId = item.getId(); - itemElement.add(entry); - } catch (DocumentException e) { - logger.error("Error parsing a node entry, ignoring. " - + item.getId()); - } - } - } - - private boolean isValidStanza() { - Element replies = request.getChildElement().element("replies"); - try { - node = replies.attributeValue("node"); - if (null == node) { - createExtendedErrorReply(PacketError.Type.modify, - PacketError.Condition.bad_request, "nodeid-required"); - return false; - } - parentId = replies.attributeValue("item_id"); - if (null == parentId) { - createExtendedErrorReply(PacketError.Type.modify, - PacketError.Condition.bad_request, "itemid-required"); - return false; - } - if (false == channelManager.nodeExists(node)) { - setErrorCondition(PacketError.Type.cancel, - PacketError.Condition.item_not_found); - return false; - } - nodeConfiguration = channelManager.getNodeConf(node); - } catch (NullPointerException e) { - logger.error(e); - setErrorCondition(PacketError.Type.modify, PacketError.Condition.bad_request); - return false; - } catch (NodeStoreException e) { - logger.error(e); - setErrorCondition(PacketError.Type.wait, PacketError.Condition.internal_server_error); - return false; - } - return true; - } - - private boolean userCanViewNode() throws NodeStoreException { - if (nodeViewAcl.canViewNode(node, - channelManager.getNodeMembership(node, actor), - getNodeAccessModel(), - Configuration.getInstance().isLocalJID(actor))) { - return true; - } - NodeAclRefuseReason reason = getNodeViewAcl().getReason(); - createExtendedErrorReply(reason.getType(), reason.getCondition(), - reason.getAdditionalErrorElement()); - return false; - } - - private AccessModels getNodeAccessModel() { - if (false == nodeConfiguration.containsKey(AccessModel.FIELD_NAME)) { - return AccessModels.authorize; - } - return AccessModels.createFromString(nodeConfiguration - .get(AccessModel.FIELD_NAME)); - } - - public void setNodeViewAcl(NodeViewAcl acl) { - nodeViewAcl = acl; - } - - private NodeViewAcl getNodeViewAcl() { - if (null == nodeViewAcl) { - nodeViewAcl = new NodeViewAcl(); - } - return nodeViewAcl; - } - - @Override - public boolean accept(Element elm) { - return elm.getName().equals("replies"); - } -} \ No newline at end of file + private Element pubsub; + private SAXReader xmlReader; + + // RSM details + private String firstItemId = null; + private String lastItemId = null; + private String afterItemId = null; + private int maxResults = -1; + private String parentId; + private NodeViewAcl nodeViewAcl; + private Map nodeConfiguration; + + private static final Logger logger = Logger.getLogger(RecentItemsGet.class); + + public static final String NS_RSM = "http://jabber.org/protocol/rsm"; + + public RepliesGet(BlockingQueue outQueue, + ChannelManager channelManager) { + setChannelManager(channelManager); + setOutQueue(outQueue); + + xmlReader = new SAXReader(); + } + + @Override + public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) + throws Exception { + response = IQ.createResultIQ(reqIQ); + request = reqIQ; + actor = actorJID; + resultSetManagement = rsm; + + if (null == actor) { + actor = request.getFrom(); + } + + if (false == isValidStanza()) { + outQueue.put(response); + return; + } + + try { + if (false == Configuration.getInstance().isLocalJID(request.getFrom())) { + response.getElement().addAttribute("remote-server-discover", + "false"); + } + pubsub = response.getElement().addElement("pubsub", + JabberPubsub.NAMESPACE_URI); + if ((false == userCanViewNode()) || (false == itemExists())) { + outQueue.put(response); + return; + } + parseRsmElement(); + addReplies(); + addRsmElement(); + outQueue.put(response); + } catch (NodeStoreException e) { + logger.error(e); + response.getElement().remove(pubsub); + setErrorCondition(PacketError.Type.wait, + PacketError.Condition.internal_server_error); + } + outQueue.put(response); + + } + + private boolean itemExists() throws NodeStoreException { + if (null != channelManager.getNodeItem(node, parentId)) { + return true; + } + setErrorCondition(PacketError.Type.modify, + PacketError.Condition.bad_request); + return false; + } + + private void parseRsmElement() { + Element rsmElement = request.getChildElement().element("set"); + if (null == rsmElement) { + return; + } + Element max; + Element after; + if (null != (max = rsmElement.element("max"))) { + maxResults = Integer.parseInt(max.getTextTrim()); + } + if (null != (after = rsmElement.element("after"))) { + afterItemId = after.getTextTrim(); + } + } + + private void addRsmElement() throws NodeStoreException { + if (null == firstItemId) { + return; + } + Element rsm = pubsub.addElement("set"); + rsm.addNamespace("", NS_RSM); + rsm.addElement("first").setText(firstItemId); + rsm.addElement("last").setText(lastItemId); + rsm.addElement("count").setText( + String.valueOf(channelManager.getCountNodeItemReplies(node, parentId))); + } + + private void addReplies() throws NodeStoreException { + + CloseableIterator items = channelManager.getNodeItemReplies(node, parentId, afterItemId, maxResults); + NodeItem item; + Element entry; + Element itemElement; + Element itemsElement = pubsub.addElement("items"); + itemsElement.addAttribute("node", node); + + while (items.hasNext()) { + item = items.next(); + + try { + entry = xmlReader.read(new StringReader(item.getPayload())) + .getRootElement(); + itemElement = itemsElement.addElement("item"); + itemElement.addAttribute("id", item.getId()); + if (null == firstItemId) { + firstItemId = item.getId(); + } + lastItemId = item.getId(); + itemElement.add(entry); + } catch (DocumentException e) { + logger.error("Error parsing a node entry, ignoring. " + + item.getId()); + } + } + } + + private boolean isValidStanza() { + Element replies = request.getChildElement().element("replies"); + try { + node = replies.attributeValue("node"); + if (null == node) { + createExtendedErrorReply(PacketError.Type.modify, + PacketError.Condition.bad_request, "nodeid-required"); + return false; + } + parentId = replies.attributeValue("item_id"); + if (null == parentId) { + createExtendedErrorReply(PacketError.Type.modify, + PacketError.Condition.bad_request, "itemid-required"); + return false; + } + if (false == channelManager.nodeExists(node)) { + setErrorCondition(PacketError.Type.cancel, + PacketError.Condition.item_not_found); + return false; + } + nodeConfiguration = channelManager.getNodeConf(node); + } catch (NullPointerException e) { + logger.error(e); + setErrorCondition(PacketError.Type.modify, PacketError.Condition.bad_request); + return false; + } catch (NodeStoreException e) { + logger.error(e); + setErrorCondition(PacketError.Type.wait, PacketError.Condition.internal_server_error); + return false; + } + return true; + } + + private boolean userCanViewNode() throws NodeStoreException { + if (nodeViewAcl.canViewNode(node, + channelManager.getNodeMembership(node, actor), + getNodeAccessModel(), + Configuration.getInstance().isLocalJID(actor))) { + return true; + } + NodeAclRefuseReason reason = getNodeViewAcl().getReason(); + createExtendedErrorReply(reason.getType(), reason.getCondition(), + reason.getAdditionalErrorElement()); + return false; + } + + private AccessModels getNodeAccessModel() { + if (false == nodeConfiguration.containsKey(AccessModel.FIELD_NAME)) { + return AccessModels.authorize; + } + return AccessModels.createFromString(nodeConfiguration + .get(AccessModel.FIELD_NAME)); + } + + public void setNodeViewAcl(NodeViewAcl acl) { + nodeViewAcl = acl; + } + + private NodeViewAcl getNodeViewAcl() { + if (null == nodeViewAcl) { + nodeViewAcl = new NodeViewAcl(); + } + return nodeViewAcl; + } + + @Override + public boolean accept(Element elm) { + return elm.getName().equals("replies"); + } +} diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGet.java index 603b9f00..5f5ce220 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGet.java @@ -20,143 +20,145 @@ public class SubscriptionsGet implements PubSubElementProcessor { - private final BlockingQueue outQueue; - private ChannelManager channelManager; - - private IQ result; - private String node; - private JID actorJid; - private IQ requestIq; - - public void setChannelManager(ChannelManager dataStore) { - channelManager = dataStore; - } - - public SubscriptionsGet(BlockingQueue outQueue, - ChannelManager channelManager) { - this.outQueue = outQueue; - this.channelManager = channelManager; - } + private final BlockingQueue outQueue; + private ChannelManager channelManager; + + private IQ result; + private String node; + private JID actorJid; + private IQ requestIq; + + public void setChannelManager(ChannelManager dataStore) { + channelManager = dataStore; + } + + public SubscriptionsGet(BlockingQueue outQueue, + ChannelManager channelManager) { + this.outQueue = outQueue; + this.channelManager = channelManager; + } - @Override - public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) - throws Exception { - result = IQ.createResultIQ(reqIQ); - actorJid = actorJID; - requestIq = reqIQ; - - Element pubsub = result.setChildElement(PubSubGet.ELEMENT_NAME, - JabberPubsub.NAMESPACE_URI); - Element subscriptions = pubsub.addElement("subscriptions"); + @Override + public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) + throws Exception { + result = IQ.createResultIQ(reqIQ); + actorJid = actorJID; + requestIq = reqIQ; + + Element pubsub = result.setChildElement(PubSubGet.ELEMENT_NAME, + JabberPubsub.NAMESPACE_URI); + Element subscriptions = pubsub.addElement("subscriptions"); - node = reqIQ.getChildElement().element("subscriptions").attributeValue("node"); + node = reqIQ.getChildElement().element("subscriptions").attributeValue("node"); - if (null == actorJid) { - actorJid = reqIQ.getFrom(); - } - - boolean isProcessedLocally = true; + if (null == actorJid) { + actorJid = reqIQ.getFrom(); + } + + boolean isProcessedLocally = true; - if (node == null) { - isProcessedLocally = getUserMemberships(subscriptions); - } else { - if (false == Configuration.getInstance().isLocalNode(node)) { - result.getElement().addAttribute("remote-server-discover", "false"); - } - isProcessedLocally = getNodeMemberships(subscriptions); - } - if (false == isProcessedLocally) return; - - outQueue.put(result); - } + if (node == null) { + isProcessedLocally = getUserMemberships(subscriptions); + } else { + if (false == Configuration.getInstance().isLocalNode(node)) { + result.getElement().addAttribute("remote-server-discover", "false"); + } + isProcessedLocally = getNodeMemberships(subscriptions); + } + if (false == isProcessedLocally) { + return; + } + + outQueue.put(result); + } - private boolean getNodeMemberships(Element subscriptions) - throws NodeStoreException, InterruptedException { - if (false == Configuration.getInstance().isLocalNode(node) - && (false == channelManager.isCachedNode(node)) - ) { - makeRemoteRequest(new JID(node.split("/")[2]).getDomain()); - return false; - } - ResultSet cur; - cur = channelManager.getNodeMemberships(node); + private boolean getNodeMemberships(Element subscriptions) + throws NodeStoreException, InterruptedException { + if (false == Configuration.getInstance().isLocalNode(node) + && (false == channelManager.isCachedNode(node)) + ) { + makeRemoteRequest(new JID(node.split("/")[2]).getDomain()); + return false; + } + ResultSet cur; + cur = channelManager.getNodeMemberships(node); - subscriptions.addAttribute("node", node); + subscriptions.addAttribute("node", node); - if ((null != requestIq.getElement().element("pubsub").element("set")) - && (0 == cur.size()) - && (false == Configuration.getInstance().isLocalNode(node))) { - makeRemoteRequest(new JID(node.split("/")[2]).getDomain()); - return false; - } - boolean isOwnerModerator = isOwnerModerator(); - for (NodeMembership ns : cur) { - if (false == actorJid.toBareJID().equals(ns.getUser())) { - if ((false == isOwnerModerator) && ns.getAffiliation().in(Affiliations.outcast, Affiliations.none)) { - continue; - } - if ((false == isOwnerModerator) && !ns.getSubscription().equals(Subscriptions.subscribed)) { - continue; - } - } - Element subscription = subscriptions - .addElement("subscription"); - subscription - .addAttribute("node", ns.getNodeId()) - .addAttribute("subscription", - ns.getSubscription().toString()) - .addAttribute("jid", ns.getUser().toBareJID()); - if (null != ns.getInvitedBy()) { - subscription.addAttribute("invited-by", ns.getInvitedBy().toBareJID()); - } - } - return true; - } + if ((null != requestIq.getElement().element("pubsub").element("set")) + && (0 == cur.size()) + && (false == Configuration.getInstance().isLocalNode(node))) { + makeRemoteRequest(new JID(node.split("/")[2]).getDomain()); + return false; + } + boolean isOwnerModerator = isOwnerModerator(); + for (NodeMembership ns : cur) { + if (false == actorJid.toBareJID().equals(ns.getUser())) { + if ((false == isOwnerModerator) && ns.getAffiliation().in(Affiliations.outcast, Affiliations.none)) { + continue; + } + if ((false == isOwnerModerator) && !ns.getSubscription().equals(Subscriptions.subscribed)) { + continue; + } + } + Element subscription = subscriptions + .addElement("subscription"); + subscription + .addAttribute("node", ns.getNodeId()) + .addAttribute("subscription", + ns.getSubscription().toString()) + .addAttribute("jid", ns.getUser().toBareJID()); + if (null != ns.getInvitedBy()) { + subscription.addAttribute("invited-by", ns.getInvitedBy().toBareJID()); + } + } + return true; + } - private boolean isOwnerModerator() throws NodeStoreException { - return channelManager.getNodeMembership(node, actorJid).getAffiliation().canAuthorize(); - } + private boolean isOwnerModerator() throws NodeStoreException { + return channelManager.getNodeMembership(node, actorJid).getAffiliation().canAuthorize(); + } - private boolean getUserMemberships(Element subscriptions) - throws NodeStoreException, InterruptedException { - // let's get all subscriptions. - ResultSet cur; - cur = channelManager.getUserMemberships(actorJid); + private boolean getUserMemberships(Element subscriptions) + throws NodeStoreException, InterruptedException { + // let's get all subscriptions. + ResultSet cur; + cur = channelManager.getUserMemberships(actorJid); - if ((null != requestIq.getElement().element("pubsub").element("set")) - && (0 == cur.size()) - && (false == Configuration.getInstance().isLocalJID(actorJid))) { - makeRemoteRequest(actorJid.getDomain()); - return false; - } - for (NodeMembership ns : cur) { - Element subscription = subscriptions - .addElement("subscription"); - subscription - .addAttribute("node", ns.getNodeId()) - .addAttribute("subscription", - ns.getSubscription().toString()) - .addAttribute("jid", ns.getUser().toBareJID()); - if (null != ns.getInvitedBy()) { - subscription.addAttribute("invited-by", ns.getInvitedBy().toBareJID()); - } - } - return true; - } - - private void makeRemoteRequest(String to) throws InterruptedException { - IQ forwarder = requestIq.createCopy(); - forwarder.setTo(to); - if (null == forwarder.getElement().element("pubsub").element("actor")) { - Element actor = forwarder.getElement().element("pubsub") - .addElement("actor", Buddycloud.NS); - actor.addText(requestIq.getFrom().toBareJID()); - } - outQueue.put(forwarder); - } - - @Override - public boolean accept(Element elm) { - return elm.getName().equals("subscriptions"); - } -} \ No newline at end of file + if ((null != requestIq.getElement().element("pubsub").element("set")) + && (0 == cur.size()) + && (false == Configuration.getInstance().isLocalJID(actorJid))) { + makeRemoteRequest(actorJid.getDomain()); + return false; + } + for (NodeMembership ns : cur) { + Element subscription = subscriptions + .addElement("subscription"); + subscription + .addAttribute("node", ns.getNodeId()) + .addAttribute("subscription", + ns.getSubscription().toString()) + .addAttribute("jid", ns.getUser().toBareJID()); + if (null != ns.getInvitedBy()) { + subscription.addAttribute("invited-by", ns.getInvitedBy().toBareJID()); + } + } + return true; + } + + private void makeRemoteRequest(String to) throws InterruptedException { + IQ forwarder = requestIq.createCopy(); + forwarder.setTo(to); + if (null == forwarder.getElement().element("pubsub").element("actor")) { + Element actor = forwarder.getElement().element("pubsub") + .addElement("actor", Buddycloud.NS); + actor.addText(requestIq.getFrom().toBareJID()); + } + outQueue.put(forwarder); + } + + @Override + public boolean accept(Element elm) { + return elm.getName().equals("subscriptions"); + } +} diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/ThreadGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/ThreadGet.java index a8361f0a..39a00c71 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/ThreadGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/ThreadGet.java @@ -27,195 +27,203 @@ public class ThreadGet extends PubSubElementProcessorAbstract { - private Element pubsub; - private SAXReader xmlReader; - - // RSM details - private String firstItemId = null; - private String lastItemId = null; - private String afterItemId = null; - private int maxResults = -1; - private String parentId; - private NodeViewAcl nodeViewAcl; - private Map nodeConfiguration; - - private static final Logger logger = Logger.getLogger(RecentItemsGet.class); - - public static final String NS_RSM = "http://jabber.org/protocol/rsm"; - - public ThreadGet(BlockingQueue outQueue, - ChannelManager channelManager) { - setChannelManager(channelManager); - setOutQueue(outQueue); - - xmlReader = new SAXReader(); - } - - @Override - public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) - throws Exception { - response = IQ.createResultIQ(reqIQ); - request = reqIQ; - actor = actorJID; - resultSetManagement = rsm; - - if (null == actor) actor = request.getFrom(); - - if (false == isValidStanza()) { - outQueue.put(response); - return; - } - - try { - if (false == Configuration.getInstance().isLocalJID(request.getFrom())) { - response.getElement().addAttribute("remote-server-discover", - "false"); - } - pubsub = response.getElement().addElement("pubsub", - JabberPubsub.NAMESPACE_URI); - if ((false == userCanViewNode()) || (false == itemExists())) { - outQueue.put(response); - return; - } - parseRsmElement(); - addItems(); - addRsmElement(); - outQueue.put(response); - } catch (NodeStoreException e) { - logger.error(e); - response.getElement().remove(pubsub); - setErrorCondition(PacketError.Type.wait, - PacketError.Condition.internal_server_error); - } - outQueue.put(response); - } - - private boolean itemExists() throws NodeStoreException { - if (null != channelManager.getNodeItem(node, parentId)) { - return true; - } - createExtendedErrorReply(PacketError.Type.cancel, - PacketError.Condition.item_not_found, "parent-item-not-found", Buddycloud.NS_ERROR); - return false; - } - - private void parseRsmElement() { - Element rsmElement = request.getChildElement().element("set"); - if (null == rsmElement) - return; - Element max; - Element after; - if (null != (max = rsmElement.element("max"))) - maxResults = Integer.parseInt(max.getTextTrim()); - if (null != (after = rsmElement.element("after"))) - afterItemId = after.getTextTrim(); - } - - private void addRsmElement() throws NodeStoreException { - if (null == firstItemId) return; - Element rsm = pubsub.addElement("set"); - rsm.addNamespace("", NS_RSM); - rsm.addElement("first").setText(firstItemId); - rsm.addElement("last").setText(lastItemId); - rsm.addElement("count").setText( - String.valueOf(channelManager.getCountNodeThread(node, parentId))); - } - - private void addItems() throws NodeStoreException { - - CloseableIterator items = channelManager.getNodeItemThread(node, parentId, afterItemId, maxResults); - NodeItem item; - Element entry; - Element itemElement; - Element itemsElement = pubsub.addElement("items"); - itemsElement.addAttribute("node", node); - - while (items.hasNext()) { - item = items.next(); - - try { - entry = xmlReader.read(new StringReader(item.getPayload())) - .getRootElement(); - itemElement = itemsElement.addElement("item"); - itemElement.addAttribute("id", item.getId()); - if (null == firstItemId) - firstItemId = item.getId(); - lastItemId = item.getId(); - itemElement.add(entry); - } catch (DocumentException e) { - logger.error("Error parsing a node entry, ignoring. " - + item.getId()); - } - } - } - - private boolean isValidStanza() { - Element thread = request.getChildElement().element("thread"); - try { - node = thread.attributeValue("node"); - if (null == node) { - createExtendedErrorReply(PacketError.Type.modify, - PacketError.Condition.bad_request, "nodeid-required"); - return false; - } - parentId = thread.attributeValue("item_id"); - if (null == parentId) { - createExtendedErrorReply(PacketError.Type.modify, - PacketError.Condition.bad_request, "itemid-required"); - return false; - } - if (false == channelManager.nodeExists(node)) { - setErrorCondition(PacketError.Type.cancel, - PacketError.Condition.item_not_found); - return false; - } - nodeConfiguration = channelManager.getNodeConf(node); - } catch (NullPointerException e) { - logger.error(e); - setErrorCondition(PacketError.Type.modify, PacketError.Condition.bad_request); - return false; - } catch (NodeStoreException e) { - logger.error(e); - setErrorCondition(PacketError.Type.wait, PacketError.Condition.internal_server_error); - return false; - } - return true; - } - - private boolean userCanViewNode() throws NodeStoreException { - if (getNodeViewAcl().canViewNode(node, - channelManager.getNodeMembership(node, actor), - getNodeAccessModel(), - Configuration.getInstance().isLocalJID(actor))) { - return true; - } - NodeAclRefuseReason reason = getNodeViewAcl().getReason(); - createExtendedErrorReply(reason.getType(), reason.getCondition(), - reason.getAdditionalErrorElement()); - return false; - } - - private AccessModels getNodeAccessModel() { - if (false == nodeConfiguration.containsKey(AccessModel.FIELD_NAME)) { - return AccessModels.authorize; - } - return AccessModels.createFromString(nodeConfiguration - .get(AccessModel.FIELD_NAME)); - } - - public void setNodeViewAcl(NodeViewAcl acl) { - nodeViewAcl = acl; - } - - private NodeViewAcl getNodeViewAcl() { - if (null == nodeViewAcl) { - nodeViewAcl = new NodeViewAcl(); - } - return nodeViewAcl; - } - - @Override - public boolean accept(Element elm) { - return elm.getName().equals("thread"); - } -} \ No newline at end of file + private Element pubsub; + private SAXReader xmlReader; + + // RSM details + private String firstItemId = null; + private String lastItemId = null; + private String afterItemId = null; + private int maxResults = -1; + private String parentId; + private NodeViewAcl nodeViewAcl; + private Map nodeConfiguration; + + private static final Logger logger = Logger.getLogger(RecentItemsGet.class); + + public static final String NS_RSM = "http://jabber.org/protocol/rsm"; + + public ThreadGet(BlockingQueue outQueue, + ChannelManager channelManager) { + setChannelManager(channelManager); + setOutQueue(outQueue); + + xmlReader = new SAXReader(); + } + + @Override + public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) + throws Exception { + response = IQ.createResultIQ(reqIQ); + request = reqIQ; + actor = actorJID; + resultSetManagement = rsm; + + if (null == actor) { + actor = request.getFrom(); + } + + if (false == isValidStanza()) { + outQueue.put(response); + return; + } + + try { + if (false == Configuration.getInstance().isLocalJID(request.getFrom())) { + response.getElement().addAttribute("remote-server-discover", + "false"); + } + pubsub = response.getElement().addElement("pubsub", + JabberPubsub.NAMESPACE_URI); + if ((false == userCanViewNode()) || (false == itemExists())) { + outQueue.put(response); + return; + } + parseRsmElement(); + addItems(); + addRsmElement(); + outQueue.put(response); + } catch (NodeStoreException e) { + logger.error(e); + response.getElement().remove(pubsub); + setErrorCondition(PacketError.Type.wait, + PacketError.Condition.internal_server_error); + } + outQueue.put(response); + } + + private boolean itemExists() throws NodeStoreException { + if (null != channelManager.getNodeItem(node, parentId)) { + return true; + } + createExtendedErrorReply(PacketError.Type.cancel, + PacketError.Condition.item_not_found, "parent-item-not-found", Buddycloud.NS_ERROR); + return false; + } + + private void parseRsmElement() { + Element rsmElement = request.getChildElement().element("set"); + if (null == rsmElement) { + return; + } + Element max; + Element after; + if (null != (max = rsmElement.element("max"))) { + maxResults = Integer.parseInt(max.getTextTrim()); + } + if (null != (after = rsmElement.element("after"))) { + afterItemId = after.getTextTrim(); + } + } + + private void addRsmElement() throws NodeStoreException { + if (null == firstItemId) { + return; + } + Element rsm = pubsub.addElement("set"); + rsm.addNamespace("", NS_RSM); + rsm.addElement("first").setText(firstItemId); + rsm.addElement("last").setText(lastItemId); + rsm.addElement("count").setText( + String.valueOf(channelManager.getCountNodeThread(node, parentId))); + } + + private void addItems() throws NodeStoreException { + + CloseableIterator items = channelManager.getNodeItemThread(node, parentId, afterItemId, maxResults); + NodeItem item; + Element entry; + Element itemElement; + Element itemsElement = pubsub.addElement("items"); + itemsElement.addAttribute("node", node); + + while (items.hasNext()) { + item = items.next(); + + try { + entry = xmlReader.read(new StringReader(item.getPayload())) + .getRootElement(); + itemElement = itemsElement.addElement("item"); + itemElement.addAttribute("id", item.getId()); + if (null == firstItemId) { + firstItemId = item.getId(); + } + lastItemId = item.getId(); + itemElement.add(entry); + } catch (DocumentException e) { + logger.error("Error parsing a node entry, ignoring. " + + item.getId()); + } + } + } + + private boolean isValidStanza() { + Element thread = request.getChildElement().element("thread"); + try { + node = thread.attributeValue("node"); + if (null == node) { + createExtendedErrorReply(PacketError.Type.modify, + PacketError.Condition.bad_request, "nodeid-required"); + return false; + } + parentId = thread.attributeValue("item_id"); + if (null == parentId) { + createExtendedErrorReply(PacketError.Type.modify, + PacketError.Condition.bad_request, "itemid-required"); + return false; + } + if (false == channelManager.nodeExists(node)) { + setErrorCondition(PacketError.Type.cancel, + PacketError.Condition.item_not_found); + return false; + } + nodeConfiguration = channelManager.getNodeConf(node); + } catch (NullPointerException e) { + logger.error(e); + setErrorCondition(PacketError.Type.modify, PacketError.Condition.bad_request); + return false; + } catch (NodeStoreException e) { + logger.error(e); + setErrorCondition(PacketError.Type.wait, PacketError.Condition.internal_server_error); + return false; + } + return true; + } + + private boolean userCanViewNode() throws NodeStoreException { + if (getNodeViewAcl().canViewNode(node, + channelManager.getNodeMembership(node, actor), + getNodeAccessModel(), + Configuration.getInstance().isLocalJID(actor))) { + return true; + } + NodeAclRefuseReason reason = getNodeViewAcl().getReason(); + createExtendedErrorReply(reason.getType(), reason.getCondition(), + reason.getAdditionalErrorElement()); + return false; + } + + private AccessModels getNodeAccessModel() { + if (false == nodeConfiguration.containsKey(AccessModel.FIELD_NAME)) { + return AccessModels.authorize; + } + return AccessModels.createFromString(nodeConfiguration + .get(AccessModel.FIELD_NAME)); + } + + public void setNodeViewAcl(NodeViewAcl acl) { + nodeViewAcl = acl; + } + + private NodeViewAcl getNodeViewAcl() { + if (null == nodeViewAcl) { + nodeViewAcl = new NodeViewAcl(); + } + return nodeViewAcl; + } + + @Override + public boolean accept(Element elm) { + return elm.getName().equals("thread"); + } +} diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/UserItemsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/UserItemsGet.java index 7eddc868..01e0e87d 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/UserItemsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/UserItemsGet.java @@ -27,176 +27,176 @@ public class UserItemsGet extends PubSubElementProcessorAbstract { - private static final Logger LOGGER = Logger.getLogger(UserItemsGet.class); - - private Date maxAge; - - private Element pubsub; - private SAXReader xmlReader; - - // RSM details - private GlobalItemID firstItemId = null; - private GlobalItemID lastItemId = null; - private GlobalItemID afterItemId = null; - private int maxResults = -1; - private boolean parentOnly = false; - - public UserItemsGet(BlockingQueue outQueue, - ChannelManager channelManager) { - setChannelManager(channelManager); - setOutQueue(outQueue); - xmlReader = new SAXReader(); - } - - @Override - public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) - throws Exception { - response = IQ.createResultIQ(reqIQ); - request = reqIQ; - actor = actorJID; - node = elm.attributeValue("node"); - resultSetManagement = rsm; - - if (null == actor) { - actor = request.getFrom(); - } - - if (!isValidStanza()) { - outQueue.put(response); - return; - } - - if (!Configuration.getInstance().isLocalJID(request.getFrom())) { - response.getElement().addAttribute("remote-server-discover", - "false"); - } - pubsub = response.getElement().addElement("pubsub", - JabberPubsub.NAMESPACE_URI); - try { - if (true == parseRsmElement()) { - addRecentItems(); - addRsmElement(); - } - } catch (NodeStoreException e) { - LOGGER.error(e); - response.getElement().remove(pubsub); - setErrorCondition(PacketError.Type.wait, - PacketError.Condition.internal_server_error); - } - outQueue.put(response); - - } - - private boolean parseRsmElement() { - if (null == resultSetManagement) { - return true; - } - - Element max = null; - Element after = null; - if (null != (max = resultSetManagement.element("max"))) { - maxResults = Integer.parseInt(max.getTextTrim()); - } - - if (null != (after = resultSetManagement.element("after"))) { - try { - afterItemId = GlobalItemIDImpl.fromBuddycloudString(after - .getTextTrim()); - } catch (IllegalArgumentException e) { - LOGGER.error(e); - createExtendedErrorReply( - Type.modify, - Condition.bad_request, - "Could not parse the 'after' id: " - + after.getTextTrim()); - return false; - } - } - return true; - } - - private void addRsmElement() throws NodeStoreException { - if (null == firstItemId) { - return; - } - Element rsm = pubsub.addElement("set", NS_RSM); - rsm.addElement("first", NS_RSM).setText(firstItemId.toString()); - rsm.addElement("last", NS_RSM).setText(lastItemId.toString()); - - rsm.addElement("count", NS_RSM).setText( - String.valueOf(channelManager.getCountUserFeedItems(actor, - maxAge, parentOnly))); - } - - private void addRecentItems() throws NodeStoreException { - CloseableIterator items = channelManager.getUserFeedItems( - actor, maxAge, maxResults, afterItemId, parentOnly); - String lastNodeId = ""; - Element itemsElement = null; - while (items.hasNext()) { - NodeItem item = items.next(); - if (!item.getNodeId().equals(lastNodeId)) { - itemsElement = pubsub.addElement("items"); - itemsElement.addAttribute("node", item.getNodeId()); - lastNodeId = item.getNodeId(); - } - try { - Element entry = xmlReader.read( - new StringReader(item.getPayload())).getRootElement(); - Element itemElement = itemsElement.addElement("item"); - itemElement.addAttribute("id", item.getId()); - - if (null == firstItemId) { - firstItemId = new GlobalItemIDImpl(null, item.getNodeId(), - item.getId()); - } - lastItemId = new GlobalItemIDImpl(null, item.getNodeId(), - item.getId()); - itemElement.add(entry); - } catch (DocumentException e) { - LOGGER.error("Error parsing a node entry, ignoring. " - + item.getId()); - } - } - } - - private boolean isValidStanza() { - Element userFeedItems = request.getChildElement().element("user-items"); - try { - String since = userFeedItems.attributeValue("since"); - String parentOnlyAttribute = userFeedItems - .attributeValue("parent-only"); - if ((null != parentOnlyAttribute) - && ((true == parentOnlyAttribute.equals("true")) || (true == parentOnlyAttribute - .equals("1")))) { - parentOnly = true; - } - - if (null == since) { - createExtendedErrorReply(PacketError.Type.modify, - PacketError.Condition.bad_request, "since-required"); - return false; - } - maxAge = Conf.parseDate(since); - - } catch (NumberFormatException e) { - LOGGER.error(e); - createExtendedErrorReply(PacketError.Type.modify, - PacketError.Condition.bad_request, - "invalid-max-value-provided"); - return false; - } catch (IllegalArgumentException e) { - createExtendedErrorReply(PacketError.Type.modify, - PacketError.Condition.bad_request, - "invalid-since-value-provided"); - LOGGER.error(e); - return false; - } - return true; - } - - @Override - public boolean accept(Element elm) { - return elm.getName().equals("user-items"); - } -} \ No newline at end of file + private static final Logger LOGGER = Logger.getLogger(UserItemsGet.class); + + private Date maxAge; + + private Element pubsub; + private SAXReader xmlReader; + + // RSM details + private GlobalItemID firstItemId = null; + private GlobalItemID lastItemId = null; + private GlobalItemID afterItemId = null; + private int maxResults = -1; + private boolean parentOnly = false; + + public UserItemsGet(BlockingQueue outQueue, + ChannelManager channelManager) { + setChannelManager(channelManager); + setOutQueue(outQueue); + xmlReader = new SAXReader(); + } + + @Override + public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) + throws Exception { + response = IQ.createResultIQ(reqIQ); + request = reqIQ; + actor = actorJID; + node = elm.attributeValue("node"); + resultSetManagement = rsm; + + if (null == actor) { + actor = request.getFrom(); + } + + if (!isValidStanza()) { + outQueue.put(response); + return; + } + + if (!Configuration.getInstance().isLocalJID(request.getFrom())) { + response.getElement().addAttribute("remote-server-discover", + "false"); + } + pubsub = response.getElement().addElement("pubsub", + JabberPubsub.NAMESPACE_URI); + try { + if (true == parseRsmElement()) { + addRecentItems(); + addRsmElement(); + } + } catch (NodeStoreException e) { + LOGGER.error(e); + response.getElement().remove(pubsub); + setErrorCondition(PacketError.Type.wait, + PacketError.Condition.internal_server_error); + } + outQueue.put(response); + + } + + private boolean parseRsmElement() { + if (null == resultSetManagement) { + return true; + } + + Element max = null; + Element after = null; + if (null != (max = resultSetManagement.element("max"))) { + maxResults = Integer.parseInt(max.getTextTrim()); + } + + if (null != (after = resultSetManagement.element("after"))) { + try { + afterItemId = GlobalItemIDImpl.fromBuddycloudString(after + .getTextTrim()); + } catch (IllegalArgumentException e) { + LOGGER.error(e); + createExtendedErrorReply( + Type.modify, + Condition.bad_request, + "Could not parse the 'after' id: " + + after.getTextTrim()); + return false; + } + } + return true; + } + + private void addRsmElement() throws NodeStoreException { + if (null == firstItemId) { + return; + } + Element rsm = pubsub.addElement("set", NS_RSM); + rsm.addElement("first", NS_RSM).setText(firstItemId.toString()); + rsm.addElement("last", NS_RSM).setText(lastItemId.toString()); + + rsm.addElement("count", NS_RSM).setText( + String.valueOf(channelManager.getCountUserFeedItems(actor, + maxAge, parentOnly))); + } + + private void addRecentItems() throws NodeStoreException { + CloseableIterator items = channelManager.getUserFeedItems( + actor, maxAge, maxResults, afterItemId, parentOnly); + String lastNodeId = ""; + Element itemsElement = null; + while (items.hasNext()) { + NodeItem item = items.next(); + if (!item.getNodeId().equals(lastNodeId)) { + itemsElement = pubsub.addElement("items"); + itemsElement.addAttribute("node", item.getNodeId()); + lastNodeId = item.getNodeId(); + } + try { + Element entry = xmlReader.read( + new StringReader(item.getPayload())).getRootElement(); + Element itemElement = itemsElement.addElement("item"); + itemElement.addAttribute("id", item.getId()); + + if (null == firstItemId) { + firstItemId = new GlobalItemIDImpl(null, item.getNodeId(), + item.getId()); + } + lastItemId = new GlobalItemIDImpl(null, item.getNodeId(), + item.getId()); + itemElement.add(entry); + } catch (DocumentException e) { + LOGGER.error("Error parsing a node entry, ignoring. " + + item.getId()); + } + } + } + + private boolean isValidStanza() { + Element userFeedItems = request.getChildElement().element("user-items"); + try { + String since = userFeedItems.attributeValue("since"); + String parentOnlyAttribute = userFeedItems + .attributeValue("parent-only"); + if ((null != parentOnlyAttribute) + && ((true == parentOnlyAttribute.equals("true")) || (true == parentOnlyAttribute + .equals("1")))) { + parentOnly = true; + } + + if (null == since) { + createExtendedErrorReply(PacketError.Type.modify, + PacketError.Condition.bad_request, "since-required"); + return false; + } + maxAge = Conf.parseDate(since); + + } catch (NumberFormatException e) { + LOGGER.error(e); + createExtendedErrorReply(PacketError.Type.modify, + PacketError.Condition.bad_request, + "invalid-max-value-provided"); + return false; + } catch (IllegalArgumentException e) { + createExtendedErrorReply(PacketError.Type.modify, + PacketError.Condition.bad_request, + "invalid-since-value-provided"); + LOGGER.error(e); + return false; + } + return true; + } + + @Override + public boolean accept(Element elm) { + return elm.getName().equals("user-items"); + } +} diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java index 55fe8c3e..1a04d75a 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGet.java @@ -53,7 +53,7 @@ public class NodeItemsGet implements PubSubElementProcessor { private int rsmEntriesCount; - private JID actor; + private JID actor; public NodeItemsGet(BlockingQueue outQueue, ChannelManager channelManager) { this.outQueue = outQueue; @@ -83,9 +83,9 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) throws Exc element = elm; resultSetManagement = rsm; - if (!Configuration.getInstance().isLocalJID(requestIq.getFrom())) { - reply.getElement().addAttribute("remote-server-discover", "false"); - } + if (!Configuration.getInstance().isLocalJID(requestIq.getFrom())) { + reply.getElement().addAttribute("remote-server-discover", "false"); + } boolean isCached = channelManager.isCachedNode(node); @@ -94,12 +94,12 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) throws Exc this.actor = requestIq.getFrom(); } - if (!Configuration.getInstance().isLocalNode(node) && !isCached) { - logger.debug("Node " + node - + " is remote and not cached, off to get some data"); - makeRemoteRequest(); - return; - } + if (!Configuration.getInstance().isLocalNode(node) && !isCached) { + logger.debug("Node " + node + + " is remote and not cached, off to get some data"); + makeRemoteRequest(); + return; + } try { if (!nodeExists()) { @@ -127,24 +127,24 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) throws Exc outQueue.put(reply); } - private boolean getItem() throws Exception { - NodeItem nodeItem = channelManager.getNodeItem(node, - element.element("item").attributeValue("id")); - if (nodeItem == null) { - if (!Configuration.getInstance().isLocalNode(node)) { - makeRemoteRequest(); - return false; - } - setErrorCondition(PacketError.Type.cancel, - PacketError.Condition.item_not_found); - return true; - } - Element pubsub = reply.getElement().addElement("pubsub", - JabberPubsub.NAMESPACE_URI); - Element items = pubsub.addElement("items").addAttribute("node", node); - addItemToResponse(nodeItem, items); - return true; - } + private boolean getItem() throws Exception { + NodeItem nodeItem = channelManager.getNodeItem(node, + element.element("item").attributeValue("id")); + if (nodeItem == null) { + if (!Configuration.getInstance().isLocalNode(node)) { + makeRemoteRequest(); + return false; + } + setErrorCondition(PacketError.Type.cancel, + PacketError.Condition.item_not_found); + return true; + } + Element pubsub = reply.getElement().addElement("pubsub", + JabberPubsub.NAMESPACE_URI); + Element items = pubsub.addElement("items").addAttribute("node", node); + addItemToResponse(nodeItem, items); + return true; + } private void makeRemoteRequest() throws InterruptedException { requestIq.setTo(new JID(node.split("/")[2]).getDomain()); @@ -177,9 +177,9 @@ private void getItems() throws Exception { int maxItemsToReturn = MAX_ITEMS_TO_RETURN; String afterItemId = null; - String max_items = element.attributeValue("max_items"); - if (max_items != null) { - maxItemsToReturn = Integer.parseInt(max_items); + String maxItems = element.attributeValue("max_items"); + if (maxItems != null) { + maxItemsToReturn = Integer.parseInt(maxItems); } if (resultSetManagement != null) { @@ -214,13 +214,13 @@ private void getItems() throws Exception { entry = null; int totalEntriesCount = getNodeItems(items, maxItemsToReturn, afterItemId); - if ((false == Configuration.getInstance().isLocalNode(node)) - && (0 == rsmEntriesCount)) { - logger.debug("No results in cache for remote node, so " - + "we're going federated to get more"); - makeRemoteRequest(); - return; - } + if ((false == Configuration.getInstance().isLocalNode(node)) + && (0 == rsmEntriesCount)) { + logger.debug("No results in cache for remote node, so " + + "we're going federated to get more"); + makeRemoteRequest(); + return; + } if ((resultSetManagement != null) || (totalEntriesCount > maxItemsToReturn)) { /* @@ -244,15 +244,15 @@ private void getItems() throws Exception { private boolean userCanViewNode() throws NodeStoreException { NodeMembership nodeMembership = channelManager.getNodeMembership(node, actor); - if (getNodeViewAcl().canViewNode(node, nodeMembership, - getNodeAccessModel(), Configuration.getInstance().isLocalJID(actor))) { - return true; - } - NodeAclRefuseReason reason = getNodeViewAcl().getReason(); - createExtendedErrorReply(reason.getType(), reason.getCondition(), - reason.getAdditionalErrorElement()); - return false; - } + if (getNodeViewAcl().canViewNode(node, nodeMembership, + getNodeAccessModel(), Configuration.getInstance().isLocalJID(actor))) { + return true; + } + NodeAclRefuseReason reason = getNodeViewAcl().getReason(); + createExtendedErrorReply(reason.getType(), reason.getCondition(), + reason.getAdditionalErrorElement()); + return false; + } private AccessModels getNodeAccessModel() { if (!nodeDetails.containsKey(AccessModel.FIELD_NAME)) { @@ -291,17 +291,17 @@ private int getNodeItems(Element items, int maxItemsToReturn, String afterItemId } } - private void addItemToResponse(NodeItem nodeItem, Element parent) { - try { - entry = xmlReader.read(new StringReader(nodeItem.getPayload())) - .getRootElement(); - Element item = parent.addElement("item"); - item.addAttribute("id", nodeItem.getId()); - item.add(entry); - } catch (DocumentException e) { - logger.error("Error parsing a node entry, ignoring. " + nodeItem); - } - } + private void addItemToResponse(NodeItem nodeItem, Element parent) { + try { + entry = xmlReader.read(new StringReader(nodeItem.getPayload())) + .getRootElement(); + Element item = parent.addElement("item"); + item.addAttribute("id", nodeItem.getId()); + item.add(entry); + } catch (DocumentException e) { + logger.error("Error parsing a node entry, ignoring. " + nodeItem); + } + } private void createExtendedErrorReply(Type type, Condition condition, String additionalElement) { reply.setType(IQ.Type.error); diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java index cc04ad99..6854c3c0 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java @@ -21,132 +21,132 @@ public class FirehoseGet extends PubSubElementProcessorAbstract { - private static final int DEFAULT_MAX_RESULTS = 50; - private static final Logger LOGGER = Logger.getLogger(FirehoseGet.class); - - private Element pubsub; - private SAXReader xmlReader; - private boolean isAdmin = false; - - // RSM details - private String firstItemId = null; - private String lastItemId = null; - private String afterItemId = null; - private int maxResults = -1; - - public FirehoseGet(BlockingQueue outQueue, - ChannelManager channelManager) { - setChannelManager(channelManager); - setOutQueue(outQueue); - xmlReader = new SAXReader(); - } - - @Override - public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) - throws Exception { - response = IQ.createResultIQ(reqIQ); - request = reqIQ; - actor = actorJID; - node = elm.attributeValue("node"); - resultSetManagement = rsm; - - if (null == actor) { - actor = request.getFrom(); - } - determineAdminUserStatus(); - - if (false == Configuration.getInstance().isLocalJID(request.getFrom())) { - response.getElement().addAttribute("remote-server-discover", - "false"); - } - - pubsub = response.getElement().addElement("pubsub", - JabberPubsub.NAMESPACE_URI); - try { - parseRsmElement(); - addItems(); - addRsmElement(); - outQueue.put(response); - } catch (NodeStoreException e) { - LOGGER.error(e); - response.getElement().remove(pubsub); - setErrorCondition(PacketError.Type.wait, - PacketError.Condition.internal_server_error); - } - outQueue.put(response); - - } - - private void determineAdminUserStatus() { - for (JID user : getAdminUsers()) { - if (user.toBareJID().equals(actor.toBareJID())) { - isAdmin = true; - return; - } - } - } - - private void parseRsmElement() { - if (null == resultSetManagement) { - return; - } - Element max = resultSetManagement.element("max"); - if (max != null) { - maxResults = Integer.parseInt(max.getTextTrim()); - } - Element after = resultSetManagement.element("after"); - if (after != null) { - afterItemId = after.getTextTrim(); - } - } - - private void addRsmElement() throws NodeStoreException { - if (firstItemId == null) { - return; - } - Element rsm = pubsub.addElement("set"); - rsm.addNamespace("", NS_RSM); - rsm.addElement("first").setText(firstItemId); - rsm.addElement("last").setText(lastItemId); - rsm.addElement("count").setText( - String.valueOf(channelManager.getFirehoseItemCount( - isAdmin, actor.getDomain()))); - } - - private void addItems() throws NodeStoreException { - if (-1 == maxResults) { - maxResults = DEFAULT_MAX_RESULTS; - } - CloseableIterator items = channelManager.getFirehose( - maxResults, afterItemId, isAdmin, actor.getDomain()); - String lastNode = ""; - Element itemsElement = null; - while (items.hasNext()) { - NodeItem item = items.next(); - if (false == item.getNodeId().equals(lastNode)) { - itemsElement = pubsub.addElement("items"); - itemsElement.addAttribute("node", item.getNodeId()); - lastNode = item.getNodeId(); - } - try { - Element entry = xmlReader.read(new StringReader(item.getPayload())) - .getRootElement(); - Element itemElement = itemsElement.addElement("item"); - itemElement.addAttribute("id", item.getId()); - if (null == firstItemId) { - firstItemId = item.getId(); - } - lastItemId = item.getId(); - itemElement.add(entry); - } catch (DocumentException e) { - LOGGER.error("Error parsing a node entry, ignoring. " - + item.getId()); - } - } - } - - @Override - public boolean accept(Element elm) { - return elm.getName().equals("items"); - } + private static final int DEFAULT_MAX_RESULTS = 50; + private static final Logger LOGGER = Logger.getLogger(FirehoseGet.class); + + private Element pubsub; + private SAXReader xmlReader; + private boolean isAdmin = false; + + // RSM details + private String firstItemId = null; + private String lastItemId = null; + private String afterItemId = null; + private int maxResults = -1; + + public FirehoseGet(BlockingQueue outQueue, + ChannelManager channelManager) { + setChannelManager(channelManager); + setOutQueue(outQueue); + xmlReader = new SAXReader(); + } + + @Override + public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) + throws Exception { + response = IQ.createResultIQ(reqIQ); + request = reqIQ; + actor = actorJID; + node = elm.attributeValue("node"); + resultSetManagement = rsm; + + if (null == actor) { + actor = request.getFrom(); + } + determineAdminUserStatus(); + + if (false == Configuration.getInstance().isLocalJID(request.getFrom())) { + response.getElement().addAttribute("remote-server-discover", + "false"); + } + + pubsub = response.getElement().addElement("pubsub", + JabberPubsub.NAMESPACE_URI); + try { + parseRsmElement(); + addItems(); + addRsmElement(); + outQueue.put(response); + } catch (NodeStoreException e) { + LOGGER.error(e); + response.getElement().remove(pubsub); + setErrorCondition(PacketError.Type.wait, + PacketError.Condition.internal_server_error); + } + outQueue.put(response); + + } + + private void determineAdminUserStatus() { + for (JID user : getAdminUsers()) { + if (user.toBareJID().equals(actor.toBareJID())) { + isAdmin = true; + return; + } + } + } + + private void parseRsmElement() { + if (null == resultSetManagement) { + return; + } + Element max = resultSetManagement.element("max"); + if (max != null) { + maxResults = Integer.parseInt(max.getTextTrim()); + } + Element after = resultSetManagement.element("after"); + if (after != null) { + afterItemId = after.getTextTrim(); + } + } + + private void addRsmElement() throws NodeStoreException { + if (firstItemId == null) { + return; + } + Element rsm = pubsub.addElement("set"); + rsm.addNamespace("", NS_RSM); + rsm.addElement("first").setText(firstItemId); + rsm.addElement("last").setText(lastItemId); + rsm.addElement("count").setText( + String.valueOf(channelManager.getFirehoseItemCount( + isAdmin, actor.getDomain()))); + } + + private void addItems() throws NodeStoreException { + if (-1 == maxResults) { + maxResults = DEFAULT_MAX_RESULTS; + } + CloseableIterator items = channelManager.getFirehose( + maxResults, afterItemId, isAdmin, actor.getDomain()); + String lastNode = ""; + Element itemsElement = null; + while (items.hasNext()) { + NodeItem item = items.next(); + if (false == item.getNodeId().equals(lastNode)) { + itemsElement = pubsub.addElement("items"); + itemsElement.addAttribute("node", item.getNodeId()); + lastNode = item.getNodeId(); + } + try { + Element entry = xmlReader.read(new StringReader(item.getPayload())) + .getRootElement(); + Element itemElement = itemsElement.addElement("item"); + itemElement.addAttribute("id", item.getId()); + if (null == firstItemId) { + firstItemId = item.getId(); + } + lastItemId = item.getId(); + itemElement.add(entry); + } catch (DocumentException e) { + LOGGER.error("Error parsing a node entry, ignoring. " + + item.getId()); + } + } + } + + @Override + public boolean accept(Element elm) { + return elm.getName().equals("items"); + } } diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/result/ItemsResult.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/result/ItemsResult.java index 9427abef..eb8f375c 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/result/ItemsResult.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/result/ItemsResult.java @@ -82,13 +82,13 @@ private void addSubscription(Element item, JID user) throws NodeStoreException { String node = item.attributeValue("node"); // If its a local JID and/or a local node, that's our turf! - if ((true == Configuration.getInstance().isLocalNode(node)) - && (true == Configuration.getInstance().isLocalJID(user))) { - return; - } - if (true == Configuration.getInstance().isLocalNode(node)) { - return; - } + if ((true == Configuration.getInstance().isLocalNode(node)) + && (true == Configuration.getInstance().isLocalJID(user))) { + return; + } + if (true == Configuration.getInstance().isLocalNode(node)) { + return; + } JID listener = request.getFrom(); Subscriptions sub = Subscriptions.createFromString(item.attributeValue("subscription")); diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/AffiliationEvent.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/AffiliationEvent.java index 5175b00b..0d1bb84b 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/AffiliationEvent.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/AffiliationEvent.java @@ -26,235 +26,237 @@ public class AffiliationEvent extends PubSubElementProcessorAbstract { - Element requestedAffiliationElement; - NodeMembership usersCurrentMembership; - private Affiliations requestedAffiliation; + Element requestedAffiliationElement; + NodeMembership usersCurrentMembership; + private Affiliations requestedAffiliation; - private static final Logger LOGGER = Logger - .getLogger(AffiliationEvent.class); + private static final Logger LOGGER = Logger + .getLogger(AffiliationEvent.class); - public static final String CAN_NOT_MODIFY_OWN_AFFILIATION = "can-not-modify-own-affiliation"; + public static final String CAN_NOT_MODIFY_OWN_AFFILIATION = "can-not-modify-own-affiliation"; - /** - * Constructor - * - * @param outQueue - * Outgoing message queue - * @param channelManager - * Data Access Object (DAO) - */ - public AffiliationEvent(BlockingQueue outQueue, - ChannelManager channelManager) { - setChannelManager(channelManager); - setOutQueue(outQueue); - } + /** + * Constructor + * + * @param outQueue + * Outgoing message queue + * @param channelManager + * Data Access Object (DAO) + */ + public AffiliationEvent(BlockingQueue outQueue, + ChannelManager channelManager) { + setChannelManager(channelManager); + setOutQueue(outQueue); + } - /** - * Process incoming stanza - */ - public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) - throws Exception { - element = elm; - response = IQ.createResultIQ(reqIQ); - request = reqIQ; - actor = actorJID; - node = element.attributeValue("node"); + /** + * Process incoming stanza + */ + public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) + throws Exception { + element = elm; + response = IQ.createResultIQ(reqIQ); + request = reqIQ; + actor = actorJID; + node = element.attributeValue("node"); - if (actor == null) { - actor = request.getFrom(); - } - - if (false == nodeProvided()) { - outQueue.put(response); - return; - } - - if (false == Configuration.getInstance().isLocalNode(node)) { - makeRemoteRequest(); - return; - } + if (actor == null) { + actor = request.getFrom(); + } + + if (false == nodeProvided()) { + outQueue.put(response); + return; + } + + if (false == Configuration.getInstance().isLocalNode(node)) { + makeRemoteRequest(); + return; + } - try { - if ((false == validRequestStanza()) - || (false == checkNodeExists()) - || (false == actorHasPermissionToAuthorize()) - || (false == subscriberHasCurrentAffiliation()) - || (true == userIsModifyingTheirAffiliation()) - || (false == attemptToChangeAffiliationOfNodeOwner())) { - outQueue.put(response); - return; - } - saveUpdatedAffiliation(); - sendNotifications(); - } catch (NodeStoreException e) { - LOGGER.error(e); - setErrorCondition(PacketError.Type.wait, - PacketError.Condition.internal_server_error); - outQueue.put(response); - return; - } - } + try { + if ((false == validRequestStanza()) + || (false == checkNodeExists()) + || (false == actorHasPermissionToAuthorize()) + || (false == subscriberHasCurrentAffiliation()) + || (true == userIsModifyingTheirAffiliation()) + || (false == attemptToChangeAffiliationOfNodeOwner())) { + outQueue.put(response); + return; + } + saveUpdatedAffiliation(); + sendNotifications(); + } catch (NodeStoreException e) { + LOGGER.error(e); + setErrorCondition(PacketError.Type.wait, + PacketError.Condition.internal_server_error); + outQueue.put(response); + return; + } + } - private boolean userIsModifyingTheirAffiliation() { - if (actor.toBareJID() - .equals(requestedAffiliationElement.attributeValue("jid"))) { - createExtendedErrorReply(PacketError.Type.cancel, - PacketError.Condition.not_allowed, - CAN_NOT_MODIFY_OWN_AFFILIATION, Buddycloud.NS_ERROR); - return true; - } - return false; - } + private boolean userIsModifyingTheirAffiliation() { + if (actor.toBareJID() + .equals(requestedAffiliationElement.attributeValue("jid"))) { + createExtendedErrorReply(PacketError.Type.cancel, + PacketError.Condition.not_allowed, + CAN_NOT_MODIFY_OWN_AFFILIATION, Buddycloud.NS_ERROR); + return true; + } + return false; + } - private boolean attemptToChangeAffiliationOfNodeOwner() { - if (!usersCurrentMembership.getAffiliation().equals(Affiliations.owner)) { - return true; - } - setErrorCondition(PacketError.Type.modify, - PacketError.Condition.not_acceptable); - return false; - } + private boolean attemptToChangeAffiliationOfNodeOwner() { + if (!usersCurrentMembership.getAffiliation().equals(Affiliations.owner)) { + return true; + } + setErrorCondition(PacketError.Type.modify, + PacketError.Condition.not_acceptable); + return false; + } - private void sendNotifications() throws Exception { + private void sendNotifications() throws Exception { - outQueue.put(response); + outQueue.put(response); - ResultSet subscribers = channelManager - .getNodeSubscriptionListeners(node); + ResultSet subscribers = channelManager + .getNodeSubscriptionListeners(node); - Document document = getDocumentHelper(); - Element message = document.addElement("message"); - Element pubsub = message.addElement("event"); - message.addAttribute("remote-server-discover", "false"); - Element affiliations = pubsub.addElement("affiliations"); - Element affiliation = affiliations.addElement("affiliation"); + Document document = getDocumentHelper(); + Element message = document.addElement("message"); + Element pubsub = message.addElement("event"); + message.addAttribute("remote-server-discover", "false"); + Element affiliations = pubsub.addElement("affiliations"); + Element affiliation = affiliations.addElement("affiliation"); - pubsub.addNamespace("", JabberPubsub.NS_PUBSUB_EVENT); - message.addAttribute("from", request.getTo().toString()); - message.addAttribute("type", "headline"); + pubsub.addNamespace("", JabberPubsub.NS_PUBSUB_EVENT); + message.addAttribute("from", request.getTo().toString()); + message.addAttribute("type", "headline"); - affiliations.addAttribute("node", node); - affiliation.addAttribute("jid", - requestedAffiliationElement.attributeValue("jid")); - affiliation.addAttribute("affiliation", - requestedAffiliationElement.attributeValue("affiliation")); - Message rootElement = new Message(message); + affiliations.addAttribute("node", node); + affiliation.addAttribute("jid", + requestedAffiliationElement.attributeValue("jid")); + affiliation.addAttribute("affiliation", + requestedAffiliationElement.attributeValue("affiliation")); + Message rootElement = new Message(message); - for (NodeSubscription subscriber : subscribers) { - Message notification = rootElement.createCopy(); - notification.setTo(subscriber.getListener()); - outQueue.put(notification); - } + for (NodeSubscription subscriber : subscribers) { + Message notification = rootElement.createCopy(); + notification.setTo(subscriber.getListener()); + outQueue.put(notification); + } - Collection admins = getAdminUsers(); - for (JID admin : admins) { - Message notification = rootElement.createCopy(); - notification.setTo(admin); - outQueue.put(notification); - } - } + Collection admins = getAdminUsers(); + for (JID admin : admins) { + Message notification = rootElement.createCopy(); + notification.setTo(admin); + outQueue.put(notification); + } + } - private void saveUpdatedAffiliation() throws NodeStoreException { - JID jid = new JID(requestedAffiliationElement.attributeValue("jid")); - Affiliations affiliation = Affiliations.valueOf(requestedAffiliationElement - .attributeValue("affiliation")); - channelManager.setUserAffiliation(node, jid, affiliation); - } + private void saveUpdatedAffiliation() throws NodeStoreException { + JID jid = new JID(requestedAffiliationElement.attributeValue("jid")); + Affiliations affiliation = Affiliations.valueOf(requestedAffiliationElement + .attributeValue("affiliation")); + channelManager.setUserAffiliation(node, jid, affiliation); + } - private boolean nodeProvided() { - if (null != node) { - return true; - } - response.setType(IQ.Type.error); - Element nodeIdRequired = new DOMElement("nodeid-required", - new Namespace("", JabberPubsub.NS_PUBSUB_ERROR)); - Element badRequest = new DOMElement( - PacketError.Condition.bad_request.toString(), new Namespace("", - JabberPubsub.NS_XMPP_STANZAS)); - Element error = new DOMElement("error"); - error.addAttribute("type", "modify"); - error.add(badRequest); - error.add(nodeIdRequired); - response.setChildElement(error); - return false; - } + private boolean nodeProvided() { + if (null != node) { + return true; + } + response.setType(IQ.Type.error); + Element nodeIdRequired = new DOMElement("nodeid-required", + new Namespace("", JabberPubsub.NS_PUBSUB_ERROR)); + Element badRequest = new DOMElement( + PacketError.Condition.bad_request.toString(), new Namespace("", + JabberPubsub.NS_XMPP_STANZAS)); + Element error = new DOMElement("error"); + error.addAttribute("type", "modify"); + error.add(badRequest); + error.add(nodeIdRequired); + response.setChildElement(error); + return false; + } - private boolean validRequestStanza() { - try { - requestedAffiliationElement = request.getElement().element("pubsub") - .element("affiliations").element("affiliation"); - if ((null == requestedAffiliationElement) - || (null == requestedAffiliationElement.attribute("jid")) - || (null == requestedAffiliationElement.attribute("affiliation"))) { - setErrorCondition(PacketError.Type.modify, - PacketError.Condition.bad_request); - return false; - } - requestedAffiliation = Affiliations.createFromString( - requestedAffiliationElement.attributeValue("affiliation")); - } catch (NullPointerException e) { - LOGGER.error(e); - setErrorCondition(PacketError.Type.modify, - PacketError.Condition.bad_request); - return false; - } - requestedAffiliationElement.addAttribute( - "affiliation", - requestedAffiliation.toString()); - return true; - } + private boolean validRequestStanza() { + try { + requestedAffiliationElement = request.getElement().element("pubsub") + .element("affiliations").element("affiliation"); + if ((null == requestedAffiliationElement) + || (null == requestedAffiliationElement.attribute("jid")) + || (null == requestedAffiliationElement.attribute("affiliation"))) { + setErrorCondition(PacketError.Type.modify, + PacketError.Condition.bad_request); + return false; + } + requestedAffiliation = Affiliations.createFromString( + requestedAffiliationElement.attributeValue("affiliation")); + } catch (NullPointerException e) { + LOGGER.error(e); + setErrorCondition(PacketError.Type.modify, + PacketError.Condition.bad_request); + return false; + } + requestedAffiliationElement.addAttribute( + "affiliation", + requestedAffiliation.toString()); + return true; + } - private boolean subscriberHasCurrentAffiliation() throws NodeStoreException { - usersCurrentMembership = channelManager.getNodeMembership(node, - new JID(requestedAffiliationElement.attributeValue("jid"))); + private boolean subscriberHasCurrentAffiliation() throws NodeStoreException { + usersCurrentMembership = channelManager.getNodeMembership(node, + new JID(requestedAffiliationElement.attributeValue("jid"))); - if (usersCurrentMembership.getAffiliation().equals(Affiliations.none)) { - setErrorCondition(PacketError.Type.modify, - PacketError.Condition.unexpected_request); - return false; - } - return true; - } + if (usersCurrentMembership.getAffiliation().equals(Affiliations.none)) { + setErrorCondition(PacketError.Type.modify, + PacketError.Condition.unexpected_request); + return false; + } + return true; + } - private boolean actorHasPermissionToAuthorize() throws NodeStoreException { + private boolean actorHasPermissionToAuthorize() throws NodeStoreException { - NodeMembership membership = channelManager.getNodeMembership(node, - actor); - if (!membership.getAffiliation().canAuthorize()) { - setErrorCondition(PacketError.Type.auth, - PacketError.Condition.not_authorized); - return false; - } - if (membership.getAffiliation().equals(Affiliations.owner)) return true; - if (requestedAffiliation.equals(Affiliations.moderator) || requestedAffiliation.equals(Affiliations.owner)) { - setErrorCondition(PacketError.Type.auth, - PacketError.Condition.forbidden); - return false; - } - return true; - } + NodeMembership membership = channelManager.getNodeMembership(node, + actor); + if (!membership.getAffiliation().canAuthorize()) { + setErrorCondition(PacketError.Type.auth, + PacketError.Condition.not_authorized); + return false; + } + if (membership.getAffiliation().equals(Affiliations.owner)) { + return true; + } + if (requestedAffiliation.equals(Affiliations.moderator) || requestedAffiliation.equals(Affiliations.owner)) { + setErrorCondition(PacketError.Type.auth, + PacketError.Condition.forbidden); + return false; + } + return true; + } - private boolean checkNodeExists() throws NodeStoreException { - if (false == channelManager.nodeExists(node)) { - setErrorCondition(PacketError.Type.cancel, - PacketError.Condition.item_not_found); - return false; - } - return true; - } + private boolean checkNodeExists() throws NodeStoreException { + if (false == channelManager.nodeExists(node)) { + setErrorCondition(PacketError.Type.cancel, + PacketError.Condition.item_not_found); + return false; + } + return true; + } - private void makeRemoteRequest() throws InterruptedException { - request.setTo(new JID(node.split("/")[2]).getDomain()); - Element actor = request.getElement().element("pubsub") - .addElement("actor", Buddycloud.NS); - actor.addText(request.getFrom().toBareJID()); - outQueue.put(request); - } + private void makeRemoteRequest() throws InterruptedException { + request.setTo(new JID(node.split("/")[2]).getDomain()); + Element actor = request.getElement().element("pubsub") + .addElement("actor", Buddycloud.NS); + actor.addText(request.getFrom().toBareJID()); + outQueue.put(request); + } - /** - * Determine if this class is capable of processing incoming stanza - */ - public boolean accept(Element elm) { - return elm.getName().equals("affiliations"); - } -} \ No newline at end of file + /** + * Determine if this class is capable of processing incoming stanza + */ + public boolean accept(Element elm) { + return elm.getName().equals("affiliations"); + } +} diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDelete.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDelete.java index 5aa9fca4..cf889d80 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDelete.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDelete.java @@ -30,257 +30,257 @@ public class ItemDelete extends PubSubElementProcessorAbstract { - private static final Logger LOGGER = Logger.getLogger(ItemDelete.class); + private static final Logger LOGGER = Logger.getLogger(ItemDelete.class); - private GlobalItemID itemId; - private NodeItem nodeItem; - private Element parsedPayload; + private GlobalItemID itemId; + private NodeItem nodeItem; + private Element parsedPayload; - public ItemDelete(BlockingQueue outQueue, - ChannelManager channelManager) { - this.setOutQueue(outQueue); - this.setChannelManager(channelManager); - } + public ItemDelete(BlockingQueue outQueue, + ChannelManager channelManager) { + this.setOutQueue(outQueue); + this.setChannelManager(channelManager); + } - @Override - public void process(Element elm, JID actor, IQ reqIQ, Element rsm) - throws InterruptedException, NodeStoreException { + @Override + public void process(Element elm, JID actor, IQ reqIQ, Element rsm) + throws InterruptedException, NodeStoreException { - element = elm; - request = reqIQ; - response = IQ.createResultIQ(request); - node = element.attributeValue("node"); - this.actor = actor; - if (null == this.actor) { - this.actor = request.getFrom(); + element = elm; + request = reqIQ; + response = IQ.createResultIQ(request); + node = element.attributeValue("node"); + this.actor = actor; + if (null == this.actor) { + this.actor = request.getFrom(); + } + if (!validNodeProvided()) { + outQueue.put(response); + return; + } + + if (!Configuration.getInstance().isLocalNode(node)) { + makeRemoteRequest(); + return; } - if (!validNodeProvided()) { - outQueue.put(response); - return; - } - - if (!Configuration.getInstance().isLocalNode(node)) { - makeRemoteRequest(); - return; - } - try { - if (!nodeExists() || !itemIdProvided() - || !itemExists() || !validPayload() || !canDelete()) { - outQueue.put(response); - return; - } - deleteItem(); - outQueue.put(response); - deleteReplies(); - sendNotifications(node, itemId); - return; - } catch (NodeStoreException e) { - logger.error(e); - setErrorCondition(PacketError.Type.wait, - PacketError.Condition.internal_server_error); - } catch (NullPointerException e) { - logger.error(e); - setErrorCondition(PacketError.Type.modify, - PacketError.Condition.bad_request); - } catch (IllegalArgumentException e) { - logger.error(e); - setErrorCondition(PacketError.Type.modify, - PacketError.Condition.bad_request); - } - outQueue.put(response); - } + try { + if (!nodeExists() || !itemIdProvided() + || !itemExists() || !validPayload() || !canDelete()) { + outQueue.put(response); + return; + } + deleteItem(); + outQueue.put(response); + deleteReplies(); + sendNotifications(node, itemId); + return; + } catch (NodeStoreException e) { + logger.error(e); + setErrorCondition(PacketError.Type.wait, + PacketError.Condition.internal_server_error); + } catch (NullPointerException e) { + logger.error(e); + setErrorCondition(PacketError.Type.modify, + PacketError.Condition.bad_request); + } catch (IllegalArgumentException e) { + logger.error(e); + setErrorCondition(PacketError.Type.modify, + PacketError.Condition.bad_request); + } + outQueue.put(response); + } - private void deleteReplies() throws NodeStoreException { - if (null != nodeItem.getInReplyTo()) { - return; - } - ClosableIteratorImpl replies = channelManager - .getNodeItemReplies(node, itemId.getItemID(), null, -1); - NodeItem reply = null; - while (replies.hasNext()) { - reply = replies.next(); - channelManager.deleteNodeItemById(reply.getNodeId(), reply.getId()); + private void deleteReplies() throws NodeStoreException { + if (null != nodeItem.getInReplyTo()) { + return; + } + ClosableIteratorImpl replies = channelManager + .getNodeItemReplies(node, itemId.getItemID(), null, -1); + NodeItem reply = null; + while (replies.hasNext()) { + reply = replies.next(); + channelManager.deleteNodeItemById(reply.getNodeId(), reply.getId()); - sendNotifications( - node, - new GlobalItemIDImpl(new JID(this.getServerDomain()), reply - .getNodeId(), reply.getId())); - } - } + sendNotifications( + node, + new GlobalItemIDImpl(new JID(this.getServerDomain()), reply + .getNodeId(), reply.getId())); + } + } - private void sendNotifications(String node, GlobalItemID itemId) - throws NodeStoreException { - try { - String notify = request.getElement().element("pubsub") - .element("retract").attributeValue("notify"); + private void sendNotifications(String node, GlobalItemID itemId) + throws NodeStoreException { + try { + String notify = request.getElement().element("pubsub") + .element("retract").attributeValue("notify"); - if ((notify != null) - && (notify.equals("false") || notify.equals("0"))) { - return; - } - ResultSet subscriptions = channelManager - .getNodeSubscriptionListeners(node); - Message notification = getNotificationMessage(node, itemId); + if ((notify != null) + && (notify.equals("false") || notify.equals("0"))) { + return; + } + ResultSet subscriptions = channelManager + .getNodeSubscriptionListeners(node); + Message notification = getNotificationMessage(node, itemId); - for (NodeSubscription subscription : subscriptions) { - logger.debug("Subscription [node: " + subscription.getNodeId() - + ", listener: " + subscription.getListener() - + ", subscription: " + subscription.getSubscription() - + "]"); - if (subscription.getSubscription().equals( - Subscriptions.subscribed)) { - notification.setTo(subscription.getListener()); - outQueue.put(notification.createCopy()); - } - } + for (NodeSubscription subscription : subscriptions) { + logger.debug("Subscription [node: " + subscription.getNodeId() + + ", listener: " + subscription.getListener() + + ", subscription: " + subscription.getSubscription() + + "]"); + if (subscription.getSubscription().equals( + Subscriptions.subscribed)) { + notification.setTo(subscription.getListener()); + outQueue.put(notification.createCopy()); + } + } - Collection admins = getAdminUsers(); - for (JID admin : admins) { - notification.setTo(admin); - outQueue.put(notification.createCopy()); - } - } catch (NullPointerException e) { - logger.error(e); - return; - } catch (InterruptedException e) { - logger.error(e); - return; - } - } + Collection admins = getAdminUsers(); + for (JID admin : admins) { + notification.setTo(admin); + outQueue.put(notification.createCopy()); + } + } catch (NullPointerException e) { + logger.error(e); + return; + } catch (InterruptedException e) { + logger.error(e); + return; + } + } - private Message getNotificationMessage(String node, GlobalItemID itemId) { - Message notification = new Message(); - notification.setType(Message.Type.headline); - notification.getElement().addAttribute("remote-server-discover", - "false"); - Element event = notification.addChildElement("event", - JabberPubsub.NS_PUBSUB_EVENT); - Element items = event.addElement("items"); - items.addAttribute("node", node); - Element retract = items.addElement("retract"); - retract.addAttribute("id", itemId.getItemID()); - return notification; - } + private Message getNotificationMessage(String node, GlobalItemID itemId) { + Message notification = new Message(); + notification.setType(Message.Type.headline); + notification.getElement().addAttribute("remote-server-discover", + "false"); + Element event = notification.addChildElement("event", + JabberPubsub.NS_PUBSUB_EVENT); + Element items = event.addElement("items"); + items.addAttribute("node", node); + Element retract = items.addElement("retract"); + retract.addAttribute("id", itemId.getItemID()); + return notification; + } - private void deleteItem() throws NodeStoreException { - channelManager.deleteNodeItemById(node, itemId.getItemID()); - } + private void deleteItem() throws NodeStoreException { + channelManager.deleteNodeItemById(node, itemId.getItemID()); + } - private boolean canDelete() throws NodeStoreException { - if (!userOwnsItem() && !userManagesNode()) { - setErrorCondition(PacketError.Type.auth, - PacketError.Condition.forbidden); - return false; - } - return true; - } + private boolean canDelete() throws NodeStoreException { + if (!userOwnsItem() && !userManagesNode()) { + setErrorCondition(PacketError.Type.auth, + PacketError.Condition.forbidden); + return false; + } + return true; + } - private boolean userOwnsItem() { - try { - return parsedPayload.element("author").elementText("name") - .equals(actor.toBareJID()); - } catch (NullPointerException e) { - return false; - } - } + private boolean userOwnsItem() { + try { + return parsedPayload.element("author").elementText("name") + .equals(actor.toBareJID()); + } catch (NullPointerException e) { + return false; + } + } - private boolean userManagesNode() throws NodeStoreException { - return channelManager.getNodeMembership(node, actor).getAffiliation() - .canAuthorize(); - } + private boolean userManagesNode() throws NodeStoreException { + return channelManager.getNodeMembership(node, actor).getAffiliation() + .canAuthorize(); + } - private boolean validPayload() { + private boolean validPayload() { - try { - SAXReader xmlReader = new SAXReader(); - xmlReader.setMergeAdjacentText(true); - xmlReader.setStringInternEnabled(true); - xmlReader.setStripWhitespaceText(true); - parsedPayload = xmlReader.read( - new StringReader(nodeItem.getPayload())).getRootElement(); - return true; - } catch (Exception e) { - LOGGER.error(e); - setErrorCondition(PacketError.Type.wait, - PacketError.Condition.internal_server_error); - return false; - } - } + try { + SAXReader xmlReader = new SAXReader(); + xmlReader.setMergeAdjacentText(true); + xmlReader.setStringInternEnabled(true); + xmlReader.setStripWhitespaceText(true); + parsedPayload = xmlReader.read( + new StringReader(nodeItem.getPayload())).getRootElement(); + return true; + } catch (Exception e) { + LOGGER.error(e); + setErrorCondition(PacketError.Type.wait, + PacketError.Condition.internal_server_error); + return false; + } + } - private boolean itemExists() throws NodeStoreException { - nodeItem = channelManager.getNodeItem(node, itemId.getItemID()); - if (nodeItem != null) { - return true; - } - setErrorCondition(PacketError.Type.cancel, - PacketError.Condition.item_not_found); - return false; - } + private boolean itemExists() throws NodeStoreException { + nodeItem = channelManager.getNodeItem(node, itemId.getItemID()); + if (nodeItem != null) { + return true; + } + setErrorCondition(PacketError.Type.cancel, + PacketError.Condition.item_not_found); + return false; + } - private boolean itemIdProvided() { - String id = request.getElement().element("pubsub").element("retract") - .element("item").attributeValue("id"); + private boolean itemIdProvided() { + String id = request.getElement().element("pubsub").element("retract") + .element("item").attributeValue("id"); - if ((id != null) && !id.isEmpty()) { - if (true == GlobalItemIDImpl.isGlobalId(id)) { - itemId = GlobalItemIDImpl.fromBuddycloudString(id); - } else { - itemId = new GlobalItemIDImpl(new JID(this.getServerDomain()), - node, id); - } - return true; - } - response.setType(IQ.Type.error); - Element nodeIdRequired = new DOMElement("item-required", new Namespace( - "", JabberPubsub.NS_PUBSUB_ERROR)); - Element badRequest = new DOMElement( - PacketError.Condition.bad_request.toXMPP(), new Namespace("", - JabberPubsub.NS_XMPP_STANZAS)); - Element error = new DOMElement("error"); - error.addAttribute("type", PacketError.Type.modify.toXMPP()); - error.add(badRequest); - error.add(nodeIdRequired); - response.setChildElement(error); - return false; - } + if ((id != null) && !id.isEmpty()) { + if (true == GlobalItemIDImpl.isGlobalId(id)) { + itemId = GlobalItemIDImpl.fromBuddycloudString(id); + } else { + itemId = new GlobalItemIDImpl(new JID(this.getServerDomain()), + node, id); + } + return true; + } + response.setType(IQ.Type.error); + Element nodeIdRequired = new DOMElement("item-required", new Namespace( + "", JabberPubsub.NS_PUBSUB_ERROR)); + Element badRequest = new DOMElement( + PacketError.Condition.bad_request.toXMPP(), new Namespace("", + JabberPubsub.NS_XMPP_STANZAS)); + Element error = new DOMElement("error"); + error.addAttribute("type", PacketError.Type.modify.toXMPP()); + error.add(badRequest); + error.add(nodeIdRequired); + response.setChildElement(error); + return false; + } - private boolean nodeExists() throws NodeStoreException { - if ((false == Configuration.getInstance().isLocalNode(node)) - || (false == channelManager.nodeExists(node))) { - setErrorCondition(PacketError.Type.cancel, - PacketError.Condition.item_not_found); - return false; - } - return true; - } + private boolean nodeExists() throws NodeStoreException { + if ((false == Configuration.getInstance().isLocalNode(node)) + || (false == channelManager.nodeExists(node))) { + setErrorCondition(PacketError.Type.cancel, + PacketError.Condition.item_not_found); + return false; + } + return true; + } - private boolean validNodeProvided() { - if (node != null && !node.equals("")) { - return true; - } - response.setType(IQ.Type.error); - Element nodeIdRequired = new DOMElement("nodeid-required", - new Namespace("", JabberPubsub.NS_PUBSUB_ERROR)); - Element badRequest = new DOMElement( - PacketError.Condition.bad_request.toXMPP(), new Namespace("", - JabberPubsub.NS_XMPP_STANZAS)); - Element error = new DOMElement("error"); - error.addAttribute("type", "modify"); - error.add(badRequest); - error.add(nodeIdRequired); - response.setChildElement(error); - return false; - } + private boolean validNodeProvided() { + if (node != null && !node.equals("")) { + return true; + } + response.setType(IQ.Type.error); + Element nodeIdRequired = new DOMElement("nodeid-required", + new Namespace("", JabberPubsub.NS_PUBSUB_ERROR)); + Element badRequest = new DOMElement( + PacketError.Condition.bad_request.toXMPP(), new Namespace("", + JabberPubsub.NS_XMPP_STANZAS)); + Element error = new DOMElement("error"); + error.addAttribute("type", "modify"); + error.add(badRequest); + error.add(nodeIdRequired); + response.setChildElement(error); + return false; + } - private void makeRemoteRequest() throws InterruptedException { - request.setTo(new JID(node.split("/")[2]).getDomain()); - request.getElement().element("pubsub") - .addElement("actor", Buddycloud.NS).addText(actor.toBareJID()); - outQueue.put(request); - } + private void makeRemoteRequest() throws InterruptedException { + request.setTo(new JID(node.split("/")[2]).getDomain()); + request.getElement().element("pubsub") + .addElement("actor", Buddycloud.NS).addText(actor.toBareJID()); + outQueue.put(request); + } - public boolean accept(Element elm) { - return elm.getName().equals("retract"); - } + public boolean accept(Element elm) { + return elm.getName().equals("retract"); + } } diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeConfigure.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeConfigure.java index 3af87e15..054ab70f 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeConfigure.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeConfigure.java @@ -45,31 +45,31 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) throws Exc actor = actorJID; node = element.attributeValue("node"); - if (null == actor) { - actor = request.getFrom(); - } - if (!nodeProvided()) { - outQueue.put(response); - return; - } - if (!Configuration.getInstance().isLocalNode(node)) { - makeRemoteRequest(); - return; - } - try { - if (!nodeExists() || !actorCanModify()) { - outQueue.put(response); - return; - } - } catch (NodeStoreException e) { - LOGGER.error(e); - setErrorCondition(PacketError.Type.cancel, - PacketError.Condition.internal_server_error); - outQueue.put(response); - return; - } - setNodeConfiguration(); - } + if (null == actor) { + actor = request.getFrom(); + } + if (!nodeProvided()) { + outQueue.put(response); + return; + } + if (!Configuration.getInstance().isLocalNode(node)) { + makeRemoteRequest(); + return; + } + try { + if (!nodeExists() || !actorCanModify()) { + outQueue.put(response); + return; + } + } catch (NodeStoreException e) { + LOGGER.error(e); + setErrorCondition(PacketError.Type.cancel, + PacketError.Condition.internal_server_error); + outQueue.put(response); + return; + } + setNodeConfiguration(); + } private void setNodeConfiguration() throws Exception { try { diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreate.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreate.java index 0fb1c6db..6b419dd0 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreate.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreate.java @@ -24,38 +24,38 @@ public class NodeCreate extends PubSubElementProcessorAbstract { private static final String NODE_REG_EX = "^/user/[^@]+@[^/]+/[^/]+$"; private static final String INVALID_NODE_CONFIGURATION = "Invalid node configuration"; - public NodeCreate(BlockingQueue outQueue, - ChannelManager channelManager) { - setChannelManager(channelManager); - setOutQueue(outQueue); - } - - public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) - throws Exception { - element = elm; - response = IQ.createResultIQ(reqIQ); - request = reqIQ; - actor = actorJID; - node = element.attributeValue("node"); - if (null == actorJID) { - actor = request.getFrom(); - } - if (false == validateNode()) { - outQueue.put(response); - return; - } - if (false == Configuration.getInstance().isLocalNode(node)) { - makeRemoteRequest(); - return; - } - if ((true == doesNodeExist()) - || (false == actorIsRegistered()) - || (false == nodeHandledByThisServer())) { - outQueue.put(response); - return; - } - createNode(); - } + public NodeCreate(BlockingQueue outQueue, + ChannelManager channelManager) { + setChannelManager(channelManager); + setOutQueue(outQueue); + } + + public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) + throws Exception { + element = elm; + response = IQ.createResultIQ(reqIQ); + request = reqIQ; + actor = actorJID; + node = element.attributeValue("node"); + if (null == actorJID) { + actor = request.getFrom(); + } + if (false == validateNode()) { + outQueue.put(response); + return; + } + if (false == Configuration.getInstance().isLocalNode(node)) { + makeRemoteRequest(); + return; + } + if ((true == doesNodeExist()) + || (false == actorIsRegistered()) + || (false == nodeHandledByThisServer())) { + outQueue.put(response); + return; + } + createNode(); + } private void createNode() throws InterruptedException { try { 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 188ef61d..4b21bb2e 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 @@ -38,25 +38,25 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) throws Exc this.actor = actorJID; this.node = element.attributeValue("node"); - if (actorJID == null) { - actor = request.getFrom(); - } - if (!nodePresent() || !nodeValid()) { - outQueue.put(response); - return; - } - if (!Configuration.getInstance().isLocalNode(node)) { - makeRemoteRequest(); - return; - } - if (!nodeExists() || !actorIsRegistered() || !nodeHandledByThisServer() - || !actorAllowedToDelete()) { - outQueue.put(response); - return; - } - deleteNode(); - sendNotifications(); - } + if (actorJID == null) { + actor = request.getFrom(); + } + if (!nodePresent() || !nodeValid()) { + outQueue.put(response); + return; + } + if (!Configuration.getInstance().isLocalNode(node)) { + makeRemoteRequest(); + return; + } + if (!nodeExists() || !actorIsRegistered() || !nodeHandledByThisServer() + || !actorAllowedToDelete()) { + outQueue.put(response); + return; + } + deleteNode(); + sendNotifications(); + } private void sendNotifications() throws NodeStoreException { try { @@ -105,23 +105,23 @@ public boolean accept(Element elm) { return elm.getName().equals("delete"); } - private boolean nodePresent() { - if (node != null && !node.trim().equals("")) { - return true; - } - response.setType(IQ.Type.error); - Element nodeIdRequired = new DOMElement("nodeid-required", - new Namespace("", JabberPubsub.NS_PUBSUB_ERROR)); - Element badRequest = new DOMElement( - PacketError.Condition.bad_request.toXMPP(), new Namespace("", - JabberPubsub.NS_XMPP_STANZAS)); - Element error = new DOMElement("error"); - error.addAttribute("type", "modify"); - error.add(badRequest); - error.add(nodeIdRequired); - response.setChildElement(error); - return false; - } + private boolean nodePresent() { + if (node != null && !node.trim().equals("")) { + return true; + } + response.setType(IQ.Type.error); + Element nodeIdRequired = new DOMElement("nodeid-required", + new Namespace("", JabberPubsub.NS_PUBSUB_ERROR)); + Element badRequest = new DOMElement( + PacketError.Condition.bad_request.toXMPP(), new Namespace("", + JabberPubsub.NS_XMPP_STANZAS)); + Element error = new DOMElement("error"); + error.addAttribute("type", "modify"); + error.add(badRequest); + error.add(nodeIdRequired); + response.setChildElement(error); + return false; + } private boolean nodeExists() throws NodeStoreException { if (channelManager.nodeExists(node)) { @@ -149,30 +149,30 @@ private boolean actorAllowedToDelete() throws NodeStoreException { 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 void makeRemoteRequest() throws InterruptedException { - request.setTo(new JID(node.split("/")[2]).getDomain()); - Element actor = request.getElement().element("pubsub") - .addElement("actor", Buddycloud.NS); - actor.addText(request.getFrom().toBareJID()); - outQueue.put(request); - } + 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 void makeRemoteRequest() throws InterruptedException { + request.setTo(new JID(node.split("/")[2]).getDomain()); + Element actor = request.getElement().element("pubsub") + .addElement("actor", Buddycloud.NS); + actor.addText(request.getFrom().toBareJID()); + outQueue.put(request); + } } diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscribeSet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscribeSet.java index e710b9d7..dd5704d3 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscribeSet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscribeSet.java @@ -68,16 +68,16 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) throws Exc boolean isLocalSubscriber = false; - if (actorJID != null) { - subscribingJid = actorJID; - } else { - isLocalSubscriber = Configuration.getInstance().isLocalJID(subscribingJid); - // Check that user is registered. - if (!isLocalSubscriber) { - failAuthRequired(); - return; - } - } + if (actorJID != null) { + subscribingJid = actorJID; + } else { + isLocalSubscriber = Configuration.getInstance().isLocalJID(subscribingJid); + // Check that user is registered. + if (!isLocalSubscriber) { + failAuthRequired(); + return; + } + } Map nodeConf = null; @@ -117,42 +117,42 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) throws Exc Affiliations defaultAffiliation = Affiliations.member; Subscriptions defaultSubscription = Subscriptions.none; - if (!membership.getSubscription().equals(Subscriptions.invited) - && !membership.getSubscription().in(Subscriptions.none) - && !membership.getAffiliation().in(Affiliations.none)) { - LOGGER.debug("User already has a '" - + membership.getSubscription().toString() - + "' subscription"); - defaultAffiliation = membership.getAffiliation(); - defaultSubscription = membership.getSubscription(); - } else { - try { - String nodeDefaultAffiliation = nodeConf - .get(Conf.DEFAULT_AFFILIATION); - LOGGER.debug("Node default affiliation: '" - + nodeDefaultAffiliation + "'"); - if (!Affiliations.none.equals(Affiliations - .createFromString(nodeDefaultAffiliation))) { - defaultAffiliation = Affiliations - .createFromString(nodeDefaultAffiliation); - } - } catch (NullPointerException e) { - LOGGER.error("Could not create affiliation.", e); - defaultAffiliation = Affiliations.member; - } - defaultSubscription = Subscriptions.subscribed; - String accessModel = nodeConf.get(Conf.ACCESS_MODEL); - if ((null == accessModel) - || (true == accessModel.equals(AccessModels.authorize - .toString())) - || (true == accessModel.equals(AccessModels.whitelist - .toString()))) { - defaultSubscription = Subscriptions.pending; - } else if ((true == accessModel.equals(AccessModels.local - .toString()) && (false == Configuration.getInstance() - .isLocalJID(subscribingJid)))) { - defaultSubscription = Subscriptions.pending; - } + if (!membership.getSubscription().equals(Subscriptions.invited) + && !membership.getSubscription().in(Subscriptions.none) + && !membership.getAffiliation().in(Affiliations.none)) { + LOGGER.debug("User already has a '" + + membership.getSubscription().toString() + + "' subscription"); + defaultAffiliation = membership.getAffiliation(); + defaultSubscription = membership.getSubscription(); + } else { + try { + String nodeDefaultAffiliation = nodeConf + .get(Conf.DEFAULT_AFFILIATION); + LOGGER.debug("Node default affiliation: '" + + nodeDefaultAffiliation + "'"); + if (!Affiliations.none.equals(Affiliations + .createFromString(nodeDefaultAffiliation))) { + defaultAffiliation = Affiliations + .createFromString(nodeDefaultAffiliation); + } + } catch (NullPointerException e) { + LOGGER.error("Could not create affiliation.", e); + defaultAffiliation = Affiliations.member; + } + defaultSubscription = Subscriptions.subscribed; + String accessModel = nodeConf.get(Conf.ACCESS_MODEL); + if ((null == accessModel) + || (true == accessModel.equals(AccessModels.authorize + .toString())) + || (true == accessModel.equals(AccessModels.whitelist + .toString()))) { + defaultSubscription = Subscriptions.pending; + } else if ((true == accessModel.equals(AccessModels.local + .toString()) && (false == Configuration.getInstance() + .isLocalJID(subscribingJid)))) { + defaultSubscription = Subscriptions.pending; + } NodeSubscription newSubscription = new NodeSubscriptionImpl(node, subscribingJid, request.getFrom(), defaultSubscription, null); channelManager.addUserSubscription(newSubscription); @@ -183,23 +183,23 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) throws Exc } } - private boolean handleNodeSubscription(Element elm, JID actorJID, - JID subscribingJid) throws NodeStoreException, InterruptedException { - boolean isLocalNode = false; - try { - isLocalNode = Configuration.getInstance().isLocalNode(node); - } catch (IllegalArgumentException e) { - LOGGER.debug(e); - createExtendedErrorReply(PacketError.Type.modify, - PacketError.Condition.bad_request, INVALID_NODE_FORMAT, - Buddycloud.NS_ERROR); - outQueue.put(response); - return false; - } - if (!isLocalNode && !node.equals("/firehose")) { - makeRemoteRequest(); - return false; - } + private boolean handleNodeSubscription(Element elm, JID actorJID, + JID subscribingJid) throws NodeStoreException, InterruptedException { + boolean isLocalNode = false; + try { + isLocalNode = Configuration.getInstance().isLocalNode(node); + } catch (IllegalArgumentException e) { + LOGGER.debug(e); + createExtendedErrorReply(PacketError.Type.modify, + PacketError.Condition.bad_request, INVALID_NODE_FORMAT, + Buddycloud.NS_ERROR); + outQueue.put(response); + return false; + } + if (!isLocalNode && !node.equals("/firehose")) { + makeRemoteRequest(); + return false; + } // 6.1.3.1 JIDs Do Not Match diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscriptionEvent.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscriptionEvent.java index 4efc4251..1d0a5b73 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscriptionEvent.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscriptionEvent.java @@ -58,37 +58,37 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) throws Exc actor = actorJID; node = element.attributeValue("node"); - if (actor == null) { - actor = request.getFrom(); - } - if (false == nodeProvided()) { - outQueue.put(response); - return; - } - - if (false == Configuration.getInstance().isLocalNode(node)) { - makeRemoteRequest(); - return; - } - try { - if ((false == validRequestStanza()) - || (false == checkNodeExists()) - || (false == actorHasPermissionToAuthorize()) - || (true == actorIsModifyingTheirSubscription()) - || (false == userIsSubscribable())) { - outQueue.put(response); - return; - } - saveUpdatedSubscription(); - sendNotifications(); - } catch (NodeStoreException e) { - LOGGER.error(e); - setErrorCondition(PacketError.Type.wait, - PacketError.Condition.internal_server_error); - outQueue.put(response); - return; - } - } + if (actor == null) { + actor = request.getFrom(); + } + if (false == nodeProvided()) { + outQueue.put(response); + return; + } + + if (false == Configuration.getInstance().isLocalNode(node)) { + makeRemoteRequest(); + return; + } + try { + if ((false == validRequestStanza()) + || (false == checkNodeExists()) + || (false == actorHasPermissionToAuthorize()) + || (true == actorIsModifyingTheirSubscription()) + || (false == userIsSubscribable())) { + outQueue.put(response); + return; + } + saveUpdatedSubscription(); + sendNotifications(); + } catch (NodeStoreException e) { + LOGGER.error(e); + setErrorCondition(PacketError.Type.wait, + PacketError.Condition.internal_server_error); + outQueue.put(response); + return; + } + } private boolean actorIsModifyingTheirSubscription() { if (actor.toBareJID().equals(subscriptionElement.attributeValue("jid"))) { @@ -144,18 +144,18 @@ private void sendNotifications() throws Exception { return; } - if (newSubscription.equals(Subscriptions.invited)) { - Message alertInvitedUser = rootElement.createCopy(); - JID to = jid; - alertInvitedUser.getElement().attribute("remote-server-discover") - .detach(); - if (!Configuration.getInstance().isLocalJID(jid)) { - to = invitedUsersDomain; - } - alertInvitedUser.setTo(to); - outQueue.put(alertInvitedUser); - } - } + if (newSubscription.equals(Subscriptions.invited)) { + Message alertInvitedUser = rootElement.createCopy(); + JID to = jid; + alertInvitedUser.getElement().attribute("remote-server-discover") + .detach(); + if (!Configuration.getInstance().isLocalJID(jid)) { + to = invitedUsersDomain; + } + alertInvitedUser.setTo(to); + outQueue.put(alertInvitedUser); + } + } private void saveUpdatedSubscription() throws NodeStoreException { if (requestedSubscription.equals(Subscriptions.invited)) { diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/UnsubscribeSet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/UnsubscribeSet.java index c59d6dda..6bd1451b 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/UnsubscribeSet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/UnsubscribeSet.java @@ -25,161 +25,161 @@ public class UnsubscribeSet extends PubSubElementProcessorAbstract { - public static final String NODE_ID_REQUIRED = "nodeid-required"; - public static final String CAN_NOT_UNSUBSCRIBE_ANOTHER_USER = "can-only-unsubscribe-self"; - public static String MUST_HAVE_ONE_OWNER = "node-must-have-owner"; - - private JID unsubscribingJid; - - - public UnsubscribeSet(BlockingQueue outQueue, - ChannelManager channelManager) { - this.outQueue = outQueue; - this.channelManager = channelManager; - } - - @Override - public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) - throws Exception { - - request = reqIQ; - node = request.getChildElement().element("unsubscribe").attributeValue("node"); - response = IQ.createResultIQ(request); - - if ((node == null) || (node.equals(""))) { - missingNodeName(); - return; - } - - JID from = request.getFrom(); - if ((false == node.equals("/firehose")) - && (false == Configuration.getInstance().isLocalNode(node))) { - makeRemoteRequest(); - return; - } - if (actorJID != null) { - from = actorJID; - } - - unsubscribingJid = new JID(request.getChildElement().element("unsubscribe") - .attributeValue("jid")); - - if (false == unsubscribingJid.toBareJID().equals(from.toBareJID())) { - failAuthRequired(); - return; - } - - - if (false == channelManager.nodeExists(node)) { - setErrorCondition(PacketError.Type.cancel, PacketError.Condition.item_not_found); - outQueue.put(response); - return; - } - - NodeMembership membership = channelManager.getNodeMembership(node, unsubscribingJid); - - // Check that the requesting user is allowed to unsubscribe according to - // XEP-0060 section 6.2.3.3 - - if (!unsubscribingJid.equals(membership.getUser())) { - createExtendedErrorReply( - PacketError.Type.auth, - PacketError.Condition.forbidden, - CAN_NOT_UNSUBSCRIBE_ANOTHER_USER, - Buddycloud.NS - ); - outQueue.put(response); - return; - } - - if (membership.getAffiliation().equals(Affiliations.owner) && - (channelManager.getNodeOwners(node).size() < 2)) { - - createExtendedErrorReply( - PacketError.Type.cancel, - PacketError.Condition.not_allowed, - MUST_HAVE_ONE_OWNER, - Buddycloud.NS - ); - outQueue.put(response); - return; - } - - NodeSubscription newSubscription = new NodeSubscriptionImpl( - membership.getNodeId(), - membership.getUser(), - membership.getListener(), Subscriptions.none, null); - - channelManager.addUserSubscription(newSubscription); - if (!Affiliations.outcast.equals( - membership.getAffiliation())) { - channelManager.setUserAffiliation(node, unsubscribingJid, - Affiliations.none); - } - - outQueue.put(response); - notifySubscribers(); - } - - private void notifySubscribers() throws NodeStoreException, - InterruptedException { - ResultSet subscribers = channelManager - .getNodeSubscriptionListeners(node); - - Document document = getDocumentHelper(); - Element message = document.addElement("message"); - message.addAttribute("remote-server-discover", "false"); - Element event = message.addElement("event", Event.NAMESPACE); - Element subscription = event.addElement("subscription"); - subscription.addAttribute("node", node); - subscription.addAttribute("jid", unsubscribingJid.toBareJID()); - subscription - .addAttribute("subscription", Subscriptions.none.toString()); - message.addAttribute("from", request.getTo().toString()); - message.addAttribute("type", "headline"); - // "None" because we don't glorify the bad - Element affiliations = event.addElement("affiliations"); - Element affiliation = affiliations.addElement("affiliation"); - affiliation.addAttribute("jid", unsubscribingJid.toBareJID()); - affiliation.addAttribute("node", node); - - Message rootElement = new Message(message); + public static final String NODE_ID_REQUIRED = "nodeid-required"; + public static final String CAN_NOT_UNSUBSCRIBE_ANOTHER_USER = "can-only-unsubscribe-self"; + public static final String MUST_HAVE_ONE_OWNER = "node-must-have-owner"; + + private JID unsubscribingJid; + + + public UnsubscribeSet(BlockingQueue outQueue, + ChannelManager channelManager) { + this.outQueue = outQueue; + this.channelManager = channelManager; + } + + @Override + public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) + throws Exception { + + request = reqIQ; + node = request.getChildElement().element("unsubscribe").attributeValue("node"); + response = IQ.createResultIQ(request); + + if ((node == null) || (node.equals(""))) { + missingNodeName(); + return; + } + + JID from = request.getFrom(); + if ((false == node.equals("/firehose")) + && (false == Configuration.getInstance().isLocalNode(node))) { + makeRemoteRequest(); + return; + } + if (actorJID != null) { + from = actorJID; + } - for (NodeSubscription subscriber : subscribers) { - Message notification = rootElement.createCopy(); - notification.setTo(subscriber.getUser()); - outQueue.put(notification); - } - - Collection admins = getAdminUsers(); - for (JID admin : admins) { - Message notification = rootElement.createCopy(); - notification.setTo(admin); - outQueue.put(notification); - } - } - - private void failAuthRequired() throws InterruptedException { - setErrorCondition(PacketError.Type.auth, PacketError.Condition.not_authorized); - outQueue.put(response); - } - - private void missingNodeName() throws InterruptedException { - createExtendedErrorReply(PacketError.Type.modify, PacketError.Condition.bad_request, NODE_ID_REQUIRED); - outQueue.put(response); - } - - private void makeRemoteRequest() throws InterruptedException { - request.setTo(new JID(node.split("/")[2]).getDomain()); - Element actor = request.getElement() - .element("pubsub") - .addElement("actor", Buddycloud.NS); - actor.addText(request.getFrom().toBareJID()); - outQueue.put(request); - } - - @Override - public boolean accept(Element elm) { - return elm.getName().equals("unsubscribe"); - } -} \ No newline at end of file + unsubscribingJid = new JID(request.getChildElement().element("unsubscribe") + .attributeValue("jid")); + + if (false == unsubscribingJid.toBareJID().equals(from.toBareJID())) { + failAuthRequired(); + return; + } + + + if (false == channelManager.nodeExists(node)) { + setErrorCondition(PacketError.Type.cancel, PacketError.Condition.item_not_found); + outQueue.put(response); + return; + } + + NodeMembership membership = channelManager.getNodeMembership(node, unsubscribingJid); + + // Check that the requesting user is allowed to unsubscribe according to + // XEP-0060 section 6.2.3.3 + + if (!unsubscribingJid.equals(membership.getUser())) { + createExtendedErrorReply( + PacketError.Type.auth, + PacketError.Condition.forbidden, + CAN_NOT_UNSUBSCRIBE_ANOTHER_USER, + Buddycloud.NS + ); + outQueue.put(response); + return; + } + + if (membership.getAffiliation().equals(Affiliations.owner) && + (channelManager.getNodeOwners(node).size() < 2)) { + + createExtendedErrorReply( + PacketError.Type.cancel, + PacketError.Condition.not_allowed, + MUST_HAVE_ONE_OWNER, + Buddycloud.NS + ); + outQueue.put(response); + return; + } + + NodeSubscription newSubscription = new NodeSubscriptionImpl( + membership.getNodeId(), + membership.getUser(), + membership.getListener(), Subscriptions.none, null); + + channelManager.addUserSubscription(newSubscription); + if (!Affiliations.outcast.equals( + membership.getAffiliation())) { + channelManager.setUserAffiliation(node, unsubscribingJid, + Affiliations.none); + } + + outQueue.put(response); + notifySubscribers(); + } + + private void notifySubscribers() throws NodeStoreException, + InterruptedException { + ResultSet subscribers = channelManager + .getNodeSubscriptionListeners(node); + + Document document = getDocumentHelper(); + Element message = document.addElement("message"); + message.addAttribute("remote-server-discover", "false"); + Element event = message.addElement("event", Event.NAMESPACE); + Element subscription = event.addElement("subscription"); + subscription.addAttribute("node", node); + subscription.addAttribute("jid", unsubscribingJid.toBareJID()); + subscription + .addAttribute("subscription", Subscriptions.none.toString()); + message.addAttribute("from", request.getTo().toString()); + message.addAttribute("type", "headline"); + // "None" because we don't glorify the bad + Element affiliations = event.addElement("affiliations"); + Element affiliation = affiliations.addElement("affiliation"); + affiliation.addAttribute("jid", unsubscribingJid.toBareJID()); + affiliation.addAttribute("node", node); + + Message rootElement = new Message(message); + + for (NodeSubscription subscriber : subscribers) { + Message notification = rootElement.createCopy(); + notification.setTo(subscriber.getUser()); + outQueue.put(notification); + } + + Collection admins = getAdminUsers(); + for (JID admin : admins) { + Message notification = rootElement.createCopy(); + notification.setTo(admin); + outQueue.put(notification); + } + } + + private void failAuthRequired() throws InterruptedException { + setErrorCondition(PacketError.Type.auth, PacketError.Condition.not_authorized); + outQueue.put(response); + } + + private void missingNodeName() throws InterruptedException { + createExtendedErrorReply(PacketError.Type.modify, PacketError.Condition.bad_request, NODE_ID_REQUIRED); + outQueue.put(response); + } + + private void makeRemoteRequest() throws InterruptedException { + request.setTo(new JID(node.split("/")[2]).getDomain()); + Element actor = request.getElement() + .element("pubsub") + .addElement("actor", Buddycloud.NS); + actor.addText(request.getFrom().toBareJID()); + outQueue.put(request); + } + + @Override + public boolean accept(Element elm) { + return elm.getName().equals("unsubscribe"); + } +} diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/RegisterSet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/RegisterSet.java index 389720d8..969848a2 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/RegisterSet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/RegisterSet.java @@ -23,152 +23,152 @@ import org.xmpp.packet.PacketError; public class RegisterSet implements PacketProcessor { - public static final String ELEMENT_NAME = "query"; - private static final Logger LOGGER = Logger.getLogger(RegisterSet.class); - - private final BlockingQueue outQueue; - private final ChannelManager channelManager; - private IQ request; - private IQ response; - private final Configuration configuration; - - public RegisterSet(BlockingQueue outQueue, ChannelManager channelManager) { - this(Configuration.getInstance(), outQueue, channelManager); - } - - public RegisterSet(Configuration configuration, BlockingQueue outQueue, ChannelManager channelManager) { - this.configuration = configuration; - this.outQueue = outQueue; - this.channelManager = channelManager; - } - - @Override - public void process(IQ reqIQ) throws Exception { - this.request = reqIQ; - this.response = IQ.createResultIQ(reqIQ); - - LOGGER.debug("Processing register request from " + request.getFrom()); - - String domain = reqIQ.getFrom().getDomain(); - if (!Configuration.getInstance().isLocalDomain(domain)) { - notThisDomain(reqIQ); - return; - } - - if (userRegistered()) { - LOGGER.debug("User " + request.getFrom().toBareJID() + " is already registered"); - outQueue.put(response); - return; - } - - LOGGER.debug("Registering new user " + request.getFrom()); - - channelManager.createPersonalChannel(request.getFrom()); - outQueue.put(response); - autosubscribeToChannels(request.getFrom()); - } - - private void notThisDomain(IQ reqIQ) throws InterruptedException { - // Request is coming from different domain than the - // component is using. We will not allow this because - // "buddycloud federation" cannot work for that. - IQ reply = IQ.createResultIQ(reqIQ); - reply.setType(Type.error); - reply.setChildElement(reqIQ.getChildElement().createCopy()); - PacketError pe = new PacketError( - org.xmpp.packet.PacketError.Condition.not_allowed, - org.xmpp.packet.PacketError.Type.cancel); - reply.setError(pe); - outQueue.put(reply); - } - - private boolean userRegistered() throws Exception { - return channelManager.nodeExists("/user/" + request.getFrom().toBareJID() + "/posts"); - } - - // TODO: We should really be returning an error as per spec shouldn't we? - // It should be up to the client to ignore the error, not the server. - @SuppressWarnings("unused") - private void userAlreadyRegistered() throws InterruptedException { - // User is already registered. - IQ reply = IQ.createResultIQ(request); - reply.setType(Type.error); - reply.setChildElement(request.getChildElement().createCopy()); - PacketError pe = new PacketError( - org.xmpp.packet.PacketError.Condition.conflict, - org.xmpp.packet.PacketError.Type.cancel); - reply.setError(pe); - outQueue.put(reply); - } - - private void autosubscribeToChannels(final JID from) { - Collection channels = configuration.getAutosubscribeChannels(); - - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Auto-subscribing " + from + " to " + channels.size() - + " channel(s)"); - } - - for (JID channel : channels) { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Auto-subscribing " + from + " to " + channel); - } - - IQ subscribe = new IQ(); - - subscribe.setType(Type.set); - - Element el = subscribe.getElement(); - Element pubsubEl = el.addElement("pubsub", - JabberPubsub.NAMESPACE_URI); - Element subscribeEl = pubsubEl.addElement("subscribe"); - - String channelNodeId = Conf.getPostChannelNodename(channel); - - subscribeEl.addAttribute("node", channelNodeId); - subscribeEl.addAttribute("jid", from.toBareJID().toString()); - - try { - if (Configuration.getInstance().isLocalJID(channel)) { - subscribe.setFrom(from); - subscribe.setTo(configuration.getServerChannelsDomain()); - } else { - subscribe.setFrom(configuration.getServerChannelsDomain()); - subscribe.setTo(channel.getDomain()); - - Element actorEl = pubsubEl.addElement(QName.get("actor", - Buddycloud.NS)); - - actorEl.setText(from.toBareJID()); - } - - outQueue.put(subscribe); - - // If auto-approve is set, and this is a local private channel - // then set the user to subscribed - if (configuration.getBooleanProperty( - Configuration.CONFIGURATION_CHANNELS_AUTOSUBSCRIBE_AUTOAPPROVE, - false) - && Configuration.getInstance().isLocalJID(channel) - && AccessModels.authorize.toString().equals( - channelManager.getNodeConfValue(channelNodeId, - Conf.ACCESS_MODEL))) { - channelManager - .addUserSubscription(new NodeSubscriptionImpl( - channelNodeId, from, - Subscriptions.subscribed, null)); - - channelManager.setUserAffiliation(channelNodeId, from, - channelManager - .getDefaultNodeAffiliation(channelNodeId)); - } - } catch (InterruptedException e) { - LOGGER.error("Could not auto-subscribe " + from + " to " - + channel, e); - } catch (NodeStoreException e) { - LOGGER.error("Could not auto-subscribe " + from + " to " - + channel, e); - } - } - } -} \ No newline at end of file + public static final String ELEMENT_NAME = "query"; + private static final Logger LOGGER = Logger.getLogger(RegisterSet.class); + + private final BlockingQueue outQueue; + private final ChannelManager channelManager; + private IQ request; + private IQ response; + private final Configuration configuration; + + public RegisterSet(BlockingQueue outQueue, ChannelManager channelManager) { + this(Configuration.getInstance(), outQueue, channelManager); + } + + public RegisterSet(Configuration configuration, BlockingQueue outQueue, ChannelManager channelManager) { + this.configuration = configuration; + this.outQueue = outQueue; + this.channelManager = channelManager; + } + + @Override + public void process(IQ reqIQ) throws Exception { + this.request = reqIQ; + this.response = IQ.createResultIQ(reqIQ); + + LOGGER.debug("Processing register request from " + request.getFrom()); + + String domain = reqIQ.getFrom().getDomain(); + if (!Configuration.getInstance().isLocalDomain(domain)) { + notThisDomain(reqIQ); + return; + } + + if (userRegistered()) { + LOGGER.debug("User " + request.getFrom().toBareJID() + " is already registered"); + outQueue.put(response); + return; + } + + LOGGER.debug("Registering new user " + request.getFrom()); + + channelManager.createPersonalChannel(request.getFrom()); + outQueue.put(response); + autosubscribeToChannels(request.getFrom()); + } + + private void notThisDomain(IQ reqIQ) throws InterruptedException { + // Request is coming from different domain than the + // component is using. We will not allow this because + // "buddycloud federation" cannot work for that. + IQ reply = IQ.createResultIQ(reqIQ); + reply.setType(Type.error); + reply.setChildElement(reqIQ.getChildElement().createCopy()); + PacketError pe = new PacketError( + org.xmpp.packet.PacketError.Condition.not_allowed, + org.xmpp.packet.PacketError.Type.cancel); + reply.setError(pe); + outQueue.put(reply); + } + + private boolean userRegistered() throws Exception { + return channelManager.nodeExists("/user/" + request.getFrom().toBareJID() + "/posts"); + } + + // TODO(lloydwatkin): We should really be returning an error as per spec shouldn't we? + // It should be up to the client to ignore the error, not the server. + @SuppressWarnings("unused") + private void userAlreadyRegistered() throws InterruptedException { + // User is already registered. + IQ reply = IQ.createResultIQ(request); + reply.setType(Type.error); + reply.setChildElement(request.getChildElement().createCopy()); + PacketError pe = new PacketError( + org.xmpp.packet.PacketError.Condition.conflict, + org.xmpp.packet.PacketError.Type.cancel); + reply.setError(pe); + outQueue.put(reply); + } + + private void autosubscribeToChannels(final JID from) { + Collection channels = configuration.getAutosubscribeChannels(); + + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Auto-subscribing " + from + " to " + channels.size() + + " channel(s)"); + } + + for (JID channel : channels) { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Auto-subscribing " + from + " to " + channel); + } + + IQ subscribe = new IQ(); + + subscribe.setType(Type.set); + + Element el = subscribe.getElement(); + Element pubsubEl = el.addElement("pubsub", + JabberPubsub.NAMESPACE_URI); + Element subscribeEl = pubsubEl.addElement("subscribe"); + + String channelNodeId = Conf.getPostChannelNodename(channel); + + subscribeEl.addAttribute("node", channelNodeId); + subscribeEl.addAttribute("jid", from.toBareJID().toString()); + + try { + if (Configuration.getInstance().isLocalJID(channel)) { + subscribe.setFrom(from); + subscribe.setTo(configuration.getServerChannelsDomain()); + } else { + subscribe.setFrom(configuration.getServerChannelsDomain()); + subscribe.setTo(channel.getDomain()); + + Element actorEl = pubsubEl.addElement(QName.get("actor", + Buddycloud.NS)); + + actorEl.setText(from.toBareJID()); + } + + outQueue.put(subscribe); + + // If auto-approve is set, and this is a local private channel + // then set the user to subscribed + if (configuration.getBooleanProperty( + Configuration.CONFIGURATION_CHANNELS_AUTOSUBSCRIBE_AUTOAPPROVE, + false) + && Configuration.getInstance().isLocalJID(channel) + && AccessModels.authorize.toString().equals( + channelManager.getNodeConfValue(channelNodeId, + Conf.ACCESS_MODEL))) { + channelManager + .addUserSubscription(new NodeSubscriptionImpl( + channelNodeId, from, + Subscriptions.subscribed, null)); + + channelManager.setUserAffiliation(channelNodeId, from, + channelManager + .getDefaultNodeAffiliation(channelNodeId)); + } + } catch (InterruptedException e) { + LOGGER.error("Could not auto-subscribe " + from + " to " + + channel, e); + } catch (NodeStoreException e) { + LOGGER.error("Could not auto-subscribe " + from + " to " + + channel, e); + } + } + } +} diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/UnregisterSet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/UnregisterSet.java index 42c4a29b..d001d1aa 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/UnregisterSet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/UnregisterSet.java @@ -34,287 +34,287 @@ import org.xmpp.resultsetmanagement.ResultSet; public class UnregisterSet implements PacketProcessor { - public static final String ELEMENT_NAME = "query"; - private static final Logger LOGGER = Logger.getLogger(UnregisterSet.class); + public static final String ELEMENT_NAME = "query"; + private static final Logger LOGGER = Logger.getLogger(UnregisterSet.class); - private final BlockingQueue outQueue; - private final ChannelManager channelManager; + private final BlockingQueue outQueue; + private final ChannelManager channelManager; - public UnregisterSet(BlockingQueue outQueue, ChannelManager channelManager) { - this.outQueue = outQueue; - this.channelManager = channelManager; - } + public UnregisterSet(BlockingQueue outQueue, ChannelManager channelManager) { + this.outQueue = outQueue; + this.channelManager = channelManager; + } - @Override - public void process(IQ request) throws Exception { - JID actorJID = null; - Element removeEl = request.getElement().element( - "query").element("remove"); + @Override + public void process(IQ request) throws Exception { + JID actorJID = null; + Element removeEl = request.getElement().element( + "query").element("remove"); Element actorEl = removeEl.element("actor"); boolean isRemote = actorEl != null; - + if (isRemote) { - actorJID = new JID(actorEl.getTextTrim()); - if (!checkDomain(request, actorJID)) { - return; - } + actorJID = new JID(actorEl.getTextTrim()); + if (!checkDomain(request, actorJID)) { + return; + } } else { - actorJID = new JID(request.getFrom().toBareJID()); + actorJID = new JID(request.getFrom().toBareJID()); } - - unregister(request, actorJID, isRemote); - } + + unregister(request, actorJID, isRemote); + } - private boolean checkDomain(IQ request, JID actorJID) throws InterruptedException { - if(!request.getFrom().getDomain().contains(actorJID.getDomain())) { + private boolean checkDomain(IQ request, JID actorJID) throws InterruptedException { + if (!request.getFrom().getDomain().contains(actorJID.getDomain())) { fail(request, org.xmpp.packet.PacketError.Condition.bad_request, org.xmpp.packet.PacketError.Type.cancel); return false; } - return true; - } + return true; + } - private void unregister(IQ request, JID actorJID, boolean isRemote) throws Exception { - LOGGER.debug("Processing unregister request from " + request.getFrom()); - - if (!validateSingleChildElement(request)) { - failBadRequest(request); - return; - } - if (!isRemote && !userRegistered(actorJID)) { - failRegistrationRequired(request); - return; - } - - Transaction t = null; - try { - t = channelManager.beginTransaction(); - - List notifications = new LinkedList(); - Set remoteDomains = getRemoteDomains(); - - ResultSet userMemberships = channelManager.getUserMemberships(actorJID); - for (NodeMembership userMembership : userMemberships) { - String nodeId = userMembership.getNodeId(); - if (isPersonal(nodeId) || isSingleOwner(nodeId, actorJID)) { - channelManager.deleteNode(nodeId); - if (Configuration.getInstance().isLocalNode(nodeId)) { - addDeleteNodeNotifications(nodeId, notifications); - } - } - if (!isRemote) { - addUnsubscribeFromNodeNotifications(actorJID, - userMembership.getNodeId(), notifications); - } - } - - ResultSet userItems = channelManager.getUserPublishedItems(actorJID); - for (NodeItem userItem : userItems) { - if (Configuration.getInstance().isLocalNode(userItem.getNodeId())) { - addDeleteItemNotifications(userItem.getNodeId(), userItem.getId(), notifications); - } - } - - channelManager.deleteUserItems(actorJID); - channelManager.deleteUserSubscriptions(actorJID); - channelManager.deleteUserAffiliations(actorJID); - - outQueue.put(IQ.createResultIQ(request)); - if (!isRemote) { - makeRemoteRequests(request, remoteDomains); - } - sendNotifications(notifications); - - t.commit(); - } finally { - if (t != null) { - t.close(); - } - } - } - - private void sendNotifications(List notifications) throws InterruptedException { - for (Packet notification : notifications) { - outQueue.put(notification); - } - } + private void unregister(IQ request, JID actorJID, boolean isRemote) throws Exception { + LOGGER.debug("Processing unregister request from " + request.getFrom()); + + if (!validateSingleChildElement(request)) { + failBadRequest(request); + return; + } + if (!isRemote && !userRegistered(actorJID)) { + failRegistrationRequired(request); + return; + } + + Transaction t = null; + try { + t = channelManager.beginTransaction(); + + List notifications = new LinkedList(); + Set remoteDomains = getRemoteDomains(); + + ResultSet userMemberships = channelManager.getUserMemberships(actorJID); + for (NodeMembership userMembership : userMemberships) { + String nodeId = userMembership.getNodeId(); + if (isPersonal(nodeId) || isSingleOwner(nodeId, actorJID)) { + channelManager.deleteNode(nodeId); + if (Configuration.getInstance().isLocalNode(nodeId)) { + addDeleteNodeNotifications(nodeId, notifications); + } + } + if (!isRemote) { + addUnsubscribeFromNodeNotifications(actorJID, + userMembership.getNodeId(), notifications); + } + } + + ResultSet userItems = channelManager.getUserPublishedItems(actorJID); + for (NodeItem userItem : userItems) { + if (Configuration.getInstance().isLocalNode(userItem.getNodeId())) { + addDeleteItemNotifications(userItem.getNodeId(), userItem.getId(), notifications); + } + } + + channelManager.deleteUserItems(actorJID); + channelManager.deleteUserSubscriptions(actorJID); + channelManager.deleteUserAffiliations(actorJID); + + outQueue.put(IQ.createResultIQ(request)); + if (!isRemote) { + makeRemoteRequests(request, remoteDomains); + } + sendNotifications(notifications); + + t.commit(); + } finally { + if (t != null) { + t.close(); + } + } + } + + private void sendNotifications(List notifications) throws InterruptedException { + for (Packet notification : notifications) { + outQueue.put(notification); + } + } - private void makeRemoteRequests(IQ request, Set remoteDomains) throws Exception { - for (String remoteDomain : remoteDomains) { - IQ remoteRequest = request.createCopy(); - remoteRequest.getElement().addAttribute("remote-server-discover", "false"); - remoteRequest.setTo(remoteDomain); - Element actor = remoteRequest.getElement() - .element("query").element("remove") - .addElement("actor", Buddycloud.NS); - actor.addText(request.getFrom().toBareJID()); - outQueue.put(remoteRequest); - } - } + private void makeRemoteRequests(IQ request, Set remoteDomains) throws Exception { + for (String remoteDomain : remoteDomains) { + IQ remoteRequest = request.createCopy(); + remoteRequest.getElement().addAttribute("remote-server-discover", "false"); + remoteRequest.setTo(remoteDomain); + Element actor = remoteRequest.getElement() + .element("query").element("remove") + .addElement("actor", Buddycloud.NS); + actor.addText(request.getFrom().toBareJID()); + outQueue.put(remoteRequest); + } + } - private Set getRemoteDomains() throws NodeStoreException { - ArrayList nodeList = channelManager.getNodeList(); - Set remoteDomains = new HashSet(); - for (String node : nodeList) { - try { - if (!Configuration.getInstance().isLocalNode(node)) { - remoteDomains.add(new JID(node.split("/")[2]).getDomain()); - } - } catch (IllegalArgumentException e) { - // Ignore bad formatted nodes - } - } - return remoteDomains; - } + private Set getRemoteDomains() throws NodeStoreException { + ArrayList nodeList = channelManager.getNodeList(); + Set remoteDomains = new HashSet(); + for (String node : nodeList) { + try { + if (!Configuration.getInstance().isLocalNode(node)) { + remoteDomains.add(new JID(node.split("/")[2]).getDomain()); + } + } catch (IllegalArgumentException e) { + // Ignore bad formatted nodes + } + } + return remoteDomains; + } - private void addUnsubscribeFromNodeNotifications(JID userJid, - String node, List notifications) throws NodeStoreException { + private void addUnsubscribeFromNodeNotifications(JID userJid, + String node, List notifications) throws NodeStoreException { - ResultSet subscribers = channelManager - .getNodeSubscriptionListeners(node); + ResultSet subscribers = channelManager + .getNodeSubscriptionListeners(node); - Message messagePacket = createUnsubscribeNotification(userJid, node); - if (subscribers != null) { - for (NodeSubscription subscriber : subscribers) { - Message notification = messagePacket.createCopy(); - notification.setTo(subscriber.getListener()); - notifications.add(notification); - } - } - - Collection adminUsers = Configuration.getInstance() - .getAdminUsers(); - for (JID admin : adminUsers) { - Message notification = messagePacket.createCopy(); - notification.setTo(admin); - notifications.add(notification); - } - } + Message messagePacket = createUnsubscribeNotification(userJid, node); + if (subscribers != null) { + for (NodeSubscription subscriber : subscribers) { + Message notification = messagePacket.createCopy(); + notification.setTo(subscriber.getListener()); + notifications.add(notification); + } + } + + Collection adminUsers = Configuration.getInstance() + .getAdminUsers(); + for (JID admin : adminUsers) { + Message notification = messagePacket.createCopy(); + notification.setTo(admin); + notifications.add(notification); + } + } - private Message createUnsubscribeNotification(JID userJid, String node) { - Message messagePacket = new Message(); - Element messageEl = messagePacket.getElement(); - messageEl.addAttribute("remote-server-discover", "false"); - Element event = messageEl.addElement("event", Event.NAMESPACE); - Element subscription = event.addElement("subscription"); - messageEl.addAttribute("type", "headline"); - subscription.addAttribute("subscription", "none"); - subscription.addAttribute("jid", userJid.toBareJID()); - subscription.addAttribute("node", node); - return messagePacket; - } + private Message createUnsubscribeNotification(JID userJid, String node) { + Message messagePacket = new Message(); + Element messageEl = messagePacket.getElement(); + messageEl.addAttribute("remote-server-discover", "false"); + Element event = messageEl.addElement("event", Event.NAMESPACE); + Element subscription = event.addElement("subscription"); + messageEl.addAttribute("type", "headline"); + subscription.addAttribute("subscription", "none"); + subscription.addAttribute("jid", userJid.toBareJID()); + subscription.addAttribute("node", node); + return messagePacket; + } - private void addDeleteItemNotifications(String node, String itemId, - List notifications) throws NodeStoreException { - ResultSet subscriptions = channelManager - .getNodeSubscriptionListeners(node); - Message notification = createItemDeleteNotificationMessage(node, itemId); - if (subscriptions != null) { - for (NodeSubscription subscription : subscriptions) { - if (subscription.getSubscription().equals(Subscriptions.subscribed)) { - notification.setTo(subscription.getListener().toString()); - notifications.add(notification); - } - } - } - - Collection adminUsers = Configuration.getInstance() - .getAdminUsers(); - for (JID admin : adminUsers) { - notification.setTo(admin); - notifications.add(notification); - } - } - - private Message createItemDeleteNotificationMessage(String node, String itemId) { - Message notification = new Message(); - notification.setType(Message.Type.headline); - notification.getElement().addAttribute("remote-server-discover", "false"); - Element event = notification.addChildElement("event", - JabberPubsub.NS_PUBSUB_EVENT); - Element items = event.addElement("items"); - items.addAttribute("node", node); - Element retract = items.addElement("retract"); - retract.addAttribute("id", itemId); - return notification; - } + private void addDeleteItemNotifications(String node, String itemId, + List notifications) throws NodeStoreException { + ResultSet subscriptions = channelManager + .getNodeSubscriptionListeners(node); + Message notification = createItemDeleteNotificationMessage(node, itemId); + if (subscriptions != null) { + for (NodeSubscription subscription : subscriptions) { + if (subscription.getSubscription().equals(Subscriptions.subscribed)) { + notification.setTo(subscription.getListener().toString()); + notifications.add(notification); + } + } + } + + Collection adminUsers = Configuration.getInstance() + .getAdminUsers(); + for (JID admin : adminUsers) { + notification.setTo(admin); + notifications.add(notification); + } + } + + private Message createItemDeleteNotificationMessage(String node, String itemId) { + Message notification = new Message(); + notification.setType(Message.Type.headline); + notification.getElement().addAttribute("remote-server-discover", "false"); + Element event = notification.addChildElement("event", + JabberPubsub.NS_PUBSUB_EVENT); + Element items = event.addElement("items"); + items.addAttribute("node", node); + Element retract = items.addElement("retract"); + retract.addAttribute("id", itemId); + return notification; + } - private void addDeleteNodeNotifications(String node, List notifications) throws Exception { - ResultSet subscriptions = channelManager - .getNodeSubscriptionListeners(node); - Message notification = createNodeDeletedNotificationMessage(node); - if (subscriptions != null) { - for (NodeSubscription subscription : subscriptions) { - notification.setTo(subscription.getListener().toString()); - notifications.add(notification.createCopy()); - } - } - Collection adminUsers = Configuration.getInstance() - .getAdminUsers(); - for (JID admin : adminUsers) { - notification.setTo(admin); - notifications.add(notification.createCopy()); - } - } + private void addDeleteNodeNotifications(String node, List notifications) throws Exception { + ResultSet subscriptions = channelManager + .getNodeSubscriptionListeners(node); + Message notification = createNodeDeletedNotificationMessage(node); + if (subscriptions != null) { + for (NodeSubscription subscription : subscriptions) { + notification.setTo(subscription.getListener().toString()); + notifications.add(notification.createCopy()); + } + } + Collection adminUsers = Configuration.getInstance() + .getAdminUsers(); + for (JID admin : adminUsers) { + notification.setTo(admin); + notifications.add(notification.createCopy()); + } + } - private Message createNodeDeletedNotificationMessage(String node) { - 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 boolean isSingleOwner(String nodeId, JID userJid) throws NodeStoreException { - ResultSet nodeMemberships = channelManager.getNodeMemberships(nodeId); - int ownerCount = 0; - boolean isOwner = false; - for (NodeMembership nodeMembership : nodeMemberships) { - if (nodeMembership.getAffiliation().equals(Affiliations.owner)) { - ownerCount++; - if (nodeMembership.getUser().equals(userJid)) { - isOwner = true; - } - } - } - return isOwner && ownerCount == 1; - } + private Message createNodeDeletedNotificationMessage(String node) { + 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 boolean isSingleOwner(String nodeId, JID userJid) throws NodeStoreException { + ResultSet nodeMemberships = channelManager.getNodeMemberships(nodeId); + int ownerCount = 0; + boolean isOwner = false; + for (NodeMembership nodeMembership : nodeMemberships) { + if (nodeMembership.getAffiliation().equals(Affiliations.owner)) { + ownerCount++; + if (nodeMembership.getUser().equals(userJid)) { + isOwner = true; + } + } + } + return isOwner && ownerCount == 1; + } - private boolean isPersonal(String nodeId) throws NodeStoreException { - String channelType = channelManager.getNodeConfValue(nodeId, Conf.CHANNEL_TYPE); - return channelType != null && channelType.equals("personal"); - } + private boolean isPersonal(String nodeId) throws NodeStoreException { + String channelType = channelManager.getNodeConfValue(nodeId, Conf.CHANNEL_TYPE); + return channelType != null && channelType.equals("personal"); + } - private boolean validateSingleChildElement(IQ request) { - return request.getElement().element("query").elements().size() == 1; - } - - private void failBadRequest(IQ request) throws InterruptedException { - fail(request, - org.xmpp.packet.PacketError.Condition.bad_request, - org.xmpp.packet.PacketError.Type.modify); - } + private boolean validateSingleChildElement(IQ request) { + return request.getElement().element("query").elements().size() == 1; + } + + private void failBadRequest(IQ request) throws InterruptedException { + fail(request, + org.xmpp.packet.PacketError.Condition.bad_request, + org.xmpp.packet.PacketError.Type.modify); + } - private void failRegistrationRequired(IQ request) throws InterruptedException { - fail(request, - org.xmpp.packet.PacketError.Condition.registration_required, - org.xmpp.packet.PacketError.Type.auth); - } - - private void fail(IQ request, Condition condition, org.xmpp.packet.PacketError.Type type) throws InterruptedException { - IQ reply = IQ.createResultIQ(request); - reply.setType(Type.error); - PacketError pe = new PacketError(condition, type); - reply.setError(pe); - outQueue.put(reply); - } + private void failRegistrationRequired(IQ request) throws InterruptedException { + fail(request, + org.xmpp.packet.PacketError.Condition.registration_required, + org.xmpp.packet.PacketError.Type.auth); + } + + private void fail(IQ request, Condition condition, org.xmpp.packet.PacketError.Type type) throws InterruptedException { + IQ reply = IQ.createResultIQ(request); + reply.setType(Type.error); + PacketError pe = new PacketError(condition, type); + reply.setError(pe); + outQueue.put(reply); + } - private boolean userRegistered(JID actorJID) throws Exception { - return channelManager.nodeExists("/user/" + actorJID.toBareJID() + "/posts"); - } + private boolean userRegistered(JID actorJID) throws Exception { + return channelManager.nodeExists("/user/" + actorJID.toBareJID() + "/posts"); + } -} \ No newline at end of file +} diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/Search.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/Search.java index 29653fa2..39fef48b 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/Search.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/Search.java @@ -11,44 +11,44 @@ import org.xmpp.packet.PacketError; public class Search implements PacketProcessor { - - public static final String ELEMENT_NAME = "query"; - private static final Logger logger = Logger.getLogger(Search.class); - - public static final String NAMESPACE_URI = "jabber:iq:search"; + + public static final String ELEMENT_NAME = "query"; + private static final Logger logger = Logger.getLogger(Search.class); + + public static final String NAMESPACE_URI = "jabber:iq:search"; - private final BlockingQueue outQueue; - private IQ request; + private final BlockingQueue outQueue; + private IQ request; - private SearchGet searchGet; - private SearchSet searchSet; + private SearchGet searchGet; + private SearchSet searchSet; - public Search(BlockingQueue outQueue, - ChannelManager channelManager) { - this.outQueue = outQueue; - this.searchGet = new SearchGet(outQueue); - this.searchSet = new SearchSet(outQueue, channelManager); - } + public Search(BlockingQueue outQueue, + ChannelManager channelManager) { + this.outQueue = outQueue; + this.searchGet = new SearchGet(outQueue); + this.searchSet = new SearchSet(outQueue, channelManager); + } - @Override - public void process(IQ reqIQ) throws Exception { - request = reqIQ; - if (request.getType().equals(Type.get)) { - logger.trace("Using search processor: SearchGet"); - this.searchGet.process(request); - return; - } else if (request.getType().equals(Type.set)) { - logger.trace("Using search processor: SearchSet"); - this.searchSet.process(request); - return; - } - IQ response = IQ.createResultIQ(request); - response.setType(IQ.Type.error); - PacketError error = new PacketError( - PacketError.Condition.bad_request, - PacketError.Type.modify - ); - response.setError(error); - outQueue.put(response); - } -} \ No newline at end of file + @Override + public void process(IQ reqIQ) throws Exception { + request = reqIQ; + if (request.getType().equals(Type.get)) { + logger.trace("Using search processor: SearchGet"); + this.searchGet.process(request); + return; + } else if (request.getType().equals(Type.set)) { + logger.trace("Using search processor: SearchSet"); + this.searchSet.process(request); + return; + } + IQ response = IQ.createResultIQ(request); + response.setType(IQ.Type.error); + PacketError error = new PacketError( + PacketError.Condition.bad_request, + PacketError.Type.modify + ); + response.setError(error); + outQueue.put(response); + } +} diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchGet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchGet.java index b55e563a..052f69f1 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchGet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchGet.java @@ -12,79 +12,79 @@ public class SearchGet implements PacketProcessor { - public static final String INSTRUCTIONS = "Search for content/hashtags/mentions"; + public static final String INSTRUCTIONS = "Search for content/hashtags/mentions"; - public static final String TITLE = "Please populate one or more of the following fields"; - public static final String CONTENT_FIELD_LABEL = "Content search"; - public static final String AUTHOR_FIELD_LABEL = "Author"; - public static final String RPP_FIELD_LABEL = "Results per page"; - public static final String PAGE_FIELD_LABEL = "Page"; - - private BlockingQueue outQueue; - private IQ response; + public static final String TITLE = "Please populate one or more of the following fields"; + public static final String CONTENT_FIELD_LABEL = "Content search"; + public static final String AUTHOR_FIELD_LABEL = "Author"; + public static final String RPP_FIELD_LABEL = "Results per page"; + public static final String PAGE_FIELD_LABEL = "Page"; + + private BlockingQueue outQueue; + private IQ response; - private Element x; + private Element x; - public SearchGet(BlockingQueue outQueue) { - this.outQueue = outQueue; - } + public SearchGet(BlockingQueue outQueue) { + this.outQueue = outQueue; + } - @Override - public void process(IQ request) throws Exception { - response = IQ.createResultIQ(request); + @Override + public void process(IQ request) throws Exception { + response = IQ.createResultIQ(request); - if (false == Configuration.getInstance().isLocalJID(request.getFrom())) { - sendErrorResponse(PacketError.Type.cancel, - PacketError.Condition.not_allowed); - return; - } - - Element query = response.getElement().addElement("query"); - query.addAttribute("xmlns", Search.NAMESPACE_URI); - query.addElement("instructions").addText(INSTRUCTIONS); - x = query.addElement("x"); - addFields(); - outQueue.put(response); - } + if (false == Configuration.getInstance().isLocalJID(request.getFrom())) { + sendErrorResponse(PacketError.Type.cancel, + PacketError.Condition.not_allowed); + return; + } + + Element query = response.getElement().addElement("query"); + query.addAttribute("xmlns", Search.NAMESPACE_URI); + query.addElement("instructions").addText(INSTRUCTIONS); + x = query.addElement("x"); + addFields(); + outQueue.put(response); + } - private void addFields() { - x.addAttribute("xmlns", DataForm.NAMESPACE); - x.addElement("title").addText(TITLE); - x.addElement("instructions").addText(INSTRUCTIONS); - - Element formType = x.addElement("field"); - formType.addAttribute("type", "hidden"); - formType.addAttribute("var", "FORM_TYPE"); - formType.addElement("value").addText(Search.NAMESPACE_URI); - - Element content = x.addElement("field"); - content.addAttribute("type", "text-multi"); - content.addAttribute("var", "content"); - content.addAttribute("label", CONTENT_FIELD_LABEL); - - Element author = x.addElement("field"); - author.addAttribute("type", "jid-single"); - author.addAttribute("var", "author"); - author.addAttribute("label", AUTHOR_FIELD_LABEL); - - Element rpp = x.addElement("field"); - rpp.addAttribute("type", "fixed"); - rpp.addAttribute("var", "rpp"); - rpp.addAttribute("label", RPP_FIELD_LABEL); - - Element page = x.addElement("field"); - page.addAttribute("type", "fixed"); - page.addAttribute("var", "page"); - page.addAttribute("label", PAGE_FIELD_LABEL); - } + private void addFields() { + x.addAttribute("xmlns", DataForm.NAMESPACE); + x.addElement("title").addText(TITLE); + x.addElement("instructions").addText(INSTRUCTIONS); + + Element formType = x.addElement("field"); + formType.addAttribute("type", "hidden"); + formType.addAttribute("var", "FORM_TYPE"); + formType.addElement("value").addText(Search.NAMESPACE_URI); + + Element content = x.addElement("field"); + content.addAttribute("type", "text-multi"); + content.addAttribute("var", "content"); + content.addAttribute("label", CONTENT_FIELD_LABEL); + + Element author = x.addElement("field"); + author.addAttribute("type", "jid-single"); + author.addAttribute("var", "author"); + author.addAttribute("label", AUTHOR_FIELD_LABEL); + + Element rpp = x.addElement("field"); + rpp.addAttribute("type", "fixed"); + rpp.addAttribute("var", "rpp"); + rpp.addAttribute("label", RPP_FIELD_LABEL); + + Element page = x.addElement("field"); + page.addAttribute("type", "fixed"); + page.addAttribute("var", "page"); + page.addAttribute("label", PAGE_FIELD_LABEL); + } - private void sendErrorResponse(PacketError.Type type, - PacketError.Condition condition) throws InterruptedException { - response.setType(IQ.Type.error); - PacketError error = new PacketError(PacketError.Condition.not_allowed, - PacketError.Type.cancel); - response.setError(error); - outQueue.put(response); - } + private void sendErrorResponse(PacketError.Type type, + PacketError.Condition condition) throws InterruptedException { + response.setType(IQ.Type.error); + PacketError error = new PacketError(PacketError.Condition.not_allowed, + PacketError.Type.cancel); + response.setError(error); + outQueue.put(response); + } } diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchSet.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchSet.java index 7ae19e8e..16474a2e 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchSet.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchSet.java @@ -24,271 +24,271 @@ public class SearchSet implements PacketProcessor { - private ChannelManager channelManager; - private BlockingQueue outQueue; - private IQ responseIq; - private Element x; - private IQ requestIq; - private ArrayList content = new ArrayList(); - private int page = 1; - private int rpp = 25; - private JID author; - private JID searcher; - - public static Logger logger = Logger.getLogger(SearchSet.class); - - public SearchSet(BlockingQueue outQueue, - ChannelManager channelManager) { - this.channelManager = channelManager; - this.outQueue = outQueue; - } - - @Override - public void process(IQ request) throws Exception { - searcher = request.getFrom(); - responseIq = IQ.createResultIQ(request); - this.requestIq = request; - - if (false == isValidRequest()) { - return; - } - - if (false == processForm()) { - return; - } - - try { - runSearch(); - } catch (NodeStoreException e) { - sendErrorResponse(PacketError.Type.wait, - PacketError.Condition.internal_server_error); - return; - } - - outQueue.put(responseIq); - } - - private boolean isValidRequest() throws Exception { - - if (false == Configuration.getInstance().isLocalJID(searcher)) { - sendErrorResponse(PacketError.Type.cancel, - PacketError.Condition.not_allowed); - return false; - } - - if (false == hasDataForm() || false == dataFormCorrect()) { - return false; - } - - return true; - } - - private boolean hasDataForm() throws Exception { - x = requestIq.getElement().element("query").element("x"); - - if (null == x || !DataForm.NAMESPACE.equals(x.getNamespaceURI()) - || !"submit".equals(x.attributeValue("type"))) { - sendErrorResponse(PacketError.Type.modify, - PacketError.Condition.bad_request); - return false; - } - - return true; - } - - private boolean dataFormCorrect() throws Exception { - if (!hasCorrectFormElement() || !hasEnoughFormFields()) { - sendErrorResponse(PacketError.Type.modify, - PacketError.Condition.bad_request); - return false; - } - - return true; - } - - private boolean hasCorrectFormElement() throws Exception { - - List elements = x.elements("field"); - - if (elements.size() > 0) { - for (Element field : elements) { - if (!"FORM_TYPE".equals(field.attributeValue("var"))) { - continue; - } - - String value = field.elementText("value"); - - if (null == value || !Search.NAMESPACE_URI.equals(value)) { - return false; - } - - return true; - } - } - - return false; - } - - private boolean hasEnoughFormFields() throws Exception { - List elements = x.elements("field"); - if (elements.size() < 2) { - return false; - } - - boolean hasContentOrAuthor = false; - - String var; - for (Element field : elements) { - var = field.attributeValue("var"); - if ("content".equals(var) || "author".equals(var)) { - hasContentOrAuthor = true; - } - } - - return hasContentOrAuthor; - } - - private boolean processForm() throws Exception { - try { - extractFieldValues(); - } catch (NumberFormatException e) { - return false; - } - - if (false == checkFieldValues()) { - return false; - } - - return true; - } - - private void runSearch() throws NodeStoreException { - CloseableIterator results = channelManager.performSearch( - searcher, content, author, page, rpp); - - Element query = responseIq.getElement().addElement("query"); - query.addAttribute("xmlns", Search.NAMESPACE_URI); - - Element x = new DefaultElement("x"); - int resultCounter = 0; - NodeItem nodeItem; - Element entry; - - SAXReader xmlReader = new SAXReader(); - while (results.hasNext()) { - if (0 == resultCounter) { - addFormField(x); - addReportedFields(x); - } - - nodeItem = results.next(); - - try { - entry = xmlReader.read(new StringReader(nodeItem.getPayload())) - .getRootElement(); - - Element item = x.addElement("item"); - - item.addElement("field").addAttribute("var", "node") - .addElement("value").setText(nodeItem.getNodeId()); - - item.addElement("field").addAttribute("var", "id") - .addElement("value").setText(nodeItem.getId()); - - item.addElement("field").addAttribute("var", "entry") - .addElement("value").add(entry); - } catch (DocumentException e) { - logger.error("Error parsing a node entry, ignoring. " - + nodeItem); - } - - resultCounter++; - } - - if (resultCounter > 0) { - query.add(x); - } - - } - - private void addFormField(Element x) { - x.addElement("field").addAttribute("type", "hidden") - .addAttribute("var", "FORM_TYPE").addElement("value") - .setText(Search.NAMESPACE_URI); - } - - private void addReportedFields(Element x) { - Element reported = x.addElement("reported"); - - reported.addElement("field").addAttribute("var", "node") - .addAttribute("label", "Node") - .addAttribute("type", "text-single"); - - reported.addElement("field").addAttribute("var", "id") - .addAttribute("label", "Item ID") - .addAttribute("type", "text-single"); - - reported.addElement("field").addAttribute("var", "entry") - .addAttribute("label", "Item").addAttribute("type", "xml"); - } - - private void extractFieldValues() { - List elements = x.elements("field"); - String var; - for (Element field : elements) { - var = field.attributeValue("var"); - if ("content".equals(var)) { - content = getValuesAsList(field); - } else if ("author".equals(var)) { - String authorStr = field.elementText("value"); - if (authorStr.length() > 0) { - author = new JID(authorStr); - } - } else if ("page".equals(var)) { - page = getValueAsNumber(field); - } else if ("rpp".equals(var)) { - rpp = getValueAsNumber(field); - } - } - } - - private boolean checkFieldValues() throws Exception { - if (((null != content && content.size() > 0) || (null != author && author - .toBareJID().length() > 0)) && (page > 0 && rpp > 0)) { - return true; - } - - sendErrorResponse(PacketError.Type.modify, - PacketError.Condition.bad_request); - return false; - - } - - private ArrayList getValuesAsList(Element field) { - ArrayList rtn = new ArrayList(); - String valueText; - for (Element value : (List) field.elements("value")) { - valueText = value.getText(); - if (valueText.length() == 0) { - continue; - } - rtn.add(valueText); - } - return rtn; - } - - private Integer getValueAsNumber(Element field) - throws NumberFormatException { - String valueStr = field.elementText("value"); - return Integer.parseInt(valueStr); - } - - private void sendErrorResponse(PacketError.Type type, - PacketError.Condition condition) throws InterruptedException { - responseIq.setType(IQ.Type.error); - PacketError error = new PacketError(condition, type); - responseIq.setError(error); - - outQueue.put(responseIq); - } + private ChannelManager channelManager; + private BlockingQueue outQueue; + private IQ responseIq; + private Element x; + private IQ requestIq; + private ArrayList content = new ArrayList(); + private int page = 1; + private int rpp = 25; + private JID author; + private JID searcher; + + public static Logger logger = Logger.getLogger(SearchSet.class); + + public SearchSet(BlockingQueue outQueue, + ChannelManager channelManager) { + this.channelManager = channelManager; + this.outQueue = outQueue; + } + + @Override + public void process(IQ request) throws Exception { + searcher = request.getFrom(); + responseIq = IQ.createResultIQ(request); + this.requestIq = request; + + if (false == isValidRequest()) { + return; + } + + if (false == processForm()) { + return; + } + + try { + runSearch(); + } catch (NodeStoreException e) { + sendErrorResponse(PacketError.Type.wait, + PacketError.Condition.internal_server_error); + return; + } + + outQueue.put(responseIq); + } + + private boolean isValidRequest() throws Exception { + + if (false == Configuration.getInstance().isLocalJID(searcher)) { + sendErrorResponse(PacketError.Type.cancel, + PacketError.Condition.not_allowed); + return false; + } + + if (false == hasDataForm() || false == dataFormCorrect()) { + return false; + } + + return true; + } + + private boolean hasDataForm() throws Exception { + x = requestIq.getElement().element("query").element("x"); + + if (null == x || !DataForm.NAMESPACE.equals(x.getNamespaceURI()) + || !"submit".equals(x.attributeValue("type"))) { + sendErrorResponse(PacketError.Type.modify, + PacketError.Condition.bad_request); + return false; + } + + return true; + } + + private boolean dataFormCorrect() throws Exception { + if (!hasCorrectFormElement() || !hasEnoughFormFields()) { + sendErrorResponse(PacketError.Type.modify, + PacketError.Condition.bad_request); + return false; + } + + return true; + } + + private boolean hasCorrectFormElement() throws Exception { + + List elements = x.elements("field"); + + if (elements.size() > 0) { + for (Element field : elements) { + if (!"FORM_TYPE".equals(field.attributeValue("var"))) { + continue; + } + + String value = field.elementText("value"); + + if (null == value || !Search.NAMESPACE_URI.equals(value)) { + return false; + } + + return true; + } + } + + return false; + } + + private boolean hasEnoughFormFields() throws Exception { + List elements = x.elements("field"); + if (elements.size() < 2) { + return false; + } + + boolean hasContentOrAuthor = false; + + String var; + for (Element field : elements) { + var = field.attributeValue("var"); + if ("content".equals(var) || "author".equals(var)) { + hasContentOrAuthor = true; + } + } + + return hasContentOrAuthor; + } + + private boolean processForm() throws Exception { + try { + extractFieldValues(); + } catch (NumberFormatException e) { + return false; + } + + if (false == checkFieldValues()) { + return false; + } + + return true; + } + + private void runSearch() throws NodeStoreException { + CloseableIterator results = channelManager.performSearch( + searcher, content, author, page, rpp); + + Element query = responseIq.getElement().addElement("query"); + query.addAttribute("xmlns", Search.NAMESPACE_URI); + + Element x = new DefaultElement("x"); + int resultCounter = 0; + NodeItem nodeItem; + Element entry; + + SAXReader xmlReader = new SAXReader(); + while (results.hasNext()) { + if (0 == resultCounter) { + addFormField(x); + addReportedFields(x); + } + + nodeItem = results.next(); + + try { + entry = xmlReader.read(new StringReader(nodeItem.getPayload())) + .getRootElement(); + + Element item = x.addElement("item"); + + item.addElement("field").addAttribute("var", "node") + .addElement("value").setText(nodeItem.getNodeId()); + + item.addElement("field").addAttribute("var", "id") + .addElement("value").setText(nodeItem.getId()); + + item.addElement("field").addAttribute("var", "entry") + .addElement("value").add(entry); + } catch (DocumentException e) { + logger.error("Error parsing a node entry, ignoring. " + + nodeItem); + } + + resultCounter++; + } + + if (resultCounter > 0) { + query.add(x); + } + + } + + private void addFormField(Element x) { + x.addElement("field").addAttribute("type", "hidden") + .addAttribute("var", "FORM_TYPE").addElement("value") + .setText(Search.NAMESPACE_URI); + } + + private void addReportedFields(Element x) { + Element reported = x.addElement("reported"); + + reported.addElement("field").addAttribute("var", "node") + .addAttribute("label", "Node") + .addAttribute("type", "text-single"); + + reported.addElement("field").addAttribute("var", "id") + .addAttribute("label", "Item ID") + .addAttribute("type", "text-single"); + + reported.addElement("field").addAttribute("var", "entry") + .addAttribute("label", "Item").addAttribute("type", "xml"); + } + + private void extractFieldValues() { + List elements = x.elements("field"); + String var; + for (Element field : elements) { + var = field.attributeValue("var"); + if ("content".equals(var)) { + content = getValuesAsList(field); + } else if ("author".equals(var)) { + String authorStr = field.elementText("value"); + if (authorStr.length() > 0) { + author = new JID(authorStr); + } + } else if ("page".equals(var)) { + page = getValueAsNumber(field); + } else if ("rpp".equals(var)) { + rpp = getValueAsNumber(field); + } + } + } + + private boolean checkFieldValues() throws Exception { + if (((null != content && content.size() > 0) || (null != author && author + .toBareJID().length() > 0)) && (page > 0 && rpp > 0)) { + return true; + } + + sendErrorResponse(PacketError.Type.modify, + PacketError.Condition.bad_request); + return false; + + } + + private ArrayList getValuesAsList(Element field) { + ArrayList rtn = new ArrayList(); + String valueText; + for (Element value : (List) field.elements("value")) { + valueText = value.getText(); + if (valueText.length() == 0) { + continue; + } + rtn.add(valueText); + } + return rtn; + } + + private Integer getValueAsNumber(Element field) + throws NumberFormatException { + String valueStr = field.elementText("value"); + return Integer.parseInt(valueStr); + } + + private void sendErrorResponse(PacketError.Type type, + PacketError.Condition condition) throws InterruptedException { + responseIq.setType(IQ.Type.error); + PacketError error = new PacketError(condition, type); + responseIq.setError(error); + + outQueue.put(responseIq); + } } diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/AbstractMessageProcessor.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/AbstractMessageProcessor.java index be5c4eee..bba65a07 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/AbstractMessageProcessor.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/AbstractMessageProcessor.java @@ -17,72 +17,72 @@ public abstract class AbstractMessageProcessor implements PacketProcessor { - protected Message message; - protected String node; - protected ChannelManager channelManager; - protected Properties configuration; - protected BlockingQueue outQueue; - - public AbstractMessageProcessor(ChannelManager channelManager, Properties configuration, BlockingQueue outQueue) { - this.channelManager = channelManager; - setConfiguration(configuration); - this.outQueue = outQueue; - } - - public void setConfiguration(Properties configuration) { - this.configuration = configuration; - } - - abstract public void process(Message packet) throws Exception; - - void sendLocalNotifications(NotificationScheme scheme) throws Exception { - sendLocalNotifications(scheme, null); - } - - void sendLocalNotifications(NotificationScheme scheme, JID user) throws Exception { - ResultSet members = channelManager - .getNodeMemberships(node); - message.setFrom(new JID(configuration - .getProperty(Configuration.CONFIGURATION_SERVER_CHANNELS_DOMAIN))); - - for (NodeMembership member : members) { - if (false == Configuration.getInstance().isLocalJID(member.getUser())) { - continue; - } - if (scheme.equals(NotificationScheme.validSubscribers) && !userIsValidSubscriber(member)) { - continue; - } - if (scheme.equals(NotificationScheme.ownerOrModerator) && !userIsOwnerOrModerator(member)) { - continue; - } + protected Message message; + protected String node; + protected ChannelManager channelManager; + protected Properties configuration; + protected BlockingQueue outQueue; + + public AbstractMessageProcessor(ChannelManager channelManager, Properties configuration, BlockingQueue outQueue) { + this.channelManager = channelManager; + setConfiguration(configuration); + this.outQueue = outQueue; + } + + public void setConfiguration(Properties configuration) { + this.configuration = configuration; + } + + public abstract void process(Message packet) throws Exception; + + void sendLocalNotifications(NotificationScheme scheme) throws Exception { + sendLocalNotifications(scheme, null); + } + + void sendLocalNotifications(NotificationScheme scheme, JID user) throws Exception { + ResultSet members = channelManager + .getNodeMemberships(node); + message.setFrom(new JID(configuration + .getProperty(Configuration.CONFIGURATION_SERVER_CHANNELS_DOMAIN))); + + for (NodeMembership member : members) { + if (false == Configuration.getInstance().isLocalJID(member.getUser())) { + continue; + } + if (scheme.equals(NotificationScheme.validSubscribers) && !userIsValidSubscriber(member)) { + continue; + } + if (scheme.equals(NotificationScheme.ownerOrModerator) && !userIsOwnerOrModerator(member)) { + continue; + } - message.setTo(member.getUser()); - outQueue.put(message.createCopy()); - } - - if (null != user) { - message.setTo(user.toBareJID()); - outQueue.put(message.createCopy()); - } - } + message.setTo(member.getUser()); + outQueue.put(message.createCopy()); + } + + if (null != user) { + message.setTo(user.toBareJID()); + outQueue.put(message.createCopy()); + } + } - private boolean userIsOwnerOrModerator(NodeMembership member) { - if (false == Subscriptions.subscribed.equals(member.getSubscription())) { - return false; - } - if (false == member.getAffiliation().canAuthorize()) { - return false; - } - return true; - } + private boolean userIsOwnerOrModerator(NodeMembership member) { + if (false == Subscriptions.subscribed.equals(member.getSubscription())) { + return false; + } + if (false == member.getAffiliation().canAuthorize()) { + return false; + } + return true; + } - private boolean userIsValidSubscriber(NodeMembership member) { - if (false == Subscriptions.subscribed.equals(member.getSubscription())) { - return false; - } - if (Affiliations.outcast.equals(member.getAffiliation())) { - return false; - } - return true; - } -} \ No newline at end of file + private boolean userIsValidSubscriber(NodeMembership member) { + if (false == Subscriptions.subscribed.equals(member.getSubscription())) { + return false; + } + if (Affiliations.outcast.equals(member.getAffiliation())) { + return false; + } + return true; + } +} diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/AffiliationProcessor.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/AffiliationProcessor.java index 2c83ae52..09e697f8 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/AffiliationProcessor.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/AffiliationProcessor.java @@ -15,57 +15,58 @@ public class AffiliationProcessor extends AbstractMessageProcessor { - private JID jid; - private Affiliations affiliation; + private JID jid; + private Affiliations affiliation; - public AffiliationProcessor(BlockingQueue outQueue, - Properties configuration, ChannelManager channelManager) { - super(channelManager, configuration, outQueue); - } + public AffiliationProcessor(BlockingQueue outQueue, + Properties configuration, ChannelManager channelManager) { + super(channelManager, configuration, outQueue); + } - @Override - public void process(Message packet) throws Exception { - message = packet; + @Override + public void process(Message packet) throws Exception { + message = packet; - handleAffiliationElement(); + handleAffiliationElement(); - if (true == Configuration.getInstance().isLocalNode(node)) { - return; - } - if (null == affiliation) { - return; - } - if (affiliation.equals(Affiliations.outcast)) { - sendLocalNotifications(NotificationScheme.ownerOrModerator, jid); - } else { - sendLocalNotifications(NotificationScheme.validSubscribers); - } - } + if (true == Configuration.getInstance().isLocalNode(node)) { + return; + } + if (null == affiliation) { + return; + } + if (affiliation.equals(Affiliations.outcast)) { + sendLocalNotifications(NotificationScheme.ownerOrModerator, jid); + } else { + sendLocalNotifications(NotificationScheme.validSubscribers); + } + } - private void handleAffiliationElement() throws NodeStoreException { - Element affiliationsElement = message.getElement().element("event") - .element("affiliations"); - Element affiliationElement = affiliationsElement.element("affiliation"); - node = affiliationsElement.attributeValue("node"); - if (null == affiliationElement) { - return; - } - jid = new JID(affiliationElement.attributeValue("jid")); - affiliation = Affiliations.valueOf(affiliationElement - .attributeValue("affiliation")); - if (true == Configuration.getInstance().isLocalNode(node)) { - return; - } - storeNewAffiliation(); - } + private void handleAffiliationElement() throws NodeStoreException { + Element affiliationsElement = message.getElement().element("event") + .element("affiliations"); + Element affiliationElement = affiliationsElement.element("affiliation"); + node = affiliationsElement.attributeValue("node"); + if (null == affiliationElement) { + return; + } + jid = new JID(affiliationElement.attributeValue("jid")); + affiliation = Affiliations.valueOf(affiliationElement + .attributeValue("affiliation")); + if (true == Configuration.getInstance().isLocalNode(node)) { + return; + } + storeNewAffiliation(); + } - private void storeNewAffiliation() throws NodeStoreException { - addRemoteNode(); - channelManager.setUserAffiliation(node, jid, affiliation); - } + private void storeNewAffiliation() throws NodeStoreException { + addRemoteNode(); + channelManager.setUserAffiliation(node, jid, affiliation); + } - private void addRemoteNode() throws NodeStoreException { - if (false == channelManager.nodeExists(node)) - channelManager.addRemoteNode(node); - } -} \ No newline at end of file + private void addRemoteNode() throws NodeStoreException { + if (false == channelManager.nodeExists(node)) { + channelManager.addRemoteNode(node); + } + } +} diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/ConfigurationProcessor.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/ConfigurationProcessor.java index 58761af7..623c3b1a 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/ConfigurationProcessor.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/ConfigurationProcessor.java @@ -15,62 +15,63 @@ public class ConfigurationProcessor extends AbstractMessageProcessor { - private Helper helper; + private Helper helper; - private static final Logger logger = Logger - .getLogger(ConfigurationProcessor.class); + private static final Logger logger = Logger + .getLogger(ConfigurationProcessor.class); - public ConfigurationProcessor(BlockingQueue outQueue, - Properties configuration, ChannelManager channelManager) { - super(channelManager, configuration, outQueue); - this.helper = new Helper(channelManager); - } - - public void setConfigurationHelper(Helper helper) { - this.helper = helper; - } + public ConfigurationProcessor(BlockingQueue outQueue, + Properties configuration, ChannelManager channelManager) { + super(channelManager, configuration, outQueue); + this.helper = new Helper(channelManager); + } + + public void setConfigurationHelper(Helper helper) { + this.helper = helper; + } - @Override - public void process(Message packet) throws Exception { - message = packet; - getPacketDetails(); + @Override + public void process(Message packet) throws Exception { + message = packet; + getPacketDetails(); - if ((null == node) || (true == Configuration.getInstance().isLocalNode(node))) { - return; - } - sendLocalNotifications(NotificationScheme.validSubscribers); - handleDataForm(); - } + if ((null == node) || (true == Configuration.getInstance().isLocalNode(node))) { + return; + } + sendLocalNotifications(NotificationScheme.validSubscribers); + handleDataForm(); + } - private void getPacketDetails() { - Element configurationElement = message.getElement().element("event") - .element("configuration"); - if (null == configurationElement) { - return; - } - - node = configurationElement.attributeValue("node"); - } + private void getPacketDetails() { + Element configurationElement = message.getElement().element("event") + .element("configuration"); + if (null == configurationElement) { + return; + } + + node = configurationElement.attributeValue("node"); + } - private void handleDataForm() throws NodeStoreException { - if (true == Configuration.getInstance().isLocalNode(node)) { - return; - } + private void handleDataForm() throws NodeStoreException { + if (true == Configuration.getInstance().isLocalNode(node)) { + return; + } setNodeConfiguration(); - } + } - private void setNodeConfiguration() throws NodeStoreException { - addRemoteNode(); - helper.parseEventUpdate(message); - channelManager.setNodeConf(node, helper.getValues()); - } + private void setNodeConfiguration() throws NodeStoreException { + addRemoteNode(); + helper.parseEventUpdate(message); + channelManager.setNodeConf(node, helper.getValues()); + } - private void addRemoteNode() { + private void addRemoteNode() { try { - if (false == channelManager.nodeExists(node)) + if (false == channelManager.nodeExists(node)) { channelManager.addRemoteNode(node); + } } catch (NodeStoreException e) { - logger.error(e); + logger.error(e); } - } -} \ No newline at end of file + } +} diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/DeleteProcessor.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/DeleteProcessor.java index d6858d9b..ffb4a69e 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/DeleteProcessor.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/DeleteProcessor.java @@ -13,30 +13,30 @@ public class DeleteProcessor extends AbstractMessageProcessor { - public DeleteProcessor(BlockingQueue outQueue, - Properties configuration, ChannelManager channelManager) { - super(channelManager, configuration, outQueue); - } + public DeleteProcessor(BlockingQueue outQueue, + Properties configuration, ChannelManager channelManager) { + super(channelManager, configuration, outQueue); + } - @Override - public void process(Message packet) throws Exception { - message = packet; - deleteNode(); - if (!Configuration.getInstance().isLocalNode(node)) { - sendLocalNotifications(NotificationScheme.validSubscribers); - } - } + @Override + public void process(Message packet) throws Exception { + message = packet; + deleteNode(); + if (!Configuration.getInstance().isLocalNode(node)) { + sendLocalNotifications(NotificationScheme.validSubscribers); + } + } - private void deleteNode() throws NodeStoreException { - Element deleteElement = message.getElement().element("event") - .element("delete"); - if (deleteElement == null) { - return; - } - node = deleteElement.attributeValue("node"); - if (Configuration.getInstance().isLocalNode(node)) { - return; - } + private void deleteNode() throws NodeStoreException { + Element deleteElement = message.getElement().element("event") + .element("delete"); + if (deleteElement == null) { + return; + } + node = deleteElement.attributeValue("node"); + if (Configuration.getInstance().isLocalNode(node)) { + return; + } channelManager.deleteNode(node); - } -} \ No newline at end of file + } +} diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/ItemsProcessor.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/ItemsProcessor.java index 84e5f451..47077eaf 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/ItemsProcessor.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/ItemsProcessor.java @@ -19,63 +19,65 @@ public class ItemsProcessor extends AbstractMessageProcessor { - private static final Logger logger = Logger.getLogger(ItemsProcessor.class); - - public ItemsProcessor(BlockingQueue outQueue, - Properties configuration, ChannelManager channelManager) { - super(channelManager, configuration, outQueue); - } + private static final Logger logger = Logger.getLogger(ItemsProcessor.class); + + public ItemsProcessor(BlockingQueue outQueue, + Properties configuration, ChannelManager channelManager) { + super(channelManager, configuration, outQueue); + } - @Override - public void process(Message packet) throws Exception { + @Override + public void process(Message packet) throws Exception { - message = packet; - node = message.getElement().element("event").element("items") - .attributeValue("node"); + message = packet; + node = message.getElement().element("event").element("items") + .attributeValue("node"); - if (true == Configuration.getInstance().isLocalNode(node)) { - return; - } - sendLocalNotifications(NotificationScheme.validSubscribers); - handleItem(); - } + if (true == Configuration.getInstance().isLocalNode(node)) { + return; + } + sendLocalNotifications(NotificationScheme.validSubscribers); + handleItem(); + } - private void handleItem() throws NodeStoreException { + private void handleItem() throws NodeStoreException { - if (false == channelManager.nodeExists(node)) - channelManager.addRemoteNode(node); - Element item = message.getElement().element("event").element("items") - .element("item"); - Element entry = item.element("entry"); - if (null != entry) { - handleNewItem(entry); - return; - } - } + if (false == channelManager.nodeExists(node)) { + channelManager.addRemoteNode(node); + } + Element item = message.getElement().element("event").element("items") + .element("item"); + Element entry = item.element("entry"); + if (null != entry) { + handleNewItem(entry); + return; + } + } - private void deleteItem(String id) throws NodeStoreException { - try { - channelManager.deleteNodeItemById(node, id); - } catch (ItemNotFoundException e) { - logger.error("No item to delete, not a problem"); - } - } + private void deleteItem(String id) throws NodeStoreException { + try { + channelManager.deleteNodeItemById(node, id); + } catch (ItemNotFoundException e) { + logger.error("No item to delete, not a problem"); + } + } - private void handleNewItem(Element entry) throws NodeStoreException { - try { - String inReplyTo = null; - Element reply; - if (null != (reply = entry.element("in-reply-to"))) - inReplyTo = reply.attributeValue("ref"); - Date updatedDate = Conf.parseDate(entry.elementText("updated")); - deleteItem(entry.elementText("id")); - NodeItemImpl nodeItem = new NodeItemImpl(node, - GlobalItemIDImpl.toLocalId(entry.elementText("id")), - updatedDate, entry.asXML(), inReplyTo); - channelManager.addNodeItem(nodeItem); - } catch (IllegalArgumentException e) { - logger.error(e); - return; - } - } -} \ No newline at end of file + private void handleNewItem(Element entry) throws NodeStoreException { + try { + String inReplyTo = null; + Element reply; + if (null != (reply = entry.element("in-reply-to"))) { + inReplyTo = reply.attributeValue("ref"); + } + Date updatedDate = Conf.parseDate(entry.elementText("updated")); + deleteItem(entry.elementText("id")); + NodeItemImpl nodeItem = new NodeItemImpl(node, + GlobalItemIDImpl.toLocalId(entry.elementText("id")), + updatedDate, entry.asXML(), inReplyTo); + channelManager.addNodeItem(nodeItem); + } catch (IllegalArgumentException e) { + logger.error(e); + return; + } + } +} diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/RetractItemProcessor.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/RetractItemProcessor.java index fb7a0d66..0ac7c11c 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/RetractItemProcessor.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/RetractItemProcessor.java @@ -12,29 +12,29 @@ public class RetractItemProcessor extends AbstractMessageProcessor { - public RetractItemProcessor(BlockingQueue outQueue, - Properties configuration, ChannelManager channelManager) { - super(channelManager, configuration, outQueue); - } + public RetractItemProcessor(BlockingQueue outQueue, + Properties configuration, ChannelManager channelManager) { + super(channelManager, configuration, outQueue); + } - @Override - public void process(Message packet) throws Exception { - message = packet; - node = message.getElement().element("event").element("items") - .attributeValue("node"); - if (true == Configuration.getInstance().isLocalNode(node)) { - return; - } - sendLocalNotifications(NotificationScheme.validSubscribers); - handleItem(); - } + @Override + public void process(Message packet) throws Exception { + message = packet; + node = message.getElement().element("event").element("items") + .attributeValue("node"); + if (true == Configuration.getInstance().isLocalNode(node)) { + return; + } + sendLocalNotifications(NotificationScheme.validSubscribers); + handleItem(); + } - private void handleItem() throws NodeStoreException { - deleteItem(message.getElement().element("event").element("items") - .element("retract").attributeValue("id")); - } + private void handleItem() throws NodeStoreException { + deleteItem(message.getElement().element("event").element("items") + .element("retract").attributeValue("id")); + } - private void deleteItem(String id) throws NodeStoreException { - channelManager.deleteNodeItemById(node, id); - } -} \ No newline at end of file + private void deleteItem(String id) throws NodeStoreException { + channelManager.deleteNodeItemById(node, id); + } +} diff --git a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/SubscriptionProcessor.java b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/SubscriptionProcessor.java index 5ebfdce8..04253383 100644 --- a/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/SubscriptionProcessor.java +++ b/src/main/java/org/buddycloud/channelserver/packetprocessor/message/event/SubscriptionProcessor.java @@ -17,75 +17,76 @@ public class SubscriptionProcessor extends AbstractMessageProcessor { - private JID jid; - private JID invitedBy = null; - private Subscriptions subscription; + private JID jid; + private JID invitedBy = null; + private Subscriptions subscription; - private static final Logger logger = Logger - .getLogger(SubscriptionProcessor.class); + private static final Logger logger = Logger + .getLogger(SubscriptionProcessor.class); - public SubscriptionProcessor(BlockingQueue outQueue, - Properties configuration, ChannelManager channelManager) { - super(channelManager, configuration, outQueue); - } + public SubscriptionProcessor(BlockingQueue outQueue, + Properties configuration, ChannelManager channelManager) { + super(channelManager, configuration, outQueue); + } - @Override - public void process(Message packet) throws Exception { - message = packet; + @Override + public void process(Message packet) throws Exception { + message = packet; - handleSubscriptionElement(); + handleSubscriptionElement(); - if (null == subscription) { - return; - } - if (true == Configuration.getInstance().isLocalNode(node)) { - return; - } - if (subscription.equals(Subscriptions.pending)) { - sendLocalNotifications(NotificationScheme.ownerOrModerator, jid); - } else if (subscription.equals(Subscriptions.invited)) { - sendLocalNotifications(NotificationScheme.ownerOrModerator, jid); - } else if (subscription.equals(Subscriptions.subscribed)) { - sendLocalNotifications(NotificationScheme.validSubscribers, null); - } else if (subscription.equals(Subscriptions.none)) { - sendLocalNotifications(NotificationScheme.validSubscribers, jid); - } - } + if (null == subscription) { + return; + } + if (true == Configuration.getInstance().isLocalNode(node)) { + return; + } + if (subscription.equals(Subscriptions.pending)) { + sendLocalNotifications(NotificationScheme.ownerOrModerator, jid); + } else if (subscription.equals(Subscriptions.invited)) { + sendLocalNotifications(NotificationScheme.ownerOrModerator, jid); + } else if (subscription.equals(Subscriptions.subscribed)) { + sendLocalNotifications(NotificationScheme.validSubscribers, null); + } else if (subscription.equals(Subscriptions.none)) { + sendLocalNotifications(NotificationScheme.validSubscribers, jid); + } + } - private void handleSubscriptionElement() throws NodeStoreException { - Element subscriptionElement = message.getElement().element("event") - .element("subscription"); - if (null == subscriptionElement) { - return; - } + private void handleSubscriptionElement() throws NodeStoreException { + Element subscriptionElement = message.getElement().element("event") + .element("subscription"); + if (null == subscriptionElement) { + return; + } - jid = new JID(subscriptionElement.attributeValue("jid")); - node = subscriptionElement.attributeValue("node"); - subscription = Subscriptions.valueOf(subscriptionElement - .attributeValue("subscription")); - if (null != subscriptionElement.attributeValue("invited-by")) { - invitedBy = new JID(subscriptionElement.attributeValue("invited-by")); - } + jid = new JID(subscriptionElement.attributeValue("jid")); + node = subscriptionElement.attributeValue("node"); + subscription = Subscriptions.valueOf(subscriptionElement + .attributeValue("subscription")); + if (null != subscriptionElement.attributeValue("invited-by")) { + invitedBy = new JID(subscriptionElement.attributeValue("invited-by")); + } - if (true == Configuration.getInstance().isLocalNode(node)) { - return; - } - storeNewSubscription(); - } + if (true == Configuration.getInstance().isLocalNode(node)) { + return; + } + storeNewSubscription(); + } - private void storeNewSubscription() throws NodeStoreException { - NodeSubscriptionImpl newSubscription = new NodeSubscriptionImpl(node, - jid, subscription, invitedBy); - addRemoteNode(); - channelManager.addUserSubscription(newSubscription); - } + private void storeNewSubscription() throws NodeStoreException { + NodeSubscriptionImpl newSubscription = new NodeSubscriptionImpl(node, + jid, subscription, invitedBy); + addRemoteNode(); + channelManager.addUserSubscription(newSubscription); + } - private void addRemoteNode() { + private void addRemoteNode() { try { - if (false == channelManager.nodeExists(node)) + if (false == channelManager.nodeExists(node)) { channelManager.addRemoteNode(node); + } } catch (NodeStoreException e) { - logger.error(e); + logger.error(e); } - } -} \ No newline at end of file + } +} diff --git a/src/test/java/org/buddycloud/channelserver/channel/ChannelManagerImplTest.java b/src/test/java/org/buddycloud/channelserver/channel/ChannelManagerImplTest.java index 26a9fc9e..5a8c402a 100644 --- a/src/test/java/org/buddycloud/channelserver/channel/ChannelManagerImplTest.java +++ b/src/test/java/org/buddycloud/channelserver/channel/ChannelManagerImplTest.java @@ -24,145 +24,145 @@ 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); - } + 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; - } + @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); + @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)); - } + 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(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")); + @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"); - } + 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); - } -} \ No newline at end of file + @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); + } +} diff --git a/src/test/java/org/buddycloud/channelserver/channel/TestHelper.java b/src/test/java/org/buddycloud/channelserver/channel/TestHelper.java index 56c706b6..b38f24c3 100644 --- a/src/test/java/org/buddycloud/channelserver/channel/TestHelper.java +++ b/src/test/java/org/buddycloud/channelserver/channel/TestHelper.java @@ -16,69 +16,64 @@ import org.xmpp.packet.Packet; public class TestHelper { - LinkedBlockingQueue outQueue; - LinkedBlockingQueue inQueue; - InQueueConsumer consumer; - - ChannelManagerFactory channelManagerFactory; - - public TestHelper() throws FileNotFoundException, IOException { - initialiseChannelManagerFactory(); + LinkedBlockingQueue outQueue; + LinkedBlockingQueue inQueue; + InQueueConsumer consumer; + + ChannelManagerFactory channelManagerFactory; + + public TestHelper() throws FileNotFoundException, IOException { + initialiseChannelManagerFactory(); outQueue = new LinkedBlockingQueue(); inQueue = new LinkedBlockingQueue(); consumer = new InQueueConsumer(outQueue, Configuration.getInstance(), inQueue, channelManagerFactory, null, null); consumer.start(); - } - - public LinkedBlockingQueue getOutQueue() { - return outQueue; - } - - public LinkedBlockingQueue getInQueue() { - return inQueue; - } - - public InQueueConsumer getConsumer() { - return consumer; - } - - public ChannelManagerFactory getChannelManagerFactory() { - return channelManagerFactory; - } - + } + + public LinkedBlockingQueue getOutQueue() { + return outQueue; + } + + public LinkedBlockingQueue getInQueue() { + return inQueue; + } + + public InQueueConsumer getConsumer() { + return consumer; + } + + public ChannelManagerFactory getChannelManagerFactory() { + return channelManagerFactory; + } + private ChannelManagerFactory initialiseChannelManagerFactory() { - NodeStoreFactory nsFactory = new NodeStoreFactory() { - - @Override - public NodeStore create() { - try { - return new JDBCNodeStore(new DatabaseTester().getConnection(), new Sql92NodeStoreDialect()); - } catch (SQLException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (ClassNotFoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return null; - } - }; - - try { - IQTestHandler.readConf(); - channelManagerFactory = new ChannelManagerFactoryImpl(nsFactory); - } catch (FileNotFoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return null; + NodeStoreFactory nsFactory = new NodeStoreFactory() { + + @Override + public NodeStore create() { + try { + return new JDBCNodeStore(new DatabaseTester().getConnection(), new Sql92NodeStoreDialect()); + } catch (SQLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + return null; + } + }; + + try { + IQTestHandler.readConf(); + channelManagerFactory = new ChannelManagerFactoryImpl(nsFactory); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return null; } - + } diff --git a/src/test/java/org/buddycloud/channelserver/channel/validate/AtomEntryTest.java b/src/test/java/org/buddycloud/channelserver/channel/validate/AtomEntryTest.java index 2c2bcfca..6e0800b9 100644 --- a/src/test/java/org/buddycloud/channelserver/channel/validate/AtomEntryTest.java +++ b/src/test/java/org/buddycloud/channelserver/channel/validate/AtomEntryTest.java @@ -31,9 +31,9 @@ */ public class AtomEntryTest extends TestHandler { - private static final String ISO_8601_REGEX = "[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}(Z|[+-][0-9]{2}:[0-9]{2})"; + private static final String ISO_8601_REGEX = "[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}(Z|[+-][0-9]{2}:[0-9]{2})"; - private AtomEntry validator; + private AtomEntry validator; private IQ publishRequest; private Element publishEntry; @@ -44,9 +44,9 @@ public class AtomEntryTest extends TestHandler { private ChannelManager channelManager; - JID jid = new JID("juliet@shakespeare.lit/balcony"); - String node = "/users/romeo@shakespeare.lit/posts"; - String server = "channels.shakespeare.lit"; + JID jid = new JID("juliet@shakespeare.lit/balcony"); + String node = "/users/romeo@shakespeare.lit/posts"; + String server = "channels.shakespeare.lit"; @Before public void setUp() throws Exception { @@ -157,8 +157,8 @@ public void missingUpdatedElementHasValueAdded() throws Exception { validator = getEntryObject(item); Assert.assertTrue(validator.isValid()); Element entry = validator.getPayload(); - Assert.assertTrue(entry.elementText("updated").matches(ISO_8601_REGEX)); - } + Assert.assertTrue(entry.elementText("updated").matches(ISO_8601_REGEX)); + } @Test public void updateDateIsIgnored() throws Exception { diff --git a/src/test/java/org/buddycloud/channelserver/db/jdbc/DatabaseTester.java b/src/test/java/org/buddycloud/channelserver/db/jdbc/DatabaseTester.java index d1da0740..29fb5260 100644 --- a/src/test/java/org/buddycloud/channelserver/db/jdbc/DatabaseTester.java +++ b/src/test/java/org/buddycloud/channelserver/db/jdbc/DatabaseTester.java @@ -23,146 +23,147 @@ import org.mockito.stubbing.Answer; public class DatabaseTester { - - public class Assertions { - private DatabaseTester tester; - - protected Assertions(final DatabaseTester tester) { - this.tester = tester; - } - - /** - * Asserts that the table contains exactly one row with field=>value pairs - * matching the given map. - * @param tableName the table to interrogate. - * @param values a map of field=>value of the expected values - * @throws SQLException - */ - public void assertTableContains(final String tableName, final Map values) throws SQLException { - assertTableContains(tableName, values, 1); - } - - /** - * Asserts that the table contains the specified number of rows with field=>value pairs - * matching the given map. - * @param tableName the table to interrogate. - * @param values a map of field=>value of the expected values - * @param expectedRows the number of rows we expect to match exactly - * @throws SQLException - */ - public void assertTableContains(final String tableName, final Map values, final int expectedRows) throws SQLException { - Connection conn = tester.getConnection(); - - // We will rebuild the values as a list so we can have guaranteed ordering - List valueList = new ArrayList(); - - StringBuilder sql = new StringBuilder("SELECT COUNT(*) FROM \""); - sql.append(tableName); - sql.append("\" WHERE TRUE"); - - for(Entry field : values.entrySet()) { - valueList.add(field.getValue()); - sql.append(" AND \""); - sql.append(field.getKey()); - sql.append("\" = ?"); - } - - sql.append(";"); - - PreparedStatement stmt = conn.prepareStatement(sql.toString()); - for(int i = 0; i < valueList.size(); ++i) { - stmt.setObject(i + 1, valueList.get(i)); - } - - ResultSet rs = stmt.executeQuery(); - - rs.next(); - assertEquals("Expected query " + sql.toString() + " to return " + expectedRows, expectedRows, rs.getInt(1)); - } - } - - - - private Connection conn; - - public DatabaseTester() throws SQLException, IOException, ClassNotFoundException { - Class.forName("org.hsqldb.jdbcDriver"); - Class.forName("net.sf.log4jdbc.DriverSpy"); - createSchema(getConnection()); - } - - public void initialise() throws SQLException, IOException { - close(); - createSchema(getConnection()); - } - - public void close() throws SQLException { - if (conn != null) { - executeDDL(conn, "SHUTDOWN"); - conn = null; - } - } + + public class Assertions { + private DatabaseTester tester; + + protected Assertions(final DatabaseTester tester) { + this.tester = tester; + } + + /** + * Asserts that the table contains exactly one row with field=>value pairs + * matching the given map. + * @param tableName the table to interrogate. + * @param values a map of field=>value of the expected values + * @throws SQLException + */ + public void assertTableContains(final String tableName, final Map values) throws SQLException { + assertTableContains(tableName, values, 1); + } + + /** + * Asserts that the table contains the specified number of rows with field=>value pairs + * matching the given map. + * @param tableName the table to interrogate. + * @param values a map of field=>value of the expected values + * @param expectedRows the number of rows we expect to match exactly + * @throws SQLException + */ + public void assertTableContains(final String tableName, final Map values, final int expectedRows) throws SQLException { + Connection conn = tester.getConnection(); + + // We will rebuild the values as a list so we can have guaranteed ordering + List valueList = new ArrayList(); + + StringBuilder sql = new StringBuilder("SELECT COUNT(*) FROM \""); + sql.append(tableName); + sql.append("\" WHERE TRUE"); + + for (Entry field : values.entrySet()) { + valueList.add(field.getValue()); + sql.append(" AND \""); + sql.append(field.getKey()); + sql.append("\" = ?"); + } + + sql.append(";"); + + PreparedStatement stmt = conn.prepareStatement(sql.toString()); + for (int i = 0; i < valueList.size(); ++i) { + stmt.setObject(i + 1, valueList.get(i)); + } + + ResultSet rs = stmt.executeQuery(); + + rs.next(); + assertEquals("Expected query " + sql.toString() + " to return " + expectedRows, expectedRows, rs.getInt(1)); + } + } + + + + private Connection conn; + + public DatabaseTester() throws SQLException, IOException, ClassNotFoundException { + Class.forName("org.hsqldb.jdbcDriver"); + Class.forName("net.sf.log4jdbc.DriverSpy"); + createSchema(getConnection()); + } + + public void initialise() throws SQLException, IOException { + close(); + createSchema(getConnection()); + } + + public void close() throws SQLException { + if (conn != null) { + executeDDL(conn, "SHUTDOWN"); + conn = null; + } + } - public Connection getConnection() throws SQLException { - if (conn == null) { - final Connection originalConn = DriverManager.getConnection("jdbc:log4jdbc:hsqldb:mem:test", "sa", ""); - conn = Mockito.spy(originalConn); - Mockito.doAnswer(new Answer() { - @Override - public PreparedStatement answer(InvocationOnMock invocation) - throws Throwable { - String originalSQL = (String) invocation.getArguments()[0]; - String replacedSQL = originalSQL.replaceAll("(\\S+) ~ \\?", "regexp_matches($1, ?)"); - replacedSQL = replacedSQL.replaceAll("(\\S+) !~ \\?", "regexp_matches($1, ?) = FALSE"); - return originalConn.prepareStatement(replacedSQL); - } - }).when(conn).prepareStatement(Mockito.anyString()); - executeDDL(conn, "drop schema public cascade;"); - } - return conn; - } + public Connection getConnection() throws SQLException { + if (conn == null) { + final Connection originalConn = DriverManager.getConnection("jdbc:log4jdbc:hsqldb:mem:test", "sa", ""); + conn = Mockito.spy(originalConn); + Mockito.doAnswer(new Answer() { + @Override + public PreparedStatement answer(InvocationOnMock invocation) + throws Throwable { + String originalSQL = (String) invocation.getArguments()[0]; + String replacedSQL = originalSQL.replaceAll("(\\S+) ~ \\?", "regexp_matches($1, ?)"); + replacedSQL = replacedSQL.replaceAll("(\\S+) !~ \\?", "regexp_matches($1, ?) = FALSE"); + return originalConn.prepareStatement(replacedSQL); + } + }).when(conn).prepareStatement(Mockito.anyString()); + executeDDL(conn, "drop schema public cascade;"); + } + return conn; + } - private void createSchema(final Connection conn) throws SQLException, IOException { - executeDDL(conn, "SET DATABASE SQL SYNTAX PGS TRUE;"); - executeDDL(conn, "SET DATABASE SQL REFERENCES TRUE;"); - loadData("base"); - } + private void createSchema(final Connection conn) throws SQLException, IOException { + executeDDL(conn, "SET DATABASE SQL SYNTAX PGS TRUE;"); + executeDDL(conn, "SET DATABASE SQL REFERENCES TRUE;"); + loadData("base"); + } - public void loadData(final String scriptName) throws SQLException, IOException { - URL url = getClass().getResource("/org/buddycloud/channelserver/testing/jdbc/scripts/" + scriptName + ".sql"); - runScript(conn, new InputStreamReader(url.openStream())); - } - - private void executeDDL(final Connection conn, final String ddl) - throws SQLException { - Statement stmt = conn.createStatement(); - stmt.executeUpdate(ddl); - stmt.close(); - } + public void loadData(final String scriptName) throws SQLException, IOException { + URL url = getClass().getResource("/org/buddycloud/channelserver/testing/jdbc/scripts/" + scriptName + ".sql"); + runScript(conn, new InputStreamReader(url.openStream())); + } + + private void executeDDL(final Connection conn, final String ddl) + throws SQLException { + Statement stmt = conn.createStatement(); + stmt.executeUpdate(ddl); + stmt.close(); + } - private void runScript(final Connection conn, final Reader script) throws SQLException, IOException { - // Now read line bye line - BufferedReader d = new BufferedReader(script); - String thisLine, sqlQuery; - Statement stmt = conn.createStatement(); - sqlQuery = ""; - while ((thisLine = d.readLine()) != null) { - // Skip comments and empty lines - if (thisLine.length() > 0 && thisLine.charAt(0) == '-' - || thisLine.length() == 0) - continue; - sqlQuery = sqlQuery + " " + thisLine; - // If one command complete - if (sqlQuery.charAt(sqlQuery.length() - 1) == ';') { - sqlQuery = sqlQuery.replace(';', ' '); // Remove the ; since - // jdbc complains - stmt.execute(sqlQuery); - sqlQuery = ""; - } - } - } - - public Assertions assertions() { - return new Assertions(this); - } + private void runScript(final Connection conn, final Reader script) throws SQLException, IOException { + // Now read line bye line + BufferedReader d = new BufferedReader(script); + String thisLine, sqlQuery; + Statement stmt = conn.createStatement(); + sqlQuery = ""; + while ((thisLine = d.readLine()) != null) { + // Skip comments and empty lines + if (thisLine.length() > 0 && thisLine.charAt(0) == '-' + || thisLine.length() == 0) { + continue; + } + sqlQuery = sqlQuery + " " + thisLine; + // If one command complete + if (sqlQuery.charAt(sqlQuery.length() - 1) == ';') { + sqlQuery = sqlQuery.replace(';', ' '); // Remove the ; since + // jdbc complains + stmt.execute(sqlQuery); + sqlQuery = ""; + } + } + } + + public Assertions assertions() { + return new Assertions(this); + } } diff --git a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreAbstract.java b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreAbstract.java index 55d3bc33..ff5f4b12 100644 --- a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreAbstract.java +++ b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreAbstract.java @@ -35,10 +35,10 @@ public abstract class JDBCNodeStoreAbstract { protected static final String TEST_SERVER1_NODE1_ITEM3_ID = "a3"; protected static final String TEST_SERVER1_NODE1_ITEM3_CONTENT = "Test 3"; - protected static final String TEST_SERVER1_NODE1_ITEM4_ID = "a4"; - protected static final String TEST_SERVER1_NODE1_ITEM4_GLOBAL_ID = new GlobalItemIDImpl( - new JID("server1"), TEST_SERVER1_NODE1_ID, TEST_SERVER1_NODE1_ITEM4_ID).toString(); - protected static final String TEST_SERVER1_NODE1_ITEM4_CONTENT = "Test 4"; + protected static final String TEST_SERVER1_NODE1_ITEM4_ID = "a4"; + protected static final String TEST_SERVER1_NODE1_ITEM4_GLOBAL_ID = new GlobalItemIDImpl( + new JID("server1"), TEST_SERVER1_NODE1_ID, TEST_SERVER1_NODE1_ITEM4_ID).toString(); + protected static final String TEST_SERVER1_NODE1_ITEM4_CONTENT = "Test 4"; protected static final String TEST_SERVER1_NODE1_ITEM5_ID = "a5"; protected static final String TEST_SERVER1_NODE1_ITEM5_CONTENT = "Test 5"; diff --git a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreFirehoseTest.java b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreFirehoseTest.java index c85005ba..11a6e072 100644 --- a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreFirehoseTest.java +++ b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreFirehoseTest.java @@ -16,181 +16,181 @@ public class JDBCNodeStoreFirehoseTest extends JDBCNodeStoreAbstract { - public JDBCNodeStoreFirehoseTest() throws SQLException, IOException, - ClassNotFoundException { - dbTester = new DatabaseTester(); - IQTestHandler.readConf(); - } - - @Before - public void setup() throws SQLException, IOException { - dbTester.loadData("node_1"); - } + public JDBCNodeStoreFirehoseTest() throws SQLException, IOException, + ClassNotFoundException { + dbTester = new DatabaseTester(); + IQTestHandler.readConf(); + } + + @Before + public void setup() throws SQLException, IOException { + dbTester.loadData("node_1"); + } - @Test - public void testGetFirehoseOpenNode() throws Exception { - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.open.toString()); - CloseableIterator firehose = store.getFirehose( - Integer.MAX_VALUE, null, false, TEST_SERVER1_HOSTNAME); - int itemCount = 0; - while (firehose.hasNext()) { - firehose.next(); - itemCount++; - } - assertEquals(5, itemCount); - } - - @Test - public void testNonAdminGetFirehoseAuthorizedNode() throws Exception { - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.authorize.toString()); - CloseableIterator firehose = store.getFirehose( - Integer.MAX_VALUE, null, false, TEST_SERVER1_HOSTNAME); - int itemCount = 0; - while (firehose.hasNext()) { - firehose.next(); - itemCount++; - } - assertEquals(0, itemCount); - } - - @Test - public void testAdminGetFirehoseAuthorizedNode() throws Exception { - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.authorize.toString()); - CloseableIterator firehose = store.getFirehose( - Integer.MAX_VALUE, null, true, TEST_SERVER1_HOSTNAME); - int itemCount = 0; - while (firehose.hasNext()) { - firehose.next(); - itemCount++; - } - assertEquals(5, itemCount); - } - - @Test - public void testAdminGetFirehoseLocalNode() throws Exception { - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.local.toString()); - CloseableIterator firehose = store.getFirehose( - Integer.MAX_VALUE, null, true, TEST_SERVER2_HOSTNAME); - int itemCount = 0; - while (firehose.hasNext()) { - firehose.next(); - itemCount++; - } - assertEquals(5, itemCount); - } - - @Test - public void testNonAdminSameDomainGetFirehoseLocalNode() throws Exception { - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.local.toString()); - CloseableIterator firehose = store.getFirehose( - Integer.MAX_VALUE, null, false, TEST_SERVER1_HOSTNAME); - int itemCount = 0; - while (firehose.hasNext()) { - firehose.next(); - itemCount++; - } - assertEquals(5, itemCount); - } - - @Test - public void testNonAdminGetFirehoseLocalNode() throws Exception { - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.local.toString()); - CloseableIterator firehose = store.getFirehose( - Integer.MAX_VALUE, null, false, TEST_SERVER2_HOSTNAME); - int itemCount = 0; - while (firehose.hasNext()) { - firehose.next(); - itemCount++; - } - assertEquals(0, itemCount); - } - - @Test - public void testGetFirehoseNoDomainSet() throws Exception { - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.open.toString()); - Configuration.getInstance().remove( - Configuration.CONFIGURATION_SERVER_DOMAIN); - Configuration.getInstance().remove( - Configuration.CONFIGURATION_SERVER_TOPICS_DOMAIN); - CloseableIterator firehose = store.getFirehose( - Integer.MAX_VALUE, null, false, TEST_SERVER1_HOSTNAME); - int itemCount = 0; - while (firehose.hasNext()) { - firehose.next(); - itemCount++; - } - assertEquals(5, itemCount); - } - - @Test - public void testGetFirehoseRSM() throws Exception { - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.open.toString()); - CloseableIterator firehose = store.getFirehose( - Integer.MAX_VALUE, TEST_SERVER1_NODE1_ITEM4_GLOBAL_ID, - false, TEST_SERVER1_HOSTNAME); - int itemCount = 0; - while (firehose.hasNext()) { - firehose.next(); - itemCount++; - } - assertEquals(3, itemCount); - } - - @Test - public void testCountFirehoseItemsOpenNode() throws Exception { - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.open.toString()); - int firehoseItemCount = store.getFirehoseItemCount(false, - TEST_SERVER1_HOSTNAME); - assertEquals(5, firehoseItemCount); - } - - @Test - public void testNonAdminCountFirehoseItemsAuthorizeNode() throws Exception { - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.authorize.toString()); - int firehoseItemCount = store.getFirehoseItemCount(false, - TEST_SERVER1_HOSTNAME); - assertEquals(0, firehoseItemCount); - } - - @Test - public void testAdminCountFirehoseItemsAuthorizeNode() throws Exception { - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.authorize.toString()); - int firehoseItemCount = store.getFirehoseItemCount(true, - TEST_SERVER1_HOSTNAME); - assertEquals(5, firehoseItemCount); - } - - @Test - public void testAdminCountFirehoseLocalNode() throws Exception { - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.local.toString()); - int firehoseItemCount = store.getFirehoseItemCount(true, TEST_SERVER2_HOSTNAME); - assertEquals(5, firehoseItemCount); - } - - @Test - public void testNonAdminSameDomainCountFirehoseLocalNode() throws Exception { - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.local.toString()); - int firehoseItemCount = store.getFirehoseItemCount(false, TEST_SERVER1_HOSTNAME); - assertEquals(5, firehoseItemCount); - } - - @Test - public void testNonAdminCounttFirehoseLocalNode() throws Exception { - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.local.toString()); - int firehoseItemCount = store.getFirehoseItemCount(false, TEST_SERVER2_HOSTNAME); - assertEquals(0, firehoseItemCount); - } - - @Test - public void testCountFirehoseItemsNoDomainSet() throws Exception { - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.open.toString()); - Configuration.getInstance().remove( - Configuration.CONFIGURATION_SERVER_DOMAIN); - Configuration.getInstance().remove( - Configuration.CONFIGURATION_SERVER_TOPICS_DOMAIN); - int firehoseItemCount = store.getFirehoseItemCount(false, - TEST_SERVER1_HOSTNAME); - assertEquals(5, firehoseItemCount); - } + @Test + public void testGetFirehoseOpenNode() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.open.toString()); + CloseableIterator firehose = store.getFirehose( + Integer.MAX_VALUE, null, false, TEST_SERVER1_HOSTNAME); + int itemCount = 0; + while (firehose.hasNext()) { + firehose.next(); + itemCount++; + } + assertEquals(5, itemCount); + } + + @Test + public void testNonAdminGetFirehoseAuthorizedNode() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.authorize.toString()); + CloseableIterator firehose = store.getFirehose( + Integer.MAX_VALUE, null, false, TEST_SERVER1_HOSTNAME); + int itemCount = 0; + while (firehose.hasNext()) { + firehose.next(); + itemCount++; + } + assertEquals(0, itemCount); + } + + @Test + public void testAdminGetFirehoseAuthorizedNode() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.authorize.toString()); + CloseableIterator firehose = store.getFirehose( + Integer.MAX_VALUE, null, true, TEST_SERVER1_HOSTNAME); + int itemCount = 0; + while (firehose.hasNext()) { + firehose.next(); + itemCount++; + } + assertEquals(5, itemCount); + } + + @Test + public void testAdminGetFirehoseLocalNode() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.local.toString()); + CloseableIterator firehose = store.getFirehose( + Integer.MAX_VALUE, null, true, TEST_SERVER2_HOSTNAME); + int itemCount = 0; + while (firehose.hasNext()) { + firehose.next(); + itemCount++; + } + assertEquals(5, itemCount); + } + + @Test + public void testNonAdminSameDomainGetFirehoseLocalNode() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.local.toString()); + CloseableIterator firehose = store.getFirehose( + Integer.MAX_VALUE, null, false, TEST_SERVER1_HOSTNAME); + int itemCount = 0; + while (firehose.hasNext()) { + firehose.next(); + itemCount++; + } + assertEquals(5, itemCount); + } + + @Test + public void testNonAdminGetFirehoseLocalNode() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.local.toString()); + CloseableIterator firehose = store.getFirehose( + Integer.MAX_VALUE, null, false, TEST_SERVER2_HOSTNAME); + int itemCount = 0; + while (firehose.hasNext()) { + firehose.next(); + itemCount++; + } + assertEquals(0, itemCount); + } + + @Test + public void testGetFirehoseNoDomainSet() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.open.toString()); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_SERVER_DOMAIN); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_SERVER_TOPICS_DOMAIN); + CloseableIterator firehose = store.getFirehose( + Integer.MAX_VALUE, null, false, TEST_SERVER1_HOSTNAME); + int itemCount = 0; + while (firehose.hasNext()) { + firehose.next(); + itemCount++; + } + assertEquals(5, itemCount); + } + + @Test + public void testGetFirehoseRSM() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.open.toString()); + CloseableIterator firehose = store.getFirehose( + Integer.MAX_VALUE, TEST_SERVER1_NODE1_ITEM4_GLOBAL_ID, + false, TEST_SERVER1_HOSTNAME); + int itemCount = 0; + while (firehose.hasNext()) { + firehose.next(); + itemCount++; + } + assertEquals(3, itemCount); + } + + @Test + public void testCountFirehoseItemsOpenNode() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.open.toString()); + int firehoseItemCount = store.getFirehoseItemCount(false, + TEST_SERVER1_HOSTNAME); + assertEquals(5, firehoseItemCount); + } + + @Test + public void testNonAdminCountFirehoseItemsAuthorizeNode() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.authorize.toString()); + int firehoseItemCount = store.getFirehoseItemCount(false, + TEST_SERVER1_HOSTNAME); + assertEquals(0, firehoseItemCount); + } + + @Test + public void testAdminCountFirehoseItemsAuthorizeNode() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.authorize.toString()); + int firehoseItemCount = store.getFirehoseItemCount(true, + TEST_SERVER1_HOSTNAME); + assertEquals(5, firehoseItemCount); + } + + @Test + public void testAdminCountFirehoseLocalNode() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.local.toString()); + int firehoseItemCount = store.getFirehoseItemCount(true, TEST_SERVER2_HOSTNAME); + assertEquals(5, firehoseItemCount); + } + + @Test + public void testNonAdminSameDomainCountFirehoseLocalNode() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.local.toString()); + int firehoseItemCount = store.getFirehoseItemCount(false, TEST_SERVER1_HOSTNAME); + assertEquals(5, firehoseItemCount); + } + + @Test + public void testNonAdminCounttFirehoseLocalNode() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.local.toString()); + int firehoseItemCount = store.getFirehoseItemCount(false, TEST_SERVER2_HOSTNAME); + assertEquals(0, firehoseItemCount); + } + + @Test + public void testCountFirehoseItemsNoDomainSet() throws Exception { + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, Conf.ACCESS_MODEL, AccessModels.open.toString()); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_SERVER_DOMAIN); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_SERVER_TOPICS_DOMAIN); + int firehoseItemCount = store.getFirehoseItemCount(false, + TEST_SERVER1_HOSTNAME); + assertEquals(5, firehoseItemCount); + } -} \ No newline at end of file +} diff --git a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreRemoteAndLocalNodesTest.java b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreRemoteAndLocalNodesTest.java index 35782aa8..9374f68c 100644 --- a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreRemoteAndLocalNodesTest.java +++ b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreRemoteAndLocalNodesTest.java @@ -12,33 +12,32 @@ public class JDBCNodeStoreRemoteAndLocalNodesTest extends JDBCNodeStoreAbstract { - public JDBCNodeStoreRemoteAndLocalNodesTest() throws SQLException, IOException, - ClassNotFoundException { - dbTester = new DatabaseTester(); - IQTestHandler.readConf(); - } - - @Before - public void setup() throws SQLException, IOException, NodeStoreException { - dbTester.loadData("node_1"); - dbTester.loadData("node_2"); - store.addRemoteNode(TEST_SERVER2_NODE1_ID); - } + public JDBCNodeStoreRemoteAndLocalNodesTest() throws SQLException, IOException, + ClassNotFoundException { + dbTester = new DatabaseTester(); + IQTestHandler.readConf(); + } + + @Before + public void setup() throws SQLException, IOException, NodeStoreException { + dbTester.loadData("node_1"); + dbTester.loadData("node_2"); + store.addRemoteNode(TEST_SERVER2_NODE1_ID); + } - @Test - public void testGetLocalNodesList() throws Exception { - List localNodes = store.getLocalNodesList(); - Assert.assertTrue(localNodes.contains(TEST_SERVER1_NODE1_ID)); - Assert.assertTrue(localNodes.contains(TEST_SERVER1_NODE2_ID)); - Assert.assertFalse(localNodes.contains(TEST_SERVER2_NODE1_ID)); - } - - @Test - public void testGetRemoteNodesList() throws Exception { - List remoteNodes = store.getRemoteNodesList(); - Assert.assertFalse(remoteNodes.contains(TEST_SERVER1_NODE1_ID)); - Assert.assertFalse(remoteNodes.contains(TEST_SERVER1_NODE2_ID)); - Assert.assertTrue(remoteNodes.contains(TEST_SERVER2_NODE1_ID)); - } - -} \ No newline at end of file + @Test + public void testGetLocalNodesList() throws Exception { + List localNodes = store.getLocalNodesList(); + Assert.assertTrue(localNodes.contains(TEST_SERVER1_NODE1_ID)); + Assert.assertTrue(localNodes.contains(TEST_SERVER1_NODE2_ID)); + Assert.assertFalse(localNodes.contains(TEST_SERVER2_NODE1_ID)); + } + + @Test + public void testGetRemoteNodesList() throws Exception { + List remoteNodes = store.getRemoteNodesList(); + Assert.assertFalse(remoteNodes.contains(TEST_SERVER1_NODE1_ID)); + Assert.assertFalse(remoteNodes.contains(TEST_SERVER1_NODE2_ID)); + Assert.assertTrue(remoteNodes.contains(TEST_SERVER2_NODE1_ID)); + } +} diff --git a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java index 2923da1c..9865fdd6 100644 --- a/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java +++ b/src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreTest.java @@ -3,7 +3,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; @@ -17,14 +16,10 @@ import java.util.ArrayList; import java.util.Date; import java.util.HashMap; -import java.util.HashSet; import java.util.Iterator; -import java.util.Map; -import java.util.Map.Entry; import junit.framework.Assert; -import org.apache.commons.collections.CollectionUtils; import org.buddycloud.channelserver.channel.node.configuration.field.AccessModel; import org.buddycloud.channelserver.db.ClosableIteratorImpl; import org.buddycloud.channelserver.db.CloseableIterator; @@ -32,1158 +27,1154 @@ import org.buddycloud.channelserver.db.exception.ItemNotFoundException; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.db.jdbc.JDBCNodeStore.NodeStoreSQLDialect; -import org.buddycloud.channelserver.db.jdbc.dialect.Sql92NodeStoreDialect; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; import org.buddycloud.channelserver.pubsub.accessmodel.AccessModels; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; -import org.buddycloud.channelserver.pubsub.model.GlobalItemID; -import org.buddycloud.channelserver.pubsub.model.NodeAffiliation; import org.buddycloud.channelserver.pubsub.model.NodeItem; -import org.buddycloud.channelserver.pubsub.model.NodeSubscription; import org.buddycloud.channelserver.pubsub.model.impl.GlobalItemIDImpl; -import org.buddycloud.channelserver.pubsub.model.impl.NodeAffiliationImpl; import org.buddycloud.channelserver.pubsub.model.impl.NodeItemImpl; import org.buddycloud.channelserver.pubsub.model.impl.NodeSubscriptionImpl; import org.buddycloud.channelserver.pubsub.subscription.Subscriptions; -import org.junit.After; -import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.mockito.InOrder; import org.mockito.Mockito; import org.xmpp.packet.JID; -import org.xmpp.resultsetmanagement.ResultSet; @SuppressWarnings("serial") public class JDBCNodeStoreTest extends JDBCNodeStoreAbstract { - public JDBCNodeStoreTest() throws SQLException, IOException, - ClassNotFoundException { - dbTester = new DatabaseTester(); - IQTestHandler.readConf(); - } - - @Test - public void testIsCachedJidForCachedJid() throws Exception { - dbTester.loadData("node_1"); + public JDBCNodeStoreTest() throws SQLException, IOException, + ClassNotFoundException { + dbTester = new DatabaseTester(); + IQTestHandler.readConf(); + } + + @Test + public void testIsCachedJidForCachedJid() throws Exception { + dbTester.loadData("node_1"); - boolean result = store.isCachedJID(TEST_SERVER1_USER1_JID); - assertEquals("Expected JID to be shown as cached", true, result); - } + boolean result = store.isCachedJID(TEST_SERVER1_USER1_JID); + assertEquals("Expected JID to be shown as cached", true, result); + } - @Test - public void testIsCachedJidForNonCachedJid() throws Exception { - dbTester.loadData("node_1"); + @Test + public void testIsCachedJidForNonCachedJid() throws Exception { + dbTester.loadData("node_1"); - boolean result = store.isCachedJID(new JID("anotheruser@sample.com")); - assertEquals("Expected JID to be shown as not cached", false, result); - } + boolean result = store.isCachedJID(new JID("anotheruser@sample.com")); + assertEquals("Expected JID to be shown as not cached", false, result); + } - @Test - public void testGetNodeItems() throws Exception { - dbTester.loadData("node_1"); + @Test + public void testGetNodeItems() throws Exception { + dbTester.loadData("node_1"); - Iterator result = store.getNodeItems(TEST_SERVER1_NODE1_ID); + Iterator result = store.getNodeItems(TEST_SERVER1_NODE1_ID); - String[] expectedNodeIds = { TEST_SERVER1_NODE1_ITEM5_ID, - TEST_SERVER1_NODE1_ITEM4_ID, TEST_SERVER1_NODE1_ITEM3_ID, - TEST_SERVER1_NODE1_ITEM2_ID, TEST_SERVER1_NODE1_ITEM1_ID, }; - String[] expectedEntryContent = { TEST_SERVER1_NODE1_ITEM5_CONTENT, - TEST_SERVER1_NODE1_ITEM4_CONTENT, - TEST_SERVER1_NODE1_ITEM3_CONTENT, - TEST_SERVER1_NODE1_ITEM2_CONTENT, - TEST_SERVER1_NODE1_ITEM1_CONTENT, }; + String[] expectedNodeIds = { TEST_SERVER1_NODE1_ITEM5_ID, + TEST_SERVER1_NODE1_ITEM4_ID, TEST_SERVER1_NODE1_ITEM3_ID, + TEST_SERVER1_NODE1_ITEM2_ID, TEST_SERVER1_NODE1_ITEM1_ID, }; + String[] expectedEntryContent = { TEST_SERVER1_NODE1_ITEM5_CONTENT, + TEST_SERVER1_NODE1_ITEM4_CONTENT, + TEST_SERVER1_NODE1_ITEM3_CONTENT, + TEST_SERVER1_NODE1_ITEM2_CONTENT, + TEST_SERVER1_NODE1_ITEM1_CONTENT, }; - int i = 0; - - while (result.hasNext()) { - NodeItem item = result.next(); + int i = 0; + + while (result.hasNext()) { + NodeItem item = result.next(); - assertEquals("The " + i - + " node returned does not have the expected id", - expectedNodeIds[i], item.getId()); - assertTrue("The " + i - + " node returned does not have the expected content", item - .getPayload().contains(expectedEntryContent[i])); + assertEquals("The " + i + + " node returned does not have the expected id", + expectedNodeIds[i], item.getId()); + assertTrue("The " + i + + " node returned does not have the expected content", item + .getPayload().contains(expectedEntryContent[i])); - ++i; - } - - assertEquals("Too few items returned", expectedNodeIds.length, i); + ++i; + } + + assertEquals("Too few items returned", expectedNodeIds.length, i); - assertFalse("Too many items were returned", result.hasNext()); - } + assertFalse("Too many items were returned", result.hasNext()); + } - @Test - public void testGetNodeItemsForUnknownNodeReturnsEmptyIterator() - throws Exception { - dbTester.loadData("node_1"); + @Test + public void testGetNodeItemsForUnknownNodeReturnsEmptyIterator() + throws Exception { + dbTester.loadData("node_1"); - Iterator result = store.getNodeItems(TEST_SERVER1_NODE2_ID); + Iterator result = store.getNodeItems(TEST_SERVER1_NODE2_ID); - assertFalse("Items were returned but none were expected", - result.hasNext()); - } + assertFalse("Items were returned but none were expected", + result.hasNext()); + } - @Test - public void testGetNodeItemsWithLimits() throws Exception { - dbTester.loadData("node_1"); - - Iterator result = store.getNodeItems(TEST_SERVER1_NODE1_ID, - TEST_SERVER1_NODE1_ITEM4_ID, 4); - - String[] expectedNodeIds = { TEST_SERVER1_NODE1_ITEM3_ID, - TEST_SERVER1_NODE1_ITEM2_ID, TEST_SERVER1_NODE1_ITEM1_ID }; - String[] expectedEntryContent = { TEST_SERVER1_NODE1_ITEM3_CONTENT, - TEST_SERVER1_NODE1_ITEM2_CONTENT, - TEST_SERVER1_NODE1_ITEM1_CONTENT }; - - int i = 0; - - while (result.hasNext()) { - NodeItem item = result.next(); - - assertEquals("The " + i - + " node returned does not have the expected id", - expectedNodeIds[i], item.getId()); - assertTrue("The " + i - + " node returned does not have the expected content", item - .getPayload().contains(expectedEntryContent[i])); - - ++i; - } - - assertEquals("Too few items returned", expectedNodeIds.length, i); - - assertFalse("Too many items were returned", result.hasNext()); - } - - @Test - public void testGetNodeItemsWithPaging() throws Exception { - dbTester.loadData("node_1"); + @Test + public void testGetNodeItemsWithLimits() throws Exception { + dbTester.loadData("node_1"); + + Iterator result = store.getNodeItems(TEST_SERVER1_NODE1_ID, + TEST_SERVER1_NODE1_ITEM4_ID, 4); + + String[] expectedNodeIds = { TEST_SERVER1_NODE1_ITEM3_ID, + TEST_SERVER1_NODE1_ITEM2_ID, TEST_SERVER1_NODE1_ITEM1_ID }; + String[] expectedEntryContent = { TEST_SERVER1_NODE1_ITEM3_CONTENT, + TEST_SERVER1_NODE1_ITEM2_CONTENT, + TEST_SERVER1_NODE1_ITEM1_CONTENT }; + + int i = 0; + + while (result.hasNext()) { + NodeItem item = result.next(); + + assertEquals("The " + i + + " node returned does not have the expected id", + expectedNodeIds[i], item.getId()); + assertTrue("The " + i + + " node returned does not have the expected content", item + .getPayload().contains(expectedEntryContent[i])); + + ++i; + } + + assertEquals("Too few items returned", expectedNodeIds.length, i); + + assertFalse("Too many items were returned", result.hasNext()); + } + + @Test + public void testGetNodeItemsWithPaging() throws Exception { + dbTester.loadData("node_1"); - long start = System.currentTimeMillis(); + long start = System.currentTimeMillis(); - NodeItem[] items = new NodeItem[20]; + NodeItem[] items = new NodeItem[20]; - for (int i = 0; i < 20; i++) { - items[i] = new NodeItemImpl(TEST_SERVER1_NODE1_ID, - String.valueOf(i), new Date(start + i * 10), "payload" - + String.valueOf(i)); - store.addNodeItem(items[i]); - } + for (int i = 0; i < 20; i++) { + items[i] = new NodeItemImpl(TEST_SERVER1_NODE1_ID, + String.valueOf(i), new Date(start + i * 10), "payload" + + String.valueOf(i)); + store.addNodeItem(items[i]); + } - CloseableIterator result = store.getNodeItems( - TEST_SERVER1_NODE1_ID, "15", 3); + CloseableIterator result = store.getNodeItems( + TEST_SERVER1_NODE1_ID, "15", 3); - assertEquals("Incorrect node item returned", items[14], result.next()); - assertEquals("Incorrect node item returned", items[13], result.next()); - assertEquals("Incorrect node item returned", items[12], result.next()); - } + assertEquals("Incorrect node item returned", items[14], result.next()); + assertEquals("Incorrect node item returned", items[13], result.next()); + assertEquals("Incorrect node item returned", items[12], result.next()); + } - @Test - public void testGetNodeItemsWithNegativeOneCountReturnsAllItems() - throws Exception { - dbTester.loadData("node_1"); + @Test + public void testGetNodeItemsWithNegativeOneCountReturnsAllItems() + throws Exception { + dbTester.loadData("node_1"); - Iterator result = store.getNodeItems(TEST_SERVER1_NODE1_ID, - null, -1); + Iterator result = store.getNodeItems(TEST_SERVER1_NODE1_ID, + null, -1); - String[] expectedNodeIds = { TEST_SERVER1_NODE1_ITEM5_ID, - TEST_SERVER1_NODE1_ITEM4_ID, TEST_SERVER1_NODE1_ITEM3_ID, - TEST_SERVER1_NODE1_ITEM2_ID, TEST_SERVER1_NODE1_ITEM1_ID, }; - String[] expectedEntryContent = { TEST_SERVER1_NODE1_ITEM5_CONTENT, - TEST_SERVER1_NODE1_ITEM4_CONTENT, - TEST_SERVER1_NODE1_ITEM3_CONTENT, - TEST_SERVER1_NODE1_ITEM2_CONTENT, - TEST_SERVER1_NODE1_ITEM1_CONTENT, }; + String[] expectedNodeIds = { TEST_SERVER1_NODE1_ITEM5_ID, + TEST_SERVER1_NODE1_ITEM4_ID, TEST_SERVER1_NODE1_ITEM3_ID, + TEST_SERVER1_NODE1_ITEM2_ID, TEST_SERVER1_NODE1_ITEM1_ID, }; + String[] expectedEntryContent = { TEST_SERVER1_NODE1_ITEM5_CONTENT, + TEST_SERVER1_NODE1_ITEM4_CONTENT, + TEST_SERVER1_NODE1_ITEM3_CONTENT, + TEST_SERVER1_NODE1_ITEM2_CONTENT, + TEST_SERVER1_NODE1_ITEM1_CONTENT, }; - int i = 0; + int i = 0; - while (result.hasNext()) { - NodeItem item = result.next(); + while (result.hasNext()) { + NodeItem item = result.next(); - assertEquals("The " + i - + " node returned does not have the expected id", - expectedNodeIds[i], item.getId()); - assertTrue("The " + i - + " node returned does not have the expected content", item - .getPayload().contains(expectedEntryContent[i])); + assertEquals("The " + i + + " node returned does not have the expected id", + expectedNodeIds[i], item.getId()); + assertTrue("The " + i + + " node returned does not have the expected content", item + .getPayload().contains(expectedEntryContent[i])); - ++i; - } + ++i; + } - assertEquals("Too few items returned", expectedNodeIds.length, i); + assertEquals("Too few items returned", expectedNodeIds.length, i); - assertFalse("Too many items were returned", result.hasNext()); - } + assertFalse("Too many items were returned", result.hasNext()); + } - @Test(expected = IllegalArgumentException.class) - public void testGetNodeItemsWithInvalidCountThrowsException() - throws Exception { - store.getNodeItems(TEST_SERVER1_NODE1_ID, TEST_SERVER1_NODE1_ITEM1_ID, - -2); - } + @Test(expected = IllegalArgumentException.class) + public void testGetNodeItemsWithInvalidCountThrowsException() + throws Exception { + store.getNodeItems(TEST_SERVER1_NODE1_ID, TEST_SERVER1_NODE1_ITEM1_ID, + -2); + } - @Test - public void testGetNodeItemsWithUnknownItemReturnsAllItems() - throws Exception { - dbTester.loadData("node_1"); + @Test + public void testGetNodeItemsWithUnknownItemReturnsAllItems() + throws Exception { + dbTester.loadData("node_1"); - Iterator result = store.getNodeItems(TEST_SERVER1_NODE1_ID, - "randomunknownitemid", 10); + Iterator result = store.getNodeItems(TEST_SERVER1_NODE1_ID, + "randomunknownitemid", 10); - String[] expectedNodeIds = { TEST_SERVER1_NODE1_ITEM5_ID, - TEST_SERVER1_NODE1_ITEM4_ID, TEST_SERVER1_NODE1_ITEM3_ID, - TEST_SERVER1_NODE1_ITEM2_ID, TEST_SERVER1_NODE1_ITEM1_ID, }; - String[] expectedEntryContent = { TEST_SERVER1_NODE1_ITEM5_CONTENT, - TEST_SERVER1_NODE1_ITEM4_CONTENT, - TEST_SERVER1_NODE1_ITEM3_CONTENT, - TEST_SERVER1_NODE1_ITEM2_CONTENT, - TEST_SERVER1_NODE1_ITEM1_CONTENT, }; + String[] expectedNodeIds = { TEST_SERVER1_NODE1_ITEM5_ID, + TEST_SERVER1_NODE1_ITEM4_ID, TEST_SERVER1_NODE1_ITEM3_ID, + TEST_SERVER1_NODE1_ITEM2_ID, TEST_SERVER1_NODE1_ITEM1_ID, }; + String[] expectedEntryContent = { TEST_SERVER1_NODE1_ITEM5_CONTENT, + TEST_SERVER1_NODE1_ITEM4_CONTENT, + TEST_SERVER1_NODE1_ITEM3_CONTENT, + TEST_SERVER1_NODE1_ITEM2_CONTENT, + TEST_SERVER1_NODE1_ITEM1_CONTENT, }; - int i = 0; + int i = 0; - while (result.hasNext()) { - NodeItem item = result.next(); + while (result.hasNext()) { + NodeItem item = result.next(); - assertEquals("The " + i - + " node returned does not have the expected id", - expectedNodeIds[i], item.getId()); - assertTrue("The " + i - + " node returned does not have the expected content", item - .getPayload().contains(expectedEntryContent[i])); + assertEquals("The " + i + + " node returned does not have the expected id", + expectedNodeIds[i], item.getId()); + assertTrue("The " + i + + " node returned does not have the expected content", item + .getPayload().contains(expectedEntryContent[i])); - ++i; - } + ++i; + } - assertEquals("Too few items returned", expectedNodeIds.length, i); + assertEquals("Too few items returned", expectedNodeIds.length, i); - assertFalse("Too many items were returned", result.hasNext()); - } + assertFalse("Too many items were returned", result.hasNext()); + } - @Test - public void testCountNodeItems() throws Exception { - dbTester.loadData("node_1"); + @Test + public void testCountNodeItems() throws Exception { + dbTester.loadData("node_1"); - int result = store.countNodeItems(TEST_SERVER1_NODE1_ID); + int result = store.countNodeItems(TEST_SERVER1_NODE1_ID); - assertEquals("Incorrect item count", 5, result); - } + assertEquals("Incorrect item count", 5, result); + } - @Test - public void testGetNewNodeItemsForUserBetweenDates() throws Exception { + @Test + public void testGetNewNodeItemsForUserBetweenDates() throws Exception { - dbTester.loadData("node_1"); + dbTester.loadData("node_1"); - // We shouldn't see this item come out! - store.addRemoteNode(TEST_SERVER2_NODE1_ID); - store.addNodeItem(new NodeItemImpl(TEST_SERVER2_NODE1_ID, "1", - new Date(), "item-payload")); + // We shouldn't see this item come out! + store.addRemoteNode(TEST_SERVER2_NODE1_ID); + store.addNodeItem(new NodeItemImpl(TEST_SERVER2_NODE1_ID, "1", + new Date(), "item-payload")); - Iterator result = store.getNewNodeItemsForUser( - TEST_SERVER1_USER1_JID, new Date(0), new Date()); + Iterator result = store.getNewNodeItemsForUser( + TEST_SERVER1_USER1_JID, new Date(0), new Date()); - String[] expectedNodeIds = { TEST_SERVER1_NODE1_ITEM5_ID, - TEST_SERVER1_NODE1_ITEM4_ID, TEST_SERVER1_NODE1_ITEM3_ID, - TEST_SERVER1_NODE1_ITEM2_ID, TEST_SERVER1_NODE1_ITEM1_ID, }; - String[] expectedEntryContent = { TEST_SERVER1_NODE1_ITEM5_CONTENT, - TEST_SERVER1_NODE1_ITEM4_CONTENT, - TEST_SERVER1_NODE1_ITEM3_CONTENT, - TEST_SERVER1_NODE1_ITEM2_CONTENT, - TEST_SERVER1_NODE1_ITEM1_CONTENT, }; + String[] expectedNodeIds = { TEST_SERVER1_NODE1_ITEM5_ID, + TEST_SERVER1_NODE1_ITEM4_ID, TEST_SERVER1_NODE1_ITEM3_ID, + TEST_SERVER1_NODE1_ITEM2_ID, TEST_SERVER1_NODE1_ITEM1_ID, }; + String[] expectedEntryContent = { TEST_SERVER1_NODE1_ITEM5_CONTENT, + TEST_SERVER1_NODE1_ITEM4_CONTENT, + TEST_SERVER1_NODE1_ITEM3_CONTENT, + TEST_SERVER1_NODE1_ITEM2_CONTENT, + TEST_SERVER1_NODE1_ITEM1_CONTENT, }; - int i = 0; + int i = 0; - while (result.hasNext()) { - NodeItem item = result.next(); + while (result.hasNext()) { + NodeItem item = result.next(); - assertEquals("The " + i - + " node returned does not have the expected id", - expectedNodeIds[i], item.getId()); - assertTrue("The " + i - + " node returned does not have the expected content", item - .getPayload().contains(expectedEntryContent[i])); + assertEquals("The " + i + + " node returned does not have the expected id", + expectedNodeIds[i], item.getId()); + assertTrue("The " + i + + " node returned does not have the expected content", item + .getPayload().contains(expectedEntryContent[i])); - ++i; - } + ++i; + } - assertEquals("Too few items returned", expectedNodeIds.length, i); - assertFalse("Too many items were returned", result.hasNext()); - } + assertEquals("Too few items returned", expectedNodeIds.length, i); + assertFalse("Too many items were returned", result.hasNext()); + } - @Test - public void testGetNewNodeItemsForUserBetweenDatesWhenOutcast() - throws Exception { + @Test + public void testGetNewNodeItemsForUserBetweenDatesWhenOutcast() + throws Exception { - dbTester.loadData("node_1"); + dbTester.loadData("node_1"); - store.setUserAffiliation(TEST_SERVER1_NODE1_ID, TEST_SERVER1_USER1_JID, - Affiliations.outcast); + store.setUserAffiliation(TEST_SERVER1_NODE1_ID, TEST_SERVER1_USER1_JID, + Affiliations.outcast); - Iterator result = store.getNewNodeItemsForUser( - TEST_SERVER1_USER1_JID, new Date(0), new Date()); + Iterator result = store.getNewNodeItemsForUser( + TEST_SERVER1_USER1_JID, new Date(0), new Date()); - int i = 0; - while (result.hasNext()) - ++i; + int i = 0; + while (result.hasNext()) { + ++i; + } - assertEquals(0, i); - } + assertEquals(0, i); + } - @Test - public void testCountNodeItemsNonExistantNode() throws Exception { - dbTester.loadData("node_1"); + @Test + public void testCountNodeItemsNonExistantNode() throws Exception { + dbTester.loadData("node_1"); - int result = store.countNodeItems("iamanodewhichdoesntexist"); + int result = store.countNodeItems("iamanodewhichdoesntexist"); - assertEquals("Incorrect item count", 0, result); - } + assertEquals("Incorrect item count", 0, result); + } - @Test - public void testIsCachedNode() throws Exception { - dbTester.loadData("node_1"); + @Test + public void testIsCachedNode() throws Exception { + dbTester.loadData("node_1"); - boolean result = store.isCachedNode(TEST_SERVER1_NODE1_ID); + boolean result = store.isCachedNode(TEST_SERVER1_NODE1_ID); - assertEquals("Incorrect caching reported", true, result); - } + assertEquals("Incorrect caching reported", true, result); + } - @Test - public void testIsCachedNodeForNonCachedNode() throws Exception { - dbTester.loadData("node_1"); - boolean result = store.isCachedNode("iamanodewhichdoesntexist"); + @Test + public void testIsCachedNodeForNonCachedNode() throws Exception { + dbTester.loadData("node_1"); + boolean result = store.isCachedNode("iamanodewhichdoesntexist"); - assertEquals("Incorrect cached response", false, result); - } + assertEquals("Incorrect cached response", false, result); + } - @Test - public void testGetNodeItem() throws Exception { - dbTester.loadData("node_1"); + @Test + public void testGetNodeItem() throws Exception { + dbTester.loadData("node_1"); - NodeItem result = store.getNodeItem(TEST_SERVER1_NODE1_ID, - TEST_SERVER1_NODE1_ITEM1_ID); + NodeItem result = store.getNodeItem(TEST_SERVER1_NODE1_ID, + TEST_SERVER1_NODE1_ITEM1_ID); - assertEquals("Unexpected Node ID returned", - TEST_SERVER1_NODE1_ITEM1_ID, result.getId()); - assertTrue("Unexpected Node content returned", result.getPayload() - .contains(TEST_SERVER1_NODE1_ITEM1_CONTENT)); - } - - @Test - public void canUpdateUpdatedDateOfItem() throws Exception { - dbTester.loadData("node_1"); + assertEquals("Unexpected Node ID returned", + TEST_SERVER1_NODE1_ITEM1_ID, result.getId()); + assertTrue("Unexpected Node content returned", result.getPayload() + .contains(TEST_SERVER1_NODE1_ITEM1_CONTENT)); + } + + @Test + public void canUpdateUpdatedDateOfItem() throws Exception { + dbTester.loadData("node_1"); - NodeItem result = store.getNodeItem(TEST_SERVER1_NODE1_ID, - TEST_SERVER1_NODE1_ITEM1_ID); + NodeItem result = store.getNodeItem(TEST_SERVER1_NODE1_ID, + TEST_SERVER1_NODE1_ITEM1_ID); Date originalDate = result.getUpdated(); store.updateThreadParent(result.getNodeId(), result.getId()); result = store.getNodeItem(TEST_SERVER1_NODE1_ID, - TEST_SERVER1_NODE1_ITEM1_ID); + TEST_SERVER1_NODE1_ITEM1_ID); assertTrue(result.getUpdated().after(originalDate)); - } - - @Test - public void canGetItemReplies() throws Exception { - dbTester.loadData("node_1"); - NodeItem testItem = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a6", - new Date(), "payload", "a5", new Date()); - store.addNodeItem(testItem); - - ClosableIteratorImpl items = store.getNodeItemReplies( - TEST_SERVER1_NODE1_ID, "a5", null, -1); - - int count = 0; - NodeItem item = null; - while (items.hasNext()) { - ++count; - item = items.next(); - - } - assertEquals(1, count); - assertSameNodeItem(item, testItem); - } - - @Test - public void canGetItemRepliesWithResultSetManagement() throws Exception { - dbTester.loadData("node_1"); - NodeItem testItem1 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a6", - new Date(), "payload", "a5", new Date()); - NodeItem testItem2 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a7", - new Date(0), "payload", "a5", new Date()); - NodeItem testItem3 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a8", - new Date(100), "payload", "a5", new Date()); - NodeItem testItem4 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a9", - new Date(200), "payload", "/full-node-item-id-ref/a5", new Date()); - store.addNodeItem(testItem1); - store.addNodeItem(testItem2); - store.addNodeItem(testItem3); - store.addNodeItem(testItem4); - - ClosableIteratorImpl items = store.getNodeItemReplies( - TEST_SERVER1_NODE1_ID, "a5", "a7", 2); - - int count = 0; - ArrayList itemsResult = new ArrayList(); - while (items.hasNext()) { - ++count; - itemsResult.add(items.next()); - - } - assertEquals(2, count); - assertSameNodeItem(itemsResult.get(0), testItem4); - assertSameNodeItem(itemsResult.get(1), testItem1); - } - - @Test - public void canGetCountOfItemReplies() throws Exception { - dbTester.loadData("node_1"); - NodeItem testItem = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a6", - new Date(), "payload", "/full-node-item-id-ref/a5", new Date()); - store.addNodeItem(testItem); - - int items = store.getCountNodeItemReplies(TEST_SERVER1_NODE1_ID, "a5"); - assertEquals(1, items); - } - - @Test - public void canGetItemThread() throws Exception { - dbTester.loadData("node_1"); - NodeItem testItem = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a6", - new Date(), "payload", "/full-node-item-id-ref/a5", new Date()); - store.addNodeItem(testItem); - - ClosableIteratorImpl items = store.getNodeItemThread( - TEST_SERVER1_NODE1_ID, "a5", null, -1); - - int count = 0; - NodeItem item = null; - while (items.hasNext()) { - ++count; - item = items.next(); - - } - assertEquals(2, count); - assertSameNodeItem(item, testItem); - } - - - @Test - public void canGetItemThreadWithResultSetManagement() throws Exception { - dbTester.loadData("node_1"); - NodeItem testItemParent = new NodeItemImpl(TEST_SERVER1_NODE1_ID, - "a100", new Date(100), "payload parent", null, new Date()); - NodeItem testItem1 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a6", - new Date(20), "payload", "a100", new Date()); - NodeItem testItem2 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a7", - new Date(40), "payload", "a100", new Date()); - NodeItem testItem3 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "/full-node-item-id-ref/a8", - new Date(80), "payload", "a100", new Date()); - NodeItem testItem4 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a9", - new Date(160), "payload", "a100", new Date()); - store.addNodeItem(testItemParent); - store.addNodeItem(testItem1); - store.addNodeItem(testItem2); - store.addNodeItem(testItem3); - store.addNodeItem(testItem4); - - ClosableIteratorImpl items = store.getNodeItemThread( - TEST_SERVER1_NODE1_ID, "a100", "a7", 2); - - int count = 0; - ArrayList itemsResult = new ArrayList(); - while (items.hasNext()) { - ++count; - itemsResult.add(items.next()); - - } - assertEquals(2, count); - assertSameNodeItem(itemsResult.get(0), testItemParent); - assertSameNodeItem(itemsResult.get(1), testItem4); - } - - @Test - public void canGetCountOfItemThread() throws Exception { - dbTester.loadData("node_1"); - NodeItem testItem = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a6", - new Date(), "payload", "/full-node-item-id-ref/a5", new Date()); - store.addNodeItem(testItem); - - int items = store.getCountNodeThread(TEST_SERVER1_NODE1_ID, "a5"); - assertEquals(2, items); - } - - @Test - public void testAddNodeItem() throws Exception { - dbTester.loadData("node_1"); - - final String itemId = "test-item-id"; - final Timestamp updated = new Timestamp(System.currentTimeMillis()); - final String testContent = "Hello World"; - - NodeItem item = new NodeItemImpl(TEST_SERVER1_NODE1_ID, itemId, - updated, testContent); - store.addNodeItem(item); - - dbTester.assertions().assertTableContains("items", - new HashMap() { - { - put("node", TEST_SERVER1_NODE1_ID); - put("id", itemId); - put("updated", updated); - put("xml", testContent); - } - }); - } - - @Test - public void addNoteItemWithInReplyTo() throws Exception { - dbTester.loadData("node_1"); - - final String itemId = "test-item-id"; - final Timestamp updated = new Timestamp(System.currentTimeMillis()); - final String testContent = "Hello World"; - final String inReplyTo = "a5"; - - NodeItem item = new NodeItemImpl(TEST_SERVER1_NODE1_ID, itemId, - updated, testContent, "a5", new Date()); - store.addNodeItem(item); - - dbTester.assertions().assertTableContains("items", - new HashMap() { - { - put("node", TEST_SERVER1_NODE1_ID); - put("id", itemId); - put("updated", updated); - put("xml", testContent); - put("in_reply_to", inReplyTo); - } - }); - } - - @Test(expected = NodeStoreException.class) - public void testAddNodeItemWithExistingIdThrowsException() throws Exception { - dbTester.loadData("node_1"); - - final Date updated = new Date(System.currentTimeMillis()); - final String testContent = "Hello World"; - - NodeItem item = new NodeItemImpl(TEST_SERVER1_NODE1_ID, - TEST_SERVER1_NODE1_ITEM1_ID, updated, testContent); - store.addNodeItem(item); - } - - @Test - public void testUpdateNodeItem() throws Exception { - dbTester.loadData("node_1"); - - final Timestamp updated = new Timestamp(System.currentTimeMillis()); - final String testContent = "Hello World"; - - NodeItem item = new NodeItemImpl(TEST_SERVER1_NODE1_ID, - TEST_SERVER1_NODE1_ITEM1_ID, updated, testContent); - store.updateNodeItem(item); - - dbTester.assertions().assertTableContains("items", - new HashMap() { - { - put("node", TEST_SERVER1_NODE1_ID); - put("id", TEST_SERVER1_NODE1_ITEM1_ID); - put("updated", updated); - put("xml", testContent); - } - }); - } - - @Test(expected = ItemNotFoundException.class) - public void testUpdateNodeItemForNonExistantItemThrowsException() - throws Exception { - dbTester.loadData("node_1"); - - final String itemId = "test-item-id"; - final Timestamp updated = new Timestamp(System.currentTimeMillis()); - final String testContent = "Hello World"; - - NodeItem item = new NodeItemImpl(TEST_SERVER1_NODE1_ID, itemId, - updated, testContent); - store.updateNodeItem(item); - } - - @Test - public void testDeleteNodeItem() throws Exception { - dbTester.loadData("node_1"); - - store.deleteNodeItemById(TEST_SERVER1_NODE1_ID, - TEST_SERVER1_NODE1_ITEM1_ID); - - dbTester.assertions().assertTableContains("items", - new HashMap() { - { - put("node", TEST_SERVER1_NODE1_ID); - put("id", TEST_SERVER1_NODE1_ITEM1_ID); - } - }, 0); - } - - @Test(expected = ItemNotFoundException.class) - public void testDeleteNodeItemForNonExistantItemThrowsException() - throws Exception { - - dbTester.loadData("node_1"); - - store.deleteNodeItemById(TEST_SERVER1_NODE1_ID, "test-item-id"); - } - - @Test - public void testGetNodeListReturnsExpectedNodes() throws Exception { - dbTester.loadData("node_1"); - dbTester.loadData("node_2"); - assertEquals(2, store.getNodeList().size()); - } - - @Test - public void testPurgeNodeItemsDeletesNodeItems() throws Exception { - - dbTester.loadData("node_1"); - assertTrue(store.countNodeItems(TEST_SERVER1_NODE1_ID) > 0); - store.purgeNodeItems(TEST_SERVER1_NODE1_ID); - assertEquals(0, store.countNodeItems(TEST_SERVER1_NODE1_ID)); - } - - @Test - public void testPurgeNodeItemsDoesntDeleteItemsUnexpectedly() - throws Exception { - - dbTester.loadData("node_1"); - int itemCount = store.countNodeItems(TEST_SERVER1_NODE1_ID); - assertTrue(itemCount > 0); - store.purgeNodeItems(TEST_SERVER1_NODE2_ID); // <--- NODE **2** - assertEquals(itemCount, store.countNodeItems(TEST_SERVER1_NODE1_ID)); - } - - @Test - public void testGetIsCachedSubscriptionNodeReturnsFalseWhereThereAreNoSubscriptions() - throws Exception { - boolean cached = store.nodeHasSubscriptions(TEST_SERVER1_NODE1_ID); - assertEquals(false, cached); - } - - @Test(expected = IllegalArgumentException.class) - public void testFirehoseItemsThrowsExceptionIfNegativeLimitRequested() - throws Exception { - store.getFirehose(-1, null, false, TEST_SERVER1_HOSTNAME); - } - - @Test - public void testCanGetFirehoseItems() throws Exception { - dbTester.loadData("node_1"); - dbTester.loadData("node_2"); - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, "pubsub#access_model", - "open"); - store.setNodeConfValue(TEST_SERVER1_NODE2_ID, "pubsub#access_model", - "open"); - // Add a remote node - don't expect to see - HashMap remoteNodeConf = new HashMap(); - remoteNodeConf.put("pubsub#access_model", "open"); - store.addRemoteNode(TEST_SERVER2_NODE1_ID); - store.setNodeConf(TEST_SERVER2_NODE1_ID, remoteNodeConf); - // Add a private node - don't expect to see - HashMap privateNodeConf = new HashMap(); - privateNodeConf.put("pubsub#access_model", "subscribe"); - store.createNode(TEST_SERVER1_USER1_JID, TEST_SERVER1_NODE3_ID, - privateNodeConf); - store.addNodeItem(new NodeItemImpl(TEST_SERVER1_NODE3_ID, "1111", - new Date(), "")); - Thread.sleep(4); - CloseableIterator items = store.getFirehose(50, null, - false, TEST_SERVER1_HOSTNAME); - NodeItem item = null; - int count = 0; - while (items.hasNext()) { - item = items.next(); - ++count; - } - assertEquals(6, count); - } - - @Test - public void testCanGetFirehoseItemsIncludingPrivateAsAdminUser() - throws Exception { - dbTester.loadData("node_1"); - dbTester.loadData("node_2"); - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, AccessModel.FIELD_NAME, - AccessModels.open.toString()); - store.setNodeConfValue(TEST_SERVER1_NODE2_ID, AccessModel.FIELD_NAME, - AccessModels.open.toString()); - // Add a private node - *do* expect to see - HashMap privateNodeConf = new HashMap(); - privateNodeConf.put(AccessModel.FIELD_NAME, AccessModels.authorize.toString()); - store.createNode(TEST_SERVER1_USER1_JID, TEST_SERVER1_NODE3_ID, - privateNodeConf); - store.addNodeItem(new NodeItemImpl(TEST_SERVER1_NODE3_ID, "1111", - new Date(), "")); - // Add a remote node - don't expect to see - HashMap remoteNodeConf = new HashMap(); - remoteNodeConf.put(AccessModel.FIELD_NAME, AccessModels.open.toString()); - store.addRemoteNode(TEST_SERVER2_NODE1_ID); - store.setNodeConf(TEST_SERVER2_NODE1_ID, remoteNodeConf); - - CloseableIterator items = store.getFirehose(50, null, - true, TEST_SERVER1_HOSTNAME); - NodeItem item = null; - int count = 0; - while (items.hasNext()) { - item = items.next(); - ++count; - } - assertEquals(7, count); - } - - @Test - @Ignore("Ordering by timestamp isn't happening here. Return to later") - public void testCanGetFirehoseItemsWithRsm() throws Exception { - dbTester.loadData("node_1"); - dbTester.loadData("node_2"); - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, "pubsub#access_model", - "open"); - store.setNodeConfValue(TEST_SERVER1_NODE2_ID, "pubsub#access_model", - "open"); - // Add a private node - don't expect to see - HashMap privateNodeConf = new HashMap(); - privateNodeConf.put("pubsub#access_model", "subscribe"); - store.createNode(TEST_SERVER1_USER1_JID, TEST_SERVER1_NODE3_ID, - privateNodeConf); - store.addNodeItem(new NodeItemImpl(TEST_SERVER1_NODE3_ID, "1111", - new Date(), "")); - - // Add a remote node - don't expect to see - HashMap remoteNodeConf = new HashMap(); - remoteNodeConf.put("pubsub#access_model", "open"); - store.addRemoteNode(TEST_SERVER2_NODE1_ID); - store.setNodeConf(TEST_SERVER2_NODE1_ID, remoteNodeConf); - - CloseableIterator items = store.getFirehose(2, "a3", - false, TEST_SERVER1_HOSTNAME); - NodeItem item1 = items.next(); - NodeItem item2 = items.next(); - assertFalse(items.hasNext()); - assertEquals("a4", item1.getId()); - assertEquals("node2:1", item2.getId()); - assertEquals(TEST_SERVER1_NODE1_ID, item1.getNodeId()); - assertEquals(TEST_SERVER1_NODE2_ID, item2.getNodeId()); - } - - @Test - public void testCanGetFirehoseItemCount() throws Exception { - dbTester.loadData("node_1"); - dbTester.loadData("node_2"); - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, "pubsub#access_model", - "open"); - store.setNodeConfValue(TEST_SERVER1_NODE2_ID, "pubsub#access_model", - "open"); - // Add a private node - *do* expect to see - HashMap privateNodeConf = new HashMap(); - privateNodeConf.put("pubsub#access_model", "subscribe"); - store.createNode(TEST_SERVER1_USER1_JID, TEST_SERVER1_NODE3_ID, - privateNodeConf); - store.addNodeItem(new NodeItemImpl(TEST_SERVER1_NODE3_ID, "1111", - new Date(), "")); - // Add a remote node - don't expect to see - HashMap remoteNodeConf = new HashMap(); - remoteNodeConf.put("pubsub#access_model", "open"); - store.addRemoteNode(TEST_SERVER2_NODE1_ID); - store.setNodeConf(TEST_SERVER2_NODE1_ID, remoteNodeConf); - assertEquals(6, store.getFirehoseItemCount(false, TEST_SERVER1_HOSTNAME)); - } - - @Test - public void testCanGetFirehostItemCountWithPrivateItemsAsAdmin() - throws Exception { - dbTester.loadData("node_1"); - dbTester.loadData("node_2"); - store.setNodeConfValue(TEST_SERVER1_NODE1_ID, "pubsub#access_model", - "open"); - store.setNodeConfValue(TEST_SERVER1_NODE2_ID, "pubsub#access_model", - "open"); - // Add a private node - *do* expect to see - HashMap privateNodeConf = new HashMap(); - privateNodeConf.put("pubsub#access_model", "subscribe"); - store.createNode(TEST_SERVER1_USER1_JID, TEST_SERVER1_NODE3_ID, - privateNodeConf); - store.addNodeItem(new NodeItemImpl(TEST_SERVER1_NODE3_ID, "1111", - new Date(), "")); - // Add a remote node - don't expect to see - HashMap remoteNodeConf = new HashMap(); - remoteNodeConf.put("pubsub#access_model", "open"); - store.addRemoteNode(TEST_SERVER2_NODE1_ID); - store.setNodeConf(TEST_SERVER2_NODE1_ID, remoteNodeConf); - assertEquals(7, store.getFirehoseItemCount(true, TEST_SERVER1_HOSTNAME)); - } - - @Test - public void testOnlySeeSearchResultsFromSubscribedPostsNodes() throws Exception { - dbTester.loadData("search-test-1"); - CloseableIterator items = store.performSearch( - new JID("user1@server1"), new ArrayList(), new JID("author@server1"), 1, 25 - ); - int counter = 0; - while (items.hasNext()) { - ++counter; - NodeItem item = items.next(); - assertEquals("a1", item.getId()); - assertEquals("/users/subscribed@server1/posts", item.getNodeId()); - } - assertEquals(1, counter); - } - - @Test - public void testOnlySeeSearchResultsFromRequestedAuthor() throws Exception { - dbTester.loadData("search-test-2"); - CloseableIterator items = store.performSearch( - new JID("user1@server1"), new ArrayList(), new JID("author@server1"), 1, 25 - ); - int counter = 0; - NodeItem item; - while (items.hasNext()) { - ++counter; - item = items.next(); - if (1 == counter) { - assertEquals("b1", item.getId()); - assertEquals("/users/another-subscribed@server1/posts", item.getNodeId()); - } else if (2 == counter) { - assertEquals("a1", item.getId()); - assertEquals("/users/subscribed@server1/posts", item.getNodeId()); - } - } - assertEquals(2, counter); - } - - @Test - public void testOnlySeeSearchResultsWithSpecificContent() throws Exception { - dbTester.loadData("search-test-3"); - - ArrayList searchTerms = new ArrayList(); - searchTerms.add("keyword"); - searchTerms.add("post"); - - CloseableIterator items = store.performSearch( - new JID("user1@server1"), searchTerms, new JID("author@server1"), 1, 25 - ); - int counter = 0; - NodeItem item; - while (items.hasNext()) { - ++counter; - item = items.next(); - if (1 == counter) { - assertEquals("a3", item.getId()); - assertEquals("/users/subscribed@server1/posts", item.getNodeId()); - } else if (2 == counter) { - assertEquals("a1", item.getId()); - assertEquals("/users/subscribed@server1/posts", item.getNodeId()); - } - } - assertEquals(2, counter); - } - - @Test - public void testOnlySeeSearchResultsWithSpecificContentAndAuthor() throws Exception { - dbTester.loadData("search-test-4"); - - ArrayList searchTerms = new ArrayList(); - searchTerms.add("keyword"); - searchTerms.add("post"); - - CloseableIterator items = store.performSearch( - new JID("user1@server1"), searchTerms, new JID("author@server1"), 1, 25 - ); - int counter = 0; - NodeItem item; - while (items.hasNext()) { - ++counter; - item = items.next(); - if (1 == counter) { - assertEquals("a3", item.getId()); - assertEquals("/users/subscribed@server1/posts", item.getNodeId()); - } else if (2 == counter) { - assertEquals("a1", item.getId()); - assertEquals("/users/subscribed@server1/posts", item.getNodeId()); - } - } - assertEquals(2, counter); - } - - @Test - public void testBeginTransaction() throws Exception { - Connection conn = Mockito.mock(Connection.class); - JDBCNodeStore store = new JDBCNodeStore(conn, - mock(NodeStoreSQLDialect.class)); - - NodeStore.Transaction t = store.beginTransaction(); - - assertNotNull("Null transaction returned", t); - - verify(conn).setAutoCommit(false); - } - - @Test - public void testCommitTransaction() throws Exception { - Connection conn = Mockito.mock(Connection.class); - JDBCNodeStore store = new JDBCNodeStore(conn, - mock(NodeStoreSQLDialect.class)); - - NodeStore.Transaction t = store.beginTransaction(); - t.commit(); - - verify(conn).commit(); - verify(conn).setAutoCommit(true); - } - - @Test - public void testCloseTransaction() throws Exception { - Connection conn = Mockito.mock(Connection.class); - JDBCNodeStore store = new JDBCNodeStore(conn, - mock(NodeStoreSQLDialect.class)); - - NodeStore.Transaction t = store.beginTransaction(); - t.close(); - - verify(conn, never()).commit(); - verify(conn).rollback(); - verify(conn).setAutoCommit(true); - } - - @Test - public void testCloseOnAlreadyCommittedTransactionDoesntRollback() - throws Exception { - Connection conn = Mockito.mock(Connection.class); - JDBCNodeStore store = new JDBCNodeStore(conn, - mock(NodeStoreSQLDialect.class)); - - NodeStore.Transaction t = store.beginTransaction(); - t.commit(); - - t.close(); - - verify(conn, never()).rollback(); - } - - @Test - public void testNestedTransactionsOnlySetAutoCommitOnce() throws Exception { - Connection conn = Mockito.mock(Connection.class); - JDBCNodeStore store = new JDBCNodeStore(conn, - mock(NodeStoreSQLDialect.class)); - - store.beginTransaction(); - - // Make sure setAutoCommit was called - verify(conn).setAutoCommit(false); - - store.beginTransaction(); - store.beginTransaction(); - - // Make sure setAutoCommit was still only called once - verify(conn).setAutoCommit(false); - } - - @Test - public void testNestedTransactionsOnlyCallCommitOnOuterTransaction() - throws Exception { - Connection conn = Mockito.mock(Connection.class); - JDBCNodeStore store = new JDBCNodeStore(conn, - mock(NodeStoreSQLDialect.class)); - - InOrder inOrder = inOrder(conn); - - NodeStore.Transaction t1 = store.beginTransaction(); - NodeStore.Transaction t2 = store.beginTransaction(); - NodeStore.Transaction t3 = store.beginTransaction(); - - t3.commit(); - verify(conn, never()).commit(); // Make sure that commit isn't called - // until the outer transaction is - // committed - - t2.commit(); - verify(conn, never()).commit(); // Make sure that commit isn't called - // until the outer transaction is - // committed - - t1.commit(); - - inOrder.verify(conn).commit(); // Make sure that commit was called - inOrder.verify(conn).setAutoCommit(true); - } - - @Test(expected = IllegalStateException.class) - public void testNestedTransactionsWithRollbackInMiddle() throws Exception { - Connection conn = Mockito.mock(Connection.class); - JDBCNodeStore store = new JDBCNodeStore(conn, - mock(NodeStoreSQLDialect.class)); - - NodeStore.Transaction t1 = store.beginTransaction(); - NodeStore.Transaction t2 = store.beginTransaction(); - NodeStore.Transaction t3 = store.beginTransaction(); - - t3.commit(); - t2.close(); - t1.commit(); - } - - @Test(expected = IllegalStateException.class) - public void testNestedTransactionsWithOutOfOrderCommitsThrowsException() - throws Exception { - Connection conn = Mockito.mock(Connection.class); - JDBCNodeStore store = new JDBCNodeStore(conn, - mock(NodeStoreSQLDialect.class)); - - NodeStore.Transaction t1 = store.beginTransaction(); - NodeStore.Transaction t2 = store.beginTransaction(); - NodeStore.Transaction t3 = store.beginTransaction(); - - t3.commit(); - t1.commit(); // t1 must not be committed before t2 - t2.commit(); - } - - @Test - public void testSelectNodeThreads() throws Exception { - dbTester.loadData("node_1"); - assertEquals(5, store.getNodeThreads(TEST_SERVER1_NODE1_ID, null, 10) - .size()); - } - - @Test - public void testCountNodeThreads() throws Exception { - dbTester.loadData("node_1"); - assertEquals(5, store.countNodeThreads(TEST_SERVER1_NODE1_ID)); - } - - @Test - public void testNoNodeOwnersReturnsEmptyList() throws Exception { - dbTester.loadData("node_1"); - assertEquals(0, store.getNodeOwners(UNKNOWN_NODE).size()); - } - - @Test - public void testNodeOwnersReturnsExpectedList() throws Exception { - dbTester.loadData("node_1"); - - store.addUserSubscription(new NodeSubscriptionImpl(TEST_SERVER1_NODE1_ID, TEST_SERVER1_USER2_JID, Subscriptions.subscribed, null)); - store.setUserAffiliation(TEST_SERVER1_NODE1_ID, TEST_SERVER1_USER2_JID, Affiliations.owner); - - assertEquals(2, store.getNodeOwners(TEST_SERVER1_NODE1_ID).size()); - assertEquals(TEST_SERVER1_USER1_JID, store.getNodeOwners(TEST_SERVER1_NODE1_ID).get(0)); - assertEquals(TEST_SERVER1_USER2_JID, store.getNodeOwners(TEST_SERVER1_NODE1_ID).get(1)); - } - - @Test - public void notPreviousRatingByUserReturnsFalse() throws Exception { - - String node = "/users/romeo@capulet.lit/posts"; - store.addRemoteNode(node); - - String content = "" + - "" + - "tag:channels.capulet.lit,/users/romeo@capulet.lit/posts,6" + - "Post title" + - "2014-01-01T00:00:00.000Z" + - "2014-01-01T00:00:00.000Z" + - "" + - "romeo@capulet.lit" + - "acct:romeo@capulet.lit" + - "romeo@capulet.lit" + - "" + - "rating:5.0" + - "rated" + - "" + - "comment" + - "" + - "" + - "" + - "tag:channels.capulet.lit,/users/romeo@capulet.lit/posts,5" + - "" + - "5.0" + - ""; - String alternativeContent = "" + - "" + - "tag:channels.capulet.lit,/users/romeo@capulet.lit/posts,7" + - "Post title" + - "2014-01-01T00:00:00.000Z" + - "rating:5.0" + - "rated" + - "" + - "comment" + - "" + - "" + - "" + - "tag:channels.capulet.lit,/users/romeo@capulet.lit/posts,5" + - "" + - "5.0" + - ""; - - NodeItem item1 = new NodeItemImpl(node, "6", new Date(), content); - store.addNodeItem(item1); - NodeItem item2 = new NodeItemImpl(node, "7", new Date(), alternativeContent); - store.addNodeItem(item2); - - Assert.assertFalse( - store.userHasRatedPost(node, new JID("romeo@capulet.lit"), new GlobalItemIDImpl(new JID("channels.capulet.lit"), node, "6")) - ); - } - - @Test - public void previousRatingByUserReturnsTrue() throws Exception { - - String node = "/users/romeo@capulet.lit/posts"; - store.addRemoteNode(node); - - String content = "" + - "" + - "tag:channels.capulet.lit,/users/romeo@capulet.lit/posts,6" + - "Post title" + - "2014-01-01T00:00:00.000Z" + - "2014-01-01T00:00:00.000Z" + - "" + - "romeo@capulet.lit" + - "acct:romeo@capulet.lit" + - "romeo@capulet.lit" + - "" + - "rating:5.0" + - "rated" + - "" + - "comment" + - "" + - "" + - "" + - "tag:channels.capulet.lit,/users/romeo@capulet.lit/posts,5" + - "" + - "5.0" + - ""; - String alternativeContent = "" + - "" + - "tag:channels.capulet.lit,/users/romeo@capulet.lit/posts,7" + - "Post title" + - "2014-01-01T00:00:00.000Z" + - "rating:5.0" + - "rated" + - "" + - "comment" + - "" + - "" + - "" + - "tag:channels.capulet.lit,/users/romeo@capulet.lit/posts,5" + - "" + - "5.0" + - ""; - - NodeItem item1 = new NodeItemImpl(node, "6", new Date(), content); - store.addNodeItem(item1); - NodeItem item2 = new NodeItemImpl(node, "7", new Date(), alternativeContent); - store.addNodeItem(item2); - - Assert.assertTrue( - store.userHasRatedPost(node, new JID("romeo@capulet.lit"), new GlobalItemIDImpl(new JID("channels.capulet.lit"), node, "5")) - ); - } - -} \ No newline at end of file + } + + @Test + public void canGetItemReplies() throws Exception { + dbTester.loadData("node_1"); + NodeItem testItem = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a6", + new Date(), "payload", "a5", new Date()); + store.addNodeItem(testItem); + + ClosableIteratorImpl items = store.getNodeItemReplies( + TEST_SERVER1_NODE1_ID, "a5", null, -1); + + int count = 0; + NodeItem item = null; + while (items.hasNext()) { + ++count; + item = items.next(); + + } + assertEquals(1, count); + assertSameNodeItem(item, testItem); + } + + @Test + public void canGetItemRepliesWithResultSetManagement() throws Exception { + dbTester.loadData("node_1"); + NodeItem testItem1 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a6", + new Date(), "payload", "a5", new Date()); + NodeItem testItem2 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a7", + new Date(0), "payload", "a5", new Date()); + NodeItem testItem3 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a8", + new Date(100), "payload", "a5", new Date()); + NodeItem testItem4 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a9", + new Date(200), "payload", "/full-node-item-id-ref/a5", new Date()); + store.addNodeItem(testItem1); + store.addNodeItem(testItem2); + store.addNodeItem(testItem3); + store.addNodeItem(testItem4); + + ClosableIteratorImpl items = store.getNodeItemReplies( + TEST_SERVER1_NODE1_ID, "a5", "a7", 2); + + int count = 0; + ArrayList itemsResult = new ArrayList(); + while (items.hasNext()) { + ++count; + itemsResult.add(items.next()); + + } + assertEquals(2, count); + assertSameNodeItem(itemsResult.get(0), testItem4); + assertSameNodeItem(itemsResult.get(1), testItem1); + } + + @Test + public void canGetCountOfItemReplies() throws Exception { + dbTester.loadData("node_1"); + NodeItem testItem = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a6", + new Date(), "payload", "/full-node-item-id-ref/a5", new Date()); + store.addNodeItem(testItem); + + int items = store.getCountNodeItemReplies(TEST_SERVER1_NODE1_ID, "a5"); + assertEquals(1, items); + } + + @Test + public void canGetItemThread() throws Exception { + dbTester.loadData("node_1"); + NodeItem testItem = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a6", + new Date(), "payload", "/full-node-item-id-ref/a5", new Date()); + store.addNodeItem(testItem); + + ClosableIteratorImpl items = store.getNodeItemThread( + TEST_SERVER1_NODE1_ID, "a5", null, -1); + + int count = 0; + NodeItem item = null; + while (items.hasNext()) { + ++count; + item = items.next(); + + } + assertEquals(2, count); + assertSameNodeItem(item, testItem); + } + + + @Test + public void canGetItemThreadWithResultSetManagement() throws Exception { + dbTester.loadData("node_1"); + NodeItem testItemParent = new NodeItemImpl(TEST_SERVER1_NODE1_ID, + "a100", new Date(100), "payload parent", null, new Date()); + NodeItem testItem1 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a6", + new Date(20), "payload", "a100", new Date()); + NodeItem testItem2 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a7", + new Date(40), "payload", "a100", new Date()); + NodeItem testItem3 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "/full-node-item-id-ref/a8", + new Date(80), "payload", "a100", new Date()); + NodeItem testItem4 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a9", + new Date(160), "payload", "a100", new Date()); + store.addNodeItem(testItemParent); + store.addNodeItem(testItem1); + store.addNodeItem(testItem2); + store.addNodeItem(testItem3); + store.addNodeItem(testItem4); + + ClosableIteratorImpl items = store.getNodeItemThread( + TEST_SERVER1_NODE1_ID, "a100", "a7", 2); + + int count = 0; + ArrayList itemsResult = new ArrayList(); + while (items.hasNext()) { + ++count; + itemsResult.add(items.next()); + + } + assertEquals(2, count); + assertSameNodeItem(itemsResult.get(0), testItemParent); + assertSameNodeItem(itemsResult.get(1), testItem4); + } + + @Test + public void canGetCountOfItemThread() throws Exception { + dbTester.loadData("node_1"); + NodeItem testItem = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "a6", + new Date(), "payload", "/full-node-item-id-ref/a5", new Date()); + store.addNodeItem(testItem); + + int items = store.getCountNodeThread(TEST_SERVER1_NODE1_ID, "a5"); + assertEquals(2, items); + } + + @Test + public void testAddNodeItem() throws Exception { + dbTester.loadData("node_1"); + + final String itemId = "test-item-id"; + final Timestamp updated = new Timestamp(System.currentTimeMillis()); + final String testContent = "Hello World"; + + NodeItem item = new NodeItemImpl(TEST_SERVER1_NODE1_ID, itemId, + updated, testContent); + store.addNodeItem(item); + + dbTester.assertions().assertTableContains("items", + new HashMap() { + { + put("node", TEST_SERVER1_NODE1_ID); + put("id", itemId); + put("updated", updated); + put("xml", testContent); + } + }); + } + + @Test + public void addNoteItemWithInReplyTo() throws Exception { + dbTester.loadData("node_1"); + + final String itemId = "test-item-id"; + final Timestamp updated = new Timestamp(System.currentTimeMillis()); + final String testContent = "Hello World"; + final String inReplyTo = "a5"; + + NodeItem item = new NodeItemImpl(TEST_SERVER1_NODE1_ID, itemId, + updated, testContent, "a5", new Date()); + store.addNodeItem(item); + + dbTester.assertions().assertTableContains("items", + new HashMap() { + { + put("node", TEST_SERVER1_NODE1_ID); + put("id", itemId); + put("updated", updated); + put("xml", testContent); + put("in_reply_to", inReplyTo); + } + }); + } + + @Test(expected = NodeStoreException.class) + public void testAddNodeItemWithExistingIdThrowsException() throws Exception { + dbTester.loadData("node_1"); + + final Date updated = new Date(System.currentTimeMillis()); + final String testContent = "Hello World"; + + NodeItem item = new NodeItemImpl(TEST_SERVER1_NODE1_ID, + TEST_SERVER1_NODE1_ITEM1_ID, updated, testContent); + store.addNodeItem(item); + } + + @Test + public void testUpdateNodeItem() throws Exception { + dbTester.loadData("node_1"); + + final Timestamp updated = new Timestamp(System.currentTimeMillis()); + final String testContent = "Hello World"; + + NodeItem item = new NodeItemImpl(TEST_SERVER1_NODE1_ID, + TEST_SERVER1_NODE1_ITEM1_ID, updated, testContent); + store.updateNodeItem(item); + + dbTester.assertions().assertTableContains("items", + new HashMap() { + { + put("node", TEST_SERVER1_NODE1_ID); + put("id", TEST_SERVER1_NODE1_ITEM1_ID); + put("updated", updated); + put("xml", testContent); + } + }); + } + + @Test(expected = ItemNotFoundException.class) + public void testUpdateNodeItemForNonExistantItemThrowsException() + throws Exception { + dbTester.loadData("node_1"); + + final String itemId = "test-item-id"; + final Timestamp updated = new Timestamp(System.currentTimeMillis()); + final String testContent = "Hello World"; + + NodeItem item = new NodeItemImpl(TEST_SERVER1_NODE1_ID, itemId, + updated, testContent); + store.updateNodeItem(item); + } + + @Test + public void testDeleteNodeItem() throws Exception { + dbTester.loadData("node_1"); + + store.deleteNodeItemById(TEST_SERVER1_NODE1_ID, + TEST_SERVER1_NODE1_ITEM1_ID); + + dbTester.assertions().assertTableContains("items", + new HashMap() { + { + put("node", TEST_SERVER1_NODE1_ID); + put("id", TEST_SERVER1_NODE1_ITEM1_ID); + } + }, 0); + } + + @Test(expected = ItemNotFoundException.class) + public void testDeleteNodeItemForNonExistantItemThrowsException() + throws Exception { + + dbTester.loadData("node_1"); + + store.deleteNodeItemById(TEST_SERVER1_NODE1_ID, "test-item-id"); + } + + @Test + public void testGetNodeListReturnsExpectedNodes() throws Exception { + dbTester.loadData("node_1"); + dbTester.loadData("node_2"); + assertEquals(2, store.getNodeList().size()); + } + + @Test + public void testPurgeNodeItemsDeletesNodeItems() throws Exception { + + dbTester.loadData("node_1"); + assertTrue(store.countNodeItems(TEST_SERVER1_NODE1_ID) > 0); + store.purgeNodeItems(TEST_SERVER1_NODE1_ID); + assertEquals(0, store.countNodeItems(TEST_SERVER1_NODE1_ID)); + } + + @Test + public void testPurgeNodeItemsDoesntDeleteItemsUnexpectedly() + throws Exception { + + dbTester.loadData("node_1"); + int itemCount = store.countNodeItems(TEST_SERVER1_NODE1_ID); + assertTrue(itemCount > 0); + store.purgeNodeItems(TEST_SERVER1_NODE2_ID); // <--- NODE **2** + assertEquals(itemCount, store.countNodeItems(TEST_SERVER1_NODE1_ID)); + } + + @Test + public void testGetIsCachedSubscriptionNodeReturnsFalseWhereThereAreNoSubscriptions() + throws Exception { + boolean cached = store.nodeHasSubscriptions(TEST_SERVER1_NODE1_ID); + assertEquals(false, cached); + } + + @Test(expected = IllegalArgumentException.class) + public void testFirehoseItemsThrowsExceptionIfNegativeLimitRequested() + throws Exception { + store.getFirehose(-1, null, false, TEST_SERVER1_HOSTNAME); + } + + @Test + public void testCanGetFirehoseItems() throws Exception { + dbTester.loadData("node_1"); + dbTester.loadData("node_2"); + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, "pubsub#access_model", + "open"); + store.setNodeConfValue(TEST_SERVER1_NODE2_ID, "pubsub#access_model", + "open"); + // Add a remote node - don't expect to see + HashMap remoteNodeConf = new HashMap(); + remoteNodeConf.put("pubsub#access_model", "open"); + store.addRemoteNode(TEST_SERVER2_NODE1_ID); + store.setNodeConf(TEST_SERVER2_NODE1_ID, remoteNodeConf); + // Add a private node - don't expect to see + HashMap privateNodeConf = new HashMap(); + privateNodeConf.put("pubsub#access_model", "subscribe"); + store.createNode(TEST_SERVER1_USER1_JID, TEST_SERVER1_NODE3_ID, + privateNodeConf); + store.addNodeItem(new NodeItemImpl(TEST_SERVER1_NODE3_ID, "1111", + new Date(), "")); + Thread.sleep(4); + CloseableIterator items = store.getFirehose(50, null, + false, TEST_SERVER1_HOSTNAME); + NodeItem item = null; + int count = 0; + while (items.hasNext()) { + item = items.next(); + ++count; + } + assertEquals(6, count); + } + + @Test + public void testCanGetFirehoseItemsIncludingPrivateAsAdminUser() + throws Exception { + dbTester.loadData("node_1"); + dbTester.loadData("node_2"); + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, AccessModel.FIELD_NAME, + AccessModels.open.toString()); + store.setNodeConfValue(TEST_SERVER1_NODE2_ID, AccessModel.FIELD_NAME, + AccessModels.open.toString()); + // Add a private node - *do* expect to see + HashMap privateNodeConf = new HashMap(); + privateNodeConf.put(AccessModel.FIELD_NAME, AccessModels.authorize.toString()); + store.createNode(TEST_SERVER1_USER1_JID, TEST_SERVER1_NODE3_ID, + privateNodeConf); + store.addNodeItem(new NodeItemImpl(TEST_SERVER1_NODE3_ID, "1111", + new Date(), "")); + // Add a remote node - don't expect to see + HashMap remoteNodeConf = new HashMap(); + remoteNodeConf.put(AccessModel.FIELD_NAME, AccessModels.open.toString()); + store.addRemoteNode(TEST_SERVER2_NODE1_ID); + store.setNodeConf(TEST_SERVER2_NODE1_ID, remoteNodeConf); + + CloseableIterator items = store.getFirehose(50, null, + true, TEST_SERVER1_HOSTNAME); + NodeItem item = null; + int count = 0; + while (items.hasNext()) { + item = items.next(); + ++count; + } + assertEquals(7, count); + } + + @Test + @Ignore("Ordering by timestamp isn't happening here. Return to later") + public void testCanGetFirehoseItemsWithRsm() throws Exception { + dbTester.loadData("node_1"); + dbTester.loadData("node_2"); + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, "pubsub#access_model", + "open"); + store.setNodeConfValue(TEST_SERVER1_NODE2_ID, "pubsub#access_model", + "open"); + // Add a private node - don't expect to see + HashMap privateNodeConf = new HashMap(); + privateNodeConf.put("pubsub#access_model", "subscribe"); + store.createNode(TEST_SERVER1_USER1_JID, TEST_SERVER1_NODE3_ID, + privateNodeConf); + store.addNodeItem(new NodeItemImpl(TEST_SERVER1_NODE3_ID, "1111", + new Date(), "")); + + // Add a remote node - don't expect to see + HashMap remoteNodeConf = new HashMap(); + remoteNodeConf.put("pubsub#access_model", "open"); + store.addRemoteNode(TEST_SERVER2_NODE1_ID); + store.setNodeConf(TEST_SERVER2_NODE1_ID, remoteNodeConf); + + CloseableIterator items = store.getFirehose(2, "a3", + false, TEST_SERVER1_HOSTNAME); + NodeItem item1 = items.next(); + NodeItem item2 = items.next(); + assertFalse(items.hasNext()); + assertEquals("a4", item1.getId()); + assertEquals("node2:1", item2.getId()); + assertEquals(TEST_SERVER1_NODE1_ID, item1.getNodeId()); + assertEquals(TEST_SERVER1_NODE2_ID, item2.getNodeId()); + } + + @Test + public void testCanGetFirehoseItemCount() throws Exception { + dbTester.loadData("node_1"); + dbTester.loadData("node_2"); + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, "pubsub#access_model", + "open"); + store.setNodeConfValue(TEST_SERVER1_NODE2_ID, "pubsub#access_model", + "open"); + // Add a private node - *do* expect to see + HashMap privateNodeConf = new HashMap(); + privateNodeConf.put("pubsub#access_model", "subscribe"); + store.createNode(TEST_SERVER1_USER1_JID, TEST_SERVER1_NODE3_ID, + privateNodeConf); + store.addNodeItem(new NodeItemImpl(TEST_SERVER1_NODE3_ID, "1111", + new Date(), "")); + // Add a remote node - don't expect to see + HashMap remoteNodeConf = new HashMap(); + remoteNodeConf.put("pubsub#access_model", "open"); + store.addRemoteNode(TEST_SERVER2_NODE1_ID); + store.setNodeConf(TEST_SERVER2_NODE1_ID, remoteNodeConf); + assertEquals(6, store.getFirehoseItemCount(false, TEST_SERVER1_HOSTNAME)); + } + + @Test + public void testCanGetFirehostItemCountWithPrivateItemsAsAdmin() + throws Exception { + dbTester.loadData("node_1"); + dbTester.loadData("node_2"); + store.setNodeConfValue(TEST_SERVER1_NODE1_ID, "pubsub#access_model", + "open"); + store.setNodeConfValue(TEST_SERVER1_NODE2_ID, "pubsub#access_model", + "open"); + // Add a private node - *do* expect to see + HashMap privateNodeConf = new HashMap(); + privateNodeConf.put("pubsub#access_model", "subscribe"); + store.createNode(TEST_SERVER1_USER1_JID, TEST_SERVER1_NODE3_ID, + privateNodeConf); + store.addNodeItem(new NodeItemImpl(TEST_SERVER1_NODE3_ID, "1111", + new Date(), "")); + // Add a remote node - don't expect to see + HashMap remoteNodeConf = new HashMap(); + remoteNodeConf.put("pubsub#access_model", "open"); + store.addRemoteNode(TEST_SERVER2_NODE1_ID); + store.setNodeConf(TEST_SERVER2_NODE1_ID, remoteNodeConf); + assertEquals(7, store.getFirehoseItemCount(true, TEST_SERVER1_HOSTNAME)); + } + + @Test + public void testOnlySeeSearchResultsFromSubscribedPostsNodes() throws Exception { + dbTester.loadData("search-test-1"); + CloseableIterator items = store.performSearch( + new JID("user1@server1"), new ArrayList(), new JID("author@server1"), 1, 25 + ); + int counter = 0; + while (items.hasNext()) { + ++counter; + NodeItem item = items.next(); + assertEquals("a1", item.getId()); + assertEquals("/users/subscribed@server1/posts", item.getNodeId()); + } + assertEquals(1, counter); + } + + @Test + public void testOnlySeeSearchResultsFromRequestedAuthor() throws Exception { + dbTester.loadData("search-test-2"); + CloseableIterator items = store.performSearch( + new JID("user1@server1"), new ArrayList(), new JID("author@server1"), 1, 25 + ); + int counter = 0; + NodeItem item; + while (items.hasNext()) { + ++counter; + item = items.next(); + if (1 == counter) { + assertEquals("b1", item.getId()); + assertEquals("/users/another-subscribed@server1/posts", item.getNodeId()); + } else if (2 == counter) { + assertEquals("a1", item.getId()); + assertEquals("/users/subscribed@server1/posts", item.getNodeId()); + } + } + assertEquals(2, counter); + } + + @Test + public void testOnlySeeSearchResultsWithSpecificContent() throws Exception { + dbTester.loadData("search-test-3"); + + ArrayList searchTerms = new ArrayList(); + searchTerms.add("keyword"); + searchTerms.add("post"); + + CloseableIterator items = store.performSearch( + new JID("user1@server1"), searchTerms, new JID("author@server1"), 1, 25 + ); + int counter = 0; + NodeItem item; + while (items.hasNext()) { + ++counter; + item = items.next(); + if (1 == counter) { + assertEquals("a3", item.getId()); + assertEquals("/users/subscribed@server1/posts", item.getNodeId()); + } else if (2 == counter) { + assertEquals("a1", item.getId()); + assertEquals("/users/subscribed@server1/posts", item.getNodeId()); + } + } + assertEquals(2, counter); + } + + @Test + public void testOnlySeeSearchResultsWithSpecificContentAndAuthor() throws Exception { + dbTester.loadData("search-test-4"); + + ArrayList searchTerms = new ArrayList(); + searchTerms.add("keyword"); + searchTerms.add("post"); + + CloseableIterator items = store.performSearch( + new JID("user1@server1"), searchTerms, new JID("author@server1"), 1, 25 + ); + int counter = 0; + NodeItem item; + while (items.hasNext()) { + ++counter; + item = items.next(); + if (1 == counter) { + assertEquals("a3", item.getId()); + assertEquals("/users/subscribed@server1/posts", item.getNodeId()); + } else if (2 == counter) { + assertEquals("a1", item.getId()); + assertEquals("/users/subscribed@server1/posts", item.getNodeId()); + } + } + assertEquals(2, counter); + } + + @Test + public void testBeginTransaction() throws Exception { + Connection conn = Mockito.mock(Connection.class); + JDBCNodeStore store = new JDBCNodeStore(conn, + mock(NodeStoreSQLDialect.class)); + + NodeStore.Transaction t = store.beginTransaction(); + + assertNotNull("Null transaction returned", t); + + verify(conn).setAutoCommit(false); + } + + @Test + public void testCommitTransaction() throws Exception { + Connection conn = Mockito.mock(Connection.class); + JDBCNodeStore store = new JDBCNodeStore(conn, + mock(NodeStoreSQLDialect.class)); + + NodeStore.Transaction t = store.beginTransaction(); + t.commit(); + + verify(conn).commit(); + verify(conn).setAutoCommit(true); + } + + @Test + public void testCloseTransaction() throws Exception { + Connection conn = Mockito.mock(Connection.class); + JDBCNodeStore store = new JDBCNodeStore(conn, + mock(NodeStoreSQLDialect.class)); + + NodeStore.Transaction t = store.beginTransaction(); + t.close(); + + verify(conn, never()).commit(); + verify(conn).rollback(); + verify(conn).setAutoCommit(true); + } + + @Test + public void testCloseOnAlreadyCommittedTransactionDoesntRollback() + throws Exception { + Connection conn = Mockito.mock(Connection.class); + JDBCNodeStore store = new JDBCNodeStore(conn, + mock(NodeStoreSQLDialect.class)); + + NodeStore.Transaction t = store.beginTransaction(); + t.commit(); + + t.close(); + + verify(conn, never()).rollback(); + } + + @Test + public void testNestedTransactionsOnlySetAutoCommitOnce() throws Exception { + Connection conn = Mockito.mock(Connection.class); + JDBCNodeStore store = new JDBCNodeStore(conn, + mock(NodeStoreSQLDialect.class)); + + store.beginTransaction(); + + // Make sure setAutoCommit was called + verify(conn).setAutoCommit(false); + + store.beginTransaction(); + store.beginTransaction(); + + // Make sure setAutoCommit was still only called once + verify(conn).setAutoCommit(false); + } + + @Test + public void testNestedTransactionsOnlyCallCommitOnOuterTransaction() + throws Exception { + Connection conn = Mockito.mock(Connection.class); + JDBCNodeStore store = new JDBCNodeStore(conn, + mock(NodeStoreSQLDialect.class)); + + InOrder inOrder = inOrder(conn); + + NodeStore.Transaction t1 = store.beginTransaction(); + NodeStore.Transaction t2 = store.beginTransaction(); + NodeStore.Transaction t3 = store.beginTransaction(); + + t3.commit(); + verify(conn, never()).commit(); // Make sure that commit isn't called + // until the outer transaction is + // committed + + t2.commit(); + verify(conn, never()).commit(); // Make sure that commit isn't called + // until the outer transaction is + // committed + + t1.commit(); + + inOrder.verify(conn).commit(); // Make sure that commit was called + inOrder.verify(conn).setAutoCommit(true); + } + + @Test(expected = IllegalStateException.class) + public void testNestedTransactionsWithRollbackInMiddle() throws Exception { + Connection conn = Mockito.mock(Connection.class); + JDBCNodeStore store = new JDBCNodeStore(conn, + mock(NodeStoreSQLDialect.class)); + + NodeStore.Transaction t1 = store.beginTransaction(); + NodeStore.Transaction t2 = store.beginTransaction(); + NodeStore.Transaction t3 = store.beginTransaction(); + + t3.commit(); + t2.close(); + t1.commit(); + } + + @Test(expected = IllegalStateException.class) + public void testNestedTransactionsWithOutOfOrderCommitsThrowsException() + throws Exception { + Connection conn = Mockito.mock(Connection.class); + JDBCNodeStore store = new JDBCNodeStore(conn, + mock(NodeStoreSQLDialect.class)); + + NodeStore.Transaction t1 = store.beginTransaction(); + NodeStore.Transaction t2 = store.beginTransaction(); + NodeStore.Transaction t3 = store.beginTransaction(); + + t3.commit(); + t1.commit(); // t1 must not be committed before t2 + t2.commit(); + } + + @Test + public void testSelectNodeThreads() throws Exception { + dbTester.loadData("node_1"); + assertEquals(5, store.getNodeThreads(TEST_SERVER1_NODE1_ID, null, 10) + .size()); + } + + @Test + public void testCountNodeThreads() throws Exception { + dbTester.loadData("node_1"); + assertEquals(5, store.countNodeThreads(TEST_SERVER1_NODE1_ID)); + } + + @Test + public void testNoNodeOwnersReturnsEmptyList() throws Exception { + dbTester.loadData("node_1"); + assertEquals(0, store.getNodeOwners(UNKNOWN_NODE).size()); + } + + @Test + public void testNodeOwnersReturnsExpectedList() throws Exception { + dbTester.loadData("node_1"); + + store.addUserSubscription(new NodeSubscriptionImpl(TEST_SERVER1_NODE1_ID, TEST_SERVER1_USER2_JID, Subscriptions.subscribed, null)); + store.setUserAffiliation(TEST_SERVER1_NODE1_ID, TEST_SERVER1_USER2_JID, Affiliations.owner); + + assertEquals(2, store.getNodeOwners(TEST_SERVER1_NODE1_ID).size()); + assertEquals(TEST_SERVER1_USER1_JID, store.getNodeOwners(TEST_SERVER1_NODE1_ID).get(0)); + assertEquals(TEST_SERVER1_USER2_JID, store.getNodeOwners(TEST_SERVER1_NODE1_ID).get(1)); + } + + @Test + public void notPreviousRatingByUserReturnsFalse() throws Exception { + + String node = "/users/romeo@capulet.lit/posts"; + store.addRemoteNode(node); + + String content = "" + + "" + + "tag:channels.capulet.lit,/users/romeo@capulet.lit/posts,6" + + "Post title" + + "2014-01-01T00:00:00.000Z" + + "2014-01-01T00:00:00.000Z" + + "" + + "romeo@capulet.lit" + + "acct:romeo@capulet.lit" + + "romeo@capulet.lit" + + "" + + "rating:5.0" + + "rated" + + "" + + "comment" + + "" + + "" + + "" + + "tag:channels.capulet.lit,/users/romeo@capulet.lit/posts,5" + + "" + + "5.0" + + ""; + String alternativeContent = "" + + "" + + "tag:channels.capulet.lit,/users/romeo@capulet.lit/posts,7" + + "Post title" + + "2014-01-01T00:00:00.000Z" + + "rating:5.0" + + "rated" + + "" + + "comment" + + "" + + "" + + "" + + "tag:channels.capulet.lit,/users/romeo@capulet.lit/posts,5" + + "" + + "5.0" + + ""; + + NodeItem item1 = new NodeItemImpl(node, "6", new Date(), content); + store.addNodeItem(item1); + NodeItem item2 = new NodeItemImpl(node, "7", new Date(), alternativeContent); + store.addNodeItem(item2); + + Assert.assertFalse( + store.userHasRatedPost(node, new JID("romeo@capulet.lit"), new GlobalItemIDImpl(new JID("channels.capulet.lit"), node, "6")) + ); + } + + @Test + public void previousRatingByUserReturnsTrue() throws Exception { + + String node = "/users/romeo@capulet.lit/posts"; + store.addRemoteNode(node); + + String content = "" + + "" + + "tag:channels.capulet.lit,/users/romeo@capulet.lit/posts,6" + + "Post title" + + "2014-01-01T00:00:00.000Z" + + "2014-01-01T00:00:00.000Z" + + "" + + "romeo@capulet.lit" + + "acct:romeo@capulet.lit" + + "romeo@capulet.lit" + + "" + + "rating:5.0" + + "rated" + + "" + + "comment" + + "" + + "" + + "" + + "tag:channels.capulet.lit,/users/romeo@capulet.lit/posts,5" + + "" + + "5.0" + + ""; + String alternativeContent = "" + + "" + + "tag:channels.capulet.lit,/users/romeo@capulet.lit/posts,7" + + "Post title" + + "2014-01-01T00:00:00.000Z" + + "rating:5.0" + + "rated" + + "" + + "comment" + + "" + + "" + + "" + + "tag:channels.capulet.lit,/users/romeo@capulet.lit/posts,5" + + "" + + "5.0" + + ""; + + NodeItem item1 = new NodeItemImpl(node, "6", new Date(), content); + store.addNodeItem(item1); + NodeItem item2 = new NodeItemImpl(node, "7", new Date(), alternativeContent); + store.addNodeItem(item2); + + Assert.assertTrue( + store.userHasRatedPost(node, new JID("romeo@capulet.lit"), new GlobalItemIDImpl(new JID("channels.capulet.lit"), node, "5")) + ); + } +} diff --git a/src/test/java/org/buddycloud/channelserver/packetHandler/iq/TestHandler.java b/src/test/java/org/buddycloud/channelserver/packetHandler/iq/TestHandler.java index 63f9932c..a7b947c4 100644 --- a/src/test/java/org/buddycloud/channelserver/packetHandler/iq/TestHandler.java +++ b/src/test/java/org/buddycloud/channelserver/packetHandler/iq/TestHandler.java @@ -14,16 +14,15 @@ import org.xmpp.packet.IQ; public class TestHandler { - - public final static String STANZA_PATH = "src/test/resources/stanzas"; - private final static String CONFIGURATION_PROPERTIES = "src/test/resources/configuration.properties"; - public final static String LOGGER_PROPERTIES = "src/test/resources/log4j.properties"; + public static final String STANZA_PATH = "src/test/resources/stanzas"; + + private static final String CONFIGURATION_PROPERTIES = "src/test/resources/configuration.properties"; + public static final String LOGGER_PROPERTIES = "src/test/resources/log4j.properties"; public static Properties readConf() - throws FileNotFoundException, IOException - { - Configuration.reset(); + throws FileNotFoundException, IOException { + Configuration.reset(); Configuration conf = Configuration.getInstance(); try { conf.load(new FileInputStream(CONFIGURATION_PROPERTIES)); @@ -35,31 +34,28 @@ public static Properties readConf() } public static String readStanzaAsString(String stanzaPath) - throws IOException, DocumentException - { + throws IOException, DocumentException { String stanzaStr = IOUtils.toString( new FileInputStream(STANZA_PATH + stanzaPath)); return stanzaStr.replaceAll(" ", "").replaceAll("\n", ""); } public static IQ readStanzaAsIq(String stanzaPath) - throws IOException, DocumentException - { + throws IOException, DocumentException { String stanzaStr = IOUtils.toString( new FileInputStream(STANZA_PATH + stanzaPath)); return toIq(stanzaStr); } - public static IQ toIq(String stanzaStr) throws DocumentException - { + public static IQ toIq(String stanzaStr) throws DocumentException { return new IQ(parseXml(stanzaStr)); } public static Element parseXml(String stanzaStr) throws DocumentException { - SAXReader xmlReader = new SAXReader(); + SAXReader xmlReader = new SAXReader(); xmlReader.setMergeAdjacentText(true); xmlReader.setStringInternEnabled(true); xmlReader.setStripWhitespaceText(true); return xmlReader.read(new StringReader(stanzaStr)).getRootElement(); - } -} \ No newline at end of file + } +} diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGetTest.java index 8dd569ea..c0ceb581 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/discoitems/DiscoItemsGetTest.java @@ -22,92 +22,92 @@ public class DiscoItemsGetTest extends IQTestHandler { - private ChannelManager channelManager; - private FederatedQueueManager federatedQueueManager; - private DiscoItemsGet discoItems; - private LinkedBlockingQueue queue; - - private IQ request; - private IQ requestWithNode; + private ChannelManager channelManager; + private FederatedQueueManager federatedQueueManager; + private DiscoItemsGet discoItems; + private LinkedBlockingQueue queue; + + private IQ request; + private IQ requestWithNode; - @Before - public void setUp() throws Exception { - channelManager = Mockito.mock(ChannelManagerImpl.class); - federatedQueueManager = Mockito.mock(FederatedQueueManager.class); - queue = new LinkedBlockingQueue(); - - discoItems = new DiscoItemsGet(queue, channelManager, federatedQueueManager); + @Before + public void setUp() throws Exception { + channelManager = Mockito.mock(ChannelManagerImpl.class); + federatedQueueManager = Mockito.mock(FederatedQueueManager.class); + queue = new LinkedBlockingQueue(); + + discoItems = new DiscoItemsGet(queue, channelManager, federatedQueueManager); - request = readStanzaAsIq("/iq/discoitems/request.stanza"); - requestWithNode = readStanzaAsIq("/iq/discoitems/requestWithNode.stanza"); - } + request = readStanzaAsIq("/iq/discoitems/request.stanza"); + requestWithNode = readStanzaAsIq("/iq/discoitems/requestWithNode.stanza"); + } - @SuppressWarnings("unchecked") - @Test - public void testReturnsListOfNodes() throws Exception { - List nodes = new ArrayList(); - nodes.add("/user/user1@server1.com/posts"); - nodes.add("/user/topic@topics.server1.com/posts"); - nodes.add("/user/user2@server1.com/posts"); - - Mockito.when(channelManager.getLocalNodesList()).thenReturn(nodes); - - discoItems.process(request); - - Assert.assertEquals(1, queue.size()); - Packet iq = queue.poll(); + @SuppressWarnings("unchecked") + @Test + public void testReturnsListOfNodes() throws Exception { + List nodes = new ArrayList(); + nodes.add("/user/user1@server1.com/posts"); + nodes.add("/user/topic@topics.server1.com/posts"); + nodes.add("/user/user2@server1.com/posts"); + + Mockito.when(channelManager.getLocalNodesList()).thenReturn(nodes); + + discoItems.process(request); + + Assert.assertEquals(1, queue.size()); + Packet iq = queue.poll(); - String jid = Configuration.getInstance() - .getProperty(Configuration.CONFIGURATION_SERVER_CHANNELS_DOMAIN); - - List items = iq.getElement().element("query").elements("item"); - Assert.assertEquals(3, items.size()); - Assert.assertEquals(jid, items.get(0).attributeValue("jid")); - Assert.assertEquals("/user/user1@server1.com/posts", items.get(0).attributeValue("node")); - Assert.assertEquals(jid, items.get(1).attributeValue("jid")); - Assert.assertEquals("/user/topic@topics.server1.com/posts", items.get(1).attributeValue("node")); - } - - @Test - public void testOnlyReturnsLocalNodes() throws Exception { - ArrayList nodes = new ArrayList(); - nodes.add("/user/user1@server1.com/posts"); - nodes.add("/user/topic@topics.server1.com/posts"); - nodes.add("/user/user2@server1.com/posts"); - - Mockito.when(channelManager.getNodeList()).thenReturn(nodes); - - discoItems.process(request); - - Assert.assertEquals(1, queue.size()); - Packet iq = queue.poll(); - List items = iq.getElement().element("query").elements("item"); - Assert.assertEquals(0, items.size()); - } - - @Test - public void testReturnsErrorIfDataStoreException() throws Exception { - Mockito.when(channelManager.getLocalNodesList()).thenThrow(new NodeStoreException()); - - discoItems.process(request); - Packet response = queue.poll(); + String jid = Configuration.getInstance() + .getProperty(Configuration.CONFIGURATION_SERVER_CHANNELS_DOMAIN); + + List items = iq.getElement().element("query").elements("item"); + Assert.assertEquals(3, items.size()); + Assert.assertEquals(jid, items.get(0).attributeValue("jid")); + Assert.assertEquals("/user/user1@server1.com/posts", items.get(0).attributeValue("node")); + Assert.assertEquals(jid, items.get(1).attributeValue("jid")); + Assert.assertEquals("/user/topic@topics.server1.com/posts", items.get(1).attributeValue("node")); + } + + @Test + public void testOnlyReturnsLocalNodes() throws Exception { + ArrayList nodes = new ArrayList(); + nodes.add("/user/user1@server1.com/posts"); + nodes.add("/user/topic@topics.server1.com/posts"); + nodes.add("/user/user2@server1.com/posts"); + + Mockito.when(channelManager.getNodeList()).thenReturn(nodes); + + discoItems.process(request); + + Assert.assertEquals(1, queue.size()); + Packet iq = queue.poll(); + List items = iq.getElement().element("query").elements("item"); + Assert.assertEquals(0, items.size()); + } + + @Test + public void testReturnsErrorIfDataStoreException() throws Exception { + Mockito.when(channelManager.getLocalNodesList()).thenThrow(new NodeStoreException()); + + discoItems.process(request); + Packet response = queue.poll(); - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.wait, error.getType()); - Assert.assertEquals(PacketError.Condition.internal_server_error, error.getCondition()); - } - - /* Not supporting this yet */ - @Test - public void testReturnsErrorIfNodeProvided() throws Exception { - - discoItems.process(requestWithNode); - Packet response = queue.poll(); + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.wait, error.getType()); + Assert.assertEquals(PacketError.Condition.internal_server_error, error.getCondition()); + } + + /* Not supporting this yet */ + @Test + public void testReturnsErrorIfNodeProvided() throws Exception { + + discoItems.process(requestWithNode); + Packet response = queue.poll(); - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.cancel, error.getType()); - Assert.assertEquals(PacketError.Condition.feature_not_implemented, error.getCondition()); - } -} \ No newline at end of file + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.cancel, error.getType()); + Assert.assertEquals(PacketError.Condition.feature_not_implemented, error.getCondition()); + } +} diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/mam/MessageArchiveManagementTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/mam/MessageArchiveManagementTest.java index 119694f1..397d6711 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/mam/MessageArchiveManagementTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/mam/MessageArchiveManagementTest.java @@ -39,383 +39,383 @@ public class MessageArchiveManagementTest extends IQTestHandler { - private ChannelManager channelManager; - private MessageArchiveManagement mam; - private LinkedBlockingQueue queue; - private IQ request; - - private ResultSet noAffiliations; - private ResultSet noSubscriptions; - private CloseableIterator noItems; - - private Date date1 = new Date(); - private Date date2 = new Date(); - private Date date3 = new Date(); - - private String node1 = "node1"; - private String node2 = "node2"; - - private JID jid1 = new JID("user@server1.com"); - private JID jid2 = new JID("user@server2.com"); - private JID invitedBy = new JID("romeo@shakespeare.lit"); - - @Before - public void setUp() throws Exception { - channelManager = Mockito.mock(ChannelManagerImpl.class); - queue = new LinkedBlockingQueue(); - mam = new MessageArchiveManagement(queue, channelManager); - - request = readStanzaAsIq("/iq/mam/request.stanza"); - - noAffiliations = new ResultSetImpl( - new ArrayList()); - noSubscriptions = new ResultSetImpl( - new ArrayList()); - noItems = new ClosableIteratorImpl( - new LinkedList().iterator()); - - date1 = Conf.parseDate("1995-10-26T10:00:00Z"); - date2 = Conf.parseDate("2015-10-21T16:29:00Z"); - date3 = Conf.parseDate("1985-10-27T09:59:00Z"); - - Mockito.when( - channelManager.getAffiliationChanges(Mockito.any(JID.class), - Mockito.any(Date.class), Mockito.any(Date.class))) - .thenReturn(noAffiliations); - Mockito.when( - channelManager.getSubscriptionChanges(Mockito.any(JID.class), - Mockito.any(Date.class), Mockito.any(Date.class))) - .thenReturn(noSubscriptions); - Mockito.when( - channelManager.getNewNodeItemsForUser(Mockito.any(JID.class), - Mockito.any(Date.class), Mockito.any(Date.class))) - .thenReturn(noItems); - - NodeMembership membership = new NodeMembershipImpl(node1, jid1, - Subscriptions.subscribed, Affiliations.owner, null); - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.any(JID.class))).thenReturn(membership); - - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); - } - - @Test - public void testRequestsOnlyHonouredForLocalUsers() throws Exception { - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); - - mam.process(request); - - Assert.assertEquals(1, queue.size()); - - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.cancel, error.getType()); - Assert.assertEquals(PacketError.Condition.service_unavailable, - error.getCondition()); - } - - @Test - public void testInvalidStartTimestampResultsInBadRequestStanza() - throws Exception { - - request.getChildElement().element("start").setText("not-a-date"); - mam.process(request); - - Assert.assertEquals(1, queue.size()); - - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - - 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 testInvalidEndTimestampResultsInBadRequestStanza() - throws Exception { - - request.getChildElement().element("end").setText("not-a-date"); - mam.process(request); - - Assert.assertEquals(1, queue.size()); - - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - - 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 testNoNotificationsResultsInJustResultPacket() throws Exception { - - mam.process(request); - - Assert.assertEquals(1, queue.size()); - IQ result = (IQ) queue.poll(); - Assert.assertEquals("result", result.getType().toString()); - } - - @Test - public void testTwoAffiliationChangesReportAsExpected() throws Exception { - - ArrayList affiliations = new ArrayList(); - - affiliations.add(new NodeAffiliationImpl(node1, jid1, - Affiliations.member, date1)); - affiliations.add(new NodeAffiliationImpl(node2, jid2, - Affiliations.publisher, date2)); - - Mockito.when( - channelManager.getAffiliationChanges(Mockito.any(JID.class), - Mockito.any(Date.class), Mockito.any(Date.class))) - .thenReturn(new ResultSetImpl(affiliations)); - - mam.process(request); - - Assert.assertEquals(3, queue.size()); - checkAffiliationStanza(queue.poll(), jid1, date1, node1, - Affiliations.member); - checkAffiliationStanza(queue.poll(), jid2, date2, node2, - Affiliations.publisher); - - IQ result = (IQ) queue.poll(); - Assert.assertEquals("result", result.getType().toString()); - } - - @Test - public void testOutcastChangeReportedAsExpected() throws Exception { - - NodeMembership membership = new NodeMembershipImpl(node1, jid1, - Subscriptions.subscribed, Affiliations.owner, null); - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.any(JID.class))).thenReturn(membership); - - ArrayList affiliations = new ArrayList(); - - affiliations.add(new NodeAffiliationImpl(node1, jid1, - Affiliations.outcast, date1)); - - Mockito.when( - channelManager.getAffiliationChanges(Mockito.any(JID.class), - Mockito.any(Date.class), Mockito.any(Date.class))) - .thenReturn(new ResultSetImpl(affiliations)); - - mam.process(request); - - Assert.assertEquals(2, queue.size()); - checkAffiliationStanza(queue.poll(), jid1, date1, node1, - Affiliations.none); - - IQ result = (IQ) queue.poll(); - Assert.assertEquals("result", result.getType().toString()); - } - - @Test - public void testOutcastChangeReportedAsExpectedToOwnerModerator() - throws Exception { - - ArrayList affiliations = new ArrayList(); - - affiliations.add(new NodeAffiliationImpl(node1, jid1, - Affiliations.member, date1)); - affiliations.add(new NodeAffiliationImpl(node2, jid2, - Affiliations.publisher, date2)); - - Mockito.when( - channelManager.getAffiliationChanges(Mockito.any(JID.class), - Mockito.any(Date.class), Mockito.any(Date.class))) - .thenReturn(new ResultSetImpl(affiliations)); - - mam.process(request); - - Assert.assertEquals(3, queue.size()); - checkAffiliationStanza(queue.poll(), jid1, date1, node1, - Affiliations.member); - checkAffiliationStanza(queue.poll(), jid2, date2, node2, - Affiliations.publisher); - - IQ result = (IQ) queue.poll(); - Assert.assertEquals("result", result.getType().toString()); - } - - private void checkAffiliationStanza(Packet result, JID jid, Date date, - String node, Affiliations affiliation) throws ParseException { - - Element message = result.getElement(); - Assert.assertEquals(MessageArchiveManagement.NAMESPACE_MAM, message - .element("result").getNamespaceURI()); - Assert.assertEquals(MessageArchiveManagement.NAMESPACE_FORWARDED, - message.element("forwarded").getNamespaceURI()); - - Element delay = message.element("forwarded").element("delay"); - - // Using strings here as SMACK doesn't output correct elements :-( - String outgoingMessage = message.asXML(); - Assert.assertTrue(outgoingMessage.contains("event")); - Assert.assertTrue(outgoingMessage.contains("affiliations")); - Assert.assertTrue(outgoingMessage.contains(jid.toBareJID())); - Assert.assertEquals(date, Conf.parseDate(delay.attributeValue("stamp"))); - Assert.assertTrue(outgoingMessage.contains(node)); - Assert.assertTrue(outgoingMessage.contains(affiliation.toString())); - } - - @Test - public void testThreeSubscriptionChangesReportAsExpected() throws Exception { - - NodeMembership publisher = new NodeMembershipImpl(node1, jid1, - Subscriptions.subscribed, Affiliations.publisher, null); - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.any(JID.class))).thenReturn(publisher); - - ArrayList subscriptions = new ArrayList(); - subscriptions.add(new NodeSubscriptionImpl(node1, jid1, - Subscriptions.subscribed, null, date1)); - subscriptions.add(new NodeSubscriptionImpl(node2, jid2, - Subscriptions.invited, invitedBy, date2)); - subscriptions.add(new NodeSubscriptionImpl(node2, jid2, - Subscriptions.pending, invitedBy, date2)); - - Mockito.when( - channelManager.getSubscriptionChanges(Mockito.any(JID.class), - Mockito.any(Date.class), Mockito.any(Date.class))) - .thenReturn(new ResultSetImpl(subscriptions)); - - mam.process(request); - - Assert.assertEquals(3, queue.size()); - checkSubscriptionStanza(queue.poll(), jid1, date1, node1, - Subscriptions.subscribed, null); - checkSubscriptionStanza(queue.poll(), jid2, date2, node2, - Subscriptions.pending, null); - - IQ result = (IQ) queue.poll(); - Assert.assertEquals("result", result.getType().toString()); - } - - @Test - public void ownerModeratorAreShownInvites() throws Exception { - - NodeMembership owner = new NodeMembershipImpl(node1, jid1, - Subscriptions.subscribed, Affiliations.owner, null); - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.any(JID.class))).thenReturn(owner); - - JID invitedBy = new JID("romeo@shakespeare.lit"); - - ArrayList subscriptions = new ArrayList(); - subscriptions.add(new NodeSubscriptionImpl(node1, jid1, - Subscriptions.subscribed, null, date1)); - subscriptions.add(new NodeSubscriptionImpl(node2, jid2, - Subscriptions.invited, invitedBy, date2)); - subscriptions.add(new NodeSubscriptionImpl(node2, jid2, - Subscriptions.pending, invitedBy, date2)); - - Mockito.when( - channelManager.getSubscriptionChanges(Mockito.any(JID.class), - Mockito.any(Date.class), Mockito.any(Date.class))) - .thenReturn(new ResultSetImpl(subscriptions)); - - mam.process(request); - - Assert.assertEquals(4, queue.size()); - checkSubscriptionStanza(queue.poll(), jid1, date1, node1, - Subscriptions.subscribed, null); - checkSubscriptionStanza(queue.poll(), jid2, date2, node2, - Subscriptions.invited, invitedBy); - checkSubscriptionStanza(queue.poll(), jid2, date2, node2, - Subscriptions.pending, invitedBy); - - IQ result = (IQ) queue.poll(); - Assert.assertEquals("result", result.getType().toString()); - } - - private void checkSubscriptionStanza(Packet result, JID jid, Date date, - String node, Subscriptions subscription, JID invitedBy) - throws ParseException { - Element message = result.getElement(); - Assert.assertEquals(MessageArchiveManagement.NAMESPACE_MAM, message - .element("result").getNamespaceURI()); - Assert.assertEquals(MessageArchiveManagement.NAMESPACE_FORWARDED, - message.element("forwarded").getNamespaceURI()); - - Element delay = message.element("forwarded").element("delay"); - Element sub = message.element("forwarded").element("event") - .element("subscription"); - - Assert.assertEquals(node, sub.attributeValue("node")); - Assert.assertEquals(jid.toBareJID(), sub.attributeValue("jid")); - Assert.assertEquals(subscription, - Subscriptions.valueOf(sub.attributeValue("subscription"))); - if (null == invitedBy) { - Assert.assertNull(sub.attributeValue("invited-by")); - } else { - Assert.assertEquals(invitedBy.toBareJID(), - sub.attributeValue("invited-by")); - } - Assert.assertEquals(date, Conf.parseDate(delay.attributeValue("stamp"))); - } - - @Test - public void testTwoNewItemsReportAsExpected() throws Exception { - - String item1 = "item1"; - String item2 = "item2"; - String item3 = "item3"; - - ArrayList items = new ArrayList(); - items.add(new NodeItemImpl(node1, "1", date1, item1)); - items.add(new NodeItemImpl(node1, "2", date2, item2)); - items.add(new NodeItemImpl(node2, "1", date3, item3)); - - Mockito.when( - channelManager.getNewNodeItemsForUser(Mockito.any(JID.class), - Mockito.any(Date.class), Mockito.any(Date.class))) - .thenReturn( - new ClosableIteratorImpl(items.iterator())); - - mam.process(request); - - Assert.assertEquals(4, queue.size()); - checkItemStanza(queue.poll(), date1, node1, "1", item1); - checkItemStanza(queue.poll(), date2, node1, "2", item2); - checkItemStanza(queue.poll(), date3, node2, "1", item3); - - IQ result = (IQ) queue.poll(); - Assert.assertEquals("result", result.getType().toString()); - } - - private void checkItemStanza(Packet result, Date date, String node, - String id, String entry) throws ParseException { - - Element message = result.getElement(); - Assert.assertEquals(MessageArchiveManagement.NAMESPACE_MAM, message - .element("result").getNamespaceURI()); - Assert.assertEquals(MessageArchiveManagement.NAMESPACE_FORWARDED, - message.element("forwarded").getNamespaceURI()); - - Element delay = message.element("forwarded").element("delay"); - Element items = message.element("forwarded").element("event") - .element("items"); - Element item = items.element("item"); - - Assert.assertEquals(id, item.attributeValue("id")); - Assert.assertEquals(node, items.attributeValue("node")); - // Hack to make up for SMACK - Assert.assertTrue(item.asXML().replace(" xmlns=\"\"", "") - .contains(entry)); - - Assert.assertEquals(date, Conf.parseDate(delay.attributeValue("stamp"))); - } -} \ No newline at end of file + private ChannelManager channelManager; + private MessageArchiveManagement mam; + private LinkedBlockingQueue queue; + private IQ request; + + private ResultSet noAffiliations; + private ResultSet noSubscriptions; + private CloseableIterator noItems; + + private Date date1 = new Date(); + private Date date2 = new Date(); + private Date date3 = new Date(); + + private String node1 = "node1"; + private String node2 = "node2"; + + private JID jid1 = new JID("user@server1.com"); + private JID jid2 = new JID("user@server2.com"); + private JID invitedBy = new JID("romeo@shakespeare.lit"); + + @Before + public void setUp() throws Exception { + channelManager = Mockito.mock(ChannelManagerImpl.class); + queue = new LinkedBlockingQueue(); + mam = new MessageArchiveManagement(queue, channelManager); + + request = readStanzaAsIq("/iq/mam/request.stanza"); + + noAffiliations = new ResultSetImpl( + new ArrayList()); + noSubscriptions = new ResultSetImpl( + new ArrayList()); + noItems = new ClosableIteratorImpl( + new LinkedList().iterator()); + + date1 = Conf.parseDate("1995-10-26T10:00:00Z"); + date2 = Conf.parseDate("2015-10-21T16:29:00Z"); + date3 = Conf.parseDate("1985-10-27T09:59:00Z"); + + Mockito.when( + channelManager.getAffiliationChanges(Mockito.any(JID.class), + Mockito.any(Date.class), Mockito.any(Date.class))) + .thenReturn(noAffiliations); + Mockito.when( + channelManager.getSubscriptionChanges(Mockito.any(JID.class), + Mockito.any(Date.class), Mockito.any(Date.class))) + .thenReturn(noSubscriptions); + Mockito.when( + channelManager.getNewNodeItemsForUser(Mockito.any(JID.class), + Mockito.any(Date.class), Mockito.any(Date.class))) + .thenReturn(noItems); + + NodeMembership membership = new NodeMembershipImpl(node1, jid1, + Subscriptions.subscribed, Affiliations.owner, null); + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.any(JID.class))).thenReturn(membership); + + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); + } + + @Test + public void testRequestsOnlyHonouredForLocalUsers() throws Exception { + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); + + mam.process(request); + + Assert.assertEquals(1, queue.size()); + + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.cancel, error.getType()); + Assert.assertEquals(PacketError.Condition.service_unavailable, + error.getCondition()); + } + + @Test + public void testInvalidStartTimestampResultsInBadRequestStanza() + throws Exception { + + request.getChildElement().element("start").setText("not-a-date"); + mam.process(request); + + Assert.assertEquals(1, queue.size()); + + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + + 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 testInvalidEndTimestampResultsInBadRequestStanza() + throws Exception { + + request.getChildElement().element("end").setText("not-a-date"); + mam.process(request); + + Assert.assertEquals(1, queue.size()); + + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + + 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 testNoNotificationsResultsInJustResultPacket() throws Exception { + + mam.process(request); + + Assert.assertEquals(1, queue.size()); + IQ result = (IQ) queue.poll(); + Assert.assertEquals("result", result.getType().toString()); + } + + @Test + public void testTwoAffiliationChangesReportAsExpected() throws Exception { + + ArrayList affiliations = new ArrayList(); + + affiliations.add(new NodeAffiliationImpl(node1, jid1, + Affiliations.member, date1)); + affiliations.add(new NodeAffiliationImpl(node2, jid2, + Affiliations.publisher, date2)); + + Mockito.when( + channelManager.getAffiliationChanges(Mockito.any(JID.class), + Mockito.any(Date.class), Mockito.any(Date.class))) + .thenReturn(new ResultSetImpl(affiliations)); + + mam.process(request); + + Assert.assertEquals(3, queue.size()); + checkAffiliationStanza(queue.poll(), jid1, date1, node1, + Affiliations.member); + checkAffiliationStanza(queue.poll(), jid2, date2, node2, + Affiliations.publisher); + + IQ result = (IQ) queue.poll(); + Assert.assertEquals("result", result.getType().toString()); + } + + @Test + public void testOutcastChangeReportedAsExpected() throws Exception { + + NodeMembership membership = new NodeMembershipImpl(node1, jid1, + Subscriptions.subscribed, Affiliations.owner, null); + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.any(JID.class))).thenReturn(membership); + + ArrayList affiliations = new ArrayList(); + + affiliations.add(new NodeAffiliationImpl(node1, jid1, + Affiliations.outcast, date1)); + + Mockito.when( + channelManager.getAffiliationChanges(Mockito.any(JID.class), + Mockito.any(Date.class), Mockito.any(Date.class))) + .thenReturn(new ResultSetImpl(affiliations)); + + mam.process(request); + + Assert.assertEquals(2, queue.size()); + checkAffiliationStanza(queue.poll(), jid1, date1, node1, + Affiliations.none); + + IQ result = (IQ) queue.poll(); + Assert.assertEquals("result", result.getType().toString()); + } + + @Test + public void testOutcastChangeReportedAsExpectedToOwnerModerator() + throws Exception { + + ArrayList affiliations = new ArrayList(); + + affiliations.add(new NodeAffiliationImpl(node1, jid1, + Affiliations.member, date1)); + affiliations.add(new NodeAffiliationImpl(node2, jid2, + Affiliations.publisher, date2)); + + Mockito.when( + channelManager.getAffiliationChanges(Mockito.any(JID.class), + Mockito.any(Date.class), Mockito.any(Date.class))) + .thenReturn(new ResultSetImpl(affiliations)); + + mam.process(request); + + Assert.assertEquals(3, queue.size()); + checkAffiliationStanza(queue.poll(), jid1, date1, node1, + Affiliations.member); + checkAffiliationStanza(queue.poll(), jid2, date2, node2, + Affiliations.publisher); + + IQ result = (IQ) queue.poll(); + Assert.assertEquals("result", result.getType().toString()); + } + + private void checkAffiliationStanza(Packet result, JID jid, Date date, + String node, Affiliations affiliation) throws ParseException { + + Element message = result.getElement(); + Assert.assertEquals(MessageArchiveManagement.NAMESPACE_MAM, message + .element("result").getNamespaceURI()); + Assert.assertEquals(MessageArchiveManagement.NAMESPACE_FORWARDED, + message.element("forwarded").getNamespaceURI()); + + Element delay = message.element("forwarded").element("delay"); + + // Using strings here as SMACK doesn't output correct elements :-( + String outgoingMessage = message.asXML(); + Assert.assertTrue(outgoingMessage.contains("event")); + Assert.assertTrue(outgoingMessage.contains("affiliations")); + Assert.assertTrue(outgoingMessage.contains(jid.toBareJID())); + Assert.assertEquals(date, Conf.parseDate(delay.attributeValue("stamp"))); + Assert.assertTrue(outgoingMessage.contains(node)); + Assert.assertTrue(outgoingMessage.contains(affiliation.toString())); + } + + @Test + public void testThreeSubscriptionChangesReportAsExpected() throws Exception { + + NodeMembership publisher = new NodeMembershipImpl(node1, jid1, + Subscriptions.subscribed, Affiliations.publisher, null); + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.any(JID.class))).thenReturn(publisher); + + ArrayList subscriptions = new ArrayList(); + subscriptions.add(new NodeSubscriptionImpl(node1, jid1, + Subscriptions.subscribed, null, date1)); + subscriptions.add(new NodeSubscriptionImpl(node2, jid2, + Subscriptions.invited, invitedBy, date2)); + subscriptions.add(new NodeSubscriptionImpl(node2, jid2, + Subscriptions.pending, invitedBy, date2)); + + Mockito.when( + channelManager.getSubscriptionChanges(Mockito.any(JID.class), + Mockito.any(Date.class), Mockito.any(Date.class))) + .thenReturn(new ResultSetImpl(subscriptions)); + + mam.process(request); + + Assert.assertEquals(3, queue.size()); + checkSubscriptionStanza(queue.poll(), jid1, date1, node1, + Subscriptions.subscribed, null); + checkSubscriptionStanza(queue.poll(), jid2, date2, node2, + Subscriptions.pending, null); + + IQ result = (IQ) queue.poll(); + Assert.assertEquals("result", result.getType().toString()); + } + + @Test + public void ownerModeratorAreShownInvites() throws Exception { + + NodeMembership owner = new NodeMembershipImpl(node1, jid1, + Subscriptions.subscribed, Affiliations.owner, null); + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.any(JID.class))).thenReturn(owner); + + JID invitedBy = new JID("romeo@shakespeare.lit"); + + ArrayList subscriptions = new ArrayList(); + subscriptions.add(new NodeSubscriptionImpl(node1, jid1, + Subscriptions.subscribed, null, date1)); + subscriptions.add(new NodeSubscriptionImpl(node2, jid2, + Subscriptions.invited, invitedBy, date2)); + subscriptions.add(new NodeSubscriptionImpl(node2, jid2, + Subscriptions.pending, invitedBy, date2)); + + Mockito.when( + channelManager.getSubscriptionChanges(Mockito.any(JID.class), + Mockito.any(Date.class), Mockito.any(Date.class))) + .thenReturn(new ResultSetImpl(subscriptions)); + + mam.process(request); + + Assert.assertEquals(4, queue.size()); + checkSubscriptionStanza(queue.poll(), jid1, date1, node1, + Subscriptions.subscribed, null); + checkSubscriptionStanza(queue.poll(), jid2, date2, node2, + Subscriptions.invited, invitedBy); + checkSubscriptionStanza(queue.poll(), jid2, date2, node2, + Subscriptions.pending, invitedBy); + + IQ result = (IQ) queue.poll(); + Assert.assertEquals("result", result.getType().toString()); + } + + private void checkSubscriptionStanza(Packet result, JID jid, Date date, + String node, Subscriptions subscription, JID invitedBy) + throws ParseException { + Element message = result.getElement(); + Assert.assertEquals(MessageArchiveManagement.NAMESPACE_MAM, message + .element("result").getNamespaceURI()); + Assert.assertEquals(MessageArchiveManagement.NAMESPACE_FORWARDED, + message.element("forwarded").getNamespaceURI()); + + Element delay = message.element("forwarded").element("delay"); + Element sub = message.element("forwarded").element("event") + .element("subscription"); + + Assert.assertEquals(node, sub.attributeValue("node")); + Assert.assertEquals(jid.toBareJID(), sub.attributeValue("jid")); + Assert.assertEquals(subscription, + Subscriptions.valueOf(sub.attributeValue("subscription"))); + if (null == invitedBy) { + Assert.assertNull(sub.attributeValue("invited-by")); + } else { + Assert.assertEquals(invitedBy.toBareJID(), + sub.attributeValue("invited-by")); + } + Assert.assertEquals(date, Conf.parseDate(delay.attributeValue("stamp"))); + } + + @Test + public void testTwoNewItemsReportAsExpected() throws Exception { + + String item1 = "item1"; + String item2 = "item2"; + String item3 = "item3"; + + ArrayList items = new ArrayList(); + items.add(new NodeItemImpl(node1, "1", date1, item1)); + items.add(new NodeItemImpl(node1, "2", date2, item2)); + items.add(new NodeItemImpl(node2, "1", date3, item3)); + + Mockito.when( + channelManager.getNewNodeItemsForUser(Mockito.any(JID.class), + Mockito.any(Date.class), Mockito.any(Date.class))) + .thenReturn( + new ClosableIteratorImpl(items.iterator())); + + mam.process(request); + + Assert.assertEquals(4, queue.size()); + checkItemStanza(queue.poll(), date1, node1, "1", item1); + checkItemStanza(queue.poll(), date2, node1, "2", item2); + checkItemStanza(queue.poll(), date3, node2, "1", item3); + + IQ result = (IQ) queue.poll(); + Assert.assertEquals("result", result.getType().toString()); + } + + private void checkItemStanza(Packet result, Date date, String node, + String id, String entry) throws ParseException { + + Element message = result.getElement(); + Assert.assertEquals(MessageArchiveManagement.NAMESPACE_MAM, message + .element("result").getNamespaceURI()); + Assert.assertEquals(MessageArchiveManagement.NAMESPACE_FORWARDED, + message.element("forwarded").getNamespaceURI()); + + Element delay = message.element("forwarded").element("delay"); + Element items = message.element("forwarded").element("event") + .element("items"); + Element item = items.element("item"); + + Assert.assertEquals(id, item.attributeValue("id")); + Assert.assertEquals(node, items.attributeValue("node")); + // Hack to make up for SMACK + Assert.assertTrue(item.asXML().replace(" xmlns=\"\"", "") + .contains(entry)); + + Assert.assertEquals(date, Conf.parseDate(delay.attributeValue("stamp"))); + } +} diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeConfigureGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeConfigureGetTest.java index e9f700f1..34f7d5b0 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeConfigureGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeConfigureGetTest.java @@ -25,176 +25,176 @@ public class NodeConfigureGetTest extends IQTestHandler { - private NodeConfigureGet configureGet; - private BlockingQueue queue = new LinkedBlockingQueue(); - private JID jid = new JID("juliet@shakespeare.lit"); - private ChannelManager channelManager; - private BaseElement element; - - @Before - public void setUp() throws Exception { - queue = new LinkedBlockingQueue(); - configureGet = new NodeConfigureGet(queue, channelManager); - element = new BaseElement("configure"); - channelManager = Mockito.mock(ChannelManager.class); - configureGet.setChannelManager(channelManager); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); - } - - @After - public void tearDown() { - Mockito.reset(channelManager); - } - - @Test - public void testPassingConfigureAsElementNameReturnsTrue() { - Assert.assertTrue(configureGet.accept(element)); - } - - @Test - public void testPassingNotConfigureAsElementNameReturnsFalse() { - Element element = new BaseElement("not-configure"); - Assert.assertFalse(configureGet.accept(element)); - } - - @Test - public void testMissingNodeAttributeReturnsErrorStanza() throws Exception { - IQ request = readStanzaAsIq("/iq/pubsub/configure/request-no-node.stanza"); - Element configure = request.getChildElement().element("configure"); - configureGet.process(configure, 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 testInexistentNodeAttributeReturnsErrorStanza() - throws Exception { - IQ request = readStanzaAsIq("/iq/pubsub/configure/request-with-node.stanza"); - Element configure = request.getChildElement().element("configure"); - - configureGet.process(configure, 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 testRemoteNodeNoError() throws Exception { - IQ request = readStanzaAsIq("/iq/pubsub/configure/request-with-node.stanza"); - Element configure = request.getChildElement().element("configure"); - - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); - configureGet.process(configure, jid, request, null); - - Packet response = queue.poll(); - - Assert.assertNull(response.getError()); - - Element pubsubResponse = response.getElement().element("pubsub"); - Assert.assertNotNull(pubsubResponse); - - Element configureResponse = pubsubResponse.element("configure"); - Assert.assertNotNull(configureResponse); - Assert.assertEquals(configure.attributeValue("node"), - configureResponse.attributeValue("node")); - - Element actor = pubsubResponse.element("actor"); - Assert.assertNotNull(actor); - Assert.assertEquals(actor.getText(), jid.toBareJID()); - } - - @Test - public void testLocalNodeNoError() throws Exception { - IQ request = readStanzaAsIq("/iq/pubsub/configure/request-with-node.stanza"); - Element configure = request.getChildElement().element("configure"); - - Map conf = new HashMap(); - conf.put("pubsub#att1", "value1"); - conf.put("pubsub#att2", "value2"); - - String node = configure.attributeValue("node"); - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - Mockito.when(channelManager.getNodeConf(node)).thenReturn(conf); - - configureGet.process(configure, jid, request, null); - Packet response = queue.poll(); - - PacketError error = response.getError(); - Assert.assertNull(error); - - Element pubsubResponse = response.getElement().element("pubsub"); - Assert.assertNotNull(pubsubResponse); - - Element configureResponse = pubsubResponse.element("configure"); - Assert.assertNotNull(configureResponse); - Assert.assertEquals(node, configureResponse.attributeValue("node")); - - Element x = configureResponse.element("x"); - Assert.assertEquals("http://jabber.org/protocol/pubsub#node_config", - fieldValue(x, "FORM_TYPE")); - Assert.assertEquals("value1", fieldValue(x, "pubsub#att1")); - Assert.assertEquals("value2", fieldValue(x, "pubsub#att2")); - } - - @Test - public void testLocalAccessModelGetsReportedAsAuthorizeToRemoveUsers() - throws Exception { - - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); - Configuration.getInstance().remove( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); - - IQ request = readStanzaAsIq("/iq/pubsub/configure/request-with-node.stanza"); - Element configure = request.getChildElement().element("configure"); - - Map conf = new HashMap(); - conf.put("pubsub#access_model", AccessModels.local.toString()); - - String node = configure.attributeValue("node"); - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - Mockito.when(channelManager.getNodeConf(node)).thenReturn(conf); - - configureGet.process(configure, jid, request, null); - Packet response = queue.poll(); - - PacketError error = response.getError(); - Assert.assertNull(error); - - Element pubsubResponse = response.getElement().element("pubsub"); - Assert.assertNotNull(pubsubResponse); - - Element configureResponse = pubsubResponse.element("configure"); - Assert.assertNotNull(configureResponse); - Assert.assertEquals(node, configureResponse.attributeValue("node")); - - Element x = configureResponse.element("x"); - Assert.assertEquals("http://jabber.org/protocol/pubsub#node_config", - fieldValue(x, "FORM_TYPE")); - Assert.assertEquals(AccessModels.authorize.toString(), - fieldValue(x, "pubsub#access_model")); - } - - @SuppressWarnings("unchecked") - private static String fieldValue(Element x, String var) { - List elements = x.elements(); - for (Element field : elements) { - if (field.attributeValue("var").equals(var)) { - return field.element("value").getText(); - } - } - return null; - } -} \ No newline at end of file + private NodeConfigureGet configureGet; + private BlockingQueue queue = new LinkedBlockingQueue(); + private JID jid = new JID("juliet@shakespeare.lit"); + private ChannelManager channelManager; + private BaseElement element; + + @Before + public void setUp() throws Exception { + queue = new LinkedBlockingQueue(); + configureGet = new NodeConfigureGet(queue, channelManager); + element = new BaseElement("configure"); + channelManager = Mockito.mock(ChannelManager.class); + configureGet.setChannelManager(channelManager); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); + } + + @After + public void tearDown() { + Mockito.reset(channelManager); + } + + @Test + public void testPassingConfigureAsElementNameReturnsTrue() { + Assert.assertTrue(configureGet.accept(element)); + } + + @Test + public void testPassingNotConfigureAsElementNameReturnsFalse() { + Element element = new BaseElement("not-configure"); + Assert.assertFalse(configureGet.accept(element)); + } + + @Test + public void testMissingNodeAttributeReturnsErrorStanza() throws Exception { + IQ request = readStanzaAsIq("/iq/pubsub/configure/request-no-node.stanza"); + Element configure = request.getChildElement().element("configure"); + configureGet.process(configure, 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 testInexistentNodeAttributeReturnsErrorStanza() + throws Exception { + IQ request = readStanzaAsIq("/iq/pubsub/configure/request-with-node.stanza"); + Element configure = request.getChildElement().element("configure"); + + configureGet.process(configure, 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 testRemoteNodeNoError() throws Exception { + IQ request = readStanzaAsIq("/iq/pubsub/configure/request-with-node.stanza"); + Element configure = request.getChildElement().element("configure"); + + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); + configureGet.process(configure, jid, request, null); + + Packet response = queue.poll(); + + Assert.assertNull(response.getError()); + + Element pubsubResponse = response.getElement().element("pubsub"); + Assert.assertNotNull(pubsubResponse); + + Element configureResponse = pubsubResponse.element("configure"); + Assert.assertNotNull(configureResponse); + Assert.assertEquals(configure.attributeValue("node"), + configureResponse.attributeValue("node")); + + Element actor = pubsubResponse.element("actor"); + Assert.assertNotNull(actor); + Assert.assertEquals(actor.getText(), jid.toBareJID()); + } + + @Test + public void testLocalNodeNoError() throws Exception { + IQ request = readStanzaAsIq("/iq/pubsub/configure/request-with-node.stanza"); + Element configure = request.getChildElement().element("configure"); + + Map conf = new HashMap(); + conf.put("pubsub#att1", "value1"); + conf.put("pubsub#att2", "value2"); + + String node = configure.attributeValue("node"); + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + Mockito.when(channelManager.getNodeConf(node)).thenReturn(conf); + + configureGet.process(configure, jid, request, null); + Packet response = queue.poll(); + + PacketError error = response.getError(); + Assert.assertNull(error); + + Element pubsubResponse = response.getElement().element("pubsub"); + Assert.assertNotNull(pubsubResponse); + + Element configureResponse = pubsubResponse.element("configure"); + Assert.assertNotNull(configureResponse); + Assert.assertEquals(node, configureResponse.attributeValue("node")); + + Element x = configureResponse.element("x"); + Assert.assertEquals("http://jabber.org/protocol/pubsub#node_config", + fieldValue(x, "FORM_TYPE")); + Assert.assertEquals("value1", fieldValue(x, "pubsub#att1")); + Assert.assertEquals("value2", fieldValue(x, "pubsub#att2")); + } + + @Test + public void testLocalAccessModelGetsReportedAsAuthorizeToRemoveUsers() + throws Exception { + + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + + IQ request = readStanzaAsIq("/iq/pubsub/configure/request-with-node.stanza"); + Element configure = request.getChildElement().element("configure"); + + Map conf = new HashMap(); + conf.put("pubsub#access_model", AccessModels.local.toString()); + + String node = configure.attributeValue("node"); + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + Mockito.when(channelManager.getNodeConf(node)).thenReturn(conf); + + configureGet.process(configure, jid, request, null); + Packet response = queue.poll(); + + PacketError error = response.getError(); + Assert.assertNull(error); + + Element pubsubResponse = response.getElement().element("pubsub"); + Assert.assertNotNull(pubsubResponse); + + Element configureResponse = pubsubResponse.element("configure"); + Assert.assertNotNull(configureResponse); + Assert.assertEquals(node, configureResponse.attributeValue("node")); + + Element x = configureResponse.element("x"); + Assert.assertEquals("http://jabber.org/protocol/pubsub#node_config", + fieldValue(x, "FORM_TYPE")); + Assert.assertEquals(AccessModels.authorize.toString(), + fieldValue(x, "pubsub#access_model")); + } + + @SuppressWarnings("unchecked") + private static String fieldValue(Element x, String var) { + List elements = x.elements(); + for (Element field : elements) { + if (field.attributeValue("var").equals(var)) { + return field.element("value").getText(); + } + } + return null; + } +} diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeThreadsGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeThreadsGetTest.java index 60c3df9c..417e25ca 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeThreadsGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/NodeThreadsGetTest.java @@ -34,236 +34,236 @@ public class NodeThreadsGetTest extends IQTestHandler { - private BlockingQueue queue; - private ChannelManager channelManager; - private NodeThreadsGet threadsGet; - private Element element = new BaseElement("threads"); - private NodeMembershipImpl membership = null; - private IQ request = null; - private String node = null; - - @Before - public void setUp() throws Exception { - this.queue = new LinkedBlockingQueue(); - this.channelManager = Mockito.mock(ChannelManager.class); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); - Mockito.when(channelManager.nodeExists(Mockito.anyString())).thenReturn(true); - - request = readStanzaAsIq("/iq/pubsub/threads/request-with-node.stanza"); - node = request.getChildElement().attributeValue("node"); - - membership = new NodeMembershipImpl(node, request.getFrom(), Subscriptions.subscribed, Affiliations.member, null); - Mockito.when(channelManager.getNodeMembership(Mockito.anyString(), Mockito.any(JID.class))).thenReturn(membership); - - this.threadsGet = new NodeThreadsGet(queue, channelManager); - } - - @Test - public void testPassingThreadsAsElementName() { - Assert.assertTrue(threadsGet.accept(element)); - } - - @Test - public void testPassingNoThreadsAsElementName() { - Element element = new BaseElement("non-threads"); - Assert.assertFalse(threadsGet.accept(element)); - } - - @Test - public void testMissingNodeAttribute() throws Exception { - IQ request = readStanzaAsIq("/iq/pubsub/threads/request-no-node.stanza"); + private BlockingQueue queue; + private ChannelManager channelManager; + private NodeThreadsGet threadsGet; + private Element element = new BaseElement("threads"); + private NodeMembershipImpl membership = null; + private IQ request = null; + private String node = null; + + @Before + public void setUp() throws Exception { + this.queue = new LinkedBlockingQueue(); + this.channelManager = Mockito.mock(ChannelManager.class); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); + Mockito.when(channelManager.nodeExists(Mockito.anyString())).thenReturn(true); + + request = readStanzaAsIq("/iq/pubsub/threads/request-with-node.stanza"); + node = request.getChildElement().attributeValue("node"); + + membership = new NodeMembershipImpl(node, request.getFrom(), Subscriptions.subscribed, Affiliations.member, null); + Mockito.when(channelManager.getNodeMembership(Mockito.anyString(), Mockito.any(JID.class))).thenReturn(membership); + + this.threadsGet = new NodeThreadsGet(queue, channelManager); + } + + @Test + public void testPassingThreadsAsElementName() { + Assert.assertTrue(threadsGet.accept(element)); + } + + @Test + public void testPassingNoThreadsAsElementName() { + Element element = new BaseElement("non-threads"); + Assert.assertFalse(threadsGet.accept(element)); + } + + @Test + public void testMissingNodeAttribute() throws Exception { + IQ request = readStanzaAsIq("/iq/pubsub/threads/request-no-node.stanza"); - threadsGet.process(element, request.getFrom(), request, null); - Packet response = queue.poll(); + threadsGet.process(element, request.getFrom(), 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 testInexistentNode() throws Exception { - Element element = request.getChildElement().element("threads"); + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.modify, error.getType()); + Assert.assertEquals("nodeid-required", + error.getApplicationConditionName()); + } + + @Test + public void testInexistentNode() throws Exception { + Element element = request.getChildElement().element("threads"); - Mockito.when(channelManager.nodeExists(Mockito.anyString())).thenReturn(false); - - threadsGet.process(element, request.getFrom(), request, null); - Packet response = queue.poll(); + Mockito.when(channelManager.nodeExists(Mockito.anyString())).thenReturn(false); + + threadsGet.process(element, request.getFrom(), 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 userNotInAuthorizedChannel() throws Exception { + 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 userNotInAuthorizedChannel() throws Exception { - membership = new NodeMembershipImpl(node, request.getFrom(), Subscriptions.none, Affiliations.none, null); - Mockito.when(channelManager.getNodeMembership(Mockito.anyString(), Mockito.any(JID.class))).thenReturn(membership); - - threadsGet.process(element, request.getFrom(), request, null); - Packet response = queue.poll(); - - PacketError error = response.getError(); + membership = new NodeMembershipImpl(node, request.getFrom(), Subscriptions.none, Affiliations.none, null); + Mockito.when(channelManager.getNodeMembership(Mockito.anyString(), Mockito.any(JID.class))).thenReturn(membership); + + threadsGet.process(element, request.getFrom(), 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 userOutcastInOpenChannel() throws Exception { + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.auth, error.getType()); + Assert.assertEquals(PacketError.Condition.forbidden, error.getCondition()); + } + + @Test + public void userOutcastInOpenChannel() throws Exception { - membership = new NodeMembershipImpl(node, request.getFrom(), Subscriptions.none, Affiliations.outcast, null); - Mockito.when(channelManager.getNodeMembership(Mockito.anyString(), Mockito.any(JID.class))).thenReturn(membership); - - Map conf = new HashMap(); - conf.put(AccessModel.FIELD_NAME, AccessModels.open.toString()); - Mockito.when(channelManager.getNodeConf(Mockito.anyString())).thenReturn(conf); - - threadsGet.process(element, request.getFrom(), 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 testWrongAfterItemRSM() throws Exception { - IQ request = readStanzaAsIq("/iq/pubsub/threads/request-with-rsm.stanza"); - - Map conf = new HashMap(); - conf.put(AccessModel.FIELD_NAME, AccessModels.open.toString()); - Mockito.when(channelManager.getNodeConf(Mockito.anyString())).thenReturn(conf); - - Element rsmEl = request.getChildElement().element("set"); - threadsGet.process(element, request.getFrom(), request, rsmEl); - 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 testSucessfulEmptyResponse() throws Exception { - - Map conf = new HashMap(); - conf.put(AccessModel.FIELD_NAME, AccessModels.open.toString()); - Mockito.when(channelManager.getNodeConf(Mockito.anyString())).thenReturn(conf); + membership = new NodeMembershipImpl(node, request.getFrom(), Subscriptions.none, Affiliations.outcast, null); + Mockito.when(channelManager.getNodeMembership(Mockito.anyString(), Mockito.any(JID.class))).thenReturn(membership); + + Map conf = new HashMap(); + conf.put(AccessModel.FIELD_NAME, AccessModels.open.toString()); + Mockito.when(channelManager.getNodeConf(Mockito.anyString())).thenReturn(conf); + + threadsGet.process(element, request.getFrom(), 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 testWrongAfterItemRSM() throws Exception { + IQ request = readStanzaAsIq("/iq/pubsub/threads/request-with-rsm.stanza"); + + Map conf = new HashMap(); + conf.put(AccessModel.FIELD_NAME, AccessModels.open.toString()); + Mockito.when(channelManager.getNodeConf(Mockito.anyString())).thenReturn(conf); + + Element rsmEl = request.getChildElement().element("set"); + threadsGet.process(element, request.getFrom(), request, rsmEl); + 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 testSucessfulEmptyResponse() throws Exception { + + Map conf = new HashMap(); + conf.put(AccessModel.FIELD_NAME, AccessModels.open.toString()); + Mockito.when(channelManager.getNodeConf(Mockito.anyString())).thenReturn(conf); - Mockito.when(channelManager.getNodeThreads(Mockito.anyString(), Mockito.anyString(), - Mockito.anyInt())).thenReturn(new ResultSetImpl( - new LinkedList())); - - threadsGet.process(element, request.getFrom(), request, null); - Packet response = queue.poll(); - - Assert.assertNull(response.getError()); - Assert.assertNull(response.getElement().element("pubsub").element("thread")); - } - - @SuppressWarnings("unchecked") - @Test - public void testSucessfulNonEmptyResponse() throws Exception { - - Element element = request.getChildElement().element("threads"); - String node = element.attributeValue("node"); + Mockito.when(channelManager.getNodeThreads(Mockito.anyString(), Mockito.anyString(), + Mockito.anyInt())).thenReturn(new ResultSetImpl( + new LinkedList())); + + threadsGet.process(element, request.getFrom(), request, null); + Packet response = queue.poll(); + + Assert.assertNull(response.getError()); + Assert.assertNull(response.getElement().element("pubsub").element("thread")); + } + + @SuppressWarnings("unchecked") + @Test + public void testSucessfulNonEmptyResponse() throws Exception { + + Element element = request.getChildElement().element("threads"); + String node = element.attributeValue("node"); - - Map conf = new HashMap(); - conf.put(AccessModel.FIELD_NAME, AccessModels.open.toString()); - Mockito.when(channelManager.getNodeConf(node)).thenReturn(conf); + + Map conf = new HashMap(); + conf.put(AccessModel.FIELD_NAME, AccessModels.open.toString()); + Mockito.when(channelManager.getNodeConf(node)).thenReturn(conf); - LinkedList threads = new LinkedList(); - NodeThreadImpl threadA = new NodeThreadImpl("itemA", new Date()); - threadA.addItem(new NodeItemImpl(node, "itemA", new Date(), "")); - threadA.addItem(new NodeItemImpl(node, "itemB", new Date(), "", "itemA")); - threads.add(threadA); - - NodeThreadImpl threadB = new NodeThreadImpl("itemC", new Date()); - threadB.addItem(new NodeItemImpl(node, "itemC", new Date(), "")); - threadB.addItem(new NodeItemImpl(node, "itemD", new Date(), "", "itemC")); - threads.add(threadB); - - Mockito.when(channelManager.getNodeThreads(Mockito.eq(node), Mockito.anyString(), - Mockito.anyInt())).thenReturn(new ResultSetImpl( - threads)); - Mockito.when(channelManager.countNodeThreads(node)).thenReturn(threads.size()); - - threadsGet.process(element, request.getFrom(), request, null); - Packet response = queue.poll(); - - Assert.assertNull(response.getError()); - Element responsePubsubEl = response.getElement().element("pubsub"); - - List responseelement = responsePubsubEl.elements("thread"); - Assert.assertNotNull(responseelement); - Assert.assertEquals(2, responseelement.size()); - - Element responseRsmEl = responsePubsubEl.element("set"); - Assert.assertEquals("itemA", responseRsmEl.elementText("first")); - Assert.assertEquals("itemC", responseRsmEl.elementText("last")); - Assert.assertEquals("2", responseRsmEl.elementText("count")); - } - - @Test - public void testRemoteNodeNoError() throws Exception { - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); - Mockito.when(channelManager.isCachedNode(Mockito.anyString())).thenReturn(false); - JID from = request.getFrom(); - threadsGet.process(element, from, request, null); + LinkedList threads = new LinkedList(); + NodeThreadImpl threadA = new NodeThreadImpl("itemA", new Date()); + threadA.addItem(new NodeItemImpl(node, "itemA", new Date(), "")); + threadA.addItem(new NodeItemImpl(node, "itemB", new Date(), "", "itemA")); + threads.add(threadA); + + NodeThreadImpl threadB = new NodeThreadImpl("itemC", new Date()); + threadB.addItem(new NodeItemImpl(node, "itemC", new Date(), "")); + threadB.addItem(new NodeItemImpl(node, "itemD", new Date(), "", "itemC")); + threads.add(threadB); + + Mockito.when(channelManager.getNodeThreads(Mockito.eq(node), Mockito.anyString(), + Mockito.anyInt())).thenReturn(new ResultSetImpl( + threads)); + Mockito.when(channelManager.countNodeThreads(node)).thenReturn(threads.size()); + + threadsGet.process(element, request.getFrom(), request, null); + Packet response = queue.poll(); + + Assert.assertNull(response.getError()); + Element responsePubsubEl = response.getElement().element("pubsub"); + + List responseelement = responsePubsubEl.elements("thread"); + Assert.assertNotNull(responseelement); + Assert.assertEquals(2, responseelement.size()); + + Element responseRsmEl = responsePubsubEl.element("set"); + Assert.assertEquals("itemA", responseRsmEl.elementText("first")); + Assert.assertEquals("itemC", responseRsmEl.elementText("last")); + Assert.assertEquals("2", responseRsmEl.elementText("count")); + } + + @Test + public void testRemoteNodeNoError() throws Exception { + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); + Mockito.when(channelManager.isCachedNode(Mockito.anyString())).thenReturn(false); + JID from = request.getFrom(); + threadsGet.process(element, from, request, null); - Packet response = queue.poll(); + Packet response = queue.poll(); - Assert.assertNull(response.getError()); + Assert.assertNull(response.getError()); - Element pubsubResponse = response.getElement().element("pubsub"); - Assert.assertNotNull(pubsubResponse); + Element pubsubResponse = response.getElement().element("pubsub"); + Assert.assertNotNull(pubsubResponse); - Element threadsResponseEl = pubsubResponse.element("threads"); - Assert.assertNotNull(threadsResponseEl); - Assert.assertEquals( - request.getChildElement().element("threads").attributeValue("node"), - threadsResponseEl.attributeValue("node") - ); + Element threadsResponseEl = pubsubResponse.element("threads"); + Assert.assertNotNull(threadsResponseEl); + Assert.assertEquals( + request.getChildElement().element("threads").attributeValue("node"), + threadsResponseEl.attributeValue("node") + ); - Element actor = pubsubResponse.element("actor"); - Assert.assertNotNull(actor); - Assert.assertEquals(actor.getText(), from.toBareJID()); - } - - @Test - public void testRemoteRequest() throws Exception { - JID from = request.getFrom(); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); - Configuration.getInstance().remove( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); - - Map conf = new HashMap(); - conf.put(AccessModel.FIELD_NAME, AccessModels.open.toString()); - Mockito.when(channelManager.getNodeConf(Mockito.anyString())).thenReturn(conf); - - Mockito.when(channelManager.getNodeThreads(Mockito.anyString(), Mockito.anyString(), - Mockito.anyInt())).thenReturn(new ResultSetImpl( - new LinkedList())); - - threadsGet.process(element, from, request, null); + Element actor = pubsubResponse.element("actor"); + Assert.assertNotNull(actor); + Assert.assertEquals(actor.getText(), from.toBareJID()); + } + + @Test + public void testRemoteRequest() throws Exception { + JID from = request.getFrom(); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + + Map conf = new HashMap(); + conf.put(AccessModel.FIELD_NAME, AccessModels.open.toString()); + Mockito.when(channelManager.getNodeConf(Mockito.anyString())).thenReturn(conf); + + Mockito.when(channelManager.getNodeThreads(Mockito.anyString(), Mockito.anyString(), + Mockito.anyInt())).thenReturn(new ResultSetImpl( + new LinkedList())); + + threadsGet.process(element, from, request, null); - Packet response = queue.poll(); - - Assert.assertNull(response.getError()); - Assert.assertNotNull(response.getElement().element("pubsub")); - Assert.assertNotNull(response.getElement().attributeValue( - "remote-server-discover")); - } + Packet response = queue.poll(); + + Assert.assertNull(response.getError()); + Assert.assertNotNull(response.getElement().element("pubsub")); + Assert.assertNotNull(response.getElement().attributeValue( + "remote-server-discover")); + } } diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RecentItemsGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RecentItemsGetTest.java index e4fb9789..3ee0a135 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RecentItemsGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RecentItemsGetTest.java @@ -52,8 +52,8 @@ public class RecentItemsGetTest extends IQTestHandler { private JID jid = new JID("juliet@shakespeare.lit"); private ChannelManager channelManager; - private String TEST_NODE_1 = "node1"; - private String TEST_NODE_2 = "node2"; + private static final String TEST_NODE_1 = "node1"; + private static final String TEST_NODE_2 = "node2"; @Before public void setUp() throws Exception { diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGetTest.java index 0b7bd7bf..f135fb64 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/RepliesGetTest.java @@ -42,7 +42,7 @@ public class RepliesGetTest extends IQTestHandler { private JID jid = new JID("juliet@shakespeare.lit"); private ChannelManager channelManager; - private String TEST_NODE = "node1"; + private static final String TEST_NODE = "node1"; private NodeViewAcl nodeViewAcl; @Before diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGetTest.java index 78a44229..7af0cfec 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/SubscriptionsGetTest.java @@ -25,199 +25,199 @@ public class SubscriptionsGetTest extends IQTestHandler { - private IQ userRequest; - private IQ nodeRequest; - private SubscriptionsGet subscriptionsGet; - private Element element; - private BlockingQueue queue = new LinkedBlockingQueue(); - - private String node = "/user/pamela@denmark.lit/posts"; - private JID jid = new JID("juliet@shakespeare.lit"); - private JID invitedBy = new JID("romeo@shakespeare.lit"); - - private ChannelManager channelManager; - - @Before - public void setUp() throws Exception { - - queue = new LinkedBlockingQueue(); - subscriptionsGet = new SubscriptionsGet(queue, channelManager); - element = new BaseElement("subscriptions"); - - channelManager = Mockito.mock(ChannelManager.class); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); - - NodeMembership nodeMembership = new NodeMembershipImpl(node, jid, - Subscriptions.subscribed, Affiliations.member, null); - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.any(JID.class))).thenReturn(nodeMembership); - subscriptionsGet.setChannelManager(channelManager); - - userRequest = readStanzaAsIq("/iq/pubsub/subscriptions/request.stanza"); - nodeRequest = readStanzaAsIq("/iq/pubsub/subscriptions/requestExistingNode.stanza"); - - } - - @Test - public void testPassingSubscriptionsAsElementNameReturnsTrue() { - Assert.assertTrue(subscriptionsGet.accept(element)); - } - - @Test - public void testPassingNotSubscriptionsAsElementNameReturnsFalse() { - Element element = new BaseElement("not-subscriptions"); - Assert.assertFalse(subscriptionsGet.accept(element)); - } - - @Test - public void addsInvitedByToUserSubscriptionsList() throws Exception { - - - ArrayList members = new ArrayList(); - members.add(new NodeMembershipImpl(node, jid, Subscriptions.invited, Affiliations.publisher, invitedBy)); - - Mockito.when(channelManager.getUserMemberships(Mockito.any(JID.class))).thenReturn(new ResultSetImpl(members)); - - subscriptionsGet.process(element, jid, userRequest, null); - - Assert.assertEquals(1, queue.size()); - - IQ response = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.result, response.getType()); - Assert.assertEquals(userRequest.getTo(), response.getFrom()); - Assert.assertEquals(userRequest.getFrom(), response.getTo()); - Assert.assertEquals(userRequest.getID(), response.getID()); - Assert.assertEquals(1, response.getChildElement().element("subscriptions").elements("subscription").size()); - - } - - // ------------- node subscripton tests - - @Test - public void remoteNodeForwardsStanza() throws Exception { - - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, - Boolean.FALSE.toString()); - - Mockito.when(channelManager.isCachedNode(Mockito.anyString())) - .thenReturn(false); - - subscriptionsGet.process(element, jid, nodeRequest, null); - - IQ response = (IQ) queue.poll(); - - Assert.assertEquals(IQ.Type.get, response.getType()); - Assert.assertEquals(new JID("denmark.lit"), response.getTo()); - Assert.assertEquals(userRequest.getID(), response.getID()); - } - - - @Test - public void doesntAddInvitedByToNodeSubscriptionsListIfNotUserOrOwnerOrModerator() throws Exception { - - ArrayList members = new ArrayList(); - members.add(new NodeMembershipImpl(node, jid, Subscriptions.invited, Affiliations.publisher, invitedBy)); - - Mockito.when(channelManager.getNodeMemberships(Mockito.anyString())).thenReturn(new ResultSetImpl(members)); - - subscriptionsGet.process(element, jid, nodeRequest, null); - - Assert.assertEquals(1, queue.size()); - - IQ response = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.result, response.getType()); - Assert.assertEquals(userRequest.getTo(), response.getFrom()); - Assert.assertEquals(userRequest.getFrom(), response.getTo()); - Assert.assertEquals(userRequest.getID(), response.getID()); - Assert.assertEquals(0, response.getChildElement().element("subscriptions").elements("subscription").size()); - } - - @Test - public void addsInvitedByToNodeSubscriptionsList() throws Exception { - - NodeMembership nodeMembership = new NodeMembershipImpl(node, jid, - Subscriptions.subscribed, Affiliations.owner, null); - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.any(JID.class))).thenReturn(nodeMembership); - - ArrayList members = new ArrayList(); - members.add(new NodeMembershipImpl(node, jid, Subscriptions.invited, Affiliations.publisher, invitedBy)); - - Mockito.when(channelManager.getNodeMemberships(Mockito.anyString())).thenReturn(new ResultSetImpl(members)); - - subscriptionsGet.process(element, jid, nodeRequest, null); - - Assert.assertEquals(1, queue.size()); - - IQ response = (IQ) queue.poll(); - - Assert.assertEquals(IQ.Type.result, response.getType()); - Assert.assertEquals(userRequest.getTo(), response.getFrom()); - Assert.assertEquals(userRequest.getFrom(), response.getTo()); - Assert.assertEquals(userRequest.getID(), response.getID()); - Assert.assertEquals(1, response.getChildElement().element("subscriptions").elements("subscription").size()); + private IQ userRequest; + private IQ nodeRequest; + private SubscriptionsGet subscriptionsGet; + private Element element; + private BlockingQueue queue = new LinkedBlockingQueue(); + + private String node = "/user/pamela@denmark.lit/posts"; + private JID jid = new JID("juliet@shakespeare.lit"); + private JID invitedBy = new JID("romeo@shakespeare.lit"); + + private ChannelManager channelManager; + + @Before + public void setUp() throws Exception { + + queue = new LinkedBlockingQueue(); + subscriptionsGet = new SubscriptionsGet(queue, channelManager); + element = new BaseElement("subscriptions"); + + channelManager = Mockito.mock(ChannelManager.class); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); + + NodeMembership nodeMembership = new NodeMembershipImpl(node, jid, + Subscriptions.subscribed, Affiliations.member, null); + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.any(JID.class))).thenReturn(nodeMembership); + subscriptionsGet.setChannelManager(channelManager); + + userRequest = readStanzaAsIq("/iq/pubsub/subscriptions/request.stanza"); + nodeRequest = readStanzaAsIq("/iq/pubsub/subscriptions/requestExistingNode.stanza"); + + } + + @Test + public void testPassingSubscriptionsAsElementNameReturnsTrue() { + Assert.assertTrue(subscriptionsGet.accept(element)); + } + + @Test + public void testPassingNotSubscriptionsAsElementNameReturnsFalse() { + Element element = new BaseElement("not-subscriptions"); + Assert.assertFalse(subscriptionsGet.accept(element)); + } + + @Test + public void addsInvitedByToUserSubscriptionsList() throws Exception { + + + ArrayList members = new ArrayList(); + members.add(new NodeMembershipImpl(node, jid, Subscriptions.invited, Affiliations.publisher, invitedBy)); + + Mockito.when(channelManager.getUserMemberships(Mockito.any(JID.class))).thenReturn(new ResultSetImpl(members)); + + subscriptionsGet.process(element, jid, userRequest, null); + + Assert.assertEquals(1, queue.size()); + + IQ response = (IQ) queue.poll(); + Assert.assertEquals(IQ.Type.result, response.getType()); + Assert.assertEquals(userRequest.getTo(), response.getFrom()); + Assert.assertEquals(userRequest.getFrom(), response.getTo()); + Assert.assertEquals(userRequest.getID(), response.getID()); + Assert.assertEquals(1, response.getChildElement().element("subscriptions").elements("subscription").size()); + + } + + // ------------- node subscripton tests + + @Test + public void remoteNodeForwardsStanza() throws Exception { + + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, + Boolean.FALSE.toString()); + + Mockito.when(channelManager.isCachedNode(Mockito.anyString())) + .thenReturn(false); + + subscriptionsGet.process(element, jid, nodeRequest, null); + + IQ response = (IQ) queue.poll(); + + Assert.assertEquals(IQ.Type.get, response.getType()); + Assert.assertEquals(new JID("denmark.lit"), response.getTo()); + Assert.assertEquals(userRequest.getID(), response.getID()); + } + + + @Test + public void doesntAddInvitedByToNodeSubscriptionsListIfNotUserOrOwnerOrModerator() throws Exception { + + ArrayList members = new ArrayList(); + members.add(new NodeMembershipImpl(node, jid, Subscriptions.invited, Affiliations.publisher, invitedBy)); + + Mockito.when(channelManager.getNodeMemberships(Mockito.anyString())).thenReturn(new ResultSetImpl(members)); + + subscriptionsGet.process(element, jid, nodeRequest, null); + + Assert.assertEquals(1, queue.size()); + + IQ response = (IQ) queue.poll(); + Assert.assertEquals(IQ.Type.result, response.getType()); + Assert.assertEquals(userRequest.getTo(), response.getFrom()); + Assert.assertEquals(userRequest.getFrom(), response.getTo()); + Assert.assertEquals(userRequest.getID(), response.getID()); + Assert.assertEquals(0, response.getChildElement().element("subscriptions").elements("subscription").size()); + } + + @Test + public void addsInvitedByToNodeSubscriptionsList() throws Exception { + + NodeMembership nodeMembership = new NodeMembershipImpl(node, jid, + Subscriptions.subscribed, Affiliations.owner, null); + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.any(JID.class))).thenReturn(nodeMembership); + + ArrayList members = new ArrayList(); + members.add(new NodeMembershipImpl(node, jid, Subscriptions.invited, Affiliations.publisher, invitedBy)); + + Mockito.when(channelManager.getNodeMemberships(Mockito.anyString())).thenReturn(new ResultSetImpl(members)); + + subscriptionsGet.process(element, jid, nodeRequest, null); + + Assert.assertEquals(1, queue.size()); + + IQ response = (IQ) queue.poll(); + + Assert.assertEquals(IQ.Type.result, response.getType()); + Assert.assertEquals(userRequest.getTo(), response.getFrom()); + Assert.assertEquals(userRequest.getFrom(), response.getTo()); + Assert.assertEquals(userRequest.getID(), response.getID()); + Assert.assertEquals(1, response.getChildElement().element("subscriptions").elements("subscription").size()); Element subscription = (Element) response.getChildElement().element("subscriptions").elements("subscription").get(0); Assert.assertEquals(node, subscription.attributeValue("node")); Assert.assertEquals(invitedBy.toBareJID(), subscription.attributeValue("invited-by")); Assert.assertEquals(jid.toBareJID(), subscription.attributeValue("jid")); Assert.assertEquals(Subscriptions.invited.toString(), subscription.attributeValue("subscription")); - } - - @Test - public void addsInvitedByToNodeSubscriptionsListIfModerator() throws Exception { - - NodeMembership nodeMembership = new NodeMembershipImpl(node, jid, - Subscriptions.subscribed, Affiliations.moderator, null); - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.any(JID.class))).thenReturn(nodeMembership); - - ArrayList members = new ArrayList(); - members.add(new NodeMembershipImpl(node, jid, Subscriptions.invited, Affiliations.publisher, invitedBy)); - - Mockito.when(channelManager.getNodeMemberships(Mockito.anyString())).thenReturn(new ResultSetImpl(members)); - - subscriptionsGet.process(element, jid, nodeRequest, null); - - Assert.assertEquals(1, queue.size()); - - IQ response = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.result, response.getType()); - Assert.assertEquals(userRequest.getTo(), response.getFrom()); - Assert.assertEquals(userRequest.getFrom(), response.getTo()); - Assert.assertEquals(userRequest.getID(), response.getID()); - Assert.assertEquals(1, response.getChildElement().element("subscriptions").elements("subscription").size()); - - } - - @Test - public void addsInvitedByToUserSubscriptionsListIfUser() throws Exception { - - NodeMembership nodeMembership = new NodeMembershipImpl(node, nodeRequest.getFrom(), - Subscriptions.subscribed, Affiliations.moderator, null); - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.any(JID.class))).thenReturn(nodeMembership); - - ArrayList members = new ArrayList(); - members.add(new NodeMembershipImpl(node, jid, Subscriptions.invited, Affiliations.publisher, invitedBy)); - - Mockito.when(channelManager.getNodeMemberships(Mockito.anyString())).thenReturn(new ResultSetImpl(members)); - - subscriptionsGet.process(element, jid, nodeRequest, null); - - Assert.assertEquals(1, queue.size()); - - IQ response = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.result, response.getType()); - Assert.assertEquals(userRequest.getTo(), response.getFrom()); - Assert.assertEquals(userRequest.getFrom(), response.getTo()); - Assert.assertEquals(userRequest.getID(), response.getID()); - Assert.assertEquals(1, response.getChildElement().element("subscriptions").elements("subscription").size()); - - } -} \ No newline at end of file + } + + @Test + public void addsInvitedByToNodeSubscriptionsListIfModerator() throws Exception { + + NodeMembership nodeMembership = new NodeMembershipImpl(node, jid, + Subscriptions.subscribed, Affiliations.moderator, null); + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.any(JID.class))).thenReturn(nodeMembership); + + ArrayList members = new ArrayList(); + members.add(new NodeMembershipImpl(node, jid, Subscriptions.invited, Affiliations.publisher, invitedBy)); + + Mockito.when(channelManager.getNodeMemberships(Mockito.anyString())).thenReturn(new ResultSetImpl(members)); + + subscriptionsGet.process(element, jid, nodeRequest, null); + + Assert.assertEquals(1, queue.size()); + + IQ response = (IQ) queue.poll(); + Assert.assertEquals(IQ.Type.result, response.getType()); + Assert.assertEquals(userRequest.getTo(), response.getFrom()); + Assert.assertEquals(userRequest.getFrom(), response.getTo()); + Assert.assertEquals(userRequest.getID(), response.getID()); + Assert.assertEquals(1, response.getChildElement().element("subscriptions").elements("subscription").size()); + + } + + @Test + public void addsInvitedByToUserSubscriptionsListIfUser() throws Exception { + + NodeMembership nodeMembership = new NodeMembershipImpl(node, nodeRequest.getFrom(), + Subscriptions.subscribed, Affiliations.moderator, null); + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.any(JID.class))).thenReturn(nodeMembership); + + ArrayList members = new ArrayList(); + members.add(new NodeMembershipImpl(node, jid, Subscriptions.invited, Affiliations.publisher, invitedBy)); + + Mockito.when(channelManager.getNodeMemberships(Mockito.anyString())).thenReturn(new ResultSetImpl(members)); + + subscriptionsGet.process(element, jid, nodeRequest, null); + + Assert.assertEquals(1, queue.size()); + + IQ response = (IQ) queue.poll(); + Assert.assertEquals(IQ.Type.result, response.getType()); + Assert.assertEquals(userRequest.getTo(), response.getFrom()); + Assert.assertEquals(userRequest.getFrom(), response.getTo()); + Assert.assertEquals(userRequest.getID(), response.getID()); + Assert.assertEquals(1, response.getChildElement().element("subscriptions").elements("subscription").size()); + + } +} diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/ThreadGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/ThreadGetTest.java index 9874f9ea..41fdb3a9 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/ThreadGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/ThreadGetTest.java @@ -41,7 +41,7 @@ public class ThreadGetTest extends IQTestHandler { private JID jid = new JID("juliet@shakespeare.lit"); private ChannelManager channelManager; - private String TEST_NODE = "node1"; + private static final String TEST_NODE = "node1"; private NodeViewAcl nodeViewAclMock; @Before diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/UserItemsGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/UserItemsGetTest.java index b082719f..a27e7aee 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/UserItemsGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/UserItemsGetTest.java @@ -51,8 +51,8 @@ public class UserItemsGetTest extends IQTestHandler { private JID jid = new JID("juliet@shakespeare.lit"); private ChannelManager channelManager; - private String TEST_NODE_1 = "node1"; - private String TEST_NODE_2 = "node2"; + private static final String TEST_NODE_1 = "node1"; + private static final String TEST_NODE_2 = "node2"; @Before public void setUp() throws Exception { diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGetTest.java index 07f7b11d..49c72018 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/NodeItemsGetTest.java @@ -1,7 +1,11 @@ package org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.get.items; -import static org.junit.Assert.*; -import static org.mockito.Mockito.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.anyString; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.verify; import java.util.ArrayList; import java.util.Arrays; @@ -18,17 +22,12 @@ import org.buddycloud.channelserver.db.CloseableIterator; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; -import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.JabberPubsub; -import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.get.items.NodeItemsGet; import org.buddycloud.channelserver.pubsub.accessmodel.AccessModels; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; import org.buddycloud.channelserver.pubsub.model.NodeItem; import org.buddycloud.channelserver.pubsub.model.NodeMembership; -import org.buddycloud.channelserver.pubsub.model.NodeSubscription; -import org.buddycloud.channelserver.pubsub.model.impl.NodeAffiliationImpl; import org.buddycloud.channelserver.pubsub.model.impl.NodeItemImpl; 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.node.NodeAclRefuseReason; import org.buddycloud.channelserver.utils.node.NodeViewAcl; @@ -47,413 +46,413 @@ public class NodeItemsGetTest extends IQTestHandler { - private IQ request; - private NodeItemsGet itemsGet; - private Element element; - private BlockingQueue queue = new LinkedBlockingQueue(); + private IQ request; + private NodeItemsGet itemsGet; + private Element element; + private BlockingQueue queue = new LinkedBlockingQueue(); - private String node = "/user/pamela@denmark.lit/posts"; - private JID jid = new JID("juliet@shakespeare.lit"); - private ChannelManager channelManager; - private NodeViewAcl nodeViewAcl; + private String node = "/user/pamela@denmark.lit/posts"; + private JID jid = new JID("juliet@shakespeare.lit"); + private ChannelManager channelManager; + private NodeViewAcl nodeViewAcl; - @Before - public void setUp() throws Exception { + @Before + public void setUp() throws Exception { - queue = new LinkedBlockingQueue(); - itemsGet = new NodeItemsGet(queue, channelManager); - request = readStanzaAsIq("/iq/pubsub/items/request.stanza"); - element = new BaseElement("items"); + queue = new LinkedBlockingQueue(); + itemsGet = new NodeItemsGet(queue, channelManager); + request = readStanzaAsIq("/iq/pubsub/items/request.stanza"); + element = new BaseElement("items"); - channelManager = Mockito.mock(ChannelManager.class); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); - itemsGet.setChannelManager(channelManager); + channelManager = Mockito.mock(ChannelManager.class); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); + itemsGet.setChannelManager(channelManager); - ArrayList nodeMemberships = new ArrayList(); - Mockito.when(channelManager.getNodeMemberships(Mockito.anyString())).thenReturn( - new ResultSetImpl(nodeMemberships) + ArrayList nodeMemberships = new ArrayList(); + Mockito.when(channelManager.getNodeMemberships(Mockito.anyString())).thenReturn( + new ResultSetImpl(nodeMemberships) ); - ArrayList userMemberships = new ArrayList(); - Mockito.when(channelManager.getUserMemberships(Mockito.any(JID.class))).thenReturn( - new ResultSetImpl(userMemberships) + ArrayList userMemberships = new ArrayList(); + Mockito.when(channelManager.getUserMemberships(Mockito.any(JID.class))).thenReturn( + new ResultSetImpl(userMemberships) ); - - Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( - new NodeMembershipImpl(node, jid, Subscriptions.subscribed, Affiliations.member, null)); - nodeViewAcl = Mockito.mock(NodeViewAcl.class); - Mockito.doReturn(true) - .when(nodeViewAcl) - .canViewNode(Mockito.anyString(), - Mockito.any(NodeMembership.class), - Mockito.any(AccessModels.class), Mockito.anyBoolean()); - itemsGet.setNodeViewAcl(nodeViewAcl); - } - - @Test - public void testPassingItemsAsElementNameReturnsTrue() { - Assert.assertTrue(itemsGet.accept(element)); - } - - @Test - public void testPassingNotItemsAsElementNameReturnsFalse() { - Element element = new BaseElement("not-items"); - Assert.assertFalse(itemsGet.accept(element)); - } - - @Test - public void testExternalNodeReturnsExpectedStanzaEarly() throws Exception { - - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); - - element.addAttribute("node", "/user/user@remote-server.com/posts"); - - itemsGet.process(element, jid, request, null); - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - - Element element = response.getElement(); - - Assert.assertEquals(IQ.Type.get.toString(), - element.attributeValue("type")); - Assert.assertEquals("remote-server.com", response.getTo().getDomain()); - - Assert.assertEquals(element.element("pubsub").element("actor") - .getText(), response.getFrom().toBareJID()); - } - - @Test - public void testNodeWhichDoesntExistReturnsNotFoundStanza() - throws Exception { - - Mockito.when(channelManager.nodeExists(node)).thenReturn(false); - element.addAttribute("node", node); - - itemsGet.process(element, jid, request, null); - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - - 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 testNodeStoreExceptionReturnsInternalServerErrorStanza() - throws Exception { - element.addAttribute("node", node); - - Mockito.when(channelManager.nodeExists(node)).thenThrow( - NodeStoreException.class); - - itemsGet.process(element, jid, request, null); - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.wait, error.getType()); - Assert.assertEquals(PacketError.Condition.internal_server_error, - error.getCondition()); - } - - @Test - public void testSubscriptionIncompatibleWithItemRetrievalReturnsExpectedStanza() - throws Exception { - - element.addAttribute("node", node); - - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( - new NodeMembershipImpl(node, jid, Subscriptions.none, - Affiliations.none, null)); - - NodeViewAcl nodeViewAclMock = Mockito.mock(NodeViewAcl.class); - Mockito.doReturn(false) - .when(nodeViewAclMock) - .canViewNode(Mockito.anyString(), - Mockito.any(NodeMembership.class), - Mockito.any(AccessModels.class), Mockito.anyBoolean()); - NodeAclRefuseReason refusalReason = new NodeAclRefuseReason( - PacketError.Type.auth, PacketError.Condition.forbidden, - "pending-subscription"); - Mockito.when(nodeViewAclMock.getReason()).thenReturn(refusalReason); - itemsGet.setNodeViewAcl(nodeViewAclMock); - - itemsGet.process(element, jid, request, null); - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.auth, error.getType()); - Assert.assertEquals(PacketError.Condition.forbidden, - error.getCondition()); - Assert.assertEquals("pending-subscription", - error.getApplicationConditionName()); - } - - @Test - public void testStandardNodeWithNoItemsReturnsNoItems() throws Exception { - - AccessModels accessModel = AccessModels.authorize; - - element.addAttribute("node", node); - - NodeMembershipImpl membership = Mockito.mock(NodeMembershipImpl.class); - Mockito.when(membership.getAffiliation()).thenReturn( - Affiliations.member); - Mockito.when(membership.getSubscription()).thenReturn( - Subscriptions.subscribed); - Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( - membership); - - Mockito.when( - channelManager.getNodeItems(Mockito.anyString(), - Mockito.anyString(), Mockito.anyInt())) - .thenReturn(null); - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - - NodeViewAcl nodeViewAclMock = Mockito.mock(NodeViewAcl.class); - Mockito.doReturn(true) - .when(nodeViewAclMock) - .canViewNode(Mockito.anyString(), - Mockito.any(NodeMembership.class), - Mockito.any(AccessModels.class), Mockito.anyBoolean()); - itemsGet.setNodeViewAcl(nodeViewAclMock); - - itemsGet.process(element, jid, request, null); - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - Element element = response.getElement(); - - Assert.assertEquals(IQ.Type.result.toString(), - element.attributeValue("type")); - Assert.assertEquals(node, element.element("pubsub").element("items") - .attributeValue("node")); - Assert.assertNull(element.element("pubsub").element("items") - .element("item")); - } - - @Test - public void testUnparsableNodeEntryIsIgnoredInItemsResponse() - throws Exception { - AccessModels accessModel = AccessModels.authorize; - - element.addAttribute("node", node); - - NodeMembershipImpl membership = Mockito.mock(NodeMembershipImpl.class); - Mockito.when(membership.getAffiliation()).thenReturn( - Affiliations.member); - Mockito.when(membership.getSubscription()).thenReturn( - Subscriptions.subscribed); - Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( - membership); - - NodeItem item = Mockito.mock(NodeItem.class); - Mockito.when(item.getId()).thenReturn("id"); - Mockito.when(item.getNodeId()).thenReturn(node); - Mockito.when(item.getPayload()) - .thenReturn("entry "); - NodeItem[] items = new NodeItem[2]; - items[0] = item; - items[1] = item; - CloseableIterator itemList = new ClosableIteratorImpl( - Arrays.asList(items).iterator()); - Mockito.doReturn(itemList) - .when(channelManager) - .getNodeItems(Mockito.anyString(), Mockito.anyString(), - Mockito.anyInt()); - - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - - NodeViewAcl nodeViewAclMock = Mockito.mock(NodeViewAcl.class); - Mockito.doReturn(true) - .when(nodeViewAclMock) - .canViewNode(Mockito.anyString(), - Mockito.any(NodeMembership.class), - Mockito.any(AccessModels.class), Mockito.anyBoolean()); - itemsGet.setNodeViewAcl(nodeViewAclMock); - - itemsGet.process(element, jid, request, null); - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - Element element = response.getElement(); - - Assert.assertEquals(IQ.Type.result.toString(), - element.attributeValue("type")); - Assert.assertEquals(node, element.element("pubsub").element("items") - .attributeValue("node")); - Assert.assertEquals(0, element.element("pubsub").element("items") - .nodeCount()); - } - - @Test - public void testPostsNodeReturnsItemsAsExpected() throws Exception { - AccessModels accessModel = AccessModels.authorize; - - element.addAttribute("node", node); - - NodeMembershipImpl membership = Mockito.mock(NodeMembershipImpl.class); - Mockito.when(membership.getAffiliation()).thenReturn( - Affiliations.member); - Mockito.when(membership.getSubscription()).thenReturn( - Subscriptions.subscribed); - Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( - membership); - - NodeItem item = Mockito.mock(NodeItem.class); - Mockito.when(item.getId()).thenReturn("id"); - Mockito.when(item.getNodeId()).thenReturn(node); - Mockito.when(item.getPayload()).thenReturn("entry text"); - NodeItem[] items = new NodeItem[2]; - items[0] = item; - items[1] = item; - CloseableIterator itemList = new ClosableIteratorImpl( - Arrays.asList(items).iterator()); - Mockito.doReturn(itemList) - .when(channelManager) - .getNodeItems(Mockito.anyString(), Mockito.anyString(), - Mockito.anyInt()); - - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - - NodeViewAcl nodeViewAclMock = Mockito.mock(NodeViewAcl.class); - Mockito.doReturn(true) - .when(nodeViewAclMock) - .canViewNode(Mockito.anyString(), - Mockito.any(NodeMembership.class), - Mockito.any(AccessModels.class), Mockito.anyBoolean()); - itemsGet.setNodeViewAcl(nodeViewAclMock); - - itemsGet.process(element, jid, request, null); - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - Element element = response.getElement(); - - Assert.assertEquals(IQ.Type.result.toString(), - element.attributeValue("type")); - Assert.assertEquals(node, element.element("pubsub").element("items") - .attributeValue("node")); - - Assert.assertEquals(2, element.element("pubsub").element("items") - .nodeCount()); - Assert.assertEquals("id", element.element("pubsub").element("items") - .element("item").attributeValue("id")); - Assert.assertEquals("entry text", - element.element("pubsub").element("items").element("item") - .elementText("entry")); - } - - @Test - public void testPagingAfterItem() throws Exception { - Element rsm = new BaseElement(new QName("set", new Namespace("", - "http://jabber.org/protocol/rsm"))); - - rsm.addElement("after").setText( - "tag:denmark.lit,/user/" + node + "/posts,item-id"); - - element.addAttribute("node", node); - - Mockito.when(channelManager.nodeExists(anyString())).thenReturn(true); - - NodeMembershipImpl membership = Mockito.mock(NodeMembershipImpl.class); - Mockito.when(membership.getAffiliation()).thenReturn( - Affiliations.member); - Mockito.when(membership.getSubscription()).thenReturn( - Subscriptions.subscribed); - Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( - membership); - - itemsGet.process(element, jid, request, rsm); - - verify(channelManager).getNodeItems(anyString(), eq("item-id"), - anyInt()); - } - - @Test - public void pagingAfterItemWithPlainNodeID() throws Exception { - Element rsm = new BaseElement(new QName("set", new Namespace("", - "http://jabber.org/protocol/rsm"))); - - rsm.addElement("after").setText("item-id"); - - element.addAttribute("node", node); - - Mockito.when(channelManager.nodeExists(anyString())).thenReturn(true); - - itemsGet.process(element, jid, request, rsm); - - verify(channelManager).getNodeItems(anyString(), eq("item-id"), - anyInt()); - } - - @Test - public void pagingAfterItemWithInvalidNode() throws Exception { - Element rsm = new BaseElement(new QName("set", new Namespace("", - "http://jabber.org/protocol/rsm"))); - - rsm.addElement("after").setText( - "tag:denmark.lit,/user/juliet@capulet.lit/posts,item-id"); - - element.addAttribute("node", "/user/francisco@denmark.lit/posts"); - - Mockito.when(channelManager.nodeExists(anyString())).thenReturn(true); - - itemsGet.process(element, jid, request, rsm); - - Packet p = queue.poll(100, TimeUnit.MILLISECONDS); - - assertEquals("Error expected", "error", - p.getElement().attributeValue("type")); - } - - @Test - public void getItemNotFoundIfSingleItemNotFound() throws Exception { - element.addAttribute("node", "/user/francisco@denmark.lit/posts"); - element.addElement("item").addAttribute("id", "12345"); + + Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( + new NodeMembershipImpl(node, jid, Subscriptions.subscribed, Affiliations.member, null)); + nodeViewAcl = Mockito.mock(NodeViewAcl.class); + Mockito.doReturn(true) + .when(nodeViewAcl) + .canViewNode(Mockito.anyString(), + Mockito.any(NodeMembership.class), + Mockito.any(AccessModels.class), Mockito.anyBoolean()); + itemsGet.setNodeViewAcl(nodeViewAcl); + } + + @Test + public void testPassingItemsAsElementNameReturnsTrue() { + Assert.assertTrue(itemsGet.accept(element)); + } + + @Test + public void testPassingNotItemsAsElementNameReturnsFalse() { + Element element = new BaseElement("not-items"); + Assert.assertFalse(itemsGet.accept(element)); + } + + @Test + public void testExternalNodeReturnsExpectedStanzaEarly() throws Exception { + + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); + + element.addAttribute("node", "/user/user@remote-server.com/posts"); + + itemsGet.process(element, jid, request, null); + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + + Element element = response.getElement(); + + Assert.assertEquals(IQ.Type.get.toString(), + element.attributeValue("type")); + Assert.assertEquals("remote-server.com", response.getTo().getDomain()); + + Assert.assertEquals(element.element("pubsub").element("actor") + .getText(), response.getFrom().toBareJID()); + } + + @Test + public void testNodeWhichDoesntExistReturnsNotFoundStanza() + throws Exception { + + Mockito.when(channelManager.nodeExists(node)).thenReturn(false); + element.addAttribute("node", node); + + itemsGet.process(element, jid, request, null); + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + + 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 testNodeStoreExceptionReturnsInternalServerErrorStanza() + throws Exception { + element.addAttribute("node", node); + + Mockito.when(channelManager.nodeExists(node)).thenThrow( + NodeStoreException.class); + + itemsGet.process(element, jid, request, null); + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.wait, error.getType()); + Assert.assertEquals(PacketError.Condition.internal_server_error, + error.getCondition()); + } + + @Test + public void testSubscriptionIncompatibleWithItemRetrievalReturnsExpectedStanza() + throws Exception { + + element.addAttribute("node", node); + + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( + new NodeMembershipImpl(node, jid, Subscriptions.none, + Affiliations.none, null)); + + NodeViewAcl nodeViewAclMock = Mockito.mock(NodeViewAcl.class); + Mockito.doReturn(false) + .when(nodeViewAclMock) + .canViewNode(Mockito.anyString(), + Mockito.any(NodeMembership.class), + Mockito.any(AccessModels.class), Mockito.anyBoolean()); + NodeAclRefuseReason refusalReason = new NodeAclRefuseReason( + PacketError.Type.auth, PacketError.Condition.forbidden, + "pending-subscription"); + Mockito.when(nodeViewAclMock.getReason()).thenReturn(refusalReason); + itemsGet.setNodeViewAcl(nodeViewAclMock); + + itemsGet.process(element, jid, request, null); + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.auth, error.getType()); + Assert.assertEquals(PacketError.Condition.forbidden, + error.getCondition()); + Assert.assertEquals("pending-subscription", + error.getApplicationConditionName()); + } + + @Test + public void testStandardNodeWithNoItemsReturnsNoItems() throws Exception { + + AccessModels accessModel = AccessModels.authorize; + + element.addAttribute("node", node); + + NodeMembershipImpl membership = Mockito.mock(NodeMembershipImpl.class); + Mockito.when(membership.getAffiliation()).thenReturn( + Affiliations.member); + Mockito.when(membership.getSubscription()).thenReturn( + Subscriptions.subscribed); + Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( + membership); + + Mockito.when( + channelManager.getNodeItems(Mockito.anyString(), + Mockito.anyString(), Mockito.anyInt())) + .thenReturn(null); + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + + NodeViewAcl nodeViewAclMock = Mockito.mock(NodeViewAcl.class); + Mockito.doReturn(true) + .when(nodeViewAclMock) + .canViewNode(Mockito.anyString(), + Mockito.any(NodeMembership.class), + Mockito.any(AccessModels.class), Mockito.anyBoolean()); + itemsGet.setNodeViewAcl(nodeViewAclMock); + + itemsGet.process(element, jid, request, null); + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + Element element = response.getElement(); + + Assert.assertEquals(IQ.Type.result.toString(), + element.attributeValue("type")); + Assert.assertEquals(node, element.element("pubsub").element("items") + .attributeValue("node")); + Assert.assertNull(element.element("pubsub").element("items") + .element("item")); + } + + @Test + public void testUnparsableNodeEntryIsIgnoredInItemsResponse() + throws Exception { + AccessModels accessModel = AccessModels.authorize; + + element.addAttribute("node", node); + + NodeMembershipImpl membership = Mockito.mock(NodeMembershipImpl.class); + Mockito.when(membership.getAffiliation()).thenReturn( + Affiliations.member); + Mockito.when(membership.getSubscription()).thenReturn( + Subscriptions.subscribed); + Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( + membership); + + NodeItem item = Mockito.mock(NodeItem.class); + Mockito.when(item.getId()).thenReturn("id"); + Mockito.when(item.getNodeId()).thenReturn(node); + Mockito.when(item.getPayload()) + .thenReturn("entry "); + NodeItem[] items = new NodeItem[2]; + items[0] = item; + items[1] = item; + CloseableIterator itemList = new ClosableIteratorImpl( + Arrays.asList(items).iterator()); + Mockito.doReturn(itemList) + .when(channelManager) + .getNodeItems(Mockito.anyString(), Mockito.anyString(), + Mockito.anyInt()); + + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + + NodeViewAcl nodeViewAclMock = Mockito.mock(NodeViewAcl.class); + Mockito.doReturn(true) + .when(nodeViewAclMock) + .canViewNode(Mockito.anyString(), + Mockito.any(NodeMembership.class), + Mockito.any(AccessModels.class), Mockito.anyBoolean()); + itemsGet.setNodeViewAcl(nodeViewAclMock); + + itemsGet.process(element, jid, request, null); + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + Element element = response.getElement(); + + Assert.assertEquals(IQ.Type.result.toString(), + element.attributeValue("type")); + Assert.assertEquals(node, element.element("pubsub").element("items") + .attributeValue("node")); + Assert.assertEquals(0, element.element("pubsub").element("items") + .nodeCount()); + } + + @Test + public void testPostsNodeReturnsItemsAsExpected() throws Exception { + AccessModels accessModel = AccessModels.authorize; + + element.addAttribute("node", node); + + NodeMembershipImpl membership = Mockito.mock(NodeMembershipImpl.class); + Mockito.when(membership.getAffiliation()).thenReturn( + Affiliations.member); + Mockito.when(membership.getSubscription()).thenReturn( + Subscriptions.subscribed); + Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( + membership); + + NodeItem item = Mockito.mock(NodeItem.class); + Mockito.when(item.getId()).thenReturn("id"); + Mockito.when(item.getNodeId()).thenReturn(node); + Mockito.when(item.getPayload()).thenReturn("entry text"); + NodeItem[] items = new NodeItem[2]; + items[0] = item; + items[1] = item; + CloseableIterator itemList = new ClosableIteratorImpl( + Arrays.asList(items).iterator()); + Mockito.doReturn(itemList) + .when(channelManager) + .getNodeItems(Mockito.anyString(), Mockito.anyString(), + Mockito.anyInt()); + + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + + NodeViewAcl nodeViewAclMock = Mockito.mock(NodeViewAcl.class); + Mockito.doReturn(true) + .when(nodeViewAclMock) + .canViewNode(Mockito.anyString(), + Mockito.any(NodeMembership.class), + Mockito.any(AccessModels.class), Mockito.anyBoolean()); + itemsGet.setNodeViewAcl(nodeViewAclMock); + + itemsGet.process(element, jid, request, null); + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + Element element = response.getElement(); + + Assert.assertEquals(IQ.Type.result.toString(), + element.attributeValue("type")); + Assert.assertEquals(node, element.element("pubsub").element("items") + .attributeValue("node")); + + Assert.assertEquals(2, element.element("pubsub").element("items") + .nodeCount()); + Assert.assertEquals("id", element.element("pubsub").element("items") + .element("item").attributeValue("id")); + Assert.assertEquals("entry text", + element.element("pubsub").element("items").element("item") + .elementText("entry")); + } + + @Test + public void testPagingAfterItem() throws Exception { + Element rsm = new BaseElement(new QName("set", new Namespace("", + "http://jabber.org/protocol/rsm"))); + + rsm.addElement("after").setText( + "tag:denmark.lit,/user/" + node + "/posts,item-id"); + + element.addAttribute("node", node); + + Mockito.when(channelManager.nodeExists(anyString())).thenReturn(true); + + NodeMembershipImpl membership = Mockito.mock(NodeMembershipImpl.class); + Mockito.when(membership.getAffiliation()).thenReturn( + Affiliations.member); + Mockito.when(membership.getSubscription()).thenReturn( + Subscriptions.subscribed); + Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( + membership); + + itemsGet.process(element, jid, request, rsm); + + verify(channelManager).getNodeItems(anyString(), eq("item-id"), + anyInt()); + } + + @Test + public void pagingAfterItemWithPlainNodeID() throws Exception { + Element rsm = new BaseElement(new QName("set", new Namespace("", + "http://jabber.org/protocol/rsm"))); + + rsm.addElement("after").setText("item-id"); + + element.addAttribute("node", node); + + Mockito.when(channelManager.nodeExists(anyString())).thenReturn(true); + + itemsGet.process(element, jid, request, rsm); + + verify(channelManager).getNodeItems(anyString(), eq("item-id"), + anyInt()); + } + + @Test + public void pagingAfterItemWithInvalidNode() throws Exception { + Element rsm = new BaseElement(new QName("set", new Namespace("", + "http://jabber.org/protocol/rsm"))); + + rsm.addElement("after").setText( + "tag:denmark.lit,/user/juliet@capulet.lit/posts,item-id"); + + element.addAttribute("node", "/user/francisco@denmark.lit/posts"); + + Mockito.when(channelManager.nodeExists(anyString())).thenReturn(true); + + itemsGet.process(element, jid, request, rsm); + + Packet p = queue.poll(100, TimeUnit.MILLISECONDS); + + assertEquals("Error expected", "error", + p.getElement().attributeValue("type")); + } + + @Test + public void getItemNotFoundIfSingleItemNotFound() throws Exception { + element.addAttribute("node", "/user/francisco@denmark.lit/posts"); + element.addElement("item").addAttribute("id", "12345"); - itemsGet.process(element, jid, request, null); + itemsGet.process(element, jid, request, null); - Packet p = queue.poll(); - assertEquals("Error expected", "error", - p.getElement().attributeValue("type")); - assertEquals("Expected 'cancel'", "cancel", - p.getElement().element("error").attributeValue("type")); - assertNotNull(p.getElement().element("error").element("item-not-found")); - } + Packet p = queue.poll(); + assertEquals("Error expected", "error", + p.getElement().attributeValue("type")); + assertEquals("Expected 'cancel'", "cancel", + p.getElement().element("error").attributeValue("type")); + assertNotNull(p.getElement().element("error").element("item-not-found")); + } - @Test - public void canRetrieveSingleItem() throws Exception { + @Test + public void canRetrieveSingleItem() throws Exception { - String id = "12345"; - String payload = "entry text"; + String id = "12345"; + String payload = "entry text"; - element.addAttribute("node", node); - element.addElement("item").addAttribute("id", id); + element.addAttribute("node", node); + element.addElement("item").addAttribute("id", id); - Mockito.when(channelManager.nodeExists(Mockito.anyString())) - .thenReturn(true); + Mockito.when(channelManager.nodeExists(Mockito.anyString())) + .thenReturn(true); - NodeItem item = new NodeItemImpl(node, id, new Date(), payload); - Mockito.when( - channelManager.getNodeItem(Mockito.anyString(), - Mockito.anyString())).thenReturn(item); + NodeItem item = new NodeItemImpl(node, id, new Date(), payload); + Mockito.when( + channelManager.getNodeItem(Mockito.anyString(), + Mockito.anyString())).thenReturn(item); - itemsGet.process(element, jid, request, null); - Packet response = queue.poll(); + itemsGet.process(element, jid, request, null); + Packet response = queue.poll(); - Element element = response.getElement(); + Element element = response.getElement(); - Assert.assertEquals(IQ.Type.result.toString(), - element.attributeValue("type")); - Assert.assertEquals(node, element.element("pubsub").element("items") - .attributeValue("node")); + Assert.assertEquals(IQ.Type.result.toString(), + element.attributeValue("type")); + Assert.assertEquals(node, element.element("pubsub").element("items") + .attributeValue("node")); - Assert.assertEquals(1, element.element("pubsub").element("items") - .nodeCount()); - Assert.assertEquals(node, element.element("pubsub").element("items") - .attributeValue("node")); - Assert.assertEquals(id, element.element("pubsub").element("items") - .element("item").attributeValue("id")); - Assert.assertEquals("entry text", - element.element("pubsub").element("items").element("item") - .elementText("entry")); - } + Assert.assertEquals(1, element.element("pubsub").element("items") + .nodeCount()); + Assert.assertEquals(node, element.element("pubsub").element("items") + .attributeValue("node")); + Assert.assertEquals(id, element.element("pubsub").element("items") + .element("item").attributeValue("id")); + Assert.assertEquals("entry text", + element.element("pubsub").element("items").element("item") + .elementText("entry")); + } } diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/UserSingleItemGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/UserSingleItemGetTest.java index 218b5ee1..1220c3e1 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/UserSingleItemGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/UserSingleItemGetTest.java @@ -30,115 +30,115 @@ public class UserSingleItemGetTest extends IQTestHandler { - private IQ request; - private NodeItemsGet itemsGet; - private Element element; - private BlockingQueue queue = new LinkedBlockingQueue(); + private IQ request; + private NodeItemsGet itemsGet; + private Element element; + private BlockingQueue queue = new LinkedBlockingQueue(); - private String node = "/user/francisco@denmark.lit/posts"; - private JID jid = new JID("francisco@denmark.lit"); - private ChannelManager channelManager; - private NodeViewAcl nodeViewAcl; + private String node = "/user/francisco@denmark.lit/posts"; + private JID jid = new JID("francisco@denmark.lit"); + private ChannelManager channelManager; + private NodeViewAcl nodeViewAcl; - @Before - public void setUp() throws Exception { + @Before + public void setUp() throws Exception { - queue = new LinkedBlockingQueue(); - itemsGet = new NodeItemsGet(queue, channelManager); - request = readStanzaAsIq("/iq/pubsub/items/requestSingleItem.stanza"); - element = request.getElement().element("pubsub").element("items"); + queue = new LinkedBlockingQueue(); + itemsGet = new NodeItemsGet(queue, channelManager); + request = readStanzaAsIq("/iq/pubsub/items/requestSingleItem.stanza"); + element = request.getElement().element("pubsub").element("items"); - channelManager = Mockito.mock(ChannelManager.class); - - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); - - Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( - new NodeMembershipImpl(node, jid, Subscriptions.subscribed, Affiliations.member, null)); - nodeViewAcl = Mockito.mock(NodeViewAcl.class); - Mockito.doReturn(true) - .when(nodeViewAcl) - .canViewNode(Mockito.anyString(), - Mockito.any(NodeMembership.class), - Mockito.any(AccessModels.class), Mockito.anyBoolean()); - itemsGet.setNodeViewAcl(nodeViewAcl); - - itemsGet.setChannelManager(channelManager); - } + channelManager = Mockito.mock(ChannelManager.class); + + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); + + Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( + new NodeMembershipImpl(node, jid, Subscriptions.subscribed, Affiliations.member, null)); + nodeViewAcl = Mockito.mock(NodeViewAcl.class); + Mockito.doReturn(true) + .when(nodeViewAcl) + .canViewNode(Mockito.anyString(), + Mockito.any(NodeMembership.class), + Mockito.any(AccessModels.class), Mockito.anyBoolean()); + itemsGet.setNodeViewAcl(nodeViewAcl); + + itemsGet.setChannelManager(channelManager); + } - @Test - public void testPassingItemsAsElementNameReturnsTrue() { - Assert.assertTrue(itemsGet.accept(element)); - } - - @Test - public void testInexistentNode() throws Exception { - Assert.assertTrue(itemsGet.accept(element)); - itemsGet.process(element, 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 testPassingItemsAsElementNameReturnsTrue() { + Assert.assertTrue(itemsGet.accept(element)); + } + + @Test + public void testInexistentNode() throws Exception { + Assert.assertTrue(itemsGet.accept(element)); + itemsGet.process(element, 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 unableToReadNode() throws Exception { - - NodeAclRefuseReason reason = Mockito.mock(NodeAclRefuseReason.class); - Mockito.when(reason.getType()).thenReturn(PacketError.Type.auth); - Mockito.when(reason.getCondition()).thenReturn(PacketError.Condition.forbidden); - - Mockito.doReturn(false) - .when(nodeViewAcl) - .canViewNode(Mockito.anyString(), - Mockito.any(NodeMembership.class), - Mockito.any(AccessModels.class), Mockito.anyBoolean()); - Mockito.when(nodeViewAcl.getReason()).thenReturn(reason); + @Test + public void unableToReadNode() throws Exception { + + NodeAclRefuseReason reason = Mockito.mock(NodeAclRefuseReason.class); + Mockito.when(reason.getType()).thenReturn(PacketError.Type.auth); + Mockito.when(reason.getCondition()).thenReturn(PacketError.Condition.forbidden); + + Mockito.doReturn(false) + .when(nodeViewAcl) + .canViewNode(Mockito.anyString(), + Mockito.any(NodeMembership.class), + Mockito.any(AccessModels.class), Mockito.anyBoolean()); + Mockito.when(nodeViewAcl.getReason()).thenReturn(reason); - itemsGet.process(element, jid, request, null); - Packet response = queue.poll(); + itemsGet.process(element, 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 inexistentItem() throws Exception { + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.auth, error.getType()); + Assert.assertEquals(PacketError.Condition.forbidden, + error.getCondition()); + } + + @Test + public void inexistentItem() throws Exception { - itemsGet.process(element, 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 existentItemCheckNamespace() throws Exception { + itemsGet.process(element, 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 existentItemCheckNamespace() throws Exception { - - final String itemId = "item1Id"; - NodeItem nodeItem = new NodeItemImpl(node, itemId, new Date(), ""); - Mockito.when(channelManager.getNodeItem(node, itemId)).thenReturn(nodeItem); - - itemsGet.process(element, jid, request, null); - Packet response = queue.poll(); - - Assert.assertNull(response.getError()); - Element pubsubEl = response.getElement().element("pubsub"); - Assert.assertEquals(JabberPubsub.NAMESPACE_URI, pubsubEl.getNamespaceURI()); - Element itemsEl = pubsubEl.element("items"); - Assert.assertEquals(JabberPubsub.NAMESPACE_URI, itemsEl.getNamespaceURI()); - Element itemEl = itemsEl.element("item"); - Assert.assertEquals(JabberPubsub.NAMESPACE_URI, itemEl.getNamespaceURI()); - } -} \ No newline at end of file + + final String itemId = "item1Id"; + NodeItem nodeItem = new NodeItemImpl(node, itemId, new Date(), ""); + Mockito.when(channelManager.getNodeItem(node, itemId)).thenReturn(nodeItem); + + itemsGet.process(element, jid, request, null); + Packet response = queue.poll(); + + Assert.assertNull(response.getError()); + Element pubsubEl = response.getElement().element("pubsub"); + Assert.assertEquals(JabberPubsub.NAMESPACE_URI, pubsubEl.getNamespaceURI()); + Element itemsEl = pubsubEl.element("items"); + Assert.assertEquals(JabberPubsub.NAMESPACE_URI, itemsEl.getNamespaceURI()); + Element itemEl = itemsEl.element("item"); + Assert.assertEquals(JabberPubsub.NAMESPACE_URI, itemEl.getNamespaceURI()); + } +} diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGetTest.java index fd8a58de..e810d9bd 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGetTest.java @@ -28,206 +28,206 @@ public class FirehoseGetTest extends IQTestHandler { - private IQ request; - private FirehoseGet recentItemsGet; - private Element element; - private BlockingQueue queue = new LinkedBlockingQueue(); - - private JID jid = new JID("user1@server1"); - private ChannelManager channelManager; - - private String TEST_NODE_1 = "node1"; - private String TEST_NODE_2 = "node2"; - - @Before - public void setUp() throws Exception { - - queue = new LinkedBlockingQueue(); - channelManager = Mockito.mock(ChannelManager.class); - - recentItemsGet = new FirehoseGet(queue, channelManager); - new IQTestHandler(); - request = readStanzaAsIq("/iq/pubsub/items/request.stanza"); - element = new BaseElement("items"); - - readConf(); - } - - @Test - public void testPassingItemsAsElementNameReturnsTrue() { - Assert.assertTrue(recentItemsGet.accept(element)); - } - - @Test - public void testPassingNotItemsAsElementNameReturnsFalse() { - Element element = new BaseElement("not-items"); - Assert.assertFalse(recentItemsGet.accept(element)); - } - - @Test - public void testNodeStoreExceptionGeneratesAnErrorStanza() throws Exception { - - Mockito.when( - channelManager.getFirehose(Mockito.anyInt(), - Mockito.anyString(), Mockito.anyBoolean(), - Mockito.anyString())).thenThrow( - new NodeStoreException()); - - recentItemsGet.process(element, jid, request, null); - Packet response = queue.poll(); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.wait, error.getType()); - Assert.assertEquals(PacketError.Condition.internal_server_error, - error.getCondition()); - } - - @Test - public void testItemsReturnsEmptyStanza() throws Exception { - - Mockito.when( - channelManager.getFirehose(Mockito.anyInt(), Mockito.anyString(), - Mockito.anyBoolean(), Mockito.anyString())).thenReturn( - new ClosableIteratorImpl(new ArrayList() - .iterator())); - - recentItemsGet.process(element, jid, request, null); - IQ response = (IQ) queue.poll(); - - Assert.assertEquals(IQ.Type.result, response.getType()); - Element pubsub = response.getChildElement(); - Assert.assertEquals("pubsub", pubsub.getName()); - Assert.assertEquals(JabberPubsub.NAMESPACE_URI, - pubsub.getNamespaceURI()); - } - - @SuppressWarnings("unchecked") - @Test - public void testOutgoingStanzaFormattedAsExpected() throws Exception { - - NodeItem item1 = new NodeItemImpl(TEST_NODE_1, "1", new Date(), - "item1"); - NodeItem item2 = new NodeItemImpl(TEST_NODE_2, "1", new Date(), - "item2"); - NodeItem item3 = new NodeItemImpl(TEST_NODE_1, "2", new Date(), - "item3"); - NodeItem item4 = new NodeItemImpl(TEST_NODE_1, "3", new Date(), - "item4"); - - ArrayList results = new ArrayList(); - results.add(item1); - results.add(item2); - results.add(item3); - results.add(item4); - - Mockito.when( - channelManager.getFirehose(Mockito.anyInt(), Mockito.anyString(), Mockito.anyBoolean(), Mockito.anyString())).thenReturn( - new ClosableIteratorImpl(results.iterator())); - Mockito.when( - channelManager.getFirehoseItemCount(Mockito.anyBoolean(), Mockito.anyString())).thenReturn(4); - - recentItemsGet.process(element, jid, request, null); - IQ response = (IQ) queue.poll(); - - Assert.assertEquals(IQ.Type.result, response.getType()); - Element pubsub = response.getChildElement(); - Assert.assertEquals("pubsub", pubsub.getName()); - Assert.assertEquals(JabberPubsub.NAMESPACE_URI, - pubsub.getNamespaceURI()); - - List items = pubsub.elements("items"); - Assert.assertEquals(3, items.size()); - - Assert.assertEquals(TEST_NODE_1, items.get(0).attributeValue("node")); - Assert.assertEquals(TEST_NODE_2, items.get(1).attributeValue("node")); - Assert.assertEquals(TEST_NODE_1, items.get(2).attributeValue("node")); - - Assert.assertEquals(1, items.get(0).elements("item").size()); - Assert.assertEquals(2, items.get(2).elements("item").size()); - } - - @Test - public void testUnparsableItemEntriesAreSimplyIgnored() throws Exception { - - NodeItem item1 = new NodeItemImpl(TEST_NODE_1, "1", new Date(), - "item1"); - NodeItem item2 = new NodeItemImpl(TEST_NODE_1, "2", new Date(), - "item2"); - - ArrayList results = new ArrayList(); - results.add(item1); - results.add(item2); - - Mockito.when( - channelManager.getFirehose(Mockito.anyInt(), Mockito.anyString(), Mockito.anyBoolean(), Mockito.anyString())).thenReturn( - new ClosableIteratorImpl(results.iterator())); - - recentItemsGet.process(element, jid, request, null); - IQ response = (IQ) queue.poll(); - Assert.assertEquals(1, response.getChildElement().element("items") - .elements("item").size()); - } - - @SuppressWarnings("unchecked") - @Test - public void testCanControlGatheredEntriesUsingRsm() throws Exception { - - NodeItem item2 = new NodeItemImpl(TEST_NODE_2, "node2:1", new Date(), - "item2"); - NodeItem item3 = new NodeItemImpl(TEST_NODE_1, "node1:2", new Date(), - "item3"); - - ArrayList results = new ArrayList(); - results.add(item2); - results.add(item3); - - Mockito.when( - channelManager.getFirehose(Mockito.anyInt(), Mockito.anyString(), - Mockito.anyBoolean(), Mockito.anyString())).thenReturn( - new ClosableIteratorImpl(results.iterator())); - Mockito.when( - channelManager.getFirehoseItemCount(Mockito.anyBoolean(), - Mockito.anyString())).thenReturn(2); - - Element rsm = request.getElement().addElement("rsm"); - rsm.addNamespace("", RecentItemsGet.NS_RSM); - rsm.addElement("max").addText("2"); - rsm.addElement("after").addText("node1:1"); - - recentItemsGet.process(element, jid, request, null); - IQ response = (IQ) queue.poll(); - - Assert.assertEquals(IQ.Type.result, response.getType()); - Element pubsub = response.getChildElement(); - Assert.assertEquals("pubsub", pubsub.getName()); - Assert.assertEquals(JabberPubsub.NAMESPACE_URI, - pubsub.getNamespaceURI()); - - List items = pubsub.elements("items"); - Assert.assertEquals(2, items.size()); - - Assert.assertEquals(TEST_NODE_2, items.get(0).attributeValue("node")); - Assert.assertEquals(TEST_NODE_1, items.get(1).attributeValue("node")); - Assert.assertEquals(1, items.get(0).elements("item").size()); - Assert.assertEquals(1, items.get(1).elements("item").size()); - - Element rsmResult = pubsub.element("set"); - Assert.assertEquals("2", rsmResult.element("count").getText()); - Assert.assertEquals("node2:1", rsmResult.element("first").getText()); - Assert.assertEquals("node1:2", rsmResult.element("last").getText()); - } - - @Test - public void testAdminUsersHaveRequestsMadeAsExpected() throws Exception { - - ArrayList results = new ArrayList(); - - Mockito.when( - channelManager.getFirehose(Mockito.anyInt(), Mockito.anyString(), Mockito.eq(true), - Mockito.anyString())).thenReturn( - new ClosableIteratorImpl(results.iterator())); - - recentItemsGet.process(element, jid, request, null); - } -} \ No newline at end of file + private IQ request; + private FirehoseGet recentItemsGet; + private Element element; + private BlockingQueue queue = new LinkedBlockingQueue(); + + private JID jid = new JID("user1@server1"); + private ChannelManager channelManager; + + private static final String TEST_NODE_1 = "node1"; + private static final String TEST_NODE_2 = "node2"; + + @Before + public void setUp() throws Exception { + + queue = new LinkedBlockingQueue(); + channelManager = Mockito.mock(ChannelManager.class); + + recentItemsGet = new FirehoseGet(queue, channelManager); + new IQTestHandler(); + request = readStanzaAsIq("/iq/pubsub/items/request.stanza"); + element = new BaseElement("items"); + + readConf(); + } + + @Test + public void testPassingItemsAsElementNameReturnsTrue() { + Assert.assertTrue(recentItemsGet.accept(element)); + } + + @Test + public void testPassingNotItemsAsElementNameReturnsFalse() { + Element element = new BaseElement("not-items"); + Assert.assertFalse(recentItemsGet.accept(element)); + } + + @Test + public void testNodeStoreExceptionGeneratesAnErrorStanza() throws Exception { + + Mockito.when( + channelManager.getFirehose(Mockito.anyInt(), + Mockito.anyString(), Mockito.anyBoolean(), + Mockito.anyString())).thenThrow( + new NodeStoreException()); + + recentItemsGet.process(element, jid, request, null); + Packet response = queue.poll(); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.wait, error.getType()); + Assert.assertEquals(PacketError.Condition.internal_server_error, + error.getCondition()); + } + + @Test + public void testItemsReturnsEmptyStanza() throws Exception { + + Mockito.when( + channelManager.getFirehose(Mockito.anyInt(), Mockito.anyString(), + Mockito.anyBoolean(), Mockito.anyString())).thenReturn( + new ClosableIteratorImpl(new ArrayList() + .iterator())); + + recentItemsGet.process(element, jid, request, null); + IQ response = (IQ) queue.poll(); + + Assert.assertEquals(IQ.Type.result, response.getType()); + Element pubsub = response.getChildElement(); + Assert.assertEquals("pubsub", pubsub.getName()); + Assert.assertEquals(JabberPubsub.NAMESPACE_URI, + pubsub.getNamespaceURI()); + } + + @SuppressWarnings("unchecked") + @Test + public void testOutgoingStanzaFormattedAsExpected() throws Exception { + + NodeItem item1 = new NodeItemImpl(TEST_NODE_1, "1", new Date(), + "item1"); + NodeItem item2 = new NodeItemImpl(TEST_NODE_2, "1", new Date(), + "item2"); + NodeItem item3 = new NodeItemImpl(TEST_NODE_1, "2", new Date(), + "item3"); + NodeItem item4 = new NodeItemImpl(TEST_NODE_1, "3", new Date(), + "item4"); + + ArrayList results = new ArrayList(); + results.add(item1); + results.add(item2); + results.add(item3); + results.add(item4); + + Mockito.when( + channelManager.getFirehose(Mockito.anyInt(), Mockito.anyString(), Mockito.anyBoolean(), Mockito.anyString())).thenReturn( + new ClosableIteratorImpl(results.iterator())); + Mockito.when( + channelManager.getFirehoseItemCount(Mockito.anyBoolean(), Mockito.anyString())).thenReturn(4); + + recentItemsGet.process(element, jid, request, null); + IQ response = (IQ) queue.poll(); + + Assert.assertEquals(IQ.Type.result, response.getType()); + Element pubsub = response.getChildElement(); + Assert.assertEquals("pubsub", pubsub.getName()); + Assert.assertEquals(JabberPubsub.NAMESPACE_URI, + pubsub.getNamespaceURI()); + + List items = pubsub.elements("items"); + Assert.assertEquals(3, items.size()); + + Assert.assertEquals(TEST_NODE_1, items.get(0).attributeValue("node")); + Assert.assertEquals(TEST_NODE_2, items.get(1).attributeValue("node")); + Assert.assertEquals(TEST_NODE_1, items.get(2).attributeValue("node")); + + Assert.assertEquals(1, items.get(0).elements("item").size()); + Assert.assertEquals(2, items.get(2).elements("item").size()); + } + + @Test + public void testUnparsableItemEntriesAreSimplyIgnored() throws Exception { + + NodeItem item1 = new NodeItemImpl(TEST_NODE_1, "1", new Date(), + "item1"); + NodeItem item2 = new NodeItemImpl(TEST_NODE_1, "2", new Date(), + "item2"); + + ArrayList results = new ArrayList(); + results.add(item1); + results.add(item2); + + Mockito.when( + channelManager.getFirehose(Mockito.anyInt(), Mockito.anyString(), Mockito.anyBoolean(), Mockito.anyString())).thenReturn( + new ClosableIteratorImpl(results.iterator())); + + recentItemsGet.process(element, jid, request, null); + IQ response = (IQ) queue.poll(); + Assert.assertEquals(1, response.getChildElement().element("items") + .elements("item").size()); + } + + @SuppressWarnings("unchecked") + @Test + public void testCanControlGatheredEntriesUsingRsm() throws Exception { + + NodeItem item2 = new NodeItemImpl(TEST_NODE_2, "node2:1", new Date(), + "item2"); + NodeItem item3 = new NodeItemImpl(TEST_NODE_1, "node1:2", new Date(), + "item3"); + + ArrayList results = new ArrayList(); + results.add(item2); + results.add(item3); + + Mockito.when( + channelManager.getFirehose(Mockito.anyInt(), Mockito.anyString(), + Mockito.anyBoolean(), Mockito.anyString())).thenReturn( + new ClosableIteratorImpl(results.iterator())); + Mockito.when( + channelManager.getFirehoseItemCount(Mockito.anyBoolean(), + Mockito.anyString())).thenReturn(2); + + Element rsm = request.getElement().addElement("rsm"); + rsm.addNamespace("", RecentItemsGet.NS_RSM); + rsm.addElement("max").addText("2"); + rsm.addElement("after").addText("node1:1"); + + recentItemsGet.process(element, jid, request, null); + IQ response = (IQ) queue.poll(); + + Assert.assertEquals(IQ.Type.result, response.getType()); + Element pubsub = response.getChildElement(); + Assert.assertEquals("pubsub", pubsub.getName()); + Assert.assertEquals(JabberPubsub.NAMESPACE_URI, + pubsub.getNamespaceURI()); + + List items = pubsub.elements("items"); + Assert.assertEquals(2, items.size()); + + Assert.assertEquals(TEST_NODE_2, items.get(0).attributeValue("node")); + Assert.assertEquals(TEST_NODE_1, items.get(1).attributeValue("node")); + Assert.assertEquals(1, items.get(0).elements("item").size()); + Assert.assertEquals(1, items.get(1).elements("item").size()); + + Element rsmResult = pubsub.element("set"); + Assert.assertEquals("2", rsmResult.element("count").getText()); + Assert.assertEquals("node2:1", rsmResult.element("first").getText()); + Assert.assertEquals("node1:2", rsmResult.element("last").getText()); + } + + @Test + public void testAdminUsersHaveRequestsMadeAsExpected() throws Exception { + + ArrayList results = new ArrayList(); + + Mockito.when( + channelManager.getFirehose(Mockito.anyInt(), Mockito.anyString(), Mockito.eq(true), + Mockito.anyString())).thenReturn( + new ClosableIteratorImpl(results.iterator())); + + recentItemsGet.process(element, jid, request, null); + } +} diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/result/ItemsResultTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/result/ItemsResultTest.java index 0670f0b5..193495b6 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/result/ItemsResultTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/result/ItemsResultTest.java @@ -18,189 +18,189 @@ public class ItemsResultTest extends IQTestHandler { - private IQ result; - private ItemsResult itemsResult; - private Element element; - - private String node = "/user/pamela@denmark.lit/posts"; - private JID jid = new JID("juliet@shakespeare.lit"); - private ChannelManager channelManager; - - @Before - public void setUp() throws Exception { - - itemsResult = new ItemsResult(channelManager); - result = readStanzaAsIq("/iq/pubsub/items/reply.stanza"); - - element = new BaseElement("items"); - element.addAttribute("node", node); - - channelManager = Mockito.mock(ChannelManager.class); - itemsResult.setChannelManager(channelManager); - - org.buddycloud.channelserver.Configuration.getInstance().putProperty( - org.buddycloud.channelserver.Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, - Boolean.FALSE.toString()); - } - - @Test - public void testPassingItemsAsElementNameReturnsTrue() { - Assert.assertTrue(itemsResult.accept(element)); - } - - @Test - public void testPassingNotItemsAsElementNameReturnsFalse() { - Element element = new BaseElement("not-items"); - Assert.assertFalse(itemsResult.accept(element)); - } - - @Test(expected = NullPointerException.class) - public void testMissingNodeAttributeThrowsException() throws Exception { - Element element = new BaseElement("items"); - itemsResult.process(element, jid, result, null); - } - - @Test - public void testEnsureResultsComeFromExternalBuddycloudServers() - throws Exception { - // If test throws an exception it failed! - Element element = new BaseElement("items"); - - result = toIq(""); - - itemsResult.process(element, jid, result, null); - } - - @Test - public void testNoItemsResultsInNoAdditionsToDatabase() throws Exception { + private IQ result; + private ItemsResult itemsResult; + private Element element; + + private String node = "/user/pamela@denmark.lit/posts"; + private JID jid = new JID("juliet@shakespeare.lit"); + private ChannelManager channelManager; + + @Before + public void setUp() throws Exception { + + itemsResult = new ItemsResult(channelManager); + result = readStanzaAsIq("/iq/pubsub/items/reply.stanza"); + + element = new BaseElement("items"); + element.addAttribute("node", node); + + channelManager = Mockito.mock(ChannelManager.class); + itemsResult.setChannelManager(channelManager); + + org.buddycloud.channelserver.Configuration.getInstance().putProperty( + org.buddycloud.channelserver.Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, + Boolean.FALSE.toString()); + } + + @Test + public void testPassingItemsAsElementNameReturnsTrue() { + Assert.assertTrue(itemsResult.accept(element)); + } + + @Test + public void testPassingNotItemsAsElementNameReturnsFalse() { + Element element = new BaseElement("not-items"); + Assert.assertFalse(itemsResult.accept(element)); + } + + @Test(expected = NullPointerException.class) + public void testMissingNodeAttributeThrowsException() throws Exception { + Element element = new BaseElement("items"); + itemsResult.process(element, jid, result, null); + } + + @Test + public void testEnsureResultsComeFromExternalBuddycloudServers() + throws Exception { + // If test throws an exception it failed! + Element element = new BaseElement("items"); + + result = toIq(""); + + itemsResult.process(element, jid, result, null); + } + + @Test + public void testNoItemsResultsInNoAdditionsToDatabase() throws Exception { - Mockito.when(channelManager.nodeExists(Mockito.anyString())) - .thenReturn(true); - - result = toIq("" - + "" - + "" - + ""); - - itemsResult.process(element, jid, result, null); - - Mockito.verify(channelManager, Mockito.never()).addNodeItem( - Mockito.any(NodeItem.class)); - } - - @Test - public void testNodeCreatedInDatabaseIfItDoesntExist() throws Exception { - - Mockito.when(channelManager.nodeExists(Mockito.anyString())) - .thenReturn(false); - - result = toIq("" - + "" - + "" - + ""); - - itemsResult.process(element, jid, result, null); - - Mockito.verify(channelManager, Mockito.times(1)).addRemoteNode( - Mockito.anyString()); - } - - @Test - public void testNodeNotCreatedInDatabaseIfAlreadyExists() throws Exception { - - Mockito.when(channelManager.nodeExists(Mockito.anyString())) - .thenReturn(true); - - result = toIq("" - + "" - + "" - + ""); - - itemsResult.process(element, jid, result, null); - - Mockito.verify(channelManager, Mockito.never()).addRemoteNode( - Mockito.anyString()); - } - - @Test - public void testItemWithInvalidDateIsNotAddedToDatabase() throws Exception { - - Mockito.when(channelManager.nodeExists(Mockito.anyString())) - .thenReturn(true); - - result = toIq("" - + "" - + "" - + "" - + "" - + "tag:channels.buddycloud.com,/user/koski@buddycloud.com/posts,3" - + "November 5, 1955" + "" - + "koski@buddycloud.com" + "" - + "" + "" + ""); - - itemsResult.process(element, jid, result, null); - - Mockito.verify(channelManager, Mockito.times(0)).addNodeItem( - Mockito.any(NodeItem.class)); - } + Mockito.when(channelManager.nodeExists(Mockito.anyString())) + .thenReturn(true); + + result = toIq("" + + "" + + "" + + ""); + + itemsResult.process(element, jid, result, null); + + Mockito.verify(channelManager, Mockito.never()).addNodeItem( + Mockito.any(NodeItem.class)); + } + + @Test + public void testNodeCreatedInDatabaseIfItDoesntExist() throws Exception { + + Mockito.when(channelManager.nodeExists(Mockito.anyString())) + .thenReturn(false); + + result = toIq("" + + "" + + "" + + ""); + + itemsResult.process(element, jid, result, null); + + Mockito.verify(channelManager, Mockito.times(1)).addRemoteNode( + Mockito.anyString()); + } + + @Test + public void testNodeNotCreatedInDatabaseIfAlreadyExists() throws Exception { + + Mockito.when(channelManager.nodeExists(Mockito.anyString())) + .thenReturn(true); + + result = toIq("" + + "" + + "" + + ""); + + itemsResult.process(element, jid, result, null); + + Mockito.verify(channelManager, Mockito.never()).addRemoteNode( + Mockito.anyString()); + } + + @Test + public void testItemWithInvalidDateIsNotAddedToDatabase() throws Exception { + + Mockito.when(channelManager.nodeExists(Mockito.anyString())) + .thenReturn(true); + + result = toIq("" + + "" + + "" + + "" + + "" + + "tag:channels.buddycloud.com,/user/koski@buddycloud.com/posts,3" + + "November 5, 1955" + "" + + "koski@buddycloud.com" + "" + + "" + "" + ""); + + itemsResult.process(element, jid, result, null); + + Mockito.verify(channelManager, Mockito.times(0)).addNodeItem( + Mockito.any(NodeItem.class)); + } - @Test - public void testSendingValidItemsResultsInCorrectNumberOfDatabaseEntries() - throws Exception { + @Test + public void testSendingValidItemsResultsInCorrectNumberOfDatabaseEntries() + throws Exception { - Mockito.when(channelManager.nodeExists(Mockito.anyString())) - .thenReturn(true); - - itemsResult.process(element, jid, result, null); + Mockito.when(channelManager.nodeExists(Mockito.anyString())) + .thenReturn(true); + + itemsResult.process(element, jid, result, null); - Mockito.verify(channelManager, Mockito.times(3)).addNodeItem( - Mockito.any(NodeItem.class)); - } + Mockito.verify(channelManager, Mockito.times(3)).addNodeItem( + Mockito.any(NodeItem.class)); + } - @Test - public void testSubscriptionsNodeAttemptsToPlaceCorrectDataIntoDatabase() - throws Exception { + @Test + public void testSubscriptionsNodeAttemptsToPlaceCorrectDataIntoDatabase() + throws Exception { - result = readStanzaAsIq("/iq/pubsub/items/subscriptions-reply.stanza"); - element.addAttribute("node", "/user/pamela@denmark.lit/subscriptions"); + result = readStanzaAsIq("/iq/pubsub/items/subscriptions-reply.stanza"); + element.addAttribute("node", "/user/pamela@denmark.lit/subscriptions"); - itemsResult.process(element, jid, result, null); + itemsResult.process(element, jid, result, null); - Mockito.verify(channelManager, Mockito.times(1)).addUserSubscription( - Mockito.any(NodeSubscription.class)); - Mockito.verify(channelManager, Mockito.times(1)).setUserAffiliation( - Mockito.anyString(), Mockito.any(JID.class), - Mockito.any(Affiliations.class)); - } + Mockito.verify(channelManager, Mockito.times(1)).addUserSubscription( + Mockito.any(NodeSubscription.class)); + Mockito.verify(channelManager, Mockito.times(1)).setUserAffiliation( + Mockito.anyString(), Mockito.any(JID.class), + Mockito.any(Affiliations.class)); + } - @Test - public void testWhenSubscribedNodeIsntInDatastoreItIsAdded() - throws Exception { - Mockito.when(channelManager.nodeExists(Mockito.anyString())) - .thenReturn(false); - - result = readStanzaAsIq("/iq/pubsub/items/subscriptions-reply.stanza"); - element.addAttribute("node", "/user/pamela@denmark.lit/subscriptions"); + @Test + public void testWhenSubscribedNodeIsntInDatastoreItIsAdded() + throws Exception { + Mockito.when(channelManager.nodeExists(Mockito.anyString())) + .thenReturn(false); + + result = readStanzaAsIq("/iq/pubsub/items/subscriptions-reply.stanza"); + element.addAttribute("node", "/user/pamela@denmark.lit/subscriptions"); - itemsResult.process(element, jid, result, null); + itemsResult.process(element, jid, result, null); - Mockito.verify(channelManager, Mockito.times(1)).addUserSubscription( - Mockito.any(NodeSubscription.class)); - Mockito.verify(channelManager, Mockito.times(1)).setUserAffiliation( - Mockito.anyString(), Mockito.any(JID.class), - Mockito.any(Affiliations.class)); - - Mockito.verify(channelManager, Mockito.times(1)).addRemoteNode( - "/user/juliet@shakespeare.lit/posts"); - } -} \ No newline at end of file + Mockito.verify(channelManager, Mockito.times(1)).addUserSubscription( + Mockito.any(NodeSubscription.class)); + Mockito.verify(channelManager, Mockito.times(1)).setUserAffiliation( + Mockito.anyString(), Mockito.any(JID.class), + Mockito.any(Affiliations.class)); + + Mockito.verify(channelManager, Mockito.times(1)).addRemoteNode( + "/user/juliet@shakespeare.lit/posts"); + } +} diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/AffiliationEventTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/AffiliationEventTest.java index 369cc128..511d0e7b 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/AffiliationEventTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/AffiliationEventTest.java @@ -33,414 +33,414 @@ public class AffiliationEventTest extends IQTestHandler { - private IQ request; - private AffiliationEvent event; - private Element element; - private BlockingQueue queue = new LinkedBlockingQueue(); - - private String subscriber = "francisco@denmark.lit"; - private String node = "/user/pamela@denmark.lit/posts"; - private JID jid = new JID("juliet@shakespeare.lit"); - - private ChannelManager channelManager; - - @Before - public void setUp() throws Exception { - - channelManager = Mockito.mock(ChannelManager.class); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); - Mockito.when(channelManager.nodeExists(Mockito.anyString())) - .thenReturn(true); - - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.eq(jid))).thenReturn( - new NodeMembershipImpl(node, jid, Subscriptions.subscribed, - Affiliations.owner, null)); - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.eq(new JID("francisco@denmark.lit")))) - .thenReturn( - new NodeMembershipImpl(node, jid, Subscriptions.none, - Affiliations.publisher, null)); - - queue = new LinkedBlockingQueue(); - event = new AffiliationEvent(queue, channelManager); - request = readStanzaAsIq("/iq/pubsub/affiliation/affiliationChange.stanza"); - event.setServerDomain("shakespeare.lit"); - - element = new BaseElement("affiliations"); - element.addAttribute("node", node); - } - - @Test - public void testPassingAffiliationsAsElementNameReturnsTrue() { - Element element = new BaseElement("affiliations"); - Assert.assertTrue(event.accept(element)); - } - - @Test - public void testPassingNotAffiliationsAsElementNameReturnsFalse() { - Element element = new BaseElement("not-affiliations"); - Assert.assertFalse(event.accept(element)); - } - - @Test - public void testNotProvidingNodeAttributeReturnsErrorStanza() - throws Exception { - BaseElement element = new BaseElement("affiliations"); - event.process(element, 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 testNotProvidingAffiliationChildNodeReturnsErrorStanza() - throws Exception { - - IQ request = toIq(readStanzaAsString( - "/iq/pubsub/affiliation/affiliationChange.stanza") - .replaceFirst( - "", - "")); - - event.process(element, 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 testNotProvidingJidAttributeReturnsErrorStanza() - throws Exception { - IQ request = toIq(readStanzaAsString( - "/iq/pubsub/affiliation/affiliationChange.stanza") - .replaceFirst("jid='francisco@denmark.lit'", "")); - event.process(element, 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 testNotProvidingAffiliationAttributeReturnsErrorStanza() - throws Exception { - IQ request = toIq(readStanzaAsString( - "/iq/pubsub/affiliation/affiliationChange.stanza") - .replaceFirst("affiliation='member'", "")); - event.process(element, 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 testNodeStoreExceptionResultsInInternalServerErrorStanza() - throws Exception { - - Mockito.when(channelManager.nodeExists(node)).thenThrow( - NodeStoreException.class); - event.setChannelManager(channelManager); - - event.process(element, jid, request, null); - Packet response = queue.poll(); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.wait, error.getType()); - Assert.assertEquals(PacketError.Condition.internal_server_error, - error.getCondition()); - } - - @Test - public void testNonExistantNodeRetunsErrorStanza() throws Exception { - - Mockito.when(channelManager.nodeExists(node)).thenReturn(false); - event.setChannelManager(channelManager); - - event.process(element, 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 userWithoutAffiliationReturnsErrorStanza() throws Exception { - - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( - new NodeMembershipImpl(node, jid, Subscriptions.subscribed, - Affiliations.none, null)); - - event.process(element, 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 userWhoIsntOwnerOrModeratorCantUpdateAffiliation() - throws Exception { - - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.eq(jid))).thenReturn( - new NodeMembershipImpl(node, jid, Subscriptions.subscribed, - Affiliations.publisher, null)); - - event.setChannelManager(channelManager); - - event.process(element, 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 userMustHaveExistingAffiliationToUpdate() throws Exception { - - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.eq(jid))).thenReturn( - new NodeMembershipImpl(node, jid, Subscriptions.subscribed, - Affiliations.owner, null)); - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.eq(new JID("francisco@denmark.lit")))) - .thenReturn( - new NodeMembershipImpl(node, jid, Subscriptions.none, - Affiliations.none, null)); - - event.process(element, 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.unexpected_request, - error.getCondition()); - } - - @Test - public void notPossibleToChangeTheAffiliationOfNodeOwner() throws Exception { - - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.eq(jid))).thenReturn( - new NodeMembershipImpl(node, jid, Subscriptions.subscribed, - Affiliations.owner, null)); - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.eq(new JID("francisco@denmark.lit")))) - .thenReturn( - new NodeMembershipImpl(node, jid, Subscriptions.none, - Affiliations.owner, null)); - - event.process(element, 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 passingInvalidAffiliationTypeSetsAffiliationToNone() - throws Exception { - - IQ request = toIq(readStanzaAsString( - "/iq/pubsub/affiliation/affiliationChange.stanza") - .replaceFirst("affiliation='member'", - "affiliation='i-can-haz-all-the-items'")); - - ResultSet subscriptions = new ResultSetImpl( - new ArrayList()); - Mockito.when( - channelManager.getNodeSubscriptionListeners(Mockito.anyString())) - .thenReturn(subscriptions); - - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - - event.setChannelManager(channelManager); - event.process(element, jid, request, null); - - Mockito.verify(channelManager).setUserAffiliation(Mockito.anyString(), - Mockito.any(JID.class), Mockito.eq(Affiliations.none)); - } - - @Test - public void testPassingValidAffiliationTypeUpdatesAffiliation() - throws Exception { - - IQ request = toIq(readStanzaAsString( - "/iq/pubsub/affiliation/affiliationChange.stanza") - .replaceFirst("affiliation='member'", "affiliation='moderator'")); - - Mockito.when( - channelManager.getNodeSubscriptionListeners(Mockito.anyString())) - .thenReturn( - new ResultSetImpl( - new ArrayList())); - - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - - event.setChannelManager(channelManager); - event.process(element, jid, request, null); - - Mockito.verify(channelManager).setUserAffiliation(Mockito.anyString(), - Mockito.any(JID.class), Mockito.eq(Affiliations.moderator)); - } - - @Test - public void testPassingValidAffiliationSendsOutExpectedNotifications() - throws Exception { - - IQ request = toIq(readStanzaAsString( - "/iq/pubsub/affiliation/affiliationChange.stanza") - .replaceFirst("affiliation='member'", "affiliation='moderator'")); - - ArrayList subscribers = new ArrayList(); - subscribers.add(new NodeSubscriptionMock(new JID( - "romeo@shakespeare.lit"))); - subscribers.add(new NodeSubscriptionMock(new JID( - "hamlet@shakespeare.lit"))); - - Mockito.doReturn(new ResultSetImpl(subscribers)) - .when(channelManager) - .getNodeSubscriptionListeners(Mockito.anyString()); - - event.setChannelManager(channelManager); - event.process(element, jid, request, null); - - // One iq result, 2 user notifications and 2 admin notifications - Assert.assertEquals(5, queue.size()); - - boolean hasIqResult = false; - boolean hasNotification1 = false; - boolean hasNotification2 = false; - - for (int i = 0; i < 3; ++i) { - Packet packet = queue.poll(); - - if (packet.getElement().getName().equals("iq") - && packet.getTo().equals( - new JID("francisco@denmark.lit/barracks"))) { - hasIqResult = true; - } - - if (packet.getElement().getName().equals("message") - && packet.getTo().equals(new JID("romeo@shakespeare.lit"))) { - hasNotification1 = true; - - Assert.assertEquals(node, packet.getElement().element("event") - .element("affiliations").attributeValue("node")); - Assert.assertTrue(packet.toXML().contains( - JabberPubsub.NS_PUBSUB_EVENT)); - Assert.assertEquals(Affiliations.moderator.toString(), packet - .getElement().element("event").element("affiliations") - .element("affiliation").attributeValue("affiliation")); - Assert.assertEquals( - subscriber, - packet.getElement().element("event") - .element("affiliations").element("affiliation") - .attributeValue("jid")); - } - - if (packet.getElement().getName().equals("message") - && packet.getTo().equals(new JID("hamlet@shakespeare.lit"))) { - hasNotification2 = true; - - Assert.assertEquals(node, packet.getElement().element("event") - .element("affiliations").attributeValue("node")); - Assert.assertTrue(packet.toXML().contains( - JabberPubsub.NS_PUBSUB_EVENT)); - Assert.assertEquals(Affiliations.moderator.toString(), packet - .getElement().element("event").element("affiliations") - .element("affiliation").attributeValue("affiliation")); - Assert.assertEquals( - subscriber, - packet.getElement().element("event") - .element("affiliations").element("affiliation") - .attributeValue("jid")); - } - } - - assertTrue("IQ result not sent", hasIqResult); - assertTrue("Notification to romeo@shakespeare.lit not sent", - hasNotification1); - assertTrue("Notification to hamlet@shakespeare.lit not sent", - hasNotification2); - } - - public void canNotUpdateOwnAffiliation() throws Exception { - - event.process(element, jid, request, null); - - IQ response = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.error, response.getType()); - PacketError error = response.getError(); - Assert.assertEquals(PacketError.Type.cancel, error.getType()); - Assert.assertEquals(PacketError.Condition.not_allowed, - error.getCondition()); - Assert.assertEquals(event.CAN_NOT_MODIFY_OWN_AFFILIATION, - error.getApplicationConditionName()); - Assert.assertEquals(Buddycloud.NS_ERROR, - error.getApplicationConditionNamespaceURI()); - } - - @Test - public void moderatorsCantCreateOtherModerators() throws Exception { - IQ request = toIq(readStanzaAsString( - "/iq/pubsub/affiliation/affiliationChange.stanza") - .replaceFirst("affiliation='member'", "affiliation='moderator'")); - - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.eq(jid))).thenReturn( - new NodeMembershipImpl(node, jid, Subscriptions.subscribed, - Affiliations.moderator, null)); - - event.process(element, jid, request, null); - - IQ response = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.error, response.getType()); - PacketError error = response.getError(); - Assert.assertEquals(PacketError.Type.auth, error.getType()); - Assert.assertEquals(PacketError.Condition.forbidden, - error.getCondition()); - } -} \ No newline at end of file + private IQ request; + private AffiliationEvent event; + private Element element; + private BlockingQueue queue = new LinkedBlockingQueue(); + + private String subscriber = "francisco@denmark.lit"; + private String node = "/user/pamela@denmark.lit/posts"; + private JID jid = new JID("juliet@shakespeare.lit"); + + private ChannelManager channelManager; + + @Before + public void setUp() throws Exception { + + channelManager = Mockito.mock(ChannelManager.class); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); + Mockito.when(channelManager.nodeExists(Mockito.anyString())) + .thenReturn(true); + + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.eq(jid))).thenReturn( + new NodeMembershipImpl(node, jid, Subscriptions.subscribed, + Affiliations.owner, null)); + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.eq(new JID("francisco@denmark.lit")))) + .thenReturn( + new NodeMembershipImpl(node, jid, Subscriptions.none, + Affiliations.publisher, null)); + + queue = new LinkedBlockingQueue(); + event = new AffiliationEvent(queue, channelManager); + request = readStanzaAsIq("/iq/pubsub/affiliation/affiliationChange.stanza"); + event.setServerDomain("shakespeare.lit"); + + element = new BaseElement("affiliations"); + element.addAttribute("node", node); + } + + @Test + public void testPassingAffiliationsAsElementNameReturnsTrue() { + Element element = new BaseElement("affiliations"); + Assert.assertTrue(event.accept(element)); + } + + @Test + public void testPassingNotAffiliationsAsElementNameReturnsFalse() { + Element element = new BaseElement("not-affiliations"); + Assert.assertFalse(event.accept(element)); + } + + @Test + public void testNotProvidingNodeAttributeReturnsErrorStanza() + throws Exception { + BaseElement element = new BaseElement("affiliations"); + event.process(element, 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 testNotProvidingAffiliationChildNodeReturnsErrorStanza() + throws Exception { + + IQ request = toIq(readStanzaAsString( + "/iq/pubsub/affiliation/affiliationChange.stanza") + .replaceFirst( + "", + "")); + + event.process(element, 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 testNotProvidingJidAttributeReturnsErrorStanza() + throws Exception { + IQ request = toIq(readStanzaAsString( + "/iq/pubsub/affiliation/affiliationChange.stanza") + .replaceFirst("jid='francisco@denmark.lit'", "")); + event.process(element, 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 testNotProvidingAffiliationAttributeReturnsErrorStanza() + throws Exception { + IQ request = toIq(readStanzaAsString( + "/iq/pubsub/affiliation/affiliationChange.stanza") + .replaceFirst("affiliation='member'", "")); + event.process(element, 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 testNodeStoreExceptionResultsInInternalServerErrorStanza() + throws Exception { + + Mockito.when(channelManager.nodeExists(node)).thenThrow( + NodeStoreException.class); + event.setChannelManager(channelManager); + + event.process(element, jid, request, null); + Packet response = queue.poll(); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.wait, error.getType()); + Assert.assertEquals(PacketError.Condition.internal_server_error, + error.getCondition()); + } + + @Test + public void testNonExistantNodeRetunsErrorStanza() throws Exception { + + Mockito.when(channelManager.nodeExists(node)).thenReturn(false); + event.setChannelManager(channelManager); + + event.process(element, 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 userWithoutAffiliationReturnsErrorStanza() throws Exception { + + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + Mockito.when(channelManager.getNodeMembership(node, jid)).thenReturn( + new NodeMembershipImpl(node, jid, Subscriptions.subscribed, + Affiliations.none, null)); + + event.process(element, 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 userWhoIsntOwnerOrModeratorCantUpdateAffiliation() + throws Exception { + + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.eq(jid))).thenReturn( + new NodeMembershipImpl(node, jid, Subscriptions.subscribed, + Affiliations.publisher, null)); + + event.setChannelManager(channelManager); + + event.process(element, 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 userMustHaveExistingAffiliationToUpdate() throws Exception { + + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.eq(jid))).thenReturn( + new NodeMembershipImpl(node, jid, Subscriptions.subscribed, + Affiliations.owner, null)); + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.eq(new JID("francisco@denmark.lit")))) + .thenReturn( + new NodeMembershipImpl(node, jid, Subscriptions.none, + Affiliations.none, null)); + + event.process(element, 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.unexpected_request, + error.getCondition()); + } + + @Test + public void notPossibleToChangeTheAffiliationOfNodeOwner() throws Exception { + + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.eq(jid))).thenReturn( + new NodeMembershipImpl(node, jid, Subscriptions.subscribed, + Affiliations.owner, null)); + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.eq(new JID("francisco@denmark.lit")))) + .thenReturn( + new NodeMembershipImpl(node, jid, Subscriptions.none, + Affiliations.owner, null)); + + event.process(element, 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 passingInvalidAffiliationTypeSetsAffiliationToNone() + throws Exception { + + IQ request = toIq(readStanzaAsString( + "/iq/pubsub/affiliation/affiliationChange.stanza") + .replaceFirst("affiliation='member'", + "affiliation='i-can-haz-all-the-items'")); + + ResultSet subscriptions = new ResultSetImpl( + new ArrayList()); + Mockito.when( + channelManager.getNodeSubscriptionListeners(Mockito.anyString())) + .thenReturn(subscriptions); + + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + + event.setChannelManager(channelManager); + event.process(element, jid, request, null); + + Mockito.verify(channelManager).setUserAffiliation(Mockito.anyString(), + Mockito.any(JID.class), Mockito.eq(Affiliations.none)); + } + + @Test + public void testPassingValidAffiliationTypeUpdatesAffiliation() + throws Exception { + + IQ request = toIq(readStanzaAsString( + "/iq/pubsub/affiliation/affiliationChange.stanza") + .replaceFirst("affiliation='member'", "affiliation='moderator'")); + + Mockito.when( + channelManager.getNodeSubscriptionListeners(Mockito.anyString())) + .thenReturn( + new ResultSetImpl( + new ArrayList())); + + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + + event.setChannelManager(channelManager); + event.process(element, jid, request, null); + + Mockito.verify(channelManager).setUserAffiliation(Mockito.anyString(), + Mockito.any(JID.class), Mockito.eq(Affiliations.moderator)); + } + + @Test + public void testPassingValidAffiliationSendsOutExpectedNotifications() + throws Exception { + + IQ request = toIq(readStanzaAsString( + "/iq/pubsub/affiliation/affiliationChange.stanza") + .replaceFirst("affiliation='member'", "affiliation='moderator'")); + + ArrayList subscribers = new ArrayList(); + subscribers.add(new NodeSubscriptionMock(new JID( + "romeo@shakespeare.lit"))); + subscribers.add(new NodeSubscriptionMock(new JID( + "hamlet@shakespeare.lit"))); + + Mockito.doReturn(new ResultSetImpl(subscribers)) + .when(channelManager) + .getNodeSubscriptionListeners(Mockito.anyString()); + + event.setChannelManager(channelManager); + event.process(element, jid, request, null); + + // One iq result, 2 user notifications and 2 admin notifications + Assert.assertEquals(5, queue.size()); + + boolean hasIqResult = false; + boolean hasNotification1 = false; + boolean hasNotification2 = false; + + for (int i = 0; i < 3; ++i) { + Packet packet = queue.poll(); + + if (packet.getElement().getName().equals("iq") + && packet.getTo().equals( + new JID("francisco@denmark.lit/barracks"))) { + hasIqResult = true; + } + + if (packet.getElement().getName().equals("message") + && packet.getTo().equals(new JID("romeo@shakespeare.lit"))) { + hasNotification1 = true; + + Assert.assertEquals(node, packet.getElement().element("event") + .element("affiliations").attributeValue("node")); + Assert.assertTrue(packet.toXML().contains( + JabberPubsub.NS_PUBSUB_EVENT)); + Assert.assertEquals(Affiliations.moderator.toString(), packet + .getElement().element("event").element("affiliations") + .element("affiliation").attributeValue("affiliation")); + Assert.assertEquals( + subscriber, + packet.getElement().element("event") + .element("affiliations").element("affiliation") + .attributeValue("jid")); + } + + if (packet.getElement().getName().equals("message") + && packet.getTo().equals(new JID("hamlet@shakespeare.lit"))) { + hasNotification2 = true; + + Assert.assertEquals(node, packet.getElement().element("event") + .element("affiliations").attributeValue("node")); + Assert.assertTrue(packet.toXML().contains( + JabberPubsub.NS_PUBSUB_EVENT)); + Assert.assertEquals(Affiliations.moderator.toString(), packet + .getElement().element("event").element("affiliations") + .element("affiliation").attributeValue("affiliation")); + Assert.assertEquals( + subscriber, + packet.getElement().element("event") + .element("affiliations").element("affiliation") + .attributeValue("jid")); + } + } + + assertTrue("IQ result not sent", hasIqResult); + assertTrue("Notification to romeo@shakespeare.lit not sent", + hasNotification1); + assertTrue("Notification to hamlet@shakespeare.lit not sent", + hasNotification2); + } + + public void canNotUpdateOwnAffiliation() throws Exception { + + event.process(element, jid, request, null); + + IQ response = (IQ) queue.poll(); + Assert.assertEquals(IQ.Type.error, response.getType()); + PacketError error = response.getError(); + Assert.assertEquals(PacketError.Type.cancel, error.getType()); + Assert.assertEquals(PacketError.Condition.not_allowed, + error.getCondition()); + Assert.assertEquals(event.CAN_NOT_MODIFY_OWN_AFFILIATION, + error.getApplicationConditionName()); + Assert.assertEquals(Buddycloud.NS_ERROR, + error.getApplicationConditionNamespaceURI()); + } + + @Test + public void moderatorsCantCreateOtherModerators() throws Exception { + IQ request = toIq(readStanzaAsString( + "/iq/pubsub/affiliation/affiliationChange.stanza") + .replaceFirst("affiliation='member'", "affiliation='moderator'")); + + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.eq(jid))).thenReturn( + new NodeMembershipImpl(node, jid, Subscriptions.subscribed, + Affiliations.moderator, null)); + + event.process(element, jid, request, null); + + IQ response = (IQ) queue.poll(); + Assert.assertEquals(IQ.Type.error, response.getType()); + PacketError error = response.getError(); + Assert.assertEquals(PacketError.Type.auth, error.getType()); + Assert.assertEquals(PacketError.Condition.forbidden, + error.getCondition()); + } +} diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDeleteTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDeleteTest.java index ad6e5171..90e1cb4c 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDeleteTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/ItemDeleteTest.java @@ -32,458 +32,458 @@ import org.xmpp.resultsetmanagement.ResultSetImpl; public class ItemDeleteTest extends IQTestHandler { - private IQ request; - private ChannelManager channelManager; - private ItemDelete itemDelete; - private JID jid = new JID("juliet@shakespeare.lit"); - private Element element; - private BlockingQueue queue = new LinkedBlockingQueue(); - private String node = "/user/capulet@shakespeare.lit/posts"; - private String payload; - - @Before - public void setUp() throws Exception { - channelManager = Mockito.mock(ChannelManager.class); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); - - queue = new LinkedBlockingQueue(); - itemDelete = new ItemDelete(queue, channelManager); - request = readStanzaAsIq("/iq/pubsub/item/delete/request.stanza"); - - itemDelete.setServerDomain("shakespeare.lit"); - - element = new BaseElement("retract"); - element.addAttribute("node", node); - - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.any(JID.class))).thenReturn( - new NodeMembershipImpl(node, jid, Subscriptions.subscribed, - Affiliations.member, null)); - - payload = readStanzaAsString("/iq/pubsub/item/item.payload"); - } - - @Test - public void testPassingRetractAsElementNameReturnsTrue() { - Element element = new BaseElement("retract"); - Assert.assertTrue(itemDelete.accept(element)); - } - - @Test - public void testPassingNotRetractAsElementNameReturnsFalse() { - Element element = new BaseElement("not-retract"); - Assert.assertFalse(itemDelete.accept(element)); - } - - @Test - public void testPassingNoNodeResultsInErrorStanza() throws Exception { - Element element = new BaseElement("retract"); - itemDelete.process(element, jid, request, null); - - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.modify, error.getType()); - Assert.assertEquals("nodeid-required", - error.getApplicationConditionName()); - } - - @Test - public void testNodeStoreExceptionReturnsErrorStanza() throws Exception { - Mockito.doThrow(new NodeStoreException()).when(channelManager) - .nodeExists(node); - - itemDelete.process(element, jid, request, null); - - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Condition.internal_server_error, - error.getCondition()); - Assert.assertEquals(PacketError.Type.wait, error.getType()); - - } - - @Test - public void testProvidingNodeWhichDoesntExistReturnsError() - throws Exception { - Mockito.when(channelManager.nodeExists(node)).thenReturn(false); - itemDelete.setChannelManager(channelManager); - - itemDelete.process(element, jid, request, null); - - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - - 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 testProvidingInvalidStanzaReturnsError() throws Exception { - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - itemDelete.setChannelManager(channelManager); - - IQ request = toIq(readStanzaAsString("/iq/pubsub/item/delete/request.stanza")); - request.getChildElement().element("retract").element("item").detach(); - itemDelete.process(element, jid, request, null); - - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - - 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 testNotProvidingItemIdReturnsError() throws Exception { - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - itemDelete.setChannelManager(channelManager); - - IQ request = toIq(readStanzaAsString("/iq/pubsub/item/delete/request.stanza")); - request.getChildElement().element("retract").element("item") - .attribute("id").detach(); - itemDelete.process(element, jid, request, null); - - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.modify, error.getType()); - Assert.assertEquals("item-required", - error.getApplicationConditionName()); - } - - @Test - public void testProvidingEmptyItemIdReturnsError() throws Exception { - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - itemDelete.setChannelManager(channelManager); - - request = toIq(readStanzaAsString( - "/iq/pubsub/item/delete/request.stanza").replaceFirst( - "item-id", "")); - itemDelete.process(element, jid, request, null); - - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.modify, error.getType()); - Assert.assertEquals("item-required", - error.getApplicationConditionName()); - } - - @Test - public void testItemWhichDoesntExistReturnsItemNotFoundError() - throws Exception { - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - Mockito.when(channelManager.getNodeItem(node, "item-id")).thenReturn( - null); - itemDelete.setChannelManager(channelManager); + private IQ request; + private ChannelManager channelManager; + private ItemDelete itemDelete; + private JID jid = new JID("juliet@shakespeare.lit"); + private Element element; + private BlockingQueue queue = new LinkedBlockingQueue(); + private String node = "/user/capulet@shakespeare.lit/posts"; + private String payload; + + @Before + public void setUp() throws Exception { + channelManager = Mockito.mock(ChannelManager.class); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); + + queue = new LinkedBlockingQueue(); + itemDelete = new ItemDelete(queue, channelManager); + request = readStanzaAsIq("/iq/pubsub/item/delete/request.stanza"); + + itemDelete.setServerDomain("shakespeare.lit"); + + element = new BaseElement("retract"); + element.addAttribute("node", node); + + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.any(JID.class))).thenReturn( + new NodeMembershipImpl(node, jid, Subscriptions.subscribed, + Affiliations.member, null)); + + payload = readStanzaAsString("/iq/pubsub/item/item.payload"); + } + + @Test + public void testPassingRetractAsElementNameReturnsTrue() { + Element element = new BaseElement("retract"); + Assert.assertTrue(itemDelete.accept(element)); + } + + @Test + public void testPassingNotRetractAsElementNameReturnsFalse() { + Element element = new BaseElement("not-retract"); + Assert.assertFalse(itemDelete.accept(element)); + } + + @Test + public void testPassingNoNodeResultsInErrorStanza() throws Exception { + Element element = new BaseElement("retract"); + itemDelete.process(element, jid, request, null); + + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.modify, error.getType()); + Assert.assertEquals("nodeid-required", + error.getApplicationConditionName()); + } + + @Test + public void testNodeStoreExceptionReturnsErrorStanza() throws Exception { + Mockito.doThrow(new NodeStoreException()).when(channelManager) + .nodeExists(node); + + itemDelete.process(element, jid, request, null); + + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Condition.internal_server_error, + error.getCondition()); + Assert.assertEquals(PacketError.Type.wait, error.getType()); + + } + + @Test + public void testProvidingNodeWhichDoesntExistReturnsError() + throws Exception { + Mockito.when(channelManager.nodeExists(node)).thenReturn(false); + itemDelete.setChannelManager(channelManager); + + itemDelete.process(element, jid, request, null); + + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + + 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 testProvidingInvalidStanzaReturnsError() throws Exception { + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + itemDelete.setChannelManager(channelManager); + + IQ request = toIq(readStanzaAsString("/iq/pubsub/item/delete/request.stanza")); + request.getChildElement().element("retract").element("item").detach(); + itemDelete.process(element, jid, request, null); + + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + + 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 testNotProvidingItemIdReturnsError() throws Exception { + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + itemDelete.setChannelManager(channelManager); + + IQ request = toIq(readStanzaAsString("/iq/pubsub/item/delete/request.stanza")); + request.getChildElement().element("retract").element("item") + .attribute("id").detach(); + itemDelete.process(element, jid, request, null); + + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.modify, error.getType()); + Assert.assertEquals("item-required", + error.getApplicationConditionName()); + } + + @Test + public void testProvidingEmptyItemIdReturnsError() throws Exception { + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + itemDelete.setChannelManager(channelManager); + + request = toIq(readStanzaAsString( + "/iq/pubsub/item/delete/request.stanza").replaceFirst( + "item-id", "")); + itemDelete.process(element, jid, request, null); + + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.modify, error.getType()); + Assert.assertEquals("item-required", + error.getApplicationConditionName()); + } + + @Test + public void testItemWhichDoesntExistReturnsItemNotFoundError() + throws Exception { + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + Mockito.when(channelManager.getNodeItem(node, "item-id")).thenReturn( + null); + itemDelete.setChannelManager(channelManager); - itemDelete.process(element, jid, request, null); + itemDelete.process(element, jid, request, null); - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - - 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 testInvalidPayloadMessageReturnsErrorStanza() throws Exception { - NodeItem nodeItem = new NodeItemImpl(node, "item-id", new Date(), - payload.replaceFirst("", ""), "12345") { - }; - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - Mockito.when(channelManager.getNodeItem(node, "item-id")).thenReturn( - nodeItem); - - itemDelete.setChannelManager(channelManager); - - itemDelete.process(element, jid, request, null); - - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.wait, error.getType()); - Assert.assertEquals(PacketError.Condition.internal_server_error, - error.getCondition()); - } - - @Test - public void userDoesNotOwnItemCanNotDelete() throws Exception { - - String payload = readStanzaAsString("/iq/pubsub/item/item.payload"); - - NodeItem nodeItem = new NodeItemImpl(node, "item-id", new Date(), - payload.replace("juliet@shakespeare.lit", - "romeo@shakespeare.lit"), "12345"); - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - Mockito.when(channelManager.getNodeItem(node, "item-id")).thenReturn( - nodeItem); - - itemDelete.setChannelManager(channelManager); - - itemDelete.process(element, 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 testUserDoesNotOwnNodeCanNotDelete() throws Exception { - - NodeItem nodeItem = new NodeItemImpl(node, "item-id", new Date(), - payload, "12345"); + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + + 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 testInvalidPayloadMessageReturnsErrorStanza() throws Exception { + NodeItem nodeItem = new NodeItemImpl(node, "item-id", new Date(), + payload.replaceFirst("", ""), "12345") { + }; + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + Mockito.when(channelManager.getNodeItem(node, "item-id")).thenReturn( + nodeItem); + + itemDelete.setChannelManager(channelManager); + + itemDelete.process(element, jid, request, null); + + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.wait, error.getType()); + Assert.assertEquals(PacketError.Condition.internal_server_error, + error.getCondition()); + } + + @Test + public void userDoesNotOwnItemCanNotDelete() throws Exception { + + String payload = readStanzaAsString("/iq/pubsub/item/item.payload"); + + NodeItem nodeItem = new NodeItemImpl(node, "item-id", new Date(), + payload.replace("juliet@shakespeare.lit", + "romeo@shakespeare.lit"), "12345"); + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + Mockito.when(channelManager.getNodeItem(node, "item-id")).thenReturn( + nodeItem); + + itemDelete.setChannelManager(channelManager); + + itemDelete.process(element, 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 testUserDoesNotOwnNodeCanNotDelete() throws Exception { + + NodeItem nodeItem = new NodeItemImpl(node, "item-id", new Date(), + payload, "12345"); - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - Mockito.when( - channelManager.getNodeItem(Mockito.anyString(), - Mockito.anyString())).thenReturn(nodeItem); - - itemDelete.process(element, jid, request, null); - - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.auth, error.getType()); - Assert.assertEquals(PacketError.Condition.forbidden, - error.getCondition()); - } - - @Test - public void testSuccessfulRequestSendsResponseStanza() throws Exception { + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + Mockito.when( + channelManager.getNodeItem(Mockito.anyString(), + Mockito.anyString())).thenReturn(nodeItem); + + itemDelete.process(element, jid, request, null); + + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.auth, error.getType()); + Assert.assertEquals(PacketError.Condition.forbidden, + error.getCondition()); + } + + @Test + public void testSuccessfulRequestSendsResponseStanza() throws Exception { - NodeItem nodeItem = new NodeItemImpl(node, "item-id", new Date(), - payload.replaceAll("romeo@shakespeare.lit", - "juliet@shakespeare.lit"), "12345"); + NodeItem nodeItem = new NodeItemImpl(node, "item-id", new Date(), + payload.replaceAll("romeo@shakespeare.lit", + "juliet@shakespeare.lit"), "12345"); - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - Mockito.when( - channelManager.getNodeItem(Mockito.anyString(), - Mockito.anyString())).thenReturn(nodeItem); + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + Mockito.when( + channelManager.getNodeItem(Mockito.anyString(), + Mockito.anyString())).thenReturn(nodeItem); - itemDelete.setChannelManager(channelManager); + itemDelete.setChannelManager(channelManager); - itemDelete.process(element, jid, request, null); + itemDelete.process(element, jid, request, null); - Mockito.verify(channelManager).deleteNodeItemById(node, "item-id"); - IQ response = (IQ) queue.poll(100, TimeUnit.MILLISECONDS); + Mockito.verify(channelManager).deleteNodeItemById(node, "item-id"); + IQ response = (IQ) queue.poll(100, TimeUnit.MILLISECONDS); - Assert.assertEquals(IQ.Type.result.toString(), response.getElement() - .attribute("type").getValue()); - // Check that no notifications are sent - Packet notification = queue.poll(100, TimeUnit.MILLISECONDS); - Assert.assertNull(notification); - } + Assert.assertEquals(IQ.Type.result.toString(), response.getElement() + .attribute("type").getValue()); + // Check that no notifications are sent + Packet notification = queue.poll(100, TimeUnit.MILLISECONDS); + Assert.assertNull(notification); + } - @Test - public void testRequestingNotificationsSendsRetractionNotifications() - throws Exception { + @Test + public void testRequestingNotificationsSendsRetractionNotifications() + throws Exception { - NodeItem nodeItem = new NodeItemImpl(node, "item-id", new Date(), - payload.replaceAll("romeo@shakespeare.lit", - "juliet@shakespeare.lit"), "12345"); + NodeItem nodeItem = new NodeItemImpl(node, "item-id", new Date(), + payload.replaceAll("romeo@shakespeare.lit", + "juliet@shakespeare.lit"), "12345"); - request = toIq(readStanzaAsString( - "/iq/pubsub/item/delete/request.stanza").replaceFirst( - " subscriptions = new ArrayList(); - NodeSubscriptionImpl subscription1 = new NodeSubscriptionImpl(node, - new JID("romeo@shakespeare.lit"), Subscriptions.pending, null); - NodeSubscriptionImpl subscription2 = new NodeSubscriptionImpl(node, - new JID("juliet@shakespeare.lit"), Subscriptions.subscribed, - null); - subscriptions.add(subscription1); - subscriptions.add(subscription2); - - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - Mockito.when(channelManager.getNodeItem(node, "item-id")).thenReturn( - nodeItem); - - Mockito.doReturn(new ResultSetImpl(subscriptions)) - .when(channelManager).getNodeSubscriptionListeners(node); - - itemDelete.setChannelManager(channelManager); - - itemDelete.process(element, jid, request, null); - - Mockito.verify(channelManager).deleteNodeItemById(node, "item-id"); - IQ response = (IQ) queue.poll(); - - Assert.assertEquals(IQ.Type.result.toString(), response.getElement() - .attribute("type").getValue()); - // Check that one notification is sent (on subscriber + 2 admins) - Assert.assertEquals(3, queue.size()); - - Packet notification = queue.poll(); - Assert.assertNotNull(notification); - Assert.assertEquals("item-id", - notification.getElement().element("event").element("items") - .element("retract").attributeValue("id")); - } - - @Test - public void testNoNotifyAttributeStillSendsNotifications() throws Exception { - - NodeItem nodeItem = new NodeItemImpl(node, "item-id", new Date(), - payload.replaceAll("romeo@shakespeare.lit", - "juliet@shakespeare.lit"), "12345"); - - IQ request = toIq(readStanzaAsString("/iq/pubsub/item/delete/request.stanza")); - request.getChildElement().element("retract").element("item") - .attribute("notify").detach(); - - ArrayList subscriptions = new ArrayList(); - NodeSubscriptionImpl subscription1 = new NodeSubscriptionImpl(node, - new JID("romeo@shakespeare.lit"), Subscriptions.pending, null); - NodeSubscriptionImpl subscription2 = new NodeSubscriptionImpl(node, - new JID("juliet@shakespeare.lit"), Subscriptions.subscribed, - null); - subscriptions.add(subscription1); - subscriptions.add(subscription2); - - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - Mockito.when(channelManager.getNodeItem(node, "item-id")).thenReturn( - nodeItem); - - Mockito.doReturn(new ResultSetImpl(subscriptions)) - .when(channelManager).getNodeSubscriptionListeners(node); - - itemDelete.setChannelManager(channelManager); - - itemDelete.process(element, jid, request, null); - - Mockito.verify(channelManager).deleteNodeItemById(node, "item-id"); - - // Check that one notification is sent (on subscriber + 2 admins) - Assert.assertEquals(4, queue.size()); - - } - - @Test - public void doesNotRequestThreadWhenDealingWithReply() throws Exception { - NodeItem nodeItem = new NodeItemImpl(node, "item-id", new Date(), - payload, "12345"); - - ArrayList subscriptions = new ArrayList(); - NodeSubscriptionImpl subscription1 = new NodeSubscriptionImpl(node, - new JID("romeo@shakespeare.lit"), Subscriptions.pending, null); - subscriptions.add(subscription1); - - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - Mockito.when(channelManager.getNodeItem(node, "item-id")).thenReturn( - nodeItem); - Mockito.doThrow(Exception.class) - .when(channelManager) - .getNodeItemReplies(Mockito.anyString(), Mockito.anyString(), - Mockito.anyString(), Mockito.anyInt()); - - Mockito.doReturn(new ResultSetImpl(subscriptions)) - .when(channelManager).getNodeSubscriptionListeners(node); - itemDelete.setChannelManager(channelManager); - - itemDelete.process(element, jid, request, null); - } - - @Test - public void requestsThreadWhenDeletingParentPost() throws Exception { - - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.any(JID.class))).thenReturn( - new NodeMembershipImpl(node, jid, Subscriptions.subscribed, - Affiliations.owner, null)); - - NodeItem nodeItem = new NodeItemImpl(node, "item-id", new Date(), - payload); - - ArrayList subscriptions = new ArrayList(); - - - ArrayList replies = new ArrayList(); - replies.add(new NodeItemImpl(node, "2", new Date(), - payload)); - replies.add(new NodeItemImpl(node, "1", new Date(), - payload)); - - - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - Mockito.when(channelManager.getNodeItem(node, "item-id")).thenReturn( - nodeItem); - Mockito.when(channelManager.getNodeItemReplies(Mockito.eq(node), Mockito.eq("item-id"), - Mockito.anyString(), Mockito.eq(-1))).thenReturn(new ClosableIteratorImpl(replies - .iterator())); - - Mockito.doReturn(new ResultSetImpl(subscriptions)) - .when(channelManager).getNodeSubscriptionListeners(node); - - itemDelete.process(element, jid, request, null); - - Assert.assertEquals(7, queue.size()); - - Assert.assertEquals(IQ.Type.result, ((IQ) queue.poll()).getType()); - - Packet notification = queue.poll(); - - Assert.assertNotNull(notification); - Assert.assertEquals("message", notification.getElement().getName()); - Assert.assertEquals("user1@server1", notification.getTo().toString()); - Assert.assertEquals("2", - notification.getElement().element("event").element("items") - .element("retract").attributeValue("id")); - notification = queue.poll(); - Assert.assertNotNull(notification); - Assert.assertEquals("2", - notification.getElement().element("event").element("items") - .element("retract").attributeValue("id")); - - notification = queue.poll(); - Assert.assertNotNull(notification); - Assert.assertEquals("message", notification.getElement().getName()); - Assert.assertEquals("user1@server1", notification.getTo().toString()); - Assert.assertEquals("1", - notification.getElement().element("event").element("items") - .element("retract").attributeValue("id")); - notification = queue.poll(); - Assert.assertNotNull(notification); - Assert.assertEquals("message", notification.getElement().getName()); - Assert.assertEquals("user2@server1", notification.getTo().toString()); - Assert.assertEquals("1", - notification.getElement().element("event").element("items") - .element("retract").attributeValue("id")); - - /* Lastly the originally deleted post */ - notification = queue.poll(); - Assert.assertNotNull(notification); - Assert.assertEquals("message", notification.getElement().getName()); - Assert.assertEquals("user1@server1", notification.getTo().toString()); - Assert.assertEquals("item-id", - notification.getElement().element("event").element("items") - .element("retract").attributeValue("id")); - notification = queue.poll(); - Assert.assertNotNull(notification); - Assert.assertEquals("item-id", - notification.getElement().element("event").element("items") - .element("retract").attributeValue("id")); - } -} \ No newline at end of file + ArrayList subscriptions = new ArrayList(); + NodeSubscriptionImpl subscription1 = new NodeSubscriptionImpl(node, + new JID("romeo@shakespeare.lit"), Subscriptions.pending, null); + NodeSubscriptionImpl subscription2 = new NodeSubscriptionImpl(node, + new JID("juliet@shakespeare.lit"), Subscriptions.subscribed, + null); + subscriptions.add(subscription1); + subscriptions.add(subscription2); + + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + Mockito.when(channelManager.getNodeItem(node, "item-id")).thenReturn( + nodeItem); + + Mockito.doReturn(new ResultSetImpl(subscriptions)) + .when(channelManager).getNodeSubscriptionListeners(node); + + itemDelete.setChannelManager(channelManager); + + itemDelete.process(element, jid, request, null); + + Mockito.verify(channelManager).deleteNodeItemById(node, "item-id"); + IQ response = (IQ) queue.poll(); + + Assert.assertEquals(IQ.Type.result.toString(), response.getElement() + .attribute("type").getValue()); + // Check that one notification is sent (on subscriber + 2 admins) + Assert.assertEquals(3, queue.size()); + + Packet notification = queue.poll(); + Assert.assertNotNull(notification); + Assert.assertEquals("item-id", + notification.getElement().element("event").element("items") + .element("retract").attributeValue("id")); + } + + @Test + public void testNoNotifyAttributeStillSendsNotifications() throws Exception { + + NodeItem nodeItem = new NodeItemImpl(node, "item-id", new Date(), + payload.replaceAll("romeo@shakespeare.lit", + "juliet@shakespeare.lit"), "12345"); + + IQ request = toIq(readStanzaAsString("/iq/pubsub/item/delete/request.stanza")); + request.getChildElement().element("retract").element("item") + .attribute("notify").detach(); + + ArrayList subscriptions = new ArrayList(); + NodeSubscriptionImpl subscription1 = new NodeSubscriptionImpl(node, + new JID("romeo@shakespeare.lit"), Subscriptions.pending, null); + NodeSubscriptionImpl subscription2 = new NodeSubscriptionImpl(node, + new JID("juliet@shakespeare.lit"), Subscriptions.subscribed, + null); + subscriptions.add(subscription1); + subscriptions.add(subscription2); + + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + Mockito.when(channelManager.getNodeItem(node, "item-id")).thenReturn( + nodeItem); + + Mockito.doReturn(new ResultSetImpl(subscriptions)) + .when(channelManager).getNodeSubscriptionListeners(node); + + itemDelete.setChannelManager(channelManager); + + itemDelete.process(element, jid, request, null); + + Mockito.verify(channelManager).deleteNodeItemById(node, "item-id"); + + // Check that one notification is sent (on subscriber + 2 admins) + Assert.assertEquals(4, queue.size()); + + } + + @Test + public void doesNotRequestThreadWhenDealingWithReply() throws Exception { + NodeItem nodeItem = new NodeItemImpl(node, "item-id", new Date(), + payload, "12345"); + + ArrayList subscriptions = new ArrayList(); + NodeSubscriptionImpl subscription1 = new NodeSubscriptionImpl(node, + new JID("romeo@shakespeare.lit"), Subscriptions.pending, null); + subscriptions.add(subscription1); + + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + Mockito.when(channelManager.getNodeItem(node, "item-id")).thenReturn( + nodeItem); + Mockito.doThrow(Exception.class) + .when(channelManager) + .getNodeItemReplies(Mockito.anyString(), Mockito.anyString(), + Mockito.anyString(), Mockito.anyInt()); + + Mockito.doReturn(new ResultSetImpl(subscriptions)) + .when(channelManager).getNodeSubscriptionListeners(node); + itemDelete.setChannelManager(channelManager); + + itemDelete.process(element, jid, request, null); + } + + @Test + public void requestsThreadWhenDeletingParentPost() throws Exception { + + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.any(JID.class))).thenReturn( + new NodeMembershipImpl(node, jid, Subscriptions.subscribed, + Affiliations.owner, null)); + + NodeItem nodeItem = new NodeItemImpl(node, "item-id", new Date(), + payload); + + ArrayList subscriptions = new ArrayList(); + + + ArrayList replies = new ArrayList(); + replies.add(new NodeItemImpl(node, "2", new Date(), + payload)); + replies.add(new NodeItemImpl(node, "1", new Date(), + payload)); + + + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + Mockito.when(channelManager.getNodeItem(node, "item-id")).thenReturn( + nodeItem); + Mockito.when(channelManager.getNodeItemReplies(Mockito.eq(node), Mockito.eq("item-id"), + Mockito.anyString(), Mockito.eq(-1))).thenReturn(new ClosableIteratorImpl(replies + .iterator())); + + Mockito.doReturn(new ResultSetImpl(subscriptions)) + .when(channelManager).getNodeSubscriptionListeners(node); + + itemDelete.process(element, jid, request, null); + + Assert.assertEquals(7, queue.size()); + + Assert.assertEquals(IQ.Type.result, ((IQ) queue.poll()).getType()); + + Packet notification = queue.poll(); + + Assert.assertNotNull(notification); + Assert.assertEquals("message", notification.getElement().getName()); + Assert.assertEquals("user1@server1", notification.getTo().toString()); + Assert.assertEquals("2", + notification.getElement().element("event").element("items") + .element("retract").attributeValue("id")); + notification = queue.poll(); + Assert.assertNotNull(notification); + Assert.assertEquals("2", + notification.getElement().element("event").element("items") + .element("retract").attributeValue("id")); + + notification = queue.poll(); + Assert.assertNotNull(notification); + Assert.assertEquals("message", notification.getElement().getName()); + Assert.assertEquals("user1@server1", notification.getTo().toString()); + Assert.assertEquals("1", + notification.getElement().element("event").element("items") + .element("retract").attributeValue("id")); + notification = queue.poll(); + Assert.assertNotNull(notification); + Assert.assertEquals("message", notification.getElement().getName()); + Assert.assertEquals("user2@server1", notification.getTo().toString()); + Assert.assertEquals("1", + notification.getElement().element("event").element("items") + .element("retract").attributeValue("id")); + + /* Lastly the originally deleted post */ + notification = queue.poll(); + Assert.assertNotNull(notification); + Assert.assertEquals("message", notification.getElement().getName()); + Assert.assertEquals("user1@server1", notification.getTo().toString()); + Assert.assertEquals("item-id", + notification.getElement().element("event").element("items") + .element("retract").attributeValue("id")); + notification = queue.poll(); + Assert.assertNotNull(notification); + Assert.assertEquals("item-id", + notification.getElement().element("event").element("items") + .element("retract").attributeValue("id")); + } +} diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeConfigureTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeConfigureTest.java index c6a5b954..3e41e5e9 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeConfigureTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeConfigureTest.java @@ -31,290 +31,290 @@ import org.xmpp.resultsetmanagement.ResultSetImpl; public class NodeConfigureTest extends IQTestHandler { - private IQ request; - private ChannelManager channelManager; - private NodeConfigure nodeConfigure; - private JID jid; - private Element element; - private BlockingQueue queue = new LinkedBlockingQueue(); - private String node = "/user/juliet@shakespeare.lit/posts"; - - @Before - public void setUp() throws Exception { - channelManager = Mockito.mock(ChannelManager.class); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); - - queue = new LinkedBlockingQueue(); - nodeConfigure = new NodeConfigure(queue, channelManager); - jid = new JID("juliet@shakespeare.lit"); - request = readStanzaAsIq("/iq/pubsub/channel/configure/request.stanza"); - - nodeConfigure.setServerDomain("shakespeare.lit"); - - element = new BaseElement("create"); - element.addAttribute("node", "/user/capulet@shakespeare.lit/posts"); - } - - @Test - public void testPassingConfigureAsElementNameReturnsTrue() { - Element element = new BaseElement("configure"); - Assert.assertTrue(nodeConfigure.accept(element)); - } - - @Test - public void testPassingNotConfigureAsElementNameReturnsFalse() { - Element element = new BaseElement("not-configure"); - Assert.assertFalse(nodeConfigure.accept(element)); - } - - @Test - public void testPassingNoNodeResultsInErrorStanza() throws Exception { - Element element = new BaseElement("configure"); - nodeConfigure.process(element, jid, request, null); - - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.modify, error.getType()); - Assert.assertEquals("nodeid-required", - error.getApplicationConditionName()); - } - - @Test - public void testNonExistantNodeReturnsErrorStanza() throws Exception { - Element element = new BaseElement("configure"); - element.addAttribute("node", "/user/not-here@shakespeare.lit/status"); - - Mockito.when(channelManager.nodeExists(Mockito.anyString())) - .thenReturn(false); - nodeConfigure.setChannelManager(channelManager); - - nodeConfigure.process(element, jid, request, null); - - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - 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 userMustBeNodeOwnerToModifyConfiguration() throws Exception { - Element element = new BaseElement("configure"); - element.addAttribute("node", "/user/juliet@shakespeare.lit/posts"); - - Mockito.when( - channelManager.nodeExists(node)) - .thenReturn(true); - Mockito.when( - channelManager.getNodeConfValue( - "/user/juliet@shakespeare.lit/posts", "pubsub#owner")) - .thenReturn("romeo@shakespeare.lit"); - - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.any(JID.class))).thenReturn( - new NodeMembershipImpl(node, jid, Subscriptions.subscribed, - Affiliations.moderator, null)); - - nodeConfigure.setChannelManager(channelManager); - nodeConfigure.process(element, 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 testProvidingNoConfigurationDataInStanzaReturnsError() - throws Exception { - String nodeId = "/user/juliet@shakespeare.lit/posts"; - String actorJid = "juliet@shakespeare.lit"; - - Element element = new BaseElement("configure"); - element.addAttribute("node", nodeId); - Mockito.when(channelManager.nodeExists(nodeId)).thenReturn(true); - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.any(JID.class))).thenReturn( - new NodeMembershipImpl(nodeId, jid, Subscriptions.subscribed, - Affiliations.owner, null)); - - Helper helper = Mockito.mock(Helper.class); - Mockito.doThrow(new NodeConfigurationException()).when(helper) - .parse(request); - - nodeConfigure.setConfigurationHelper(helper); - nodeConfigure.setChannelManager(channelManager); - nodeConfigure.process(element, jid, request, null); - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - 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 testInvalidConfigurationStanzaReturnsError() throws Exception { - - String nodeId = "/user/juliet@shakespeare.lit/posts"; - String actorJid = "juliet@shakespeare.lit"; - - Element element = new BaseElement("configure"); - element.addAttribute("node", nodeId); - - Mockito.when(channelManager.nodeExists(nodeId)).thenReturn(true); - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.any(JID.class))).thenReturn( - new NodeMembershipImpl(nodeId, jid, Subscriptions.subscribed, - Affiliations.owner, null)); - - Helper helper = Mockito.mock(Helper.class); - Mockito.when(helper.isValid()).thenReturn(false); - - nodeConfigure.setChannelManager(channelManager); - nodeConfigure.setConfigurationHelper(helper); - nodeConfigure.process(element, jid, request, null); - - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.modify, error.getType()); - Assert.assertEquals(PacketError.Condition.bad_request, - error.getCondition()); - } - - @SuppressWarnings("unchecked") - @Test - public void testDatabaseErrorOnUpdateConfigurationReturnsError() - throws Exception { - - String nodeId = "/user/juliet@shakespeare.lit/posts"; - String actorJid = "juliet@shakespeare.lit"; - - Element element = new BaseElement("configure"); - element.addAttribute("node", nodeId); - - Mockito.when(channelManager.nodeExists(nodeId)).thenReturn(true); - - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.any(JID.class))).thenReturn( - new NodeMembershipImpl(nodeId, jid, Subscriptions.subscribed, - Affiliations.owner, null)); - - Mockito.doThrow(new NodeStoreException()).when(channelManager) - .setNodeConf(Mockito.anyString(), Mockito.any(Map.class)); - - Helper helper = Mockito.mock(Helper.class); - Mockito.when(helper.isValid()).thenReturn(true); - - nodeConfigure.setChannelManager(channelManager); - nodeConfigure.setConfigurationHelper(helper); - nodeConfigure.process(element, jid, request, null); - - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.cancel, error.getType()); - Assert.assertEquals(PacketError.Condition.internal_server_error, - error.getCondition()); - } - - @Test - public void testSuccessfulSettingOfConfigurationReturnsConfirmationStanza() - throws Exception { - - String nodeId = "/user/juliet@shakespeare.lit/posts"; - String actorJid = "juliet@shakespeare.lit"; - - Element element = new BaseElement("configure"); - element.addAttribute("node", nodeId); - - Mockito.when(channelManager.nodeExists(nodeId)).thenReturn(true); - - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.any(JID.class))).thenReturn( - new NodeMembershipImpl(nodeId, jid, Subscriptions.subscribed, - Affiliations.owner, null)); - - ArrayList subscribers = new ArrayList(); - - Mockito.doReturn(new ResultSetImpl(subscribers)) - .when(channelManager) - .getNodeSubscriptionListeners(Mockito.anyString()); - - Helper helper = Mockito.mock(Helper.class); - Mockito.when(helper.isValid()).thenReturn(true); - - nodeConfigure.setChannelManager(channelManager); - nodeConfigure.setConfigurationHelper(helper); - nodeConfigure.process(element, jid, request, null); - - IQ response = (IQ) queue.poll(100, TimeUnit.MILLISECONDS); - Assert.assertEquals(IQ.Type.result.toString(), response.getType() - .toString()); - } - - @Test - public void testSettingConfigurationUpdatesSubscribers() throws Exception { - - String nodeId = "/user/juliet@shakespeare.lit/posts"; - String actorJid = "juliet@shakespeare.lit"; - - Element element = new BaseElement("configure"); - element.addAttribute("node", nodeId); - - Mockito.when(channelManager.nodeExists(nodeId)).thenReturn(true); - - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.any(JID.class))).thenReturn( - new NodeMembershipImpl(nodeId, jid, Subscriptions.subscribed, - Affiliations.owner, null)); - - ArrayList subscribers = new ArrayList(); - subscribers.add(new NodeSubscriptionMock(new JID( - "romeo@shakespeare.lit"))); - subscribers.add(new NodeSubscriptionMock(new JID( - "hamlet@shakespeare.lit"))); - subscribers.add(new NodeSubscriptionMock(new JID( - "bottom@shakespeare.lit"))); - ResultSetImpl res = new ResultSetImpl( - subscribers); - Mockito.doReturn(res).when(channelManager) - .getNodeSubscriptionListeners(Mockito.anyString()); - - Helper helper = Mockito.mock(Helper.class); - Mockito.when(helper.isValid()).thenReturn(true); - - nodeConfigure.setChannelManager(channelManager); - nodeConfigure.setConfigurationHelper(helper); - nodeConfigure.process(element, jid, request, null); - - queue.poll(100, TimeUnit.MILLISECONDS); - Assert.assertEquals(5, queue.size()); - Packet notification = queue.poll(100, TimeUnit.MILLISECONDS); - Assert.assertEquals("romeo@shakespeare.lit", notification.getTo() - .toString()); - notification = queue.poll(100, TimeUnit.MILLISECONDS); - Assert.assertEquals("hamlet@shakespeare.lit", notification.getTo() - .toString()); - notification = queue.poll(100, TimeUnit.MILLISECONDS); - Assert.assertEquals("bottom@shakespeare.lit", notification.getTo() - .toString()); - notification = queue.poll(100, TimeUnit.MILLISECONDS); - Assert.assertEquals("user1@server1", notification.getTo().toString()); - notification = queue.poll(100, TimeUnit.MILLISECONDS); - Assert.assertEquals("user2@server1", notification.getTo().toString()); - } -} \ No newline at end of file + private IQ request; + private ChannelManager channelManager; + private NodeConfigure nodeConfigure; + private JID jid; + private Element element; + private BlockingQueue queue = new LinkedBlockingQueue(); + private String node = "/user/juliet@shakespeare.lit/posts"; + + @Before + public void setUp() throws Exception { + channelManager = Mockito.mock(ChannelManager.class); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); + + queue = new LinkedBlockingQueue(); + nodeConfigure = new NodeConfigure(queue, channelManager); + jid = new JID("juliet@shakespeare.lit"); + request = readStanzaAsIq("/iq/pubsub/channel/configure/request.stanza"); + + nodeConfigure.setServerDomain("shakespeare.lit"); + + element = new BaseElement("create"); + element.addAttribute("node", "/user/capulet@shakespeare.lit/posts"); + } + + @Test + public void testPassingConfigureAsElementNameReturnsTrue() { + Element element = new BaseElement("configure"); + Assert.assertTrue(nodeConfigure.accept(element)); + } + + @Test + public void testPassingNotConfigureAsElementNameReturnsFalse() { + Element element = new BaseElement("not-configure"); + Assert.assertFalse(nodeConfigure.accept(element)); + } + + @Test + public void testPassingNoNodeResultsInErrorStanza() throws Exception { + Element element = new BaseElement("configure"); + nodeConfigure.process(element, jid, request, null); + + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.modify, error.getType()); + Assert.assertEquals("nodeid-required", + error.getApplicationConditionName()); + } + + @Test + public void testNonExistantNodeReturnsErrorStanza() throws Exception { + Element element = new BaseElement("configure"); + element.addAttribute("node", "/user/not-here@shakespeare.lit/status"); + + Mockito.when(channelManager.nodeExists(Mockito.anyString())) + .thenReturn(false); + nodeConfigure.setChannelManager(channelManager); + + nodeConfigure.process(element, jid, request, null); + + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + 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 userMustBeNodeOwnerToModifyConfiguration() throws Exception { + Element element = new BaseElement("configure"); + element.addAttribute("node", "/user/juliet@shakespeare.lit/posts"); + + Mockito.when( + channelManager.nodeExists(node)) + .thenReturn(true); + Mockito.when( + channelManager.getNodeConfValue( + "/user/juliet@shakespeare.lit/posts", "pubsub#owner")) + .thenReturn("romeo@shakespeare.lit"); + + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.any(JID.class))).thenReturn( + new NodeMembershipImpl(node, jid, Subscriptions.subscribed, + Affiliations.moderator, null)); + + nodeConfigure.setChannelManager(channelManager); + nodeConfigure.process(element, 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 testProvidingNoConfigurationDataInStanzaReturnsError() + throws Exception { + String nodeId = "/user/juliet@shakespeare.lit/posts"; + String actorJid = "juliet@shakespeare.lit"; + + Element element = new BaseElement("configure"); + element.addAttribute("node", nodeId); + Mockito.when(channelManager.nodeExists(nodeId)).thenReturn(true); + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.any(JID.class))).thenReturn( + new NodeMembershipImpl(nodeId, jid, Subscriptions.subscribed, + Affiliations.owner, null)); + + Helper helper = Mockito.mock(Helper.class); + Mockito.doThrow(new NodeConfigurationException()).when(helper) + .parse(request); + + nodeConfigure.setConfigurationHelper(helper); + nodeConfigure.setChannelManager(channelManager); + nodeConfigure.process(element, jid, request, null); + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + 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 testInvalidConfigurationStanzaReturnsError() throws Exception { + + String nodeId = "/user/juliet@shakespeare.lit/posts"; + String actorJid = "juliet@shakespeare.lit"; + + Element element = new BaseElement("configure"); + element.addAttribute("node", nodeId); + + Mockito.when(channelManager.nodeExists(nodeId)).thenReturn(true); + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.any(JID.class))).thenReturn( + new NodeMembershipImpl(nodeId, jid, Subscriptions.subscribed, + Affiliations.owner, null)); + + Helper helper = Mockito.mock(Helper.class); + Mockito.when(helper.isValid()).thenReturn(false); + + nodeConfigure.setChannelManager(channelManager); + nodeConfigure.setConfigurationHelper(helper); + nodeConfigure.process(element, jid, request, null); + + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.modify, error.getType()); + Assert.assertEquals(PacketError.Condition.bad_request, + error.getCondition()); + } + + @SuppressWarnings("unchecked") + @Test + public void testDatabaseErrorOnUpdateConfigurationReturnsError() + throws Exception { + + String nodeId = "/user/juliet@shakespeare.lit/posts"; + String actorJid = "juliet@shakespeare.lit"; + + Element element = new BaseElement("configure"); + element.addAttribute("node", nodeId); + + Mockito.when(channelManager.nodeExists(nodeId)).thenReturn(true); + + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.any(JID.class))).thenReturn( + new NodeMembershipImpl(nodeId, jid, Subscriptions.subscribed, + Affiliations.owner, null)); + + Mockito.doThrow(new NodeStoreException()).when(channelManager) + .setNodeConf(Mockito.anyString(), Mockito.any(Map.class)); + + Helper helper = Mockito.mock(Helper.class); + Mockito.when(helper.isValid()).thenReturn(true); + + nodeConfigure.setChannelManager(channelManager); + nodeConfigure.setConfigurationHelper(helper); + nodeConfigure.process(element, jid, request, null); + + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.cancel, error.getType()); + Assert.assertEquals(PacketError.Condition.internal_server_error, + error.getCondition()); + } + + @Test + public void testSuccessfulSettingOfConfigurationReturnsConfirmationStanza() + throws Exception { + + String nodeId = "/user/juliet@shakespeare.lit/posts"; + String actorJid = "juliet@shakespeare.lit"; + + Element element = new BaseElement("configure"); + element.addAttribute("node", nodeId); + + Mockito.when(channelManager.nodeExists(nodeId)).thenReturn(true); + + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.any(JID.class))).thenReturn( + new NodeMembershipImpl(nodeId, jid, Subscriptions.subscribed, + Affiliations.owner, null)); + + ArrayList subscribers = new ArrayList(); + + Mockito.doReturn(new ResultSetImpl(subscribers)) + .when(channelManager) + .getNodeSubscriptionListeners(Mockito.anyString()); + + Helper helper = Mockito.mock(Helper.class); + Mockito.when(helper.isValid()).thenReturn(true); + + nodeConfigure.setChannelManager(channelManager); + nodeConfigure.setConfigurationHelper(helper); + nodeConfigure.process(element, jid, request, null); + + IQ response = (IQ) queue.poll(100, TimeUnit.MILLISECONDS); + Assert.assertEquals(IQ.Type.result.toString(), response.getType() + .toString()); + } + + @Test + public void testSettingConfigurationUpdatesSubscribers() throws Exception { + + String nodeId = "/user/juliet@shakespeare.lit/posts"; + String actorJid = "juliet@shakespeare.lit"; + + Element element = new BaseElement("configure"); + element.addAttribute("node", nodeId); + + Mockito.when(channelManager.nodeExists(nodeId)).thenReturn(true); + + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.any(JID.class))).thenReturn( + new NodeMembershipImpl(nodeId, jid, Subscriptions.subscribed, + Affiliations.owner, null)); + + ArrayList subscribers = new ArrayList(); + subscribers.add(new NodeSubscriptionMock(new JID( + "romeo@shakespeare.lit"))); + subscribers.add(new NodeSubscriptionMock(new JID( + "hamlet@shakespeare.lit"))); + subscribers.add(new NodeSubscriptionMock(new JID( + "bottom@shakespeare.lit"))); + ResultSetImpl res = new ResultSetImpl( + subscribers); + Mockito.doReturn(res).when(channelManager) + .getNodeSubscriptionListeners(Mockito.anyString()); + + Helper helper = Mockito.mock(Helper.class); + Mockito.when(helper.isValid()).thenReturn(true); + + nodeConfigure.setChannelManager(channelManager); + nodeConfigure.setConfigurationHelper(helper); + nodeConfigure.process(element, jid, request, null); + + queue.poll(100, TimeUnit.MILLISECONDS); + Assert.assertEquals(5, queue.size()); + Packet notification = queue.poll(100, TimeUnit.MILLISECONDS); + Assert.assertEquals("romeo@shakespeare.lit", notification.getTo() + .toString()); + notification = queue.poll(100, TimeUnit.MILLISECONDS); + Assert.assertEquals("hamlet@shakespeare.lit", notification.getTo() + .toString()); + notification = queue.poll(100, TimeUnit.MILLISECONDS); + Assert.assertEquals("bottom@shakespeare.lit", notification.getTo() + .toString()); + notification = queue.poll(100, TimeUnit.MILLISECONDS); + Assert.assertEquals("user1@server1", notification.getTo().toString()); + notification = queue.poll(100, TimeUnit.MILLISECONDS); + Assert.assertEquals("user2@server1", notification.getTo().toString()); + } +} diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreateTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreateTest.java index c581dd76..fd1efabf 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreateTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/NodeCreateTest.java @@ -26,247 +26,247 @@ import org.xmpp.packet.PacketError; public class NodeCreateTest extends IQTestHandler { - private IQ request; - private ChannelManager channelManager; - private NodeCreate nodeCreate; - private JID jid; - private Element element; - private BlockingQueue queue = new LinkedBlockingQueue(); - private String node = "/user/capulet@shakespeare.lit/posts"; - - @Before - public void setUp() throws Exception { - channelManager = Mockito.mock(ChannelManager.class); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); - - queue = new LinkedBlockingQueue(); - nodeCreate = new NodeCreate(queue, channelManager); - jid = new JID("juliet@shakespeare.lit"); - request = readStanzaAsIq("/iq/pubsub/channel/create/request.stanza"); - - nodeCreate.setServerDomain("shakespeare.lit"); - - element = new BaseElement("create"); - element.addAttribute("node", node); - } - - @Test - public void testPassingCreateAsElementNameReturnsTrue() { - Element element = new BaseElement("create"); - Assert.assertTrue(nodeCreate.accept(element)); - } - - @Test - public void testPassingNotCreateAsElementNameReturnsFalse() { - Element element = new BaseElement("not-create"); - Assert.assertFalse(nodeCreate.accept(element)); - } - - @Test - public void testPassingNoNodeResultsInErrorStanza() throws Exception { - Element element = new BaseElement("create"); - nodeCreate.process(element, jid, request, null); - - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.modify, error.getType()); - Assert.assertEquals("nodeid-required", error.getApplicationConditionName()); - } - - @Test - public void testRequestingAlreadyExistingNodeReturnsErrorStanza() - throws Exception { - - Mockito.when( - channelManager - .nodeExists("/user/capulet@shakespeare.lit/posts")) - .thenReturn(true); - nodeCreate.setChannelManager(channelManager); - - nodeCreate.process(element, jid, request, null); - - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.cancel, error.getType()); - Assert.assertEquals(PacketError.Condition.conflict, error.getCondition()); - /** - * Add this check back in once Tinder supports xmlns on standard - * conditions Assert.assertEquals(JabberPubsub.NS_XMPP_STANZAS, - * error.getApplicationConditionNamespaceURI()); - */ - } - - @Test - public void testUnauthenticatedUserCanNotCreateNode() throws Exception { - JID jid = new JID("juliet@anon.shakespeare.lit"); - - nodeCreate.process(element, jid, request, null); - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Condition.forbidden, error.getCondition()); - Assert.assertEquals(PacketError.Type.auth, error.getType()); - /** - * Add this check back in once Tinder supports xmlns on standard - * conditions Assert.assertEquals(JabberPubsub.NS_XMPP_STANZAS, - * error.getApplicationConditionNamespaceURI()); - */ - } - - @Test - public void testInvalidlyFormattedNodeReturnsError() throws Exception { - element.addAttribute("node", "/user/capulet@shakespeare/posts/invalid"); - - nodeCreate.process(element, jid, request, null); - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.modify, error.getType()); - Assert.assertEquals(PacketError.Condition.bad_request, error.getCondition()); - /** - * Add this check back in once Tinder supports xmlns on standard - * conditions Assert.assertEquals(JabberPubsub.NS_XMPP_STANZAS, - * error.getApplicationConditionNamespaceURI()); - */ - } - - @Test - public void testNewNodeMustBeOnADomainSupportedByCurrentServer() - throws Exception { - element.addAttribute("node", "/user/capulet@shakespearelit/posts"); - - nodeCreate.setTopicsDomain("topics.shakespeare.lit"); - - nodeCreate.process(element, jid, request, null); - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.modify, error.getType()); - Assert.assertEquals(PacketError.Condition.not_acceptable, error.getCondition()); - /** - * Add this check back in once Tinder supports xmlns on standard - * conditions Assert.assertEquals(JabberPubsub.NS_XMPP_STANZAS, - * error.getApplicationConditionNamespaceURI()); - */ - } - - @Test - public void testchannelManagerFailureReturnsInternalServerErrorResponse() - throws Exception { - Mockito.doThrow(new NodeStoreException()) - .when(channelManager) - .createNode(Mockito.any(JID.class), Mockito.anyString(), - Mockito.anyMapOf(String.class, String.class)); - nodeCreate.setChannelManager(channelManager); - Helper helper = Mockito.mock(Helper.class); - Mockito.doReturn(true).when(helper).isValid(); - nodeCreate.setConfigurationHelper(helper); - - nodeCreate.process(element, jid, request, null); - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Condition.internal_server_error, - error.getCondition()); - Assert.assertEquals(PacketError.Type.wait, error.getType()); - /** - * Add this check back in once Tinder supports xmlns on standard - * conditions Assert.assertEquals(JabberPubsub.NS_XMPP_STANZAS, - * error.getApplicationConditionNamespaceURI()); - */ - } - - @Test - public void testValidCreateNodeRequestReturnsConfirmationStanza() - throws Exception { - Helper helper = Mockito.mock(Helper.class); - Mockito.doReturn(true).when(helper).isValid(); - nodeCreate.setConfigurationHelper(helper); - - nodeCreate.process(element, jid, request, null); - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - String error = null; - try { - error = response.getError().toString(); - Assert.fail("Unexpected error response"); - } catch (NullPointerException e) { - Assert.assertNull(error); - } - Assert.assertEquals(IQ.Type.result.toString(), response.getElement() - .attribute("type").getValue()); - } - - @Test - public void testCreateNodeWithConfigurationResultsInExpectedConfig() - throws Exception { - String channelTitle = "test-channel-name"; - - HashMap configurationProperties = new HashMap(); - configurationProperties.put(NodeTitle.FIELD_NAME, channelTitle); - - Helper helper = Mockito.mock(Helper.class); - Mockito.when(helper.getValues()) - .thenReturn(configurationProperties); - Mockito.doReturn(true).when(helper).isValid(); - - ChannelManager channelManager = Mockito.mock(ChannelManager.class); - - HashMap conf = new HashMap(); - conf.put(NodeTitle.FIELD_NAME, channelTitle); - - Mockito.when(channelManager.getNodeConf(Mockito.anyString())).thenReturn(conf); - nodeCreate.setChannelManager(channelManager); - nodeCreate.setConfigurationHelper(helper); - - nodeCreate.process(element, jid, request, null); - - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - String error = null; - try { - error = response.getError().toString(); - Assert.fail("Unexpected error response"); - } catch (NullPointerException e) { - Assert.assertNull(error); - } - Map nodeConfiguration = channelManager - .getNodeConf(node); - Assert.assertEquals(channelTitle, - nodeConfiguration.get(NodeTitle.FIELD_NAME)); - } - - @Test - public void testFailingNodeConfigurationReturnsErrorStanza() - throws Exception { - String channelTitle = "test-channel-name"; - - HashMap configurationProperties = new HashMap(); - configurationProperties.put(NodeTitle.FIELD_NAME, channelTitle); - - Helper helper = Mockito.mock(Helper.class); - Mockito.doThrow(new NodeConfigurationException()).when(helper) - .parse(request); - nodeCreate.setConfigurationHelper(helper); - - nodeCreate.process(element, jid, request, null); - - Packet response = queue.poll(100, TimeUnit.MILLISECONDS); - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.modify, error.getType()); - Assert.assertEquals(PacketError.Condition.bad_request, error.getCondition()); - /** - * Add this check back in once Tinder supports xmlns on standard - * conditions Assert.assertEquals(JabberPubsub.NS_XMPP_STANZAS, - * error.getApplicationConditionNamespaceURI()); - */ - } -} \ No newline at end of file + private IQ request; + private ChannelManager channelManager; + private NodeCreate nodeCreate; + private JID jid; + private Element element; + private BlockingQueue queue = new LinkedBlockingQueue(); + private String node = "/user/capulet@shakespeare.lit/posts"; + + @Before + public void setUp() throws Exception { + channelManager = Mockito.mock(ChannelManager.class); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); + + queue = new LinkedBlockingQueue(); + nodeCreate = new NodeCreate(queue, channelManager); + jid = new JID("juliet@shakespeare.lit"); + request = readStanzaAsIq("/iq/pubsub/channel/create/request.stanza"); + + nodeCreate.setServerDomain("shakespeare.lit"); + + element = new BaseElement("create"); + element.addAttribute("node", node); + } + + @Test + public void testPassingCreateAsElementNameReturnsTrue() { + Element element = new BaseElement("create"); + Assert.assertTrue(nodeCreate.accept(element)); + } + + @Test + public void testPassingNotCreateAsElementNameReturnsFalse() { + Element element = new BaseElement("not-create"); + Assert.assertFalse(nodeCreate.accept(element)); + } + + @Test + public void testPassingNoNodeResultsInErrorStanza() throws Exception { + Element element = new BaseElement("create"); + nodeCreate.process(element, jid, request, null); + + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.modify, error.getType()); + Assert.assertEquals("nodeid-required", error.getApplicationConditionName()); + } + + @Test + public void testRequestingAlreadyExistingNodeReturnsErrorStanza() + throws Exception { + + Mockito.when( + channelManager + .nodeExists("/user/capulet@shakespeare.lit/posts")) + .thenReturn(true); + nodeCreate.setChannelManager(channelManager); + + nodeCreate.process(element, jid, request, null); + + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.cancel, error.getType()); + Assert.assertEquals(PacketError.Condition.conflict, error.getCondition()); + /** + * Add this check back in once Tinder supports xmlns on standard + * conditions Assert.assertEquals(JabberPubsub.NS_XMPP_STANZAS, + * error.getApplicationConditionNamespaceURI()); + */ + } + + @Test + public void testUnauthenticatedUserCanNotCreateNode() throws Exception { + JID jid = new JID("juliet@anon.shakespeare.lit"); + + nodeCreate.process(element, jid, request, null); + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Condition.forbidden, error.getCondition()); + Assert.assertEquals(PacketError.Type.auth, error.getType()); + /** + * Add this check back in once Tinder supports xmlns on standard + * conditions Assert.assertEquals(JabberPubsub.NS_XMPP_STANZAS, + * error.getApplicationConditionNamespaceURI()); + */ + } + + @Test + public void testInvalidlyFormattedNodeReturnsError() throws Exception { + element.addAttribute("node", "/user/capulet@shakespeare/posts/invalid"); + + nodeCreate.process(element, jid, request, null); + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.modify, error.getType()); + Assert.assertEquals(PacketError.Condition.bad_request, error.getCondition()); + /** + * Add this check back in once Tinder supports xmlns on standard + * conditions Assert.assertEquals(JabberPubsub.NS_XMPP_STANZAS, + * error.getApplicationConditionNamespaceURI()); + */ + } + + @Test + public void testNewNodeMustBeOnADomainSupportedByCurrentServer() + throws Exception { + element.addAttribute("node", "/user/capulet@shakespearelit/posts"); + + nodeCreate.setTopicsDomain("topics.shakespeare.lit"); + + nodeCreate.process(element, jid, request, null); + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.modify, error.getType()); + Assert.assertEquals(PacketError.Condition.not_acceptable, error.getCondition()); + /** + * Add this check back in once Tinder supports xmlns on standard + * conditions Assert.assertEquals(JabberPubsub.NS_XMPP_STANZAS, + * error.getApplicationConditionNamespaceURI()); + */ + } + + @Test + public void testchannelManagerFailureReturnsInternalServerErrorResponse() + throws Exception { + Mockito.doThrow(new NodeStoreException()) + .when(channelManager) + .createNode(Mockito.any(JID.class), Mockito.anyString(), + Mockito.anyMapOf(String.class, String.class)); + nodeCreate.setChannelManager(channelManager); + Helper helper = Mockito.mock(Helper.class); + Mockito.doReturn(true).when(helper).isValid(); + nodeCreate.setConfigurationHelper(helper); + + nodeCreate.process(element, jid, request, null); + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Condition.internal_server_error, + error.getCondition()); + Assert.assertEquals(PacketError.Type.wait, error.getType()); + /** + * Add this check back in once Tinder supports xmlns on standard + * conditions Assert.assertEquals(JabberPubsub.NS_XMPP_STANZAS, + * error.getApplicationConditionNamespaceURI()); + */ + } + + @Test + public void testValidCreateNodeRequestReturnsConfirmationStanza() + throws Exception { + Helper helper = Mockito.mock(Helper.class); + Mockito.doReturn(true).when(helper).isValid(); + nodeCreate.setConfigurationHelper(helper); + + nodeCreate.process(element, jid, request, null); + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + String error = null; + try { + error = response.getError().toString(); + Assert.fail("Unexpected error response"); + } catch (NullPointerException e) { + Assert.assertNull(error); + } + Assert.assertEquals(IQ.Type.result.toString(), response.getElement() + .attribute("type").getValue()); + } + + @Test + public void testCreateNodeWithConfigurationResultsInExpectedConfig() + throws Exception { + String channelTitle = "test-channel-name"; + + HashMap configurationProperties = new HashMap(); + configurationProperties.put(NodeTitle.FIELD_NAME, channelTitle); + + Helper helper = Mockito.mock(Helper.class); + Mockito.when(helper.getValues()) + .thenReturn(configurationProperties); + Mockito.doReturn(true).when(helper).isValid(); + + ChannelManager channelManager = Mockito.mock(ChannelManager.class); + + HashMap conf = new HashMap(); + conf.put(NodeTitle.FIELD_NAME, channelTitle); + + Mockito.when(channelManager.getNodeConf(Mockito.anyString())).thenReturn(conf); + nodeCreate.setChannelManager(channelManager); + nodeCreate.setConfigurationHelper(helper); + + nodeCreate.process(element, jid, request, null); + + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + String error = null; + try { + error = response.getError().toString(); + Assert.fail("Unexpected error response"); + } catch (NullPointerException e) { + Assert.assertNull(error); + } + Map nodeConfiguration = channelManager + .getNodeConf(node); + Assert.assertEquals(channelTitle, + nodeConfiguration.get(NodeTitle.FIELD_NAME)); + } + + @Test + public void testFailingNodeConfigurationReturnsErrorStanza() + throws Exception { + String channelTitle = "test-channel-name"; + + HashMap configurationProperties = new HashMap(); + configurationProperties.put(NodeTitle.FIELD_NAME, channelTitle); + + Helper helper = Mockito.mock(Helper.class); + Mockito.doThrow(new NodeConfigurationException()).when(helper) + .parse(request); + nodeCreate.setConfigurationHelper(helper); + + nodeCreate.process(element, jid, request, null); + + Packet response = queue.poll(100, TimeUnit.MILLISECONDS); + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.modify, error.getType()); + Assert.assertEquals(PacketError.Condition.bad_request, error.getCondition()); + /** + * Add this check back in once Tinder supports xmlns on standard + * conditions Assert.assertEquals(JabberPubsub.NS_XMPP_STANZAS, + * error.getApplicationConditionNamespaceURI()); + */ + } +} 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 60482228..e060470b 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 @@ -30,258 +30,258 @@ 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"); - - @Before - public void setUp() throws Exception { - this.channelManager = Mockito.mock(ChannelManager.class); - 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()); - } - - @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")); - } + private ChannelManager channelManager; + private LinkedBlockingQueue queue; + private NodeDelete nodeDelete; + private BaseElement element; + private JID jid = new JID("juliet@shakespeare.lit"); + + @Before + public void setUp() throws Exception { + this.channelManager = Mockito.mock(ChannelManager.class); + 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()); + } + + @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")); + } } diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/PublishTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/PublishTest.java index ae1de82f..2899f1d8 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/PublishTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/PublishTest.java @@ -35,52 +35,52 @@ public class PublishTest extends IQTestHandler { - private IQ request; - private ChannelManager channelManager; - private Publish publish; - private JID jid; - private Element element; - private BlockingQueue queue = new LinkedBlockingQueue(); - private String node = "/user/romeo@shakespeare.lit/posts"; - private String server = "channels.shakespeare.lit"; - private AtomEntry validateEntry; - private Element entry; - - @Before - public void setUp() throws Exception { - channelManager = Mockito.mock(ChannelManager.class); - validateEntry = Mockito.mock(AtomEntry.class); - - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); - - queue = new LinkedBlockingQueue(); - publish = new Publish(queue, channelManager); - jid = new JID("juliet@shakespeare.lit/balcony"); - request = readStanzaAsIq("/iq/pubsub/publish/request.stanza"); - - publish.setServerDomain("shakespeare.lit"); - publish.setChannelManager(channelManager); - publish.setEntryValidator(validateEntry); - - entry = request.getChildElement().element("publish").element("item") - .element("entry").createCopy(); - - element = new BaseElement("publish"); - - Mockito.when(channelManager.nodeExists(node)).thenReturn(true); - - NodeMembership membership = new NodeMembershipImpl(node, jid, - Subscriptions.subscribed, Affiliations.publisher, null); - Mockito.when( - channelManager.getNodeMembership(Mockito.eq(node), - Mockito.eq(jid))).thenReturn(membership); - - Mockito.when( - channelManager.getNodeSubscriptionListeners(Mockito.eq(node))) - .thenReturn( - new ResultSetImpl( - new ArrayList())); + private IQ request; + private ChannelManager channelManager; + private Publish publish; + private JID jid; + private Element element; + private BlockingQueue queue = new LinkedBlockingQueue(); + private String node = "/user/romeo@shakespeare.lit/posts"; + private String server = "channels.shakespeare.lit"; + private AtomEntry validateEntry; + private Element entry; + + @Before + public void setUp() throws Exception { + channelManager = Mockito.mock(ChannelManager.class); + validateEntry = Mockito.mock(AtomEntry.class); + + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); + + queue = new LinkedBlockingQueue(); + publish = new Publish(queue, channelManager); + jid = new JID("juliet@shakespeare.lit/balcony"); + request = readStanzaAsIq("/iq/pubsub/publish/request.stanza"); + + publish.setServerDomain("shakespeare.lit"); + publish.setChannelManager(channelManager); + publish.setEntryValidator(validateEntry); + + entry = request.getChildElement().element("publish").element("item") + .element("entry").createCopy(); + + element = new BaseElement("publish"); + + Mockito.when(channelManager.nodeExists(node)).thenReturn(true); + + NodeMembership membership = new NodeMembershipImpl(node, jid, + Subscriptions.subscribed, Affiliations.publisher, null); + Mockito.when( + channelManager.getNodeMembership(Mockito.eq(node), + Mockito.eq(jid))).thenReturn(membership); + + Mockito.when( + channelManager.getNodeSubscriptionListeners(Mockito.eq(node))) + .thenReturn( + new ResultSetImpl( + new ArrayList())); validateEntry.setPayload(request.getChildElement().element("publish") .element("item").createCopy()); @@ -88,377 +88,377 @@ public void setUp() throws Exception { new GlobalItemIDImpl(new JID(request.getTo().toBareJID()), node, entry.elementText("id")).toString()); - Mockito.when(validateEntry.getLocalItemId()).thenCallRealMethod(); - Mockito.when(validateEntry.isValid()).thenReturn(true); + Mockito.when(validateEntry.getLocalItemId()).thenCallRealMethod(); + Mockito.when(validateEntry.isValid()).thenReturn(true); - Mockito.when(validateEntry.getPayload()).thenReturn(entry); + Mockito.when(validateEntry.getPayload()).thenReturn(entry); - } + } - @Test - public void passingRetractAsElementNameReturnsTrue() { - Element element = new BaseElement("publish"); - Assert.assertTrue(publish.accept(element)); - } + @Test + public void passingRetractAsElementNameReturnsTrue() { + Element element = new BaseElement("publish"); + Assert.assertTrue(publish.accept(element)); + } - @Test - public void passingNotRetractAsElementNameReturnsFalse() { - Element element = new BaseElement("not-publish"); - Assert.assertFalse(publish.accept(element)); - } + @Test + public void passingNotRetractAsElementNameReturnsFalse() { + Element element = new BaseElement("not-publish"); + Assert.assertFalse(publish.accept(element)); + } - @Test - public void passingNoNodeResultsInErrorStanza() throws Exception { + @Test + public void passingNoNodeResultsInErrorStanza() throws Exception { - IQ request = this.request.createCopy(); - request.getChildElement().element("publish").attribute("node").detach(); + IQ request = this.request.createCopy(); + request.getChildElement().element("publish").attribute("node").detach(); - publish.process(element, jid, request, null); + publish.process(element, jid, request, null); - Packet response = queue.poll(); + Packet response = queue.poll(); - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.modify, error.getType()); - Assert.assertEquals(Publish.NODE_ID_REQUIRED, - error.getApplicationConditionName()); - } + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.modify, error.getType()); + Assert.assertEquals(Publish.NODE_ID_REQUIRED, + error.getApplicationConditionName()); + } - @Test - public void nodeStoreExceptionReturnsErrorStanza() throws Exception { - Mockito.doThrow(new NodeStoreException()).when(channelManager) - .nodeExists(Mockito.eq(node)); + @Test + public void nodeStoreExceptionReturnsErrorStanza() throws Exception { + Mockito.doThrow(new NodeStoreException()).when(channelManager) + .nodeExists(Mockito.eq(node)); - publish.process(element, jid, request, null); + publish.process(element, jid, request, null); - Packet response = queue.poll(); + Packet response = queue.poll(); - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Condition.internal_server_error, - error.getCondition()); - Assert.assertEquals(PacketError.Type.wait, error.getType()); + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Condition.internal_server_error, + error.getCondition()); + Assert.assertEquals(PacketError.Type.wait, error.getType()); - } + } - @Test - public void providingNodeWhichDoesntExistReturnsError() throws Exception { - Mockito.when(channelManager.nodeExists(node)).thenReturn(false); + @Test + public void providingNodeWhichDoesntExistReturnsError() throws Exception { + Mockito.when(channelManager.nodeExists(node)).thenReturn(false); - publish.process(element, jid, request, null); + publish.process(element, jid, request, null); - Packet response = queue.poll(); + 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()); - } + 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 requestToRemoteNodeResultsInForwardedPacket() throws Exception { - Configuration.getInstance().remove( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); + @Test + public void requestToRemoteNodeResultsInForwardedPacket() throws Exception { + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); - Assert.assertEquals(new JID("channels.shakespeare.lit"), - request.getTo()); + Assert.assertEquals(new JID("channels.shakespeare.lit"), + request.getTo()); - request.getElement().element("pubsub").element( - "publish").addAttribute("node", "/user/romeo@barracks.lit/posts"); - publish.process(element, jid, request, null); + request.getElement().element("pubsub").element( + "publish").addAttribute("node", "/user/romeo@barracks.lit/posts"); + publish.process(element, jid, request, null); - Assert.assertEquals(1, queue.size()); + Assert.assertEquals(1, queue.size()); - Packet response = queue.poll(); + Packet response = queue.poll(); - Assert.assertEquals(new JID("barracks.lit"), response.getTo()); - } + Assert.assertEquals(new JID("barracks.lit"), response.getTo()); + } - @Test - public void unsubscribedUserCanNotPublish() throws Exception { - NodeMembership membership = new NodeMembershipImpl(node, jid, - Subscriptions.none, Affiliations.publisher, null); - Mockito.when( - channelManager.getNodeMembership(Mockito.eq(node), - Mockito.eq(jid))).thenReturn(membership); + @Test + public void unsubscribedUserCanNotPublish() throws Exception { + NodeMembership membership = new NodeMembershipImpl(node, jid, + Subscriptions.none, Affiliations.publisher, null); + Mockito.when( + channelManager.getNodeMembership(Mockito.eq(node), + Mockito.eq(jid))).thenReturn(membership); - publish.process(element, 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 pendingSubscriptionCanNotPublish() throws Exception { - NodeMembership membership = new NodeMembershipImpl(node, jid, - Subscriptions.pending, Affiliations.publisher, null); - Mockito.when( - channelManager.getNodeMembership(Mockito.eq(node), - Mockito.eq(jid))).thenReturn(membership); - - publish.process(element, 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 noAffiliationCanNotPublish() throws Exception { - NodeMembership membership = new NodeMembershipImpl(node, jid, - Subscriptions.subscribed, Affiliations.none, null); - Mockito.when( - channelManager.getNodeMembership(Mockito.eq(node), - Mockito.eq(jid))).thenReturn(membership); - - publish.process(element, 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 memberAffiliationCanNotPublish() throws Exception { - NodeMembership membership = new NodeMembershipImpl(node, jid, - Subscriptions.subscribed, Affiliations.member, null); - Mockito.when( - channelManager.getNodeMembership(Mockito.eq(node), - Mockito.eq(jid))).thenReturn(membership); - - publish.process(element, 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 outcastAffiliationCanNotPublish() throws Exception { - NodeMembership membership = new NodeMembershipImpl(node, jid, - Subscriptions.subscribed, Affiliations.outcast, null); - Mockito.when( - channelManager.getNodeMembership(Mockito.eq(node), - Mockito.eq(jid))).thenReturn(membership); - - publish.process(element, 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 noItemElementReturnsError() throws Exception { - IQ request = this.request.createCopy(); - request.getChildElement().element("publish").element("item").detach(); - - publish.process(element, 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()); - Assert.assertEquals(Publish.MISSING_ITEM_ELEMENT, - error.getApplicationConditionName()); - } - - @Test - public void invalidEntryReturnsError() throws Exception { - - String errorMessage = "errorMessage"; - Mockito.when(validateEntry.isValid()).thenReturn(false); - Mockito.when(validateEntry.getErrorMessage()).thenReturn(errorMessage); - publish.process(element, 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()); - Assert.assertEquals(errorMessage, error.getApplicationConditionName()); - } - - @Test - public void itemIsSavedAsExpected() throws Exception { - IQ request = this.request.createCopy(); - publish.process(element, jid, request, null); - - Mockito.verify(channelManager, Mockito.times(1)).addNodeItem( - Mockito.any(NodeItemImpl.class)); - } - - @Test - public void expectedSuccessResponseReceived() throws Exception { - IQ request = this.request.createCopy(); - publish.process(element, jid, request, null); - - IQ response = (IQ) queue.poll(); - - Assert.assertEquals(IQ.Type.result, response.getType()); - Assert.assertEquals(request.getFrom(), response.getTo()); - Assert.assertEquals(request.getTo(), response.getFrom()); - - Element pubsub = response.getElement().element("pubsub"); - Assert.assertEquals(JabberPubsub.NAMESPACE_URI, - pubsub.getNamespaceURI()); - Element publish = pubsub.element("publish"); - Assert.assertEquals(node, publish.attributeValue("node")); - - Element item = publish.element("item"); - Assert.assertNotNull(item); - - Assert.assertTrue(item.attributeValue("id").length() > 0); - Assert.assertTrue(GlobalItemIDImpl.isGlobalId(item.attributeValue("id"))); - } + publish.process(element, 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 pendingSubscriptionCanNotPublish() throws Exception { + NodeMembership membership = new NodeMembershipImpl(node, jid, + Subscriptions.pending, Affiliations.publisher, null); + Mockito.when( + channelManager.getNodeMembership(Mockito.eq(node), + Mockito.eq(jid))).thenReturn(membership); + + publish.process(element, 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 noAffiliationCanNotPublish() throws Exception { + NodeMembership membership = new NodeMembershipImpl(node, jid, + Subscriptions.subscribed, Affiliations.none, null); + Mockito.when( + channelManager.getNodeMembership(Mockito.eq(node), + Mockito.eq(jid))).thenReturn(membership); + + publish.process(element, 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 memberAffiliationCanNotPublish() throws Exception { + NodeMembership membership = new NodeMembershipImpl(node, jid, + Subscriptions.subscribed, Affiliations.member, null); + Mockito.when( + channelManager.getNodeMembership(Mockito.eq(node), + Mockito.eq(jid))).thenReturn(membership); + + publish.process(element, 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 outcastAffiliationCanNotPublish() throws Exception { + NodeMembership membership = new NodeMembershipImpl(node, jid, + Subscriptions.subscribed, Affiliations.outcast, null); + Mockito.when( + channelManager.getNodeMembership(Mockito.eq(node), + Mockito.eq(jid))).thenReturn(membership); + + publish.process(element, 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 noItemElementReturnsError() throws Exception { + IQ request = this.request.createCopy(); + request.getChildElement().element("publish").element("item").detach(); + + publish.process(element, 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()); + Assert.assertEquals(Publish.MISSING_ITEM_ELEMENT, + error.getApplicationConditionName()); + } + + @Test + public void invalidEntryReturnsError() throws Exception { + + String errorMessage = "errorMessage"; + Mockito.when(validateEntry.isValid()).thenReturn(false); + Mockito.when(validateEntry.getErrorMessage()).thenReturn(errorMessage); + publish.process(element, 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()); + Assert.assertEquals(errorMessage, error.getApplicationConditionName()); + } + + @Test + public void itemIsSavedAsExpected() throws Exception { + IQ request = this.request.createCopy(); + publish.process(element, jid, request, null); + + Mockito.verify(channelManager, Mockito.times(1)).addNodeItem( + Mockito.any(NodeItemImpl.class)); + } + + @Test + public void expectedSuccessResponseReceived() throws Exception { + IQ request = this.request.createCopy(); + publish.process(element, jid, request, null); + + IQ response = (IQ) queue.poll(); + + Assert.assertEquals(IQ.Type.result, response.getType()); + Assert.assertEquals(request.getFrom(), response.getTo()); + Assert.assertEquals(request.getTo(), response.getFrom()); + + Element pubsub = response.getElement().element("pubsub"); + Assert.assertEquals(JabberPubsub.NAMESPACE_URI, + pubsub.getNamespaceURI()); + Element publish = pubsub.element("publish"); + Assert.assertEquals(node, publish.attributeValue("node")); + + Element item = publish.element("item"); + Assert.assertNotNull(item); + + Assert.assertTrue(item.attributeValue("id").length() > 0); + Assert.assertTrue(GlobalItemIDImpl.isGlobalId(item.attributeValue("id"))); + } - @Test - public void sendsOutExpectedNotifications() throws Exception { + @Test + public void sendsOutExpectedNotifications() throws Exception { - NodeSubscription subscriber1 = new NodeSubscriptionImpl(node, new JID( - "romeo@shakespeare.lit"), Subscriptions.subscribed, null); - // Expect not to see this user (subscription: 'pending') - NodeSubscription subscriber2 = new NodeSubscriptionImpl(node, new JID( - "titania@shakespeare.lit"), Subscriptions.pending, null); - NodeSubscription subscriber3 = new NodeSubscriptionImpl(node, new JID( - "faustus@marlowe.lit"), new JID("channels.marlowe.lit"), - Subscriptions.subscribed, null); + NodeSubscription subscriber1 = new NodeSubscriptionImpl(node, new JID( + "romeo@shakespeare.lit"), Subscriptions.subscribed, null); + // Expect not to see this user (subscription: 'pending') + NodeSubscription subscriber2 = new NodeSubscriptionImpl(node, new JID( + "titania@shakespeare.lit"), Subscriptions.pending, null); + NodeSubscription subscriber3 = new NodeSubscriptionImpl(node, new JID( + "faustus@marlowe.lit"), new JID("channels.marlowe.lit"), + Subscriptions.subscribed, null); - ArrayList subscribers = new ArrayList(); - subscribers.add(subscriber1); - subscribers.add(subscriber2); - subscribers.add(subscriber3); + ArrayList subscribers = new ArrayList(); + subscribers.add(subscriber1); + subscribers.add(subscriber2); + subscribers.add(subscriber3); - Mockito.when( - channelManager.getNodeSubscriptionListeners(Mockito.eq(node))) - .thenReturn(new ResultSetImpl(subscribers)); + Mockito.when( + channelManager.getNodeSubscriptionListeners(Mockito.eq(node))) + .thenReturn(new ResultSetImpl(subscribers)); - IQ request = this.request.createCopy(); - publish.process(element, jid, request, null); + IQ request = this.request.createCopy(); + publish.process(element, jid, request, null); - Assert.assertEquals(5, queue.size()); - - queue.poll(); - Message notification = (Message) queue.poll(); + Assert.assertEquals(5, queue.size()); + + queue.poll(); + Message notification = (Message) queue.poll(); - Assert.assertEquals(Message.Type.headline, notification.getType()); - Assert.assertEquals(subscriber1.getUser(), notification.getTo()); - Assert.assertEquals(server, notification.getFrom().toString()); + Assert.assertEquals(Message.Type.headline, notification.getType()); + Assert.assertEquals(subscriber1.getUser(), notification.getTo()); + Assert.assertEquals(server, notification.getFrom().toString()); - Element event = notification.getElement().element("event"); - Assert.assertEquals(JabberPubsub.NS_PUBSUB_EVENT, - event.getNamespaceURI()); + Element event = notification.getElement().element("event"); + Assert.assertEquals(JabberPubsub.NS_PUBSUB_EVENT, + event.getNamespaceURI()); - Element items = event.element("items"); - Assert.assertEquals(node, items.attributeValue("node")); + Element items = event.element("items"); + Assert.assertEquals(node, items.attributeValue("node")); - Element item = items.element("item"); - Assert.assertTrue(item.attributeValue("id").length() > 0); - Assert.assertTrue(GlobalItemIDImpl.isGlobalId(item.attributeValue("id"))); + Element item = items.element("item"); + Assert.assertTrue(item.attributeValue("id").length() > 0); + Assert.assertTrue(GlobalItemIDImpl.isGlobalId(item.attributeValue("id"))); - Element responseEntry = item.element("entry"); - Assert.assertEquals(entry.asXML(), responseEntry.asXML()); + Element responseEntry = item.element("entry"); + Assert.assertEquals(entry.asXML(), responseEntry.asXML()); - notification = (Message) queue.poll(); - Assert.assertEquals(subscriber3.getListener(), notification.getTo()); + notification = (Message) queue.poll(); + Assert.assertEquals(subscriber3.getListener(), notification.getTo()); - notification = (Message) queue.poll(); - Assert.assertEquals(new JID("user1@server1"), notification.getTo()); + notification = (Message) queue.poll(); + Assert.assertEquals(new JID("user1@server1"), notification.getTo()); - notification = (Message) queue.poll(); - Assert.assertEquals(new JID("user2@server1"), notification.getTo()); + notification = (Message) queue.poll(); + Assert.assertEquals(new JID("user2@server1"), notification.getTo()); - } + } - @Test - public void inReplyToIdIsSavedToDatabase() throws Exception { - IQ request = readStanzaAsIq("/iq/pubsub/publish/reply.stanza"); - Mockito.when(validateEntry.getPayload()).thenReturn( - request.getChildElement().element("publish").element("item") - .element("entry")); + @Test + public void inReplyToIdIsSavedToDatabase() throws Exception { + IQ request = readStanzaAsIq("/iq/pubsub/publish/reply.stanza"); + Mockito.when(validateEntry.getPayload()).thenReturn( + request.getChildElement().element("publish").element("item") + .element("entry")); Mockito.when(validateEntry.getInReplyTo()).thenReturn( GlobalItemIDImpl.toLocalId(request.getChildElement() .element("publish").element("item").element("entry") .element("in-reply-to").attributeValue("ref"))); - publish.process(element, jid, request, null); + publish.process(element, jid, request, null); - Assert.assertEquals(IQ.Type.result, ((IQ) queue.poll()).getType()); + Assert.assertEquals(IQ.Type.result, ((IQ) queue.poll()).getType()); - ArgumentCaptor argument = ArgumentCaptor - .forClass(NodeItemImpl.class); + ArgumentCaptor argument = ArgumentCaptor + .forClass(NodeItemImpl.class); - Mockito.verify(channelManager, Mockito.times(1)).addNodeItem( - argument.capture()); + Mockito.verify(channelManager, Mockito.times(1)).addNodeItem( + argument.capture()); - Assert.assertEquals("fc362eb42085f017ed9ccd9c4004b095", argument - .getValue().getInReplyTo()); - Assert.assertEquals(node, argument.getValue().getNodeId()); - } + Assert.assertEquals("fc362eb42085f017ed9ccd9c4004b095", argument + .getValue().getInReplyTo()); + Assert.assertEquals(node, argument.getValue().getNodeId()); + } - @Test - public void replyUpdatesThreadParentDate() throws Exception { - IQ request = readStanzaAsIq("/iq/pubsub/publish/reply.stanza"); - Mockito.when(validateEntry.getPayload()).thenReturn( - request.getChildElement().element("publish").element("item") - .element("entry")); + @Test + public void replyUpdatesThreadParentDate() throws Exception { + IQ request = readStanzaAsIq("/iq/pubsub/publish/reply.stanza"); + Mockito.when(validateEntry.getPayload()).thenReturn( + request.getChildElement().element("publish").element("item") + .element("entry")); - Mockito.when(validateEntry.getInReplyTo()) - .thenReturn("fc362eb42085f017ed9ccd9c4004b095"); + Mockito.when(validateEntry.getInReplyTo()) + .thenReturn("fc362eb42085f017ed9ccd9c4004b095"); - publish.process(element, jid, request, null); + publish.process(element, jid, request, null); - Assert.assertEquals(IQ.Type.result, ((IQ) queue.poll()).getType()); + Assert.assertEquals(IQ.Type.result, ((IQ) queue.poll()).getType()); - ArgumentCaptor inReplyTo = ArgumentCaptor - .forClass(String.class); - ArgumentCaptor passedNode = ArgumentCaptor - .forClass(String.class); + ArgumentCaptor inReplyTo = ArgumentCaptor + .forClass(String.class); + ArgumentCaptor passedNode = ArgumentCaptor + .forClass(String.class); - Mockito.verify(channelManager, Mockito.times(1)).updateThreadParent( - passedNode.capture(), inReplyTo.capture()); + Mockito.verify(channelManager, Mockito.times(1)).updateThreadParent( + passedNode.capture(), inReplyTo.capture()); - Assert.assertEquals("fc362eb42085f017ed9ccd9c4004b095", - inReplyTo.getValue()); - Assert.assertEquals(node, passedNode.getValue()); - } + Assert.assertEquals("fc362eb42085f017ed9ccd9c4004b095", + inReplyTo.getValue()); + Assert.assertEquals(node, passedNode.getValue()); + } - @Test - public void doesNotUpdateParentThreadIfNotReply() throws Exception { - IQ request = this.request.createCopy(); - publish.process(element, jid, request, null); + @Test + public void doesNotUpdateParentThreadIfNotReply() throws Exception { + IQ request = this.request.createCopy(); + publish.process(element, jid, request, null); - Mockito.verify(channelManager, Mockito.times(0)).updateThreadParent( - Mockito.anyString(), Mockito.anyString()); - } + Mockito.verify(channelManager, Mockito.times(0)).updateThreadParent( + Mockito.anyString(), Mockito.anyString()); + } } diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscribeSetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscribeSetTest.java index 1cc9362a..37097129 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscribeSetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscribeSetTest.java @@ -32,298 +32,298 @@ import org.xmpp.resultsetmanagement.ResultSetImpl; public class SubscribeSetTest extends IQTestHandler { - private IQ request; - private SubscribeSet subscribe; - private Element element; - private BlockingQueue queue = new LinkedBlockingQueue(); + private IQ request; + private SubscribeSet subscribe; + private Element element; + private BlockingQueue queue = new LinkedBlockingQueue(); - private String node = "/user/pamela@denmark.lit/posts"; - private JID jid = new JID("juliet@shakespeare.lit"); - private ChannelManager channelManager; + private String node = "/user/pamela@denmark.lit/posts"; + private JID jid = new JID("juliet@shakespeare.lit"); + private ChannelManager channelManager; - private NodeMembership membership; + private NodeMembership membership; - @Before - public void setUp() throws Exception { + @Before + public void setUp() throws Exception { - channelManager = Mockito.mock(ChannelManager.class); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); - Mockito.when(channelManager.nodeExists(Mockito.anyString())) - .thenReturn(true); + channelManager = Mockito.mock(ChannelManager.class); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); + Mockito.when(channelManager.nodeExists(Mockito.anyString())) + .thenReturn(true); - queue = new LinkedBlockingQueue(); - subscribe = new SubscribeSet(queue, channelManager); - request = readStanzaAsIq("/iq/pubsub/subscribe/request.stanza"); - subscribe.setServerDomain("shakespeare.lit"); + queue = new LinkedBlockingQueue(); + subscribe = new SubscribeSet(queue, channelManager); + request = readStanzaAsIq("/iq/pubsub/subscribe/request.stanza"); + subscribe.setServerDomain("shakespeare.lit"); - element = new BaseElement("subscribe"); - element.addAttribute("node", node); + element = new BaseElement("subscribe"); + element.addAttribute("node", node); - subscribe.setChannelManager(channelManager); + subscribe.setChannelManager(channelManager); - membership = new NodeMembershipImpl(node, jid, Subscriptions.none, - Affiliations.none, null); + membership = new NodeMembershipImpl(node, jid, Subscriptions.none, + Affiliations.none, null); - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.any(JID.class))).thenReturn(membership); + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.any(JID.class))).thenReturn(membership); - ArrayList members = new ArrayList(); - members.add(new NodeMembershipImpl(node, jid, Subscriptions.subscribed, - Affiliations.member, null)); + ArrayList members = new ArrayList(); + members.add(new NodeMembershipImpl(node, jid, Subscriptions.subscribed, + Affiliations.member, null)); - Mockito.doReturn(new ResultSetImpl(members)) - .when(channelManager).getNodeMemberships(Mockito.anyString()); + Mockito.doReturn(new ResultSetImpl(members)) + .when(channelManager).getNodeMemberships(Mockito.anyString()); - ArrayList subscribers = new ArrayList(); - subscribers.add(new NodeSubscriptionImpl(node, jid, - Subscriptions.subscribed, null)); + ArrayList subscribers = new ArrayList(); + subscribers.add(new NodeSubscriptionImpl(node, jid, + Subscriptions.subscribed, null)); - Mockito.doReturn(new ResultSetImpl(subscribers)) - .when(channelManager) - .getNodeSubscriptionListeners(Mockito.anyString()); + Mockito.doReturn(new ResultSetImpl(subscribers)) + .when(channelManager) + .getNodeSubscriptionListeners(Mockito.anyString()); - } + } - @Test - public void testMissingNodeAttributeReturnsError() throws Exception { + @Test + public void testMissingNodeAttributeReturnsError() throws Exception { - IQ request = this.request.createCopy(); - request.getChildElement().element("subscribe").attribute("node") - .detach(); + IQ request = this.request.createCopy(); + request.getChildElement().element("subscribe").attribute("node") + .detach(); - subscribe.process(element, jid, request, null); + subscribe.process(element, jid, request, null); - Assert.assertEquals(1, queue.size()); + Assert.assertEquals(1, queue.size()); - IQ response = (IQ) queue.poll(); + IQ response = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.error, response.getType()); + Assert.assertEquals(IQ.Type.error, response.getType()); - PacketError error = response.getError(); - Assert.assertNotNull(error); + PacketError error = response.getError(); + Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.modify, error.getType()); - Assert.assertEquals(PacketError.Condition.bad_request, - error.getCondition()); - Assert.assertEquals(SubscribeSet.MISSING_NODE_ID, - error.getApplicationConditionName()); + Assert.assertEquals(PacketError.Type.modify, error.getType()); + Assert.assertEquals(PacketError.Condition.bad_request, + error.getCondition()); + Assert.assertEquals(SubscribeSet.MISSING_NODE_ID, + error.getApplicationConditionName()); - } + } - @Test - public void testTryingToSubscribeSomeoneElseReturnsError() throws Exception { + @Test + public void testTryingToSubscribeSomeoneElseReturnsError() throws Exception { - IQ request = this.request.createCopy(); + IQ request = this.request.createCopy(); - // We are passing in an actor of `jid` - request.getChildElement().element("subscribe").attribute("jid") - .setValue("francisco@denmark.lit"); + // We are passing in an actor of `jid` + request.getChildElement().element("subscribe").attribute("jid") + .setValue("francisco@denmark.lit"); - subscribe.process(element, jid, request, null); + subscribe.process(element, jid, request, null); - Assert.assertEquals(1, queue.size()); + Assert.assertEquals(1, queue.size()); - IQ response = (IQ) queue.poll(); + IQ response = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.error, response.getType()); + Assert.assertEquals(IQ.Type.error, response.getType()); - PacketError error = response.getError(); - Assert.assertNotNull(error); + PacketError error = response.getError(); + Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.modify, error.getType()); - Assert.assertEquals(PacketError.Condition.bad_request, - error.getCondition()); - Assert.assertEquals(SubscribeSet.INVALID_JID, - error.getApplicationConditionName()); + Assert.assertEquals(PacketError.Type.modify, error.getType()); + Assert.assertEquals(PacketError.Condition.bad_request, + error.getCondition()); + Assert.assertEquals(SubscribeSet.INVALID_JID, + error.getApplicationConditionName()); - } + } - @Test - public void testUnRegisteedLocalUserReturnsError() throws Exception { + @Test + public void testUnRegisteedLocalUserReturnsError() throws Exception { - Configuration.getInstance().remove( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); - IQ request = this.request.createCopy(); + IQ request = this.request.createCopy(); - subscribe.process(element, null, request, null); + subscribe.process(element, null, request, null); - Assert.assertEquals(1, queue.size()); + Assert.assertEquals(1, queue.size()); - IQ response = (IQ) queue.poll(); + IQ response = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.error, response.getType()); + Assert.assertEquals(IQ.Type.error, response.getType()); - PacketError error = response.getError(); - Assert.assertNotNull(error); + PacketError error = response.getError(); + Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.auth, error.getType()); - Assert.assertEquals(PacketError.Condition.registration_required, - error.getCondition()); - } + Assert.assertEquals(PacketError.Type.auth, error.getType()); + Assert.assertEquals(PacketError.Condition.registration_required, + error.getCondition()); + } - @Test - public void testLocalUserGetsSubscriptionToLocalAccessModelNode() - throws Exception { - Map configuration = new HashMap(); - configuration.put(Conf.ACCESS_MODEL, AccessModel.local.toString()); - configuration.put(Conf.DEFAULT_AFFILIATION, - Affiliations.member.toString()); + @Test + public void testLocalUserGetsSubscriptionToLocalAccessModelNode() + throws Exception { + Map configuration = new HashMap(); + configuration.put(Conf.ACCESS_MODEL, AccessModel.local.toString()); + configuration.put(Conf.DEFAULT_AFFILIATION, + Affiliations.member.toString()); - Mockito.when(channelManager.getNodeConf(Mockito.anyString())) - .thenReturn(configuration); + Mockito.when(channelManager.getNodeConf(Mockito.anyString())) + .thenReturn(configuration); - subscribe.process(element, null, request, null); + subscribe.process(element, null, request, null); - IQ response = (IQ) queue.poll(); + IQ response = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.result, response.getType()); - Assert.assertNull(response.getError()); + Assert.assertEquals(IQ.Type.result, response.getType()); + Assert.assertNull(response.getError()); - Assert.assertEquals(Subscriptions.subscribed, Subscriptions - .valueOf(response.getChildElement().element("subscription") - .attributeValue("subscription"))); - } + Assert.assertEquals(Subscriptions.subscribed, Subscriptions + .valueOf(response.getChildElement().element("subscription") + .attributeValue("subscription"))); + } - @Test - public void testRemoteUserGetsPendingSubscriptionToLocalAccessModelNode() - throws Exception { + @Test + public void testRemoteUserGetsPendingSubscriptionToLocalAccessModelNode() + throws Exception { - Configuration.getInstance().remove( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); - Map configuration = new HashMap(); - configuration.put(Conf.ACCESS_MODEL, AccessModel.local.toString()); - configuration.put(Conf.DEFAULT_AFFILIATION, - Affiliations.member.toString()); + Map configuration = new HashMap(); + configuration.put(Conf.ACCESS_MODEL, AccessModel.local.toString()); + configuration.put(Conf.DEFAULT_AFFILIATION, + Affiliations.member.toString()); - Mockito.when(channelManager.getNodeConf(Mockito.anyString())) - .thenReturn(configuration); + Mockito.when(channelManager.getNodeConf(Mockito.anyString())) + .thenReturn(configuration); - request.setFrom("francisco@barracks.lit"); - request.getElement().element("pubsub").element( - "subscribe").addAttribute("jid", request.getFrom().toBareJID()); - subscribe.process(element, request.getFrom(), request, null); + request.setFrom("francisco@barracks.lit"); + request.getElement().element("pubsub").element( + "subscribe").addAttribute("jid", request.getFrom().toBareJID()); + subscribe.process(element, request.getFrom(), request, null); - IQ response = (IQ) queue.poll(); + IQ response = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.result, response.getType()); - Assert.assertNull(response.getError()); + Assert.assertEquals(IQ.Type.result, response.getType()); + Assert.assertNull(response.getError()); - Assert.assertEquals(Subscriptions.pending.toString(), - response.getChildElement().element("subscription") - .attributeValue("subscription")); + Assert.assertEquals(Subscriptions.pending.toString(), + response.getChildElement().element("subscription") + .attributeValue("subscription")); - } + } - @Test - public void testNoDefaultAffiliationConfigurationResultsInMemberAffiliation() - throws Exception { + @Test + public void testNoDefaultAffiliationConfigurationResultsInMemberAffiliation() + throws Exception { - Mockito.when(channelManager.getNodeConf(Mockito.anyString())) - .thenReturn(new HashMap()); + Mockito.when(channelManager.getNodeConf(Mockito.anyString())) + .thenReturn(new HashMap()); - subscribe.process(element, new JID("francisco@denmark.lit"), request, - null); + subscribe.process(element, new JID("francisco@denmark.lit"), request, + null); - Mockito.verify(channelManager).setUserAffiliation(Mockito.anyString(), - Mockito.any(JID.class), Mockito.eq(Affiliations.member)); + Mockito.verify(channelManager).setUserAffiliation(Mockito.anyString(), + Mockito.any(JID.class), Mockito.eq(Affiliations.member)); - IQ response = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.result, response.getType()); + IQ response = (IQ) queue.poll(); + Assert.assertEquals(IQ.Type.result, response.getType()); - } + } - @Test - public void testDefaultAffiliationConfigurationResultsInCorrectAffiliation() - throws Exception { + @Test + public void testDefaultAffiliationConfigurationResultsInCorrectAffiliation() + throws Exception { - Map configuration = new HashMap(); - configuration.put(Conf.ACCESS_MODEL, AccessModel.open.toString()); - configuration.put(Conf.DEFAULT_AFFILIATION, - Affiliations.publisher.toString()); - Mockito.when(channelManager.getNodeConf(Mockito.anyString())) - .thenReturn(configuration); - - subscribe.process(element, new JID("francisco@denmark.lit"), request, - null); - - Mockito.verify(channelManager).setUserAffiliation(Mockito.anyString(), - Mockito.any(JID.class), Mockito.eq(Affiliations.publisher)); - - IQ response = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.result, response.getType()); - - } - - @Test - public void ifAlreadySubscribedThenSubscriptionDetailsAreReturned() - throws Exception { - membership = new NodeMembershipImpl(node, jid, - Subscriptions.subscribed, Affiliations.owner, null); - - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.any(JID.class))).thenReturn(membership); - - subscribe.process(element, new JID("francisco@denmark.lit"), request, - null); - - IQ response = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.result, response.getType()); - Assert.assertEquals(Subscriptions.subscribed, Subscriptions - .valueOf(response.getChildElement().element("subscription") - .attributeValue("subscription"))); - } - - @Test - public void canSubscribeIfInvited() throws Exception { - Map configuration = new HashMap(); - configuration.put(Conf.ACCESS_MODEL, AccessModel.local.toString()); - configuration.put(Conf.DEFAULT_AFFILIATION, - Affiliations.member.toString()); - - Mockito.when(channelManager.getNodeConf(Mockito.anyString())) - .thenReturn(configuration); - - membership = new NodeMembershipImpl(node, jid, Subscriptions.invited, - Affiliations.none, null); - - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.any(JID.class))).thenReturn(membership); - - subscribe.process(element, new JID("francisco@denmark.lit"), request, - null); - IQ response = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.result, response.getType()); - Assert.assertEquals(Subscriptions.subscribed, Subscriptions - .valueOf(response.getChildElement().element("subscription") - .attributeValue("subscription"))); - } - - @Test - public void illegalNodeFormatReturnsAppropriateError() throws Exception { - - request.getElement().element("pubsub").element( - "subscribe").addAttribute("node", "illegalformat"); - subscribe.process(element, new JID("francisco@denmark.lit"), request, - null); - IQ response = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.error, response.getType()); - PacketError error = response.getError(); - Assert.assertEquals(PacketError.Type.modify, error.getType()); - Assert.assertEquals(PacketError.Condition.bad_request, - error.getCondition()); - Assert.assertEquals(SubscribeSet.INVALID_NODE_FORMAT, - error.getApplicationConditionName()); - Assert.assertEquals(Buddycloud.NS_ERROR, - error.getApplicationConditionNamespaceURI()); - - } + Map configuration = new HashMap(); + configuration.put(Conf.ACCESS_MODEL, AccessModel.open.toString()); + configuration.put(Conf.DEFAULT_AFFILIATION, + Affiliations.publisher.toString()); + Mockito.when(channelManager.getNodeConf(Mockito.anyString())) + .thenReturn(configuration); + + subscribe.process(element, new JID("francisco@denmark.lit"), request, + null); + + Mockito.verify(channelManager).setUserAffiliation(Mockito.anyString(), + Mockito.any(JID.class), Mockito.eq(Affiliations.publisher)); + + IQ response = (IQ) queue.poll(); + Assert.assertEquals(IQ.Type.result, response.getType()); + + } + + @Test + public void ifAlreadySubscribedThenSubscriptionDetailsAreReturned() + throws Exception { + membership = new NodeMembershipImpl(node, jid, + Subscriptions.subscribed, Affiliations.owner, null); + + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.any(JID.class))).thenReturn(membership); + + subscribe.process(element, new JID("francisco@denmark.lit"), request, + null); + + IQ response = (IQ) queue.poll(); + Assert.assertEquals(IQ.Type.result, response.getType()); + Assert.assertEquals(Subscriptions.subscribed, Subscriptions + .valueOf(response.getChildElement().element("subscription") + .attributeValue("subscription"))); + } + + @Test + public void canSubscribeIfInvited() throws Exception { + Map configuration = new HashMap(); + configuration.put(Conf.ACCESS_MODEL, AccessModel.local.toString()); + configuration.put(Conf.DEFAULT_AFFILIATION, + Affiliations.member.toString()); + + Mockito.when(channelManager.getNodeConf(Mockito.anyString())) + .thenReturn(configuration); + + membership = new NodeMembershipImpl(node, jid, Subscriptions.invited, + Affiliations.none, null); + + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.any(JID.class))).thenReturn(membership); + + subscribe.process(element, new JID("francisco@denmark.lit"), request, + null); + IQ response = (IQ) queue.poll(); + Assert.assertEquals(IQ.Type.result, response.getType()); + Assert.assertEquals(Subscriptions.subscribed, Subscriptions + .valueOf(response.getChildElement().element("subscription") + .attributeValue("subscription"))); + } + + @Test + public void illegalNodeFormatReturnsAppropriateError() throws Exception { + + request.getElement().element("pubsub").element( + "subscribe").addAttribute("node", "illegalformat"); + subscribe.process(element, new JID("francisco@denmark.lit"), request, + null); + IQ response = (IQ) queue.poll(); + Assert.assertEquals(IQ.Type.error, response.getType()); + PacketError error = response.getError(); + Assert.assertEquals(PacketError.Type.modify, error.getType()); + Assert.assertEquals(PacketError.Condition.bad_request, + error.getCondition()); + Assert.assertEquals(SubscribeSet.INVALID_NODE_FORMAT, + error.getApplicationConditionName()); + Assert.assertEquals(Buddycloud.NS_ERROR, + error.getApplicationConditionNamespaceURI()); + + } } diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscriptionEventTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscriptionEventTest.java index fdc979d6..87a93990 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscriptionEventTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/SubscriptionEventTest.java @@ -40,501 +40,501 @@ import org.xmpp.resultsetmanagement.ResultSetImpl; public class SubscriptionEventTest extends IQTestHandler { - private IQ request; - private SubscriptionEvent event; - private Element element; - private BlockingQueue queue = new LinkedBlockingQueue(); - - private String subscriber = "francisco@denmark.lit"; - private String node = "/user/pamela@denmark.lit/posts"; - private JID jid = new JID("juliet@shakespeare.lit"); - private ChannelManager dataStore; - - @Before - public void setUp() throws Exception { - - queue = new LinkedBlockingQueue(); - event = new SubscriptionEvent(queue, dataStore); - request = readStanzaAsIq("/iq/pubsub/subscribe/authorizationPendingGrantReply.stanza"); - event.setServerDomain("shakespeare.lit"); - - element = new BaseElement("subscriptions"); - element.addAttribute("node", node); - - dataStore = mock(ChannelManager.class); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); - when(dataStore.nodeExists(anyString())).thenReturn(true); - - NodeMembership membership = new NodeMembershipImpl(node, jid, - Subscriptions.subscribed, Affiliations.member, null); - when(dataStore.getNodeMembership(anyString(), any(JID.class))) - .thenReturn(membership); - - ArrayList subscribers = new ArrayList(); - subscribers.add(new NodeSubscriptionMock(new JID( - "romeo@shakespeare.lit"))); - subscribers.add(new NodeSubscriptionMock(new JID( - "hamlet@shakespeare.lit"))); - - doReturn(new ResultSetImpl(subscribers)).when( - dataStore).getNodeSubscriptionListeners(anyString()); - - event.setChannelManager(dataStore); - } - - @Test - public void testPassingSubscriptionsAsElementNameReturnsTrue() { - Element element = new BaseElement("subscriptions"); - Assert.assertTrue(event.accept(element)); - } - - @Test - public void testPassingNotSubscriptionsAsElementNameReturnsFalse() { - Element element = new BaseElement("not-subscriptions"); - Assert.assertFalse(event.accept(element)); - } - - @Test - public void testNotProvidingNodeAttributeReturnsErrorStanza() - throws Exception { - BaseElement element = new BaseElement("subscriptions"); - event.process(element, 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 testNotProvidingSubscriptionChildNodeReturnsErrorStanza() - throws Exception { - - IQ request = toIq(readStanzaAsString( - "/iq/pubsub/subscribe/authorizationPendingGrantReply.stanza") - .replaceFirst( - "", - "")); - - event.process(element, 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 testNotProvidingJidAttributeReturnsErrorStanza() - throws Exception { - IQ request = toIq(readStanzaAsString( - "/iq/pubsub/subscribe/authorizationPendingGrantReply.stanza") - .replaceFirst("jid='francisco@denmark.lit'", "")); - event.process(element, 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 testNotProvidingSubscriptionAttributeReturnsErrorStanza() - throws Exception { - IQ request = toIq(readStanzaAsString( - "/iq/pubsub/subscribe/authorizationPendingGrantReply.stanza") - .replaceFirst("subscription='subscribed'", "")); - event.process(element, 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()); - } - - @SuppressWarnings("unchecked") - @Test - public void testNodeStoreExceptionResultsInInternalServerErrorStanza() - throws Exception { - when(dataStore.nodeExists(anyString())).thenThrow( - NodeStoreException.class); - - event.process(element, jid, request, null); - Packet response = queue.poll(); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.wait, error.getType()); - Assert.assertEquals(PacketError.Condition.internal_server_error, - error.getCondition()); - } - - @Test - public void testNonExistantNodeRetunsErrorStanza() throws Exception { - - when(dataStore.nodeExists(node)).thenReturn(false); - - event.process(element, 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 userWithoutSubscriptionReturnsErrorStanza() throws Exception { - - when(dataStore.getNodeMembership(anyString(), any(JID.class))) - .thenReturn( - new NodeMembershipImpl(node, jid, Subscriptions.none, - Affiliations.none, null)); - - event.process(element, 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 userWhoIsntOwnerOrModeratorCantUpdateSubscription() - throws Exception { - when(dataStore.getNodeMembership(anyString(), any(JID.class))) - .thenReturn( - new NodeMembershipImpl(node, jid, - Subscriptions.subscribed, Affiliations.member, - null)); - - event.process(element, 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 subscribingUserMustHaveExistingSubscriptionToUpdate() - throws Exception { - - NodeMembership membership = new NodeMembershipImpl(node, new JID( - subscriber), Subscriptions.none, Affiliations.owner, null); - when(dataStore.getNodeMembership(anyString(), any(JID.class))) - .thenReturn(membership); - - NodeMembership inviteeMemebership = new NodeMembershipImpl(node, - new JID(subscriber), Subscriptions.none, Affiliations.owner, - null); - when(dataStore.getNodeMembership(anyString(), eq(jid))).thenReturn( - inviteeMemebership); - - event.process(element, 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.unexpected_request, - error.getCondition()); - } - - @Test - public void passingInvalidSubscriptionTypeSetsSubscriptionToNone() - throws Exception { - - IQ request = toIq(readStanzaAsString( - "/iq/pubsub/subscribe/authorizationPendingGrantReply.stanza") - .replaceFirst("subscription='subscribed'", - "subscription='i-can-haz-all-the-items'")); - - ArgumentCaptor argument = ArgumentCaptor - .forClass(NodeSubscription.class); - - when(dataStore.getNodeMembership(anyString(), any(JID.class))) - .thenReturn( - new NodeMembershipImpl(node, jid, - Subscriptions.subscribed, Affiliations.owner, - null)); - - ArrayList subscribers = new ArrayList(); - - doReturn(new ResultSetImpl(subscribers)).when( - dataStore).getNodeSubscriptionListeners(anyString()); - - event.process(element, jid, request, null); - - verify(dataStore, times(1)).addUserSubscription(argument.capture()); - NodeSubscription subscription = argument.getValue(); - Assert.assertEquals(Subscriptions.none, subscription.getSubscription()); - } - - @Test - public void passingValidSubscriptionSendsOutExpectedNotifications() - throws Exception { - - IQ request = toIq(readStanzaAsString( - "/iq/pubsub/subscribe/authorizationPendingGrantReply.stanza") - .replaceFirst("subscription='subscribed'", - "subscription='subscribed'")); - - NodeMembership membership = new NodeMembershipImpl(node, new JID( - subscriber), Subscriptions.subscribed, Affiliations.moderator, - null); - when(dataStore.getNodeMembership(eq(node), any(JID.class))).thenReturn( - membership); - - event.process(element, jid, request, null); - - Assert.assertEquals(5, queue.size()); - Packet notification = queue.poll(); - - Assert.assertEquals(request.getFrom().toString(), notification.getTo() - .toString()); - notification = queue.poll(); - Assert.assertEquals("romeo@shakespeare.lit", notification.getTo() - .toString()); - notification = queue.poll(); - Assert.assertEquals("hamlet@shakespeare.lit", notification.getTo() - .toString()); - notification = queue.poll(); - Assert.assertEquals("user1@server1", notification.getTo().toString()); - notification = queue.poll(); - Assert.assertEquals("user2@server1", notification.getTo().toString()); - - Assert.assertEquals(node, notification.getElement().element("event") - .element("subscription").attributeValue("node")); - Assert.assertTrue(notification.toXML().contains( - JabberPubsub.NS_PUBSUB_EVENT)); - Assert.assertEquals( - "subscribed", - notification.getElement().element("event") - .element("subscription").attributeValue("subscription")); - Assert.assertEquals( - subscriber, - notification.getElement().element("event") - .element("subscription").attributeValue("jid")); - } + private IQ request; + private SubscriptionEvent event; + private Element element; + private BlockingQueue queue = new LinkedBlockingQueue(); + + private String subscriber = "francisco@denmark.lit"; + private String node = "/user/pamela@denmark.lit/posts"; + private JID jid = new JID("juliet@shakespeare.lit"); + private ChannelManager dataStore; + + @Before + public void setUp() throws Exception { + + queue = new LinkedBlockingQueue(); + event = new SubscriptionEvent(queue, dataStore); + request = readStanzaAsIq("/iq/pubsub/subscribe/authorizationPendingGrantReply.stanza"); + event.setServerDomain("shakespeare.lit"); + + element = new BaseElement("subscriptions"); + element.addAttribute("node", node); + + dataStore = mock(ChannelManager.class); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); + when(dataStore.nodeExists(anyString())).thenReturn(true); + + NodeMembership membership = new NodeMembershipImpl(node, jid, + Subscriptions.subscribed, Affiliations.member, null); + when(dataStore.getNodeMembership(anyString(), any(JID.class))) + .thenReturn(membership); + + ArrayList subscribers = new ArrayList(); + subscribers.add(new NodeSubscriptionMock(new JID( + "romeo@shakespeare.lit"))); + subscribers.add(new NodeSubscriptionMock(new JID( + "hamlet@shakespeare.lit"))); + + doReturn(new ResultSetImpl(subscribers)).when( + dataStore).getNodeSubscriptionListeners(anyString()); + + event.setChannelManager(dataStore); + } + + @Test + public void testPassingSubscriptionsAsElementNameReturnsTrue() { + Element element = new BaseElement("subscriptions"); + Assert.assertTrue(event.accept(element)); + } + + @Test + public void testPassingNotSubscriptionsAsElementNameReturnsFalse() { + Element element = new BaseElement("not-subscriptions"); + Assert.assertFalse(event.accept(element)); + } + + @Test + public void testNotProvidingNodeAttributeReturnsErrorStanza() + throws Exception { + BaseElement element = new BaseElement("subscriptions"); + event.process(element, 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 testNotProvidingSubscriptionChildNodeReturnsErrorStanza() + throws Exception { + + IQ request = toIq(readStanzaAsString( + "/iq/pubsub/subscribe/authorizationPendingGrantReply.stanza") + .replaceFirst( + "", + "")); + + event.process(element, 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 testNotProvidingJidAttributeReturnsErrorStanza() + throws Exception { + IQ request = toIq(readStanzaAsString( + "/iq/pubsub/subscribe/authorizationPendingGrantReply.stanza") + .replaceFirst("jid='francisco@denmark.lit'", "")); + event.process(element, 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 testNotProvidingSubscriptionAttributeReturnsErrorStanza() + throws Exception { + IQ request = toIq(readStanzaAsString( + "/iq/pubsub/subscribe/authorizationPendingGrantReply.stanza") + .replaceFirst("subscription='subscribed'", "")); + event.process(element, 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()); + } + + @SuppressWarnings("unchecked") + @Test + public void testNodeStoreExceptionResultsInInternalServerErrorStanza() + throws Exception { + when(dataStore.nodeExists(anyString())).thenThrow( + NodeStoreException.class); + + event.process(element, jid, request, null); + Packet response = queue.poll(); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.wait, error.getType()); + Assert.assertEquals(PacketError.Condition.internal_server_error, + error.getCondition()); + } + + @Test + public void testNonExistantNodeRetunsErrorStanza() throws Exception { + + when(dataStore.nodeExists(node)).thenReturn(false); + + event.process(element, 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 userWithoutSubscriptionReturnsErrorStanza() throws Exception { + + when(dataStore.getNodeMembership(anyString(), any(JID.class))) + .thenReturn( + new NodeMembershipImpl(node, jid, Subscriptions.none, + Affiliations.none, null)); + + event.process(element, 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 userWhoIsntOwnerOrModeratorCantUpdateSubscription() + throws Exception { + when(dataStore.getNodeMembership(anyString(), any(JID.class))) + .thenReturn( + new NodeMembershipImpl(node, jid, + Subscriptions.subscribed, Affiliations.member, + null)); + + event.process(element, 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 subscribingUserMustHaveExistingSubscriptionToUpdate() + throws Exception { + + NodeMembership membership = new NodeMembershipImpl(node, new JID( + subscriber), Subscriptions.none, Affiliations.owner, null); + when(dataStore.getNodeMembership(anyString(), any(JID.class))) + .thenReturn(membership); + + NodeMembership inviteeMemebership = new NodeMembershipImpl(node, + new JID(subscriber), Subscriptions.none, Affiliations.owner, + null); + when(dataStore.getNodeMembership(anyString(), eq(jid))).thenReturn( + inviteeMemebership); + + event.process(element, 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.unexpected_request, + error.getCondition()); + } + + @Test + public void passingInvalidSubscriptionTypeSetsSubscriptionToNone() + throws Exception { + + IQ request = toIq(readStanzaAsString( + "/iq/pubsub/subscribe/authorizationPendingGrantReply.stanza") + .replaceFirst("subscription='subscribed'", + "subscription='i-can-haz-all-the-items'")); + + ArgumentCaptor argument = ArgumentCaptor + .forClass(NodeSubscription.class); + + when(dataStore.getNodeMembership(anyString(), any(JID.class))) + .thenReturn( + new NodeMembershipImpl(node, jid, + Subscriptions.subscribed, Affiliations.owner, + null)); + + ArrayList subscribers = new ArrayList(); + + doReturn(new ResultSetImpl(subscribers)).when( + dataStore).getNodeSubscriptionListeners(anyString()); + + event.process(element, jid, request, null); + + verify(dataStore, times(1)).addUserSubscription(argument.capture()); + NodeSubscription subscription = argument.getValue(); + Assert.assertEquals(Subscriptions.none, subscription.getSubscription()); + } + + @Test + public void passingValidSubscriptionSendsOutExpectedNotifications() + throws Exception { + + IQ request = toIq(readStanzaAsString( + "/iq/pubsub/subscribe/authorizationPendingGrantReply.stanza") + .replaceFirst("subscription='subscribed'", + "subscription='subscribed'")); + + NodeMembership membership = new NodeMembershipImpl(node, new JID( + subscriber), Subscriptions.subscribed, Affiliations.moderator, + null); + when(dataStore.getNodeMembership(eq(node), any(JID.class))).thenReturn( + membership); + + event.process(element, jid, request, null); + + Assert.assertEquals(5, queue.size()); + Packet notification = queue.poll(); + + Assert.assertEquals(request.getFrom().toString(), notification.getTo() + .toString()); + notification = queue.poll(); + Assert.assertEquals("romeo@shakespeare.lit", notification.getTo() + .toString()); + notification = queue.poll(); + Assert.assertEquals("hamlet@shakespeare.lit", notification.getTo() + .toString()); + notification = queue.poll(); + Assert.assertEquals("user1@server1", notification.getTo().toString()); + notification = queue.poll(); + Assert.assertEquals("user2@server1", notification.getTo().toString()); + + Assert.assertEquals(node, notification.getElement().element("event") + .element("subscription").attributeValue("node")); + Assert.assertTrue(notification.toXML().contains( + JabberPubsub.NS_PUBSUB_EVENT)); + Assert.assertEquals( + "subscribed", + notification.getElement().element("event") + .element("subscription").attributeValue("subscription")); + Assert.assertEquals( + subscriber, + notification.getElement().element("event") + .element("subscription").attributeValue("jid")); + } - @Test - public void userCanInviteAnotherUserToNode() throws Exception { + @Test + public void userCanInviteAnotherUserToNode() throws Exception { - JID invitee = new JID("francisco@denmark.lit"); - NodeMembership membership = new NodeMembershipImpl(node, invitee, - Subscriptions.none, Affiliations.none, null); - when(dataStore.getNodeMembership(eq(node), eq(invitee))).thenReturn( - membership); + JID invitee = new JID("francisco@denmark.lit"); + NodeMembership membership = new NodeMembershipImpl(node, invitee, + Subscriptions.none, Affiliations.none, null); + when(dataStore.getNodeMembership(eq(node), eq(invitee))).thenReturn( + membership); - IQ request = readStanzaAsIq("/iq/pubsub/subscribe/invite.stanza"); + IQ request = readStanzaAsIq("/iq/pubsub/subscribe/invite.stanza"); - event.process(element, jid, request, null); + event.process(element, jid, request, null); - IQ result = (IQ) queue.poll(); + IQ result = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.result, result.getType()); + Assert.assertEquals(IQ.Type.result, result.getType()); - Assert.assertEquals(5, queue.size()); + Assert.assertEquals(5, queue.size()); - Message notification = (Message) queue.poll(); + Message notification = (Message) queue.poll(); - Element subscription = notification.getElement().element("event") - .element("subscription"); - Assert.assertEquals(Subscriptions.invited, Subscriptions - .valueOf(subscription.attributeValue("subscription"))); - Assert.assertEquals(invitee, - new JID(subscription.attributeValue("jid"))); - } + Element subscription = notification.getElement().element("event") + .element("subscription"); + Assert.assertEquals(Subscriptions.invited, Subscriptions + .valueOf(subscription.attributeValue("subscription"))); + Assert.assertEquals(invitee, + new JID(subscription.attributeValue("jid"))); + } - @Test - public void userCanNotInviteAnotherUserIfTheyDontHaveValidSubscription() - throws Exception { + @Test + public void userCanNotInviteAnotherUserIfTheyDontHaveValidSubscription() + throws Exception { - NodeMembership membership = new NodeMembershipImpl(node, jid, - Subscriptions.pending, Affiliations.member, null); - when(dataStore.getNodeMembership(anyString(), any(JID.class))) - .thenReturn(membership); + NodeMembership membership = new NodeMembershipImpl(node, jid, + Subscriptions.pending, Affiliations.member, null); + when(dataStore.getNodeMembership(anyString(), any(JID.class))) + .thenReturn(membership); - IQ request = readStanzaAsIq("/iq/pubsub/subscribe/invite.stanza"); + IQ request = readStanzaAsIq("/iq/pubsub/subscribe/invite.stanza"); - event.process(element, jid, request, null); + event.process(element, jid, request, null); - IQ result = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.error, result.getType()); - Assert.assertEquals(PacketError.Type.auth, result.getError().getType()); - Assert.assertEquals(PacketError.Condition.forbidden, result.getError() - .getCondition()); - } + IQ result = (IQ) queue.poll(); + Assert.assertEquals(IQ.Type.error, result.getType()); + Assert.assertEquals(PacketError.Type.auth, result.getError().getType()); + Assert.assertEquals(PacketError.Condition.forbidden, result.getError() + .getCondition()); + } - @Test - public void invitedByIsSetAsActorJid() throws Exception { + @Test + public void invitedByIsSetAsActorJid() throws Exception { - JID invitee = new JID("francisco@denmark.lit"); - NodeMembership membership = new NodeMembershipImpl(node, invitee, - Subscriptions.none, Affiliations.none, null); - when(dataStore.getNodeMembership(eq(node), eq(invitee))).thenReturn( - membership); + JID invitee = new JID("francisco@denmark.lit"); + NodeMembership membership = new NodeMembershipImpl(node, invitee, + Subscriptions.none, Affiliations.none, null); + when(dataStore.getNodeMembership(eq(node), eq(invitee))).thenReturn( + membership); - IQ request = readStanzaAsIq("/iq/pubsub/subscribe/invite.stanza"); + IQ request = readStanzaAsIq("/iq/pubsub/subscribe/invite.stanza"); - event.process(element, jid, request, null); + event.process(element, jid, request, null); - ArgumentCaptor subscription = ArgumentCaptor - .forClass(NodeSubscription.class); + ArgumentCaptor subscription = ArgumentCaptor + .forClass(NodeSubscription.class); - verify(dataStore, times(1)).addUserSubscription(subscription.capture()); + verify(dataStore, times(1)).addUserSubscription(subscription.capture()); - Assert.assertEquals(request.getFrom().toBareJID(), subscription - .getValue().getInvitedBy().toString()); - Assert.assertEquals(Subscriptions.invited, subscription.getValue() - .getSubscription()); - Assert.assertEquals(node, subscription.getValue().getNodeId()); + Assert.assertEquals(request.getFrom().toBareJID(), subscription + .getValue().getInvitedBy().toString()); + Assert.assertEquals(Subscriptions.invited, subscription.getValue() + .getSubscription()); + Assert.assertEquals(node, subscription.getValue().getNodeId()); - } + } - @Test - public void standardSubscribeDoesNotSetInvitedBy() throws Exception { + @Test + public void standardSubscribeDoesNotSetInvitedBy() throws Exception { - NodeMembership membership = new NodeMembershipImpl(node, new JID( - subscriber), Subscriptions.subscribed, Affiliations.moderator, - null); + NodeMembership membership = new NodeMembershipImpl(node, new JID( + subscriber), Subscriptions.subscribed, Affiliations.moderator, + null); - when(dataStore.getNodeMembership(eq(node), any(JID.class))).thenReturn( - membership); + when(dataStore.getNodeMembership(eq(node), any(JID.class))).thenReturn( + membership); - event.process(element, jid, request, null); + event.process(element, jid, request, null); - IQ result = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.result, result.getType()); + IQ result = (IQ) queue.poll(); + Assert.assertEquals(IQ.Type.result, result.getType()); - ArgumentCaptor subscription = ArgumentCaptor - .forClass(NodeSubscription.class); + ArgumentCaptor subscription = ArgumentCaptor + .forClass(NodeSubscription.class); - verify(dataStore, times(1)).addUserSubscription(subscription.capture()); + verify(dataStore, times(1)).addUserSubscription(subscription.capture()); - Assert.assertNull(subscription.getValue().getInvitedBy()); - Assert.assertEquals(Subscriptions.subscribed, subscription.getValue() - .getSubscription()); - Assert.assertEquals(node, subscription.getValue().getNodeId()); + Assert.assertNull(subscription.getValue().getInvitedBy()); + Assert.assertEquals(Subscriptions.subscribed, subscription.getValue() + .getSubscription()); + Assert.assertEquals(node, subscription.getValue().getNodeId()); - } + } - @Test - public void sendsNotificationToInvitedUserIfTheyAreLocal() throws Exception { + @Test + public void sendsNotificationToInvitedUserIfTheyAreLocal() throws Exception { - JID invitee = new JID("francisco@denmark.lit"); + JID invitee = new JID("francisco@denmark.lit"); - NodeMembership membership = new NodeMembershipImpl(node, invitee, - Subscriptions.none, Affiliations.none, null); - when(dataStore.getNodeMembership(eq(node), eq(invitee))).thenReturn( - membership); + NodeMembership membership = new NodeMembershipImpl(node, invitee, + Subscriptions.none, Affiliations.none, null); + when(dataStore.getNodeMembership(eq(node), eq(invitee))).thenReturn( + membership); - IQ request = readStanzaAsIq("/iq/pubsub/subscribe/invite.stanza"); + IQ request = readStanzaAsIq("/iq/pubsub/subscribe/invite.stanza"); - event.process(element, jid, request, null); + event.process(element, jid, request, null); - IQ result = (IQ) queue.poll(); + IQ result = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.result, result.getType()); + Assert.assertEquals(IQ.Type.result, result.getType()); - Assert.assertEquals(5, queue.size()); + Assert.assertEquals(5, queue.size()); - Message notification = (Message) queue.poll(); + Message notification = (Message) queue.poll(); - Element subscription = notification.getElement().element("event") - .element("subscription"); - Assert.assertEquals(Subscriptions.invited, Subscriptions - .valueOf(subscription.attributeValue("subscription"))); - Assert.assertEquals(invitee, - new JID(subscription.attributeValue("jid"))); + Element subscription = notification.getElement().element("event") + .element("subscription"); + Assert.assertEquals(Subscriptions.invited, Subscriptions + .valueOf(subscription.attributeValue("subscription"))); + Assert.assertEquals(invitee, + new JID(subscription.attributeValue("jid"))); - queue.poll(); - queue.poll(); - queue.poll(); - Assert.assertEquals(invitee, queue.poll().getTo()); - } + queue.poll(); + queue.poll(); + queue.poll(); + Assert.assertEquals(invitee, queue.poll().getTo()); + } - @Test - public void sendsNotificationToInvitedUsersServerIfTheyAreNotLocal() - throws Exception { + @Test + public void sendsNotificationToInvitedUsersServerIfTheyAreNotLocal() + throws Exception { - JID invitee = new JID("francisco@denmark.lit"); + JID invitee = new JID("francisco@denmark.lit"); - Configuration.getInstance().remove( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); - - NodeMembership membership = new NodeMembershipImpl(node, invitee, - Subscriptions.none, Affiliations.none, null); - when(dataStore.getNodeMembership(eq(node), eq(invitee))).thenReturn( - membership); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); + + NodeMembership membership = new NodeMembershipImpl(node, invitee, + Subscriptions.none, Affiliations.none, null); + when(dataStore.getNodeMembership(eq(node), eq(invitee))).thenReturn( + membership); - IQ request = readStanzaAsIq("/iq/pubsub/subscribe/invite.stanza"); - element.addAttribute("node", "/user/pamela@shakespeare.lit/posts"); - event.process(element, jid, request, null); + IQ request = readStanzaAsIq("/iq/pubsub/subscribe/invite.stanza"); + element.addAttribute("node", "/user/pamela@shakespeare.lit/posts"); + event.process(element, jid, request, null); - IQ result = (IQ) queue.poll(); + IQ result = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.result, result.getType()); + Assert.assertEquals(IQ.Type.result, result.getType()); - Assert.assertEquals(5, queue.size()); + Assert.assertEquals(5, queue.size()); - Message notification = (Message) queue.poll(); + Message notification = (Message) queue.poll(); - Element subscription = notification.getElement().element("event") - .element("subscription"); - Assert.assertEquals(Subscriptions.invited, Subscriptions - .valueOf(subscription.attributeValue("subscription"))); - Assert.assertEquals(invitee, - new JID(subscription.attributeValue("jid"))); - Assert.assertEquals(jid, - new JID(subscription.attributeValue("invited-by"))); + Element subscription = notification.getElement().element("event") + .element("subscription"); + Assert.assertEquals(Subscriptions.invited, Subscriptions + .valueOf(subscription.attributeValue("subscription"))); + Assert.assertEquals(invitee, + new JID(subscription.attributeValue("jid"))); + Assert.assertEquals(jid, + new JID(subscription.attributeValue("invited-by"))); - queue.poll(); - queue.poll(); - queue.poll(); - Assert.assertEquals(invitee.getDomain(), queue.poll().getTo() - .toString()); - } + queue.poll(); + queue.poll(); + queue.poll(); + Assert.assertEquals(invitee.getDomain(), queue.poll().getTo() + .toString()); + } - @Test - public void userCanNotModifyOwnSubscription() throws Exception { + @Test + public void userCanNotModifyOwnSubscription() throws Exception { - IQ request = this.request.createCopy(); + IQ request = this.request.createCopy(); - NodeMembership membership = new NodeMembershipImpl(node, new JID( - subscriber), Subscriptions.subscribed, Affiliations.moderator, - null); - when(dataStore.getNodeMembership(eq(node), any(JID.class))).thenReturn( - membership); + NodeMembership membership = new NodeMembershipImpl(node, new JID( + subscriber), Subscriptions.subscribed, Affiliations.moderator, + null); + when(dataStore.getNodeMembership(eq(node), any(JID.class))).thenReturn( + membership); - event.process(element, new JID("francisco@denmark.lit"), request, null); + event.process(element, new JID("francisco@denmark.lit"), request, null); - IQ result = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.error, result.getType()); - PacketError error = result.getError(); - Assert.assertEquals(PacketError.Type.cancel, error.getType()); - Assert.assertEquals(PacketError.Condition.not_allowed, - error.getCondition()); - Assert.assertEquals(SubscriptionEvent.CAN_NOT_MODIFY_OWN_SUBSCRIPTION, - error.getApplicationConditionName()); - Assert.assertEquals(Buddycloud.NS_ERROR, - error.getApplicationConditionNamespaceURI()); - } -} \ No newline at end of file + IQ result = (IQ) queue.poll(); + Assert.assertEquals(IQ.Type.error, result.getType()); + PacketError error = result.getError(); + Assert.assertEquals(PacketError.Type.cancel, error.getType()); + Assert.assertEquals(PacketError.Condition.not_allowed, + error.getCondition()); + Assert.assertEquals(SubscriptionEvent.CAN_NOT_MODIFY_OWN_SUBSCRIPTION, + error.getApplicationConditionName()); + Assert.assertEquals(Buddycloud.NS_ERROR, + error.getApplicationConditionNamespaceURI()); + } +} diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/UnsubscribeSetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/UnsubscribeSetTest.java index 2b36614b..43c33725 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/UnsubscribeSetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/set/UnsubscribeSetTest.java @@ -32,311 +32,311 @@ import org.xmpp.resultsetmanagement.ResultSetImpl; public class UnsubscribeSetTest extends IQTestHandler { - private IQ request; - private UnsubscribeSet unsubscribe; - private Element element; - private BlockingQueue queue = new LinkedBlockingQueue(); - - private String node = "/user/pamela@denmark.lit/posts"; - private JID jid = new JID("juliet@shakespeare.lit"); - private ChannelManager channelManager; - - private NodeMembership membership; - - @Before - public void setUp() throws Exception { - - channelManager = Mockito.mock(ChannelManager.class); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); - Mockito.when(channelManager.nodeExists(Mockito.anyString())) - .thenReturn(true); - - queue = new LinkedBlockingQueue(); - unsubscribe = new UnsubscribeSet(queue, channelManager); - request = readStanzaAsIq("/iq/pubsub/unsubscribe/request.stanza"); - unsubscribe.setServerDomain("shakespeare.lit"); - - element = new BaseElement("unsubscribe"); - element.addAttribute("node", node); - - unsubscribe.setChannelManager(channelManager); - - membership = new NodeMembershipImpl(node, jid, Subscriptions.subscribed, - Affiliations.publisher, null); - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.any(JID.class))).thenReturn(membership); - - ResultSet listeners = new ResultSetImpl( - new ArrayList()); - Mockito.when(channelManager.getNodeSubscriptionListeners(node)) - .thenReturn(listeners); - - Mockito.when(channelManager.getNodeOwners(Mockito.anyString())) - .thenReturn(new ArrayList()); - } - - @Test - public void missingNodeAttributeReturnsError() throws Exception { - IQ badRequest = request.createCopy(); - badRequest.getChildElement().element("unsubscribe").attribute("node") - .detach(); - unsubscribe.process(element, jid, badRequest, null); - - Assert.assertEquals(1, queue.size()); - - IQ response = (IQ) queue.poll(); - - Assert.assertEquals(IQ.Type.error, response.getType()); - Assert.assertEquals(badRequest.getFrom(), response.getTo()); - PacketError error = response.getError(); - Assert.assertEquals(PacketError.Condition.bad_request, - error.getCondition()); - Assert.assertEquals(PacketError.Type.modify, error.getType()); - Assert.assertEquals(UnsubscribeSet.NODE_ID_REQUIRED, - error.getApplicationConditionName()); - } - - @Test - public void emptyNodeAttributeReturnsError() throws Exception { - IQ badRequest = request.createCopy(); - badRequest.getChildElement().element("unsubscribe").attribute("node") - .detach(); - badRequest.getChildElement().element("unsubscribe") - .addAttribute("node", ""); - - unsubscribe.process(element, jid, badRequest, null); - - Assert.assertEquals(1, queue.size()); - - IQ response = (IQ) queue.poll(); - - Assert.assertEquals(IQ.Type.error, response.getType()); - Assert.assertEquals(badRequest.getFrom(), response.getTo()); - PacketError error = response.getError(); - Assert.assertEquals(PacketError.Condition.bad_request, - error.getCondition()); - Assert.assertEquals(PacketError.Type.modify, error.getType()); - Assert.assertEquals(UnsubscribeSet.NODE_ID_REQUIRED, - error.getApplicationConditionName()); - } - - @Test - public void makesRemoteRequest() throws Exception { - Configuration.getInstance().remove( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); - - unsubscribe.process(element, jid, request, null); - - Assert.assertEquals(1, queue.size()); - - String domain = new JID(request.getChildElement() - .element("unsubscribe").attributeValue("node").split("/")[2]) - .getDomain(); - - IQ response = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.set, response.getType()); - Assert.assertEquals(domain, response.getTo().toString()); - Element actor = response.getChildElement().element("actor"); - Assert.assertNotNull(actor); - Assert.assertEquals(Buddycloud.NS, actor.getNamespaceURI()); - Assert.assertEquals(request.getFrom().toBareJID(), actor.getText()); - } - - @Test - public void canNotUnsubscribeAnotherUser() throws Exception { - - IQ badRequest = request.createCopy(); - badRequest.getChildElement().element("unsubscribe").attribute("jid") - .detach(); - badRequest.getChildElement().element("unsubscribe") - .addAttribute("jid", "romeo@montague.lit"); - - unsubscribe.process(element, jid, badRequest, null); - - Assert.assertEquals(1, queue.size()); + private IQ request; + private UnsubscribeSet unsubscribe; + private Element element; + private BlockingQueue queue = new LinkedBlockingQueue(); + + private String node = "/user/pamela@denmark.lit/posts"; + private JID jid = new JID("juliet@shakespeare.lit"); + private ChannelManager channelManager; + + private NodeMembership membership; + + @Before + public void setUp() throws Exception { + + channelManager = Mockito.mock(ChannelManager.class); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); + Mockito.when(channelManager.nodeExists(Mockito.anyString())) + .thenReturn(true); + + queue = new LinkedBlockingQueue(); + unsubscribe = new UnsubscribeSet(queue, channelManager); + request = readStanzaAsIq("/iq/pubsub/unsubscribe/request.stanza"); + unsubscribe.setServerDomain("shakespeare.lit"); + + element = new BaseElement("unsubscribe"); + element.addAttribute("node", node); + + unsubscribe.setChannelManager(channelManager); + + membership = new NodeMembershipImpl(node, jid, Subscriptions.subscribed, + Affiliations.publisher, null); + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.any(JID.class))).thenReturn(membership); + + ResultSet listeners = new ResultSetImpl( + new ArrayList()); + Mockito.when(channelManager.getNodeSubscriptionListeners(node)) + .thenReturn(listeners); + + Mockito.when(channelManager.getNodeOwners(Mockito.anyString())) + .thenReturn(new ArrayList()); + } + + @Test + public void missingNodeAttributeReturnsError() throws Exception { + IQ badRequest = request.createCopy(); + badRequest.getChildElement().element("unsubscribe").attribute("node") + .detach(); + unsubscribe.process(element, jid, badRequest, null); + + Assert.assertEquals(1, queue.size()); + + IQ response = (IQ) queue.poll(); + + Assert.assertEquals(IQ.Type.error, response.getType()); + Assert.assertEquals(badRequest.getFrom(), response.getTo()); + PacketError error = response.getError(); + Assert.assertEquals(PacketError.Condition.bad_request, + error.getCondition()); + Assert.assertEquals(PacketError.Type.modify, error.getType()); + Assert.assertEquals(UnsubscribeSet.NODE_ID_REQUIRED, + error.getApplicationConditionName()); + } + + @Test + public void emptyNodeAttributeReturnsError() throws Exception { + IQ badRequest = request.createCopy(); + badRequest.getChildElement().element("unsubscribe").attribute("node") + .detach(); + badRequest.getChildElement().element("unsubscribe") + .addAttribute("node", ""); + + unsubscribe.process(element, jid, badRequest, null); + + Assert.assertEquals(1, queue.size()); + + IQ response = (IQ) queue.poll(); + + Assert.assertEquals(IQ.Type.error, response.getType()); + Assert.assertEquals(badRequest.getFrom(), response.getTo()); + PacketError error = response.getError(); + Assert.assertEquals(PacketError.Condition.bad_request, + error.getCondition()); + Assert.assertEquals(PacketError.Type.modify, error.getType()); + Assert.assertEquals(UnsubscribeSet.NODE_ID_REQUIRED, + error.getApplicationConditionName()); + } + + @Test + public void makesRemoteRequest() throws Exception { + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + + unsubscribe.process(element, jid, request, null); + + Assert.assertEquals(1, queue.size()); + + String domain = new JID(request.getChildElement() + .element("unsubscribe").attributeValue("node").split("/")[2]) + .getDomain(); + + IQ response = (IQ) queue.poll(); + Assert.assertEquals(IQ.Type.set, response.getType()); + Assert.assertEquals(domain, response.getTo().toString()); + Element actor = response.getChildElement().element("actor"); + Assert.assertNotNull(actor); + Assert.assertEquals(Buddycloud.NS, actor.getNamespaceURI()); + Assert.assertEquals(request.getFrom().toBareJID(), actor.getText()); + } + + @Test + public void canNotUnsubscribeAnotherUser() throws Exception { + + IQ badRequest = request.createCopy(); + badRequest.getChildElement().element("unsubscribe").attribute("jid") + .detach(); + badRequest.getChildElement().element("unsubscribe") + .addAttribute("jid", "romeo@montague.lit"); + + unsubscribe.process(element, jid, badRequest, null); + + Assert.assertEquals(1, queue.size()); - IQ response = (IQ) queue.poll(); + IQ response = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.error, response.getType()); - Assert.assertEquals(badRequest.getFrom(), response.getTo()); - PacketError error = response.getError(); - Assert.assertEquals(PacketError.Condition.not_authorized, - error.getCondition()); - Assert.assertEquals(PacketError.Type.auth, error.getType()); - - } - - @Test - public void notExistingNodeRetunsError() throws Exception { - Mockito.when(channelManager.nodeExists(Mockito.anyString())) - .thenReturn(false); + Assert.assertEquals(IQ.Type.error, response.getType()); + Assert.assertEquals(badRequest.getFrom(), response.getTo()); + PacketError error = response.getError(); + Assert.assertEquals(PacketError.Condition.not_authorized, + error.getCondition()); + Assert.assertEquals(PacketError.Type.auth, error.getType()); + + } + + @Test + public void notExistingNodeRetunsError() throws Exception { + Mockito.when(channelManager.nodeExists(Mockito.anyString())) + .thenReturn(false); - unsubscribe.process(element, jid, request, null); - - Assert.assertEquals(1, queue.size()); + unsubscribe.process(element, jid, request, null); + + Assert.assertEquals(1, queue.size()); - IQ response = (IQ) queue.poll(); + IQ response = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.error, response.getType()); - Assert.assertEquals(request.getFrom(), response.getTo()); - PacketError error = response.getError(); - Assert.assertEquals(PacketError.Condition.item_not_found, - error.getCondition()); - Assert.assertEquals(PacketError.Type.cancel, error.getType()); - } - - @Test - public void nonMatchingSubscriptionToSenderReturnsError() throws Exception { - - membership = new NodeMembershipImpl(node, new JID("juliet@capulet.lit"), Subscriptions.subscribed, - Affiliations.owner, null); - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.any(JID.class))).thenReturn(membership); - - unsubscribe.process(element, jid, request, null); + Assert.assertEquals(IQ.Type.error, response.getType()); + Assert.assertEquals(request.getFrom(), response.getTo()); + PacketError error = response.getError(); + Assert.assertEquals(PacketError.Condition.item_not_found, + error.getCondition()); + Assert.assertEquals(PacketError.Type.cancel, error.getType()); + } + + @Test + public void nonMatchingSubscriptionToSenderReturnsError() throws Exception { + + membership = new NodeMembershipImpl(node, new JID("juliet@capulet.lit"), Subscriptions.subscribed, + Affiliations.owner, null); + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.any(JID.class))).thenReturn(membership); + + unsubscribe.process(element, jid, request, null); - - Assert.assertEquals(1, queue.size()); + + Assert.assertEquals(1, queue.size()); - IQ response = (IQ) queue.poll(); + IQ response = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.error, response.getType()); - Assert.assertEquals(request.getFrom(), response.getTo()); - PacketError error = response.getError(); - Assert.assertEquals(PacketError.Condition.forbidden, - error.getCondition()); - Assert.assertEquals(PacketError.Type.auth, error.getType()); - Assert.assertEquals(Buddycloud.NS, error.getElement().element(UnsubscribeSet.CAN_NOT_UNSUBSCRIBE_ANOTHER_USER).getNamespaceURI()); - Assert.assertEquals(UnsubscribeSet.CAN_NOT_UNSUBSCRIBE_ANOTHER_USER, error.getApplicationConditionName()); - } + Assert.assertEquals(IQ.Type.error, response.getType()); + Assert.assertEquals(request.getFrom(), response.getTo()); + PacketError error = response.getError(); + Assert.assertEquals(PacketError.Condition.forbidden, + error.getCondition()); + Assert.assertEquals(PacketError.Type.auth, error.getType()); + Assert.assertEquals(Buddycloud.NS, error.getElement().element(UnsubscribeSet.CAN_NOT_UNSUBSCRIBE_ANOTHER_USER).getNamespaceURI()); + Assert.assertEquals(UnsubscribeSet.CAN_NOT_UNSUBSCRIBE_ANOTHER_USER, error.getApplicationConditionName()); + } - @Test - public void canNotUnsubscribeAsOnlyNodeOwner() throws Exception { + @Test + public void canNotUnsubscribeAsOnlyNodeOwner() throws Exception { - membership = new NodeMembershipImpl(node, jid, Subscriptions.subscribed, - Affiliations.owner, null); - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.any(JID.class))).thenReturn(membership); + membership = new NodeMembershipImpl(node, jid, Subscriptions.subscribed, + Affiliations.owner, null); + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.any(JID.class))).thenReturn(membership); - ArrayList owners = new ArrayList(); - owners.add(jid); + ArrayList owners = new ArrayList(); + owners.add(jid); - Mockito.when(channelManager.getNodeOwners(Mockito.anyString())) - .thenReturn(owners); + Mockito.when(channelManager.getNodeOwners(Mockito.anyString())) + .thenReturn(owners); - unsubscribe.process(element, jid, request, null); + unsubscribe.process(element, jid, request, null); - Assert.assertEquals(1, queue.size()); + Assert.assertEquals(1, queue.size()); - IQ response = (IQ) queue.poll(); + IQ response = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.error, response.getType()); + Assert.assertEquals(IQ.Type.error, response.getType()); - PacketError error = response.getError(); - Assert.assertNotNull(error); + PacketError error = response.getError(); + Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.cancel, error.getType()); - Assert.assertEquals(PacketError.Condition.not_allowed, - error.getCondition()); - Assert.assertEquals(UnsubscribeSet.MUST_HAVE_ONE_OWNER, error.getApplicationConditionName()); - Assert.assertEquals(Buddycloud.NS, error.getApplicationConditionNamespaceURI()); - } + Assert.assertEquals(PacketError.Type.cancel, error.getType()); + Assert.assertEquals(PacketError.Condition.not_allowed, + error.getCondition()); + Assert.assertEquals(UnsubscribeSet.MUST_HAVE_ONE_OWNER, error.getApplicationConditionName()); + Assert.assertEquals(Buddycloud.NS, error.getApplicationConditionNamespaceURI()); + } - @Test - public void unsubscribesTheUser() throws Exception { + @Test + public void unsubscribesTheUser() throws Exception { - ArgumentCaptor argument = ArgumentCaptor - .forClass(NodeSubscriptionImpl.class); + ArgumentCaptor argument = ArgumentCaptor + .forClass(NodeSubscriptionImpl.class); - unsubscribe.process(element, jid, request, null); + unsubscribe.process(element, jid, request, null); - Mockito.verify(channelManager, Mockito.times(1)).addUserSubscription( - argument.capture()); + Mockito.verify(channelManager, Mockito.times(1)).addUserSubscription( + argument.capture()); - IQ response = (IQ) queue.poll(); + IQ response = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.result, response.getType()); - Assert.assertEquals(node, argument.getValue().getNodeId()); - Assert.assertEquals(request.getFrom().toBareJID(), argument.getValue() - .getUser().toString()); - Assert.assertEquals(Subscriptions.none, argument.getValue() - .getSubscription()); - } + Assert.assertEquals(IQ.Type.result, response.getType()); + Assert.assertEquals(node, argument.getValue().getNodeId()); + Assert.assertEquals(request.getFrom().toBareJID(), argument.getValue() + .getUser().toString()); + Assert.assertEquals(Subscriptions.none, argument.getValue() + .getSubscription()); + } - @Test - public void updatesUserAffiliationToNone() throws Exception { + @Test + public void updatesUserAffiliationToNone() throws Exception { - unsubscribe.process(element, jid, request, null); + unsubscribe.process(element, jid, request, null); - Mockito.verify(channelManager, Mockito.times(1)).setUserAffiliation( - Mockito.eq(node), Mockito.eq(jid), - Mockito.eq(Affiliations.none)); + Mockito.verify(channelManager, Mockito.times(1)).setUserAffiliation( + Mockito.eq(node), Mockito.eq(jid), + Mockito.eq(Affiliations.none)); - IQ response = (IQ) queue.poll(); + IQ response = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.result, response.getType()); - } + Assert.assertEquals(IQ.Type.result, response.getType()); + } - @Test - public void doesNotUpdateAffiliationIfOutcast() throws Exception { - membership = new NodeMembershipImpl(node, jid, Subscriptions.subscribed, - Affiliations.outcast, null); - Mockito.when( - channelManager.getNodeMembership(Mockito.anyString(), - Mockito.any(JID.class))).thenReturn(membership); + @Test + public void doesNotUpdateAffiliationIfOutcast() throws Exception { + membership = new NodeMembershipImpl(node, jid, Subscriptions.subscribed, + Affiliations.outcast, null); + Mockito.when( + channelManager.getNodeMembership(Mockito.anyString(), + Mockito.any(JID.class))).thenReturn(membership); - Mockito.when(channelManager.getNodeOwners(Mockito.anyString())) - .thenReturn(new ArrayList()); + Mockito.when(channelManager.getNodeOwners(Mockito.anyString())) + .thenReturn(new ArrayList()); - unsubscribe.process(element, jid, request, null); + unsubscribe.process(element, jid, request, null); - Mockito.verify(channelManager, Mockito.times(0)).setUserAffiliation( - Mockito.eq(node), Mockito.eq(jid), - Mockito.eq(Affiliations.none)); + Mockito.verify(channelManager, Mockito.times(0)).setUserAffiliation( + Mockito.eq(node), Mockito.eq(jid), + Mockito.eq(Affiliations.none)); - IQ response = (IQ) queue.poll(); + IQ response = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.result, response.getType()); - } + Assert.assertEquals(IQ.Type.result, response.getType()); + } - @Test - public void sendsExpectedNotifications() throws Exception { + @Test + public void sendsExpectedNotifications() throws Exception { - JID listener = new JID("channels.example.com"); - ArrayList listeners = new ArrayList(); - listeners.add(new NodeSubscriptionImpl(node, jid, listener, - Subscriptions.subscribed, null)); + JID listener = new JID("channels.example.com"); + ArrayList listeners = new ArrayList(); + listeners.add(new NodeSubscriptionImpl(node, jid, listener, + Subscriptions.subscribed, null)); - ResultSet nodeListeners = new ResultSetImpl( - listeners); - Mockito.when(channelManager.getNodeSubscriptionListeners(node)) - .thenReturn(nodeListeners); + ResultSet nodeListeners = new ResultSetImpl( + listeners); + Mockito.when(channelManager.getNodeSubscriptionListeners(node)) + .thenReturn(nodeListeners); - unsubscribe.process(element, jid, request, null); + unsubscribe.process(element, jid, request, null); - Assert.assertEquals(4, queue.size()); + Assert.assertEquals(4, queue.size()); - IQ response = (IQ) queue.poll(); + IQ response = (IQ) queue.poll(); - Assert.assertEquals(IQ.Type.result, response.getType()); + Assert.assertEquals(IQ.Type.result, response.getType()); - Message notification = (Message) queue.poll(); + Message notification = (Message) queue.poll(); - Assert.assertEquals(jid, notification.getTo()); - Assert.assertEquals(Message.Type.headline, notification.getType()); + Assert.assertEquals(jid, notification.getTo()); + Assert.assertEquals(Message.Type.headline, notification.getType()); - Element event = notification.getElement().element("event"); - Assert.assertEquals(Event.NAMESPACE, event.getNamespaceURI()); - Element subscription = event.element("subscription"); - Assert.assertEquals(node, subscription.attributeValue("node")); - Assert.assertEquals(jid.toBareJID(), subscription.attributeValue("jid")); - Assert.assertEquals(Subscriptions.none.toString(), - subscription.attributeValue("subscription")); + Element event = notification.getElement().element("event"); + Assert.assertEquals(Event.NAMESPACE, event.getNamespaceURI()); + Element subscription = event.element("subscription"); + Assert.assertEquals(node, subscription.attributeValue("node")); + Assert.assertEquals(jid.toBareJID(), subscription.attributeValue("jid")); + Assert.assertEquals(Subscriptions.none.toString(), + subscription.attributeValue("subscription")); - } + } -} \ No newline at end of file +} diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/RegisterSetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/RegisterSetTest.java index 2857c51b..dd46cc8c 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/RegisterSetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/RegisterSetTest.java @@ -33,310 +33,310 @@ public class RegisterSetTest extends IQTestHandler { - private static final String REGISTER_REQUEST_STANZA = "/iq/pubsub/register/register.stanza"; - private static final String REGISTER_REQUEST_CHANNELS_DOMAIN = "channels.server1"; - private static final String REGISTER_REQUEST_DOMAIN = "server1"; - private static final JID REGISTER_REQUEST_FROM = new JID( - "user1@server1/mobile"); - - /* - * Class under test - */ - private RegisterSet registerSet; - - @Mock - private ChannelManager channelManagerMock; - - @Mock - private Configuration configuration; - - private LinkedBlockingQueue queue; - - @Before - public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); - - Configuration.getInstance().remove( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_SERVER_DOMAIN, REGISTER_REQUEST_DOMAIN); - - queue = new LinkedBlockingQueue(); - registerSet = new RegisterSet(configuration, queue, channelManagerMock); - - when(configuration.getProperty("server.domain")).thenReturn( - REGISTER_REQUEST_DOMAIN); - - when(configuration.getServerChannelsDomain()).thenReturn( - REGISTER_REQUEST_CHANNELS_DOMAIN); - when(configuration.getServerDomain()).thenReturn( - REGISTER_REQUEST_DOMAIN); - } - - @SuppressWarnings("serial") - @Test - public void testRegisterNewUserAutoSubscribesLocalChannels() - throws Exception { - IQ request = readStanzaAsIq(REGISTER_REQUEST_STANZA); - - when(channelManagerMock.nodeExists(anyString())).thenReturn(false); - - when(configuration.getAutosubscribeChannels()).thenReturn( - new ArrayList() { - { - add(new JID("channel1@server1")); - add(new JID("channel2@server1")); - } - }); - - registerSet.process(request); - - // Check that there are subscribe stanzas in the outqueue - ArrayList packets = new ArrayList(); - queue.drainTo(packets); - - assertPacketsContainsSubscribe(packets, request.getFrom(), - "/user/channel1@server1/posts"); - assertPacketsContainsSubscribe(packets, request.getFrom(), - "/user/channel2@server1/posts"); - } - - @SuppressWarnings("serial") - @Test - public void testRegisterNewUserAutoSubscribesRemoteChannels() - throws Exception { - IQ request = readStanzaAsIq(REGISTER_REQUEST_STANZA); - - when(channelManagerMock.nodeExists(anyString())).thenReturn(false); - - when(configuration.getAutosubscribeChannels()).thenReturn( - new ArrayList() { - { - add(new JID("channel1@server2")); - add(new JID("channel2@server2")); - } - }); - - registerSet.process(request); - - // Check that there are subscribe stanzas in the outqueue - ArrayList packets = new ArrayList(); - queue.drainTo(packets); - - assertPacketsContainsSubscribe(packets, new JID( - REGISTER_REQUEST_CHANNELS_DOMAIN), - "/user/channel1@server2/posts", request.getFrom().toBareJID()); - assertPacketsContainsSubscribe(packets, new JID( - REGISTER_REQUEST_CHANNELS_DOMAIN), - "/user/channel2@server2/posts", request.getFrom().toBareJID()); - } - - @Test - public void testRegisterExistingUserDoesntAutoSubscribeChannels() - throws Exception { - IQ request = readStanzaAsIq(REGISTER_REQUEST_STANZA); - - when(channelManagerMock.nodeExists(anyString())).thenReturn(true); - - when( - channelManagerMock.nodeExists(Conf - .getPostChannelNodename(request.getFrom()))) - .thenReturn(true); - - registerSet.process(request); - - // Check that there are subscribe stanzas in the outqueue - ArrayList packets = new ArrayList(); - queue.drainTo(packets); - - assertPacketsDoesntContainSubscribe(packets, request.getFrom(), - "/user/channel1@server1/posts"); - assertPacketsDoesntContainSubscribe(packets, request.getFrom(), - "/user/channel2@server1/posts"); - } - - @SuppressWarnings("serial") - @Test - public void testRegisterNewUserAutoApprovesOnlyLocalPrivateChannels() - throws Exception { - IQ request = readStanzaAsIq(REGISTER_REQUEST_STANZA); - - final JID localPrivateChannel = new JID("channel1@server1"); - final String localPrivateChannelNode = "/user/channel1@server1/posts"; - - final JID localOpenChannel = new JID("channel2@server1"); - final JID remoteChannel = new JID("channel1@server2"); - - when(channelManagerMock.nodeExists(anyString())).thenReturn(false); - - when(configuration.getAutosubscribeChannels()).thenReturn( - new ArrayList() { - { - add(localPrivateChannel); - add(localOpenChannel); - add(remoteChannel); - } - }); - - when( - configuration - .getBooleanProperty( - eq(Configuration.CONFIGURATION_CHANNELS_AUTOSUBSCRIBE_AUTOAPPROVE), - anyBoolean())).thenReturn(true); - - // localPrivateChannel is private - when( - channelManagerMock.getNodeConfValue(localPrivateChannelNode, - Conf.ACCESS_MODEL)).thenReturn( - AccessModels.authorize.toString()); - - when( - channelManagerMock - .getDefaultNodeAffiliation(localPrivateChannelNode)) - .thenReturn(Affiliations.moderator); - - registerSet.process(request); - - // Check that a subscription has been added, but only for - // localPrivateChannel. - verify(channelManagerMock).addUserSubscription( - new NodeSubscriptionImpl(localPrivateChannelNode, - REGISTER_REQUEST_FROM, Subscriptions.subscribed, null)); - verify(channelManagerMock).setUserAffiliation(localPrivateChannelNode, - REGISTER_REQUEST_FROM, Affiliations.moderator); - } - - @SuppressWarnings("serial") - @Test - public void testRegisterNewUserDoesntAutoApprove() throws Exception { - IQ request = readStanzaAsIq(REGISTER_REQUEST_STANZA); - - final JID localPrivateChannel = new JID("channel1@server1"); - final String localPrivateChannelNode = "/user/channel1@server1/posts"; - - when(channelManagerMock.nodeExists(anyString())).thenReturn(false); - - when(configuration.getAutosubscribeChannels()).thenReturn( - new ArrayList() { - { - add(localPrivateChannel); - } - }); - - when( - configuration - .getBooleanProperty( - eq(Configuration.CONFIGURATION_CHANNELS_AUTOSUBSCRIBE_AUTOAPPROVE), - anyBoolean())).thenReturn(false); - - // localPrivateChannel is private - when( - channelManagerMock.getNodeConfValue(localPrivateChannelNode, - Conf.ACCESS_MODEL)).thenReturn( - AccessModels.authorize.toString()); - - registerSet.process(request); - - // Check that a subscription and affiliation has been added, but only - // for - // localPrivateChannel. - verify(channelManagerMock, never()).addUserSubscription( - new NodeSubscriptionImpl(localPrivateChannelNode, - REGISTER_REQUEST_FROM, Subscriptions.subscribed, null)); - } - - private void assertPacketsContainsSubscribe( - final Collection packets, final JID jid, final String nodeId) { - assertPacketsContainsSubscribe(packets, jid, nodeId, null); - } - - private void assertPacketsContainsSubscribe( - final Collection packets, final JID jid, - final String nodeId, String actor) { - for (Packet packet : packets) { - if (packet.getElement().getName().equals("iq") - && packet.getFrom().equals(jid)) { - Element pubsubEl = packet.getElement().element( - QName.get("pubsub", JabberPubsub.NAMESPACE_URI)); - - if (pubsubEl == null) { - continue; - } - - Element subscribeEl = pubsubEl.element("subscribe"); - - if (subscribeEl.attributeValue("node").equals(nodeId)) { - - if (actor == null) { - if (subscribeEl.attributeValue("jid").equals( - jid.toBareJID().toString())) { - return; - } - } else { - - Element actorEl = pubsubEl.element("actor"); - - if (actorEl.getText().equals(actor) - && subscribeEl.attributeValue("jid").equals( - actor)) { - return; - } - } - } - } - } - - if (actor == null) { - fail("Subscribe to node " + nodeId + " from jid " + jid - + " not found"); - } else { - fail("Subscribe to node " + nodeId + " from jid " + jid - + " with actor " + actor + " not found"); - } - } - - private void assertPacketsDoesntContainSubscribe( - final Collection packets, final JID jid, - final String nodeId, String actor) { - for (Packet packet : packets) { - if (packet.getElement().getName().equals("iq") - && packet.getFrom().equals(jid)) { - Element pubsubEl = packet.getElement().element( - QName.get("pubsub", JabberPubsub.NAMESPACE_URI)); - - if (pubsubEl == null) { - continue; - } - - Element subscribeEl = pubsubEl.element("subscribe"); - - if (subscribeEl.attributeValue("node").equals(nodeId)) { - - if (actor == null) { - if (subscribeEl.attributeValue("jid").equals( - jid.toBareJID().toString())) { - fail("Subscribe to node " + nodeId + " from jid " - + jid + " was found but not expected"); - } - } else { - - Element actorEl = pubsubEl.element("actor"); - - if (actorEl.getText().equals(actor) - && subscribeEl.attributeValue("jid").equals( - actor)) { - fail("Subscribe to node " + nodeId + " from jid " - + jid + " with actor " + actor - + " was found but not expected"); - } - } - } - } - } - } - - private void assertPacketsDoesntContainSubscribe( - final Collection packets, final JID jid, final String nodeId) { - assertPacketsDoesntContainSubscribe(packets, jid, nodeId, null); - } + private static final String REGISTER_REQUEST_STANZA = "/iq/pubsub/register/register.stanza"; + private static final String REGISTER_REQUEST_CHANNELS_DOMAIN = "channels.server1"; + private static final String REGISTER_REQUEST_DOMAIN = "server1"; + private static final JID REGISTER_REQUEST_FROM = new JID( + "user1@server1/mobile"); + + /* + * Class under test + */ + private RegisterSet registerSet; + + @Mock + private ChannelManager channelManagerMock; + + @Mock + private Configuration configuration; + + private LinkedBlockingQueue queue; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, REGISTER_REQUEST_DOMAIN); + + queue = new LinkedBlockingQueue(); + registerSet = new RegisterSet(configuration, queue, channelManagerMock); + + when(configuration.getProperty("server.domain")).thenReturn( + REGISTER_REQUEST_DOMAIN); + + when(configuration.getServerChannelsDomain()).thenReturn( + REGISTER_REQUEST_CHANNELS_DOMAIN); + when(configuration.getServerDomain()).thenReturn( + REGISTER_REQUEST_DOMAIN); + } + + @SuppressWarnings("serial") + @Test + public void testRegisterNewUserAutoSubscribesLocalChannels() + throws Exception { + IQ request = readStanzaAsIq(REGISTER_REQUEST_STANZA); + + when(channelManagerMock.nodeExists(anyString())).thenReturn(false); + + when(configuration.getAutosubscribeChannels()).thenReturn( + new ArrayList() { + { + add(new JID("channel1@server1")); + add(new JID("channel2@server1")); + } + }); + + registerSet.process(request); + + // Check that there are subscribe stanzas in the outqueue + ArrayList packets = new ArrayList(); + queue.drainTo(packets); + + assertPacketsContainsSubscribe(packets, request.getFrom(), + "/user/channel1@server1/posts"); + assertPacketsContainsSubscribe(packets, request.getFrom(), + "/user/channel2@server1/posts"); + } + + @SuppressWarnings("serial") + @Test + public void testRegisterNewUserAutoSubscribesRemoteChannels() + throws Exception { + IQ request = readStanzaAsIq(REGISTER_REQUEST_STANZA); + + when(channelManagerMock.nodeExists(anyString())).thenReturn(false); + + when(configuration.getAutosubscribeChannels()).thenReturn( + new ArrayList() { + { + add(new JID("channel1@server2")); + add(new JID("channel2@server2")); + } + }); + + registerSet.process(request); + + // Check that there are subscribe stanzas in the outqueue + ArrayList packets = new ArrayList(); + queue.drainTo(packets); + + assertPacketsContainsSubscribe(packets, new JID( + REGISTER_REQUEST_CHANNELS_DOMAIN), + "/user/channel1@server2/posts", request.getFrom().toBareJID()); + assertPacketsContainsSubscribe(packets, new JID( + REGISTER_REQUEST_CHANNELS_DOMAIN), + "/user/channel2@server2/posts", request.getFrom().toBareJID()); + } + + @Test + public void testRegisterExistingUserDoesntAutoSubscribeChannels() + throws Exception { + IQ request = readStanzaAsIq(REGISTER_REQUEST_STANZA); + + when(channelManagerMock.nodeExists(anyString())).thenReturn(true); + + when( + channelManagerMock.nodeExists(Conf + .getPostChannelNodename(request.getFrom()))) + .thenReturn(true); + + registerSet.process(request); + + // Check that there are subscribe stanzas in the outqueue + ArrayList packets = new ArrayList(); + queue.drainTo(packets); + + assertPacketsDoesntContainSubscribe(packets, request.getFrom(), + "/user/channel1@server1/posts"); + assertPacketsDoesntContainSubscribe(packets, request.getFrom(), + "/user/channel2@server1/posts"); + } + + @SuppressWarnings("serial") + @Test + public void testRegisterNewUserAutoApprovesOnlyLocalPrivateChannels() + throws Exception { + IQ request = readStanzaAsIq(REGISTER_REQUEST_STANZA); + + final JID localPrivateChannel = new JID("channel1@server1"); + final String localPrivateChannelNode = "/user/channel1@server1/posts"; + + final JID localOpenChannel = new JID("channel2@server1"); + final JID remoteChannel = new JID("channel1@server2"); + + when(channelManagerMock.nodeExists(anyString())).thenReturn(false); + + when(configuration.getAutosubscribeChannels()).thenReturn( + new ArrayList() { + { + add(localPrivateChannel); + add(localOpenChannel); + add(remoteChannel); + } + }); + + when( + configuration + .getBooleanProperty( + eq(Configuration.CONFIGURATION_CHANNELS_AUTOSUBSCRIBE_AUTOAPPROVE), + anyBoolean())).thenReturn(true); + + // localPrivateChannel is private + when( + channelManagerMock.getNodeConfValue(localPrivateChannelNode, + Conf.ACCESS_MODEL)).thenReturn( + AccessModels.authorize.toString()); + + when( + channelManagerMock + .getDefaultNodeAffiliation(localPrivateChannelNode)) + .thenReturn(Affiliations.moderator); + + registerSet.process(request); + + // Check that a subscription has been added, but only for + // localPrivateChannel. + verify(channelManagerMock).addUserSubscription( + new NodeSubscriptionImpl(localPrivateChannelNode, + REGISTER_REQUEST_FROM, Subscriptions.subscribed, null)); + verify(channelManagerMock).setUserAffiliation(localPrivateChannelNode, + REGISTER_REQUEST_FROM, Affiliations.moderator); + } + + @SuppressWarnings("serial") + @Test + public void testRegisterNewUserDoesntAutoApprove() throws Exception { + IQ request = readStanzaAsIq(REGISTER_REQUEST_STANZA); + + final JID localPrivateChannel = new JID("channel1@server1"); + final String localPrivateChannelNode = "/user/channel1@server1/posts"; + + when(channelManagerMock.nodeExists(anyString())).thenReturn(false); + + when(configuration.getAutosubscribeChannels()).thenReturn( + new ArrayList() { + { + add(localPrivateChannel); + } + }); + + when( + configuration + .getBooleanProperty( + eq(Configuration.CONFIGURATION_CHANNELS_AUTOSUBSCRIBE_AUTOAPPROVE), + anyBoolean())).thenReturn(false); + + // localPrivateChannel is private + when( + channelManagerMock.getNodeConfValue(localPrivateChannelNode, + Conf.ACCESS_MODEL)).thenReturn( + AccessModels.authorize.toString()); + + registerSet.process(request); + + // Check that a subscription and affiliation has been added, but only + // for + // localPrivateChannel. + verify(channelManagerMock, never()).addUserSubscription( + new NodeSubscriptionImpl(localPrivateChannelNode, + REGISTER_REQUEST_FROM, Subscriptions.subscribed, null)); + } + + private void assertPacketsContainsSubscribe( + final Collection packets, final JID jid, final String nodeId) { + assertPacketsContainsSubscribe(packets, jid, nodeId, null); + } + + private void assertPacketsContainsSubscribe( + final Collection packets, final JID jid, + final String nodeId, String actor) { + for (Packet packet : packets) { + if (packet.getElement().getName().equals("iq") + && packet.getFrom().equals(jid)) { + Element pubsubEl = packet.getElement().element( + QName.get("pubsub", JabberPubsub.NAMESPACE_URI)); + + if (pubsubEl == null) { + continue; + } + + Element subscribeEl = pubsubEl.element("subscribe"); + + if (subscribeEl.attributeValue("node").equals(nodeId)) { + + if (actor == null) { + if (subscribeEl.attributeValue("jid").equals( + jid.toBareJID().toString())) { + return; + } + } else { + + Element actorEl = pubsubEl.element("actor"); + + if (actorEl.getText().equals(actor) + && subscribeEl.attributeValue("jid").equals( + actor)) { + return; + } + } + } + } + } + + if (actor == null) { + fail("Subscribe to node " + nodeId + " from jid " + jid + + " not found"); + } else { + fail("Subscribe to node " + nodeId + " from jid " + jid + + " with actor " + actor + " not found"); + } + } + + private void assertPacketsDoesntContainSubscribe( + final Collection packets, final JID jid, + final String nodeId, String actor) { + for (Packet packet : packets) { + if (packet.getElement().getName().equals("iq") + && packet.getFrom().equals(jid)) { + Element pubsubEl = packet.getElement().element( + QName.get("pubsub", JabberPubsub.NAMESPACE_URI)); + + if (pubsubEl == null) { + continue; + } + + Element subscribeEl = pubsubEl.element("subscribe"); + + if (subscribeEl.attributeValue("node").equals(nodeId)) { + + if (actor == null) { + if (subscribeEl.attributeValue("jid").equals( + jid.toBareJID().toString())) { + fail("Subscribe to node " + nodeId + " from jid " + + jid + " was found but not expected"); + } + } else { + + Element actorEl = pubsubEl.element("actor"); + + if (actorEl.getText().equals(actor) + && subscribeEl.attributeValue("jid").equals( + actor)) { + fail("Subscribe to node " + nodeId + " from jid " + + jid + " with actor " + actor + + " was found but not expected"); + } + } + } + } + } + } + + private void assertPacketsDoesntContainSubscribe( + final Collection packets, final JID jid, final String nodeId) { + assertPacketsDoesntContainSubscribe(packets, jid, nodeId, null); + } } diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/UnregisterSetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/UnregisterSetTest.java index 0a8fc92b..64c11f15 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/UnregisterSetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/register/UnregisterSetTest.java @@ -33,349 +33,349 @@ public class UnregisterSetTest extends IQTestHandler { - private ChannelManager channelManager; - private LinkedBlockingQueue queue; - private UnregisterSet unregisterSet; - - @Before - public void setUp() throws Exception { - this.channelManager = Mockito.mock(ChannelManager.class); - this.queue = new LinkedBlockingQueue(); - this.unregisterSet = new UnregisterSet(queue, channelManager); - } - - private void recordEmptyMockResponses(JID actorJid) - throws NodeStoreException { - Mockito.when( - channelManager.nodeExists(Mockito.eq("/user/" + actorJid.toBareJID() - + "/posts"))).thenReturn(true); - Mockito.when(channelManager.getUserMemberships(Mockito.eq(actorJid))).thenReturn( - new ResultSetImpl( - new LinkedList())); - Mockito.when(channelManager.getUserMemberships(Mockito.eq(actorJid))).thenReturn( - new ResultSetImpl( - new LinkedList())); - Mockito.when(channelManager.getUserPublishedItems(Mockito.eq(actorJid))).thenReturn( - new ResultSetImpl(new LinkedList())); - Mockito.when(channelManager.beginTransaction()).thenReturn( - Mockito.mock(Transaction.class)); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); - } - - @Test - public void testRemoteRequestWrongDomain() throws Exception { - IQ request = readStanzaAsIq("/iq/unregister/fail/remote-wrong-domain.stanza"); - unregisterSet.process(request); - Packet response = queue.poll(); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.cancel, error.getType()); - Assert.assertEquals(PacketError.Condition.bad_request, - error.getCondition()); - } - - @Test - public void testBadFormattedStanza() throws Exception { - IQ request = readStanzaAsIq("/iq/unregister/fail/bad-formatted.stanza"); - unregisterSet.process(request); - 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 testUnregisteredUser() throws Exception { - IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); - unregisterSet.process(request); - Packet response = queue.poll(); - - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.auth, error.getType()); - Assert.assertEquals(PacketError.Condition.registration_required, - error.getCondition()); - } - - @Test - public void testRegisteredUserNoNotifications() throws Exception { - IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); - JID actorJid = request.getFrom(); - - recordEmptyMockResponses(actorJid); - - unregisterSet.process(request); - IQ response = (IQ) queue.poll(); - Assert.assertNull(response.getError()); - Assert.assertEquals(Type.result, response.getType()); - Assert.assertTrue(queue.isEmpty()); - } - - @Test - public void notifyDeletePersonalNode() throws Exception { - IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); - JID actorJid = request.getFrom(); - - recordEmptyMockResponses(actorJid); - - String personalNode = "/user/" + actorJid.toBareJID() + "/posts"; - - // Record affiliations - NodeMembership membership = new NodeMembershipImpl(personalNode, - actorJid, actorJid, Subscriptions.subscribed, - Affiliations.owner, null); - List memberships = new LinkedList(); - memberships.add(membership); - Mockito.when(channelManager.getUserMemberships(Mockito.eq(actorJid))).thenReturn( - new ResultSetImpl(memberships)); - - // Record channel type - Mockito.when( - channelManager - .getNodeConfValue(personalNode, Conf.CHANNEL_TYPE)) - .thenReturn("personal"); - - unregisterSet.process(request); - - IQ response = (IQ) queue.poll(); - Assert.assertNull(response.getError()); - Assert.assertEquals(Type.result, response.getType()); - Assert.assertFalse(queue.isEmpty()); - - int adminCount = Configuration.getInstance().getAdminUsers().size() * 2; - Assert.assertEquals(adminCount, queue.size()); - - Packet deleteNodeNotification = queue.poll(); - Element deleteEl = deleteNodeNotification.getElement().element("event") - .element("delete"); - Assert.assertEquals(personalNode, deleteEl.attributeValue("node")); - } - - @Test - public void dontNotifyDeleteRemoteTopicNode() throws Exception { - - IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); - JID actorJid = request.getFrom(); - - recordEmptyMockResponses(actorJid); - - String topicNode = "/user/topic@shakespeare.lit/posts"; - - // Record affiliations - NodeMembership membership = new NodeMembershipImpl(topicNode, - actorJid, actorJid, Subscriptions.subscribed, Affiliations.owner, null, new Date()); - - List memberships = new LinkedList(); - memberships.add(membership); - - Mockito.when(channelManager.getUserMemberships(actorJid)).thenReturn( - new ResultSetImpl(memberships)); - - Mockito.when( - channelManager.getNodeMemberships(Mockito.eq(topicNode))).thenReturn( - new ResultSetImpl(memberships)); - - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); - - // Record channel type - Mockito.when( - channelManager.getNodeConfValue(topicNode, Conf.CHANNEL_TYPE)) - .thenReturn("topic"); - - unregisterSet.process(request); - - IQ response = (IQ) queue.poll(); - Assert.assertNull(response.getError()); - Assert.assertEquals(Type.result, response.getType()); - - Assert.assertEquals(2, queue.size()); - } - - @Test - public void notifyDeleteLocalTopicNode() throws Exception { - IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); - JID actorJid = request.getFrom(); - - recordEmptyMockResponses(actorJid); - - String topicNode = "/user/topic@shakespeare.lit/posts"; - - // Record affiliations - NodeMembership membership = new NodeMembershipImpl(topicNode, - actorJid, actorJid, Subscriptions.subscribed, Affiliations.owner, null, new Date()); - List memberships = new LinkedList(); - memberships.add(membership); - Mockito.when(channelManager.getUserMemberships(actorJid)).thenReturn( - new ResultSetImpl(memberships)); - Mockito.when( - channelManager.getNodeMemberships(Mockito.eq(topicNode))).thenReturn( - new ResultSetImpl(memberships)); - - // Record channel type - Mockito.when( - channelManager.getNodeConfValue(topicNode, Conf.CHANNEL_TYPE)) - .thenReturn("topic"); - - unregisterSet.process(request); - - IQ response = (IQ) queue.poll(); - Assert.assertNull(response.getError()); - Assert.assertEquals(Type.result, response.getType()); - Assert.assertFalse(queue.isEmpty()); - - // Two delete notifications, two subscription notifications - int adminCount = Configuration.getInstance().getAdminUsers().size() * 2; - Assert.assertEquals(adminCount, queue.size()); - - Packet deleteNodeNotification = queue.poll(); - Element deleteEl = deleteNodeNotification.getElement().element("event") - .element("delete"); - Assert.assertEquals(topicNode, deleteEl.attributeValue("node")); - } - - @Test - public void testDontNotifyDeleteRemoteNodeItem() throws Exception { - IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); - JID actorJid = request.getFrom(); - - recordEmptyMockResponses(actorJid); - - String topicNode = "/user/topic@shakespeare.lit/posts"; - - // Record remote node - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); - - // Record node items - NodeItem nodeItem = new NodeItemImpl(topicNode, "entry1", new Date(), - ""); - List nodeItems = new LinkedList(); - nodeItems.add(nodeItem); - Mockito.when(channelManager.getUserPublishedItems(actorJid)).thenReturn( - new ResultSetImpl(nodeItems)); - - unregisterSet.process(request); - - IQ response = (IQ) queue.poll(); - Assert.assertNull(response.getError()); - Assert.assertEquals(Type.result, response.getType()); - Assert.assertTrue(queue.isEmpty()); - } - - @Test - public void testNotifyDeleteLocalNodeItem() throws Exception { - IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); - JID actorJid = request.getFrom(); - - recordEmptyMockResponses(actorJid); - - String topicNode = "/user/topic@shakespeare.lit/posts"; - - // Record node items - String itemId = "entry1"; - NodeItem nodeItem = new NodeItemImpl(topicNode, itemId, new Date(), - ""); - List nodeItems = new LinkedList(); - nodeItems.add(nodeItem); - Mockito.when(channelManager.getUserPublishedItems(actorJid)).thenReturn( - new ResultSetImpl(nodeItems)); - - unregisterSet.process(request); - - IQ response = (IQ) queue.poll(); - Assert.assertNull(response.getError()); - Assert.assertEquals(Type.result, response.getType()); - Assert.assertFalse(queue.isEmpty()); - - int adminCount = Configuration.getInstance().getAdminUsers().size(); - Assert.assertEquals(adminCount, queue.size()); - - Packet deleteNodeNotification = queue.poll(); - Element itemsEl = deleteNodeNotification.getElement().element("event") - .element("items"); - Assert.assertEquals(topicNode, itemsEl.attributeValue("node")); - - Element retractEl = itemsEl.element("retract"); - Assert.assertEquals(itemId, retractEl.attributeValue("id")); - } - - @Test - public void testNotifyDeleteLocalSubscriptions() throws Exception { - IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); - JID actorJid = request.getFrom(); - - recordEmptyMockResponses(actorJid); - - String topicNode = "/user/topic@shakespeare.lit/posts"; - - // Record subscriptions - NodeMembership membership = new NodeMembershipImpl(topicNode, - actorJid, Subscriptions.subscribed, Affiliations.member, null); - List memberships = new LinkedList(); - memberships.add(membership); - Mockito.when(channelManager.getUserMemberships(Mockito.eq(actorJid))).thenReturn( - new ResultSetImpl(memberships)); - - List nodeMemberships = new LinkedList(); - nodeMemberships.add(membership); - Mockito.when(channelManager.getNodeMemberships(Mockito.anyString())).thenReturn( - new ResultSetImpl(nodeMemberships)); - - unregisterSet.process(request); - - IQ response = (IQ) queue.poll(); - Assert.assertNull(response.getError()); - Assert.assertEquals(Type.result, response.getType()); - Assert.assertFalse(queue.isEmpty()); - - int adminCount = Configuration.getInstance().getAdminUsers().size(); - Assert.assertEquals(adminCount, queue.size()); - - Packet deleteNodeNotification = queue.poll(); - Element itemsEl = deleteNodeNotification.getElement().element("event") - .element("subscription"); - Assert.assertEquals(topicNode, itemsEl.attributeValue("node")); - Assert.assertEquals(actorJid.toBareJID(), itemsEl.attributeValue("jid")); - Assert.assertEquals("none", itemsEl.attributeValue("subscription")); - } - - @Test - public void testForwardRemoteRequests() throws Exception { - IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); - JID actorJid = request.getFrom(); - - recordEmptyMockResponses(actorJid); - - String remoteNode = "/user/remotenode@remotedomain.com/posts"; - ArrayList remoteNodes = new ArrayList(); - remoteNodes.add(remoteNode); - Mockito.when(channelManager.getNodeList()).thenReturn(remoteNodes); - - Configuration.getInstance().remove( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_SERVER_CHANNELS_DOMAIN, "shakespeare.lit"); - - unregisterSet.process(request); - - IQ response = (IQ) queue.poll(); - Assert.assertNull(response.getError()); - Assert.assertEquals(Type.result, response.getType()); - Assert.assertFalse(queue.isEmpty()); - - Assert.assertEquals(1, queue.size()); - - Packet remoteRequest = queue.poll(); - Element removeEl = remoteRequest.getElement().element("query") - .element("remove"); - Assert.assertNotNull(removeEl); - Element actorEl = removeEl.element("actor"); - Assert.assertEquals(actorJid.toBareJID(), actorEl.getText()); - } + private ChannelManager channelManager; + private LinkedBlockingQueue queue; + private UnregisterSet unregisterSet; + + @Before + public void setUp() throws Exception { + this.channelManager = Mockito.mock(ChannelManager.class); + this.queue = new LinkedBlockingQueue(); + this.unregisterSet = new UnregisterSet(queue, channelManager); + } + + private void recordEmptyMockResponses(JID actorJid) + throws NodeStoreException { + Mockito.when( + channelManager.nodeExists(Mockito.eq("/user/" + actorJid.toBareJID() + + "/posts"))).thenReturn(true); + Mockito.when(channelManager.getUserMemberships(Mockito.eq(actorJid))).thenReturn( + new ResultSetImpl( + new LinkedList())); + Mockito.when(channelManager.getUserMemberships(Mockito.eq(actorJid))).thenReturn( + new ResultSetImpl( + new LinkedList())); + Mockito.when(channelManager.getUserPublishedItems(Mockito.eq(actorJid))).thenReturn( + new ResultSetImpl(new LinkedList())); + Mockito.when(channelManager.beginTransaction()).thenReturn( + Mockito.mock(Transaction.class)); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); + } + + @Test + public void testRemoteRequestWrongDomain() throws Exception { + IQ request = readStanzaAsIq("/iq/unregister/fail/remote-wrong-domain.stanza"); + unregisterSet.process(request); + Packet response = queue.poll(); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.cancel, error.getType()); + Assert.assertEquals(PacketError.Condition.bad_request, + error.getCondition()); + } + + @Test + public void testBadFormattedStanza() throws Exception { + IQ request = readStanzaAsIq("/iq/unregister/fail/bad-formatted.stanza"); + unregisterSet.process(request); + 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 testUnregisteredUser() throws Exception { + IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); + unregisterSet.process(request); + Packet response = queue.poll(); + + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.auth, error.getType()); + Assert.assertEquals(PacketError.Condition.registration_required, + error.getCondition()); + } + + @Test + public void testRegisteredUserNoNotifications() throws Exception { + IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); + JID actorJid = request.getFrom(); + + recordEmptyMockResponses(actorJid); + + unregisterSet.process(request); + IQ response = (IQ) queue.poll(); + Assert.assertNull(response.getError()); + Assert.assertEquals(Type.result, response.getType()); + Assert.assertTrue(queue.isEmpty()); + } + + @Test + public void notifyDeletePersonalNode() throws Exception { + IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); + JID actorJid = request.getFrom(); + + recordEmptyMockResponses(actorJid); + + String personalNode = "/user/" + actorJid.toBareJID() + "/posts"; + + // Record affiliations + NodeMembership membership = new NodeMembershipImpl(personalNode, + actorJid, actorJid, Subscriptions.subscribed, + Affiliations.owner, null); + List memberships = new LinkedList(); + memberships.add(membership); + Mockito.when(channelManager.getUserMemberships(Mockito.eq(actorJid))).thenReturn( + new ResultSetImpl(memberships)); + + // Record channel type + Mockito.when( + channelManager + .getNodeConfValue(personalNode, Conf.CHANNEL_TYPE)) + .thenReturn("personal"); + + unregisterSet.process(request); + + IQ response = (IQ) queue.poll(); + Assert.assertNull(response.getError()); + Assert.assertEquals(Type.result, response.getType()); + Assert.assertFalse(queue.isEmpty()); + + int adminCount = Configuration.getInstance().getAdminUsers().size() * 2; + Assert.assertEquals(adminCount, queue.size()); + + Packet deleteNodeNotification = queue.poll(); + Element deleteEl = deleteNodeNotification.getElement().element("event") + .element("delete"); + Assert.assertEquals(personalNode, deleteEl.attributeValue("node")); + } + + @Test + public void dontNotifyDeleteRemoteTopicNode() throws Exception { + + IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); + JID actorJid = request.getFrom(); + + recordEmptyMockResponses(actorJid); + + String topicNode = "/user/topic@shakespeare.lit/posts"; + + // Record affiliations + NodeMembership membership = new NodeMembershipImpl(topicNode, + actorJid, actorJid, Subscriptions.subscribed, Affiliations.owner, null, new Date()); + + List memberships = new LinkedList(); + memberships.add(membership); + + Mockito.when(channelManager.getUserMemberships(actorJid)).thenReturn( + new ResultSetImpl(memberships)); + + Mockito.when( + channelManager.getNodeMemberships(Mockito.eq(topicNode))).thenReturn( + new ResultSetImpl(memberships)); + + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); + + // Record channel type + Mockito.when( + channelManager.getNodeConfValue(topicNode, Conf.CHANNEL_TYPE)) + .thenReturn("topic"); + + unregisterSet.process(request); + + IQ response = (IQ) queue.poll(); + Assert.assertNull(response.getError()); + Assert.assertEquals(Type.result, response.getType()); + + Assert.assertEquals(2, queue.size()); + } + + @Test + public void notifyDeleteLocalTopicNode() throws Exception { + IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); + JID actorJid = request.getFrom(); + + recordEmptyMockResponses(actorJid); + + String topicNode = "/user/topic@shakespeare.lit/posts"; + + // Record affiliations + NodeMembership membership = new NodeMembershipImpl(topicNode, + actorJid, actorJid, Subscriptions.subscribed, Affiliations.owner, null, new Date()); + List memberships = new LinkedList(); + memberships.add(membership); + Mockito.when(channelManager.getUserMemberships(actorJid)).thenReturn( + new ResultSetImpl(memberships)); + Mockito.when( + channelManager.getNodeMemberships(Mockito.eq(topicNode))).thenReturn( + new ResultSetImpl(memberships)); + + // Record channel type + Mockito.when( + channelManager.getNodeConfValue(topicNode, Conf.CHANNEL_TYPE)) + .thenReturn("topic"); + + unregisterSet.process(request); + + IQ response = (IQ) queue.poll(); + Assert.assertNull(response.getError()); + Assert.assertEquals(Type.result, response.getType()); + Assert.assertFalse(queue.isEmpty()); + + // Two delete notifications, two subscription notifications + int adminCount = Configuration.getInstance().getAdminUsers().size() * 2; + Assert.assertEquals(adminCount, queue.size()); + + Packet deleteNodeNotification = queue.poll(); + Element deleteEl = deleteNodeNotification.getElement().element("event") + .element("delete"); + Assert.assertEquals(topicNode, deleteEl.attributeValue("node")); + } + + @Test + public void testDontNotifyDeleteRemoteNodeItem() throws Exception { + IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); + JID actorJid = request.getFrom(); + + recordEmptyMockResponses(actorJid); + + String topicNode = "/user/topic@shakespeare.lit/posts"; + + // Record remote node + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); + + // Record node items + NodeItem nodeItem = new NodeItemImpl(topicNode, "entry1", new Date(), + ""); + List nodeItems = new LinkedList(); + nodeItems.add(nodeItem); + Mockito.when(channelManager.getUserPublishedItems(actorJid)).thenReturn( + new ResultSetImpl(nodeItems)); + + unregisterSet.process(request); + + IQ response = (IQ) queue.poll(); + Assert.assertNull(response.getError()); + Assert.assertEquals(Type.result, response.getType()); + Assert.assertTrue(queue.isEmpty()); + } + + @Test + public void testNotifyDeleteLocalNodeItem() throws Exception { + IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); + JID actorJid = request.getFrom(); + + recordEmptyMockResponses(actorJid); + + String topicNode = "/user/topic@shakespeare.lit/posts"; + + // Record node items + String itemId = "entry1"; + NodeItem nodeItem = new NodeItemImpl(topicNode, itemId, new Date(), + ""); + List nodeItems = new LinkedList(); + nodeItems.add(nodeItem); + Mockito.when(channelManager.getUserPublishedItems(actorJid)).thenReturn( + new ResultSetImpl(nodeItems)); + + unregisterSet.process(request); + + IQ response = (IQ) queue.poll(); + Assert.assertNull(response.getError()); + Assert.assertEquals(Type.result, response.getType()); + Assert.assertFalse(queue.isEmpty()); + + int adminCount = Configuration.getInstance().getAdminUsers().size(); + Assert.assertEquals(adminCount, queue.size()); + + Packet deleteNodeNotification = queue.poll(); + Element itemsEl = deleteNodeNotification.getElement().element("event") + .element("items"); + Assert.assertEquals(topicNode, itemsEl.attributeValue("node")); + + Element retractEl = itemsEl.element("retract"); + Assert.assertEquals(itemId, retractEl.attributeValue("id")); + } + + @Test + public void testNotifyDeleteLocalSubscriptions() throws Exception { + IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); + JID actorJid = request.getFrom(); + + recordEmptyMockResponses(actorJid); + + String topicNode = "/user/topic@shakespeare.lit/posts"; + + // Record subscriptions + NodeMembership membership = new NodeMembershipImpl(topicNode, + actorJid, Subscriptions.subscribed, Affiliations.member, null); + List memberships = new LinkedList(); + memberships.add(membership); + Mockito.when(channelManager.getUserMemberships(Mockito.eq(actorJid))).thenReturn( + new ResultSetImpl(memberships)); + + List nodeMemberships = new LinkedList(); + nodeMemberships.add(membership); + Mockito.when(channelManager.getNodeMemberships(Mockito.anyString())).thenReturn( + new ResultSetImpl(nodeMemberships)); + + unregisterSet.process(request); + + IQ response = (IQ) queue.poll(); + Assert.assertNull(response.getError()); + Assert.assertEquals(Type.result, response.getType()); + Assert.assertFalse(queue.isEmpty()); + + int adminCount = Configuration.getInstance().getAdminUsers().size(); + Assert.assertEquals(adminCount, queue.size()); + + Packet deleteNodeNotification = queue.poll(); + Element itemsEl = deleteNodeNotification.getElement().element("event") + .element("subscription"); + Assert.assertEquals(topicNode, itemsEl.attributeValue("node")); + Assert.assertEquals(actorJid.toBareJID(), itemsEl.attributeValue("jid")); + Assert.assertEquals("none", itemsEl.attributeValue("subscription")); + } + + @Test + public void testForwardRemoteRequests() throws Exception { + IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); + JID actorJid = request.getFrom(); + + recordEmptyMockResponses(actorJid); + + String remoteNode = "/user/remotenode@remotedomain.com/posts"; + ArrayList remoteNodes = new ArrayList(); + remoteNodes.add(remoteNode); + Mockito.when(channelManager.getNodeList()).thenReturn(remoteNodes); + + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_CHANNELS_DOMAIN, "shakespeare.lit"); + + unregisterSet.process(request); + + IQ response = (IQ) queue.poll(); + Assert.assertNull(response.getError()); + Assert.assertEquals(Type.result, response.getType()); + Assert.assertFalse(queue.isEmpty()); + + Assert.assertEquals(1, queue.size()); + + Packet remoteRequest = queue.poll(); + Element removeEl = remoteRequest.getElement().element("query") + .element("remove"); + Assert.assertNotNull(removeEl); + Element actorEl = removeEl.element("actor"); + Assert.assertEquals(actorJid.toBareJID(), actorEl.getText()); + } } diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchGetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchGetTest.java index ad373431..81a47b1a 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchGetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchGetTest.java @@ -18,269 +18,269 @@ public class SearchGetTest extends IQTestHandler { - private IQ request; - private BlockingQueue queue = new LinkedBlockingQueue(); - - private SearchGet search; - private JID sender; - private JID receiver; - - @Before - public void setUp() throws Exception { - - queue = new LinkedBlockingQueue(); - - search = new SearchGet(queue); - - sender = new JID("channels.shakespeare.lit"); - receiver = new JID("romeo@shakespeare.lit/home"); - - request = new IQ(); - request.setFrom(receiver); - request.setType(IQ.Type.get); - request.setTo(sender); - Element query = request.getElement().addElement("query"); - query.addNamespace("", Search.NAMESPACE_URI); - - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); - } - - @Test - public void testOnlyAcceptsPacketsFromLocalUsers() throws Exception { - - Configuration.getInstance().remove( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); - - search.process(request); - 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()); - } - - @Test - public void testReturnsQueryChildElement() throws Exception { - - search.process(request); - - Assert.assertEquals(1, queue.size()); - - IQ response = (IQ) queue.poll(); - Assert.assertNull(response.getError()); - - Assert.assertEquals(receiver, response.getTo()); - Assert.assertEquals(sender, response.getFrom()); - Assert.assertEquals(IQ.Type.result, response.getType()); - - Element query = response.getElement().element("query"); - Assert.assertNotNull(query); - - Assert.assertEquals(Search.NAMESPACE_URI, query.attributeValue("xmlns")); - } - - @Test - public void testReturnsInstructionsElement() throws Exception { - - search.process(request); - - Assert.assertEquals(1, queue.size()); - - IQ response = (IQ) queue.poll(); - Assert.assertNull(response.getError()); - - Assert.assertEquals(receiver, response.getTo()); - Assert.assertEquals(sender, response.getFrom()); - Assert.assertEquals(IQ.Type.result, response.getType()); - - String instructions = response.getElement() - .element("query") - .elementText("instructions"); - Assert.assertEquals(SearchGet.INSTRUCTIONS, instructions); - } - - - @Test - public void testReturnsDataFormElement() throws Exception { - - search.process(request); - - Assert.assertEquals(1, queue.size()); - - IQ response = (IQ) queue.poll(); - Assert.assertNull(response.getError()); - - Assert.assertEquals(receiver, response.getTo()); - Assert.assertEquals(sender, response.getFrom()); - Assert.assertEquals(IQ.Type.result, response.getType()); - - Element x = response.getElement() - .element("query") - .element("x"); - Assert.assertNotNull(x); - Assert.assertEquals(DataForm.NAMESPACE, x.attributeValue("xmlns")); - } + private IQ request; + private BlockingQueue queue = new LinkedBlockingQueue(); + + private SearchGet search; + private JID sender; + private JID receiver; + + @Before + public void setUp() throws Exception { + + queue = new LinkedBlockingQueue(); + + search = new SearchGet(queue); + + sender = new JID("channels.shakespeare.lit"); + receiver = new JID("romeo@shakespeare.lit/home"); + + request = new IQ(); + request.setFrom(receiver); + request.setType(IQ.Type.get); + request.setTo(sender); + Element query = request.getElement().addElement("query"); + query.addNamespace("", Search.NAMESPACE_URI); + + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); + } + + @Test + public void testOnlyAcceptsPacketsFromLocalUsers() throws Exception { + + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + + search.process(request); + 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()); + } + + @Test + public void testReturnsQueryChildElement() throws Exception { + + search.process(request); + + Assert.assertEquals(1, queue.size()); + + IQ response = (IQ) queue.poll(); + Assert.assertNull(response.getError()); + + Assert.assertEquals(receiver, response.getTo()); + Assert.assertEquals(sender, response.getFrom()); + Assert.assertEquals(IQ.Type.result, response.getType()); + + Element query = response.getElement().element("query"); + Assert.assertNotNull(query); + + Assert.assertEquals(Search.NAMESPACE_URI, query.attributeValue("xmlns")); + } + + @Test + public void testReturnsInstructionsElement() throws Exception { + + search.process(request); + + Assert.assertEquals(1, queue.size()); + + IQ response = (IQ) queue.poll(); + Assert.assertNull(response.getError()); + + Assert.assertEquals(receiver, response.getTo()); + Assert.assertEquals(sender, response.getFrom()); + Assert.assertEquals(IQ.Type.result, response.getType()); + + String instructions = response.getElement() + .element("query") + .elementText("instructions"); + Assert.assertEquals(SearchGet.INSTRUCTIONS, instructions); + } + + + @Test + public void testReturnsDataFormElement() throws Exception { + + search.process(request); + + Assert.assertEquals(1, queue.size()); + + IQ response = (IQ) queue.poll(); + Assert.assertNull(response.getError()); + + Assert.assertEquals(receiver, response.getTo()); + Assert.assertEquals(sender, response.getFrom()); + Assert.assertEquals(IQ.Type.result, response.getType()); + + Element x = response.getElement() + .element("query") + .element("x"); + Assert.assertNotNull(x); + Assert.assertEquals(DataForm.NAMESPACE, x.attributeValue("xmlns")); + } - @Test - public void testReturnsDataFormTitleElement() throws Exception { - - search.process(request); - - Assert.assertEquals(1, queue.size()); - - IQ response = (IQ) queue.poll(); - Assert.assertNull(response.getError()); - - Assert.assertEquals(receiver, response.getTo()); - Assert.assertEquals(sender, response.getFrom()); - Assert.assertEquals(IQ.Type.result, response.getType()); - - String title = response.getElement() - .element("query") - .element("x") - .elementText("title"); - Assert.assertNotNull(title); - Assert.assertEquals(SearchGet.TITLE, title); - } + @Test + public void testReturnsDataFormTitleElement() throws Exception { + + search.process(request); + + Assert.assertEquals(1, queue.size()); + + IQ response = (IQ) queue.poll(); + Assert.assertNull(response.getError()); + + Assert.assertEquals(receiver, response.getTo()); + Assert.assertEquals(sender, response.getFrom()); + Assert.assertEquals(IQ.Type.result, response.getType()); + + String title = response.getElement() + .element("query") + .element("x") + .elementText("title"); + Assert.assertNotNull(title); + Assert.assertEquals(SearchGet.TITLE, title); + } @Test public void testReturnsDataFormInstructionsElement() throws Exception { - - search.process(request); - - Assert.assertEquals(1, queue.size()); - - IQ response = (IQ) queue.poll(); - Assert.assertNull(response.getError()); - - Assert.assertEquals(receiver, response.getTo()); - Assert.assertEquals(sender, response.getFrom()); - Assert.assertEquals(IQ.Type.result, response.getType()); - - String instructions = response.getElement() - .element("query") - .element("x") - .elementText("instructions"); - Assert.assertNotNull(instructions); - Assert.assertEquals(SearchGet.INSTRUCTIONS, instructions); - } - - @Test - public void testReturnsDataFormTypeElement() throws Exception { - - search.process(request); - - Assert.assertEquals(1, queue.size()); - - IQ response = (IQ) queue.poll(); - Assert.assertNull(response.getError()); - - Assert.assertEquals(receiver, response.getTo()); - Assert.assertEquals(sender, response.getFrom()); - Assert.assertEquals(IQ.Type.result, response.getType()); - - Element formType = (Element) response.getElement() - .element("query") - .element("x") - .elements("field").get(0); - Assert.assertEquals(Search.NAMESPACE_URI, formType.elementText("value")); - Assert.assertEquals("hidden", formType.attributeValue("type")); - Assert.assertEquals("FORM_TYPE", formType.attributeValue("var")); - } - - @Test - public void testReturnsDataFormContentElement() throws Exception { - - search.process(request); - - Assert.assertEquals(1, queue.size()); - - IQ response = (IQ) queue.poll(); - Assert.assertNull(response.getError()); - - Assert.assertEquals(receiver, response.getTo()); - Assert.assertEquals(sender, response.getFrom()); - Assert.assertEquals(IQ.Type.result, response.getType()); - - Element formType = (Element) response.getElement() - .element("query") - .element("x") - .elements("field").get(1); - Assert.assertEquals("text-multi", formType.attributeValue("type")); - Assert.assertEquals("content", formType.attributeValue("var")); - Assert.assertEquals(SearchGet.CONTENT_FIELD_LABEL, formType.attributeValue("label")); - - } - - @Test - public void testReturnsDataFormAuthorElement() throws Exception { - - search.process(request); - - Assert.assertEquals(1, queue.size()); - - IQ response = (IQ) queue.poll(); - Assert.assertNull(response.getError()); - - Assert.assertEquals(receiver, response.getTo()); - Assert.assertEquals(sender, response.getFrom()); - Assert.assertEquals(IQ.Type.result, response.getType()); - - Element formType = (Element) response.getElement() - .element("query") - .element("x") - .elements("field").get(2); - Assert.assertEquals("jid-single", formType.attributeValue("type")); - Assert.assertEquals("author", formType.attributeValue("var")); - Assert.assertEquals(SearchGet.AUTHOR_FIELD_LABEL, formType.attributeValue("label")); - } - - @Test - public void testReturnsDataFormResultsPerPageElement() throws Exception { - - search.process(request); - - Assert.assertEquals(1, queue.size()); - - IQ response = (IQ) queue.poll(); - Assert.assertNull(response.getError()); - - Assert.assertEquals(receiver, response.getTo()); - Assert.assertEquals(sender, response.getFrom()); - Assert.assertEquals(IQ.Type.result, response.getType()); - - Element formType = (Element) response.getElement() - .element("query") - .element("x") - .elements("field").get(3); - Assert.assertEquals("fixed", formType.attributeValue("type")); - Assert.assertEquals("rpp", formType.attributeValue("var")); - Assert.assertEquals(SearchGet.RPP_FIELD_LABEL, formType.attributeValue("label")); - - } - - @Test - public void testReturnsDataFormPageElement() throws Exception { - - search.process(request); - - Assert.assertEquals(1, queue.size()); - - IQ response = (IQ) queue.poll(); - Assert.assertNull(response.getError()); - - Assert.assertEquals(receiver, response.getTo()); - Assert.assertEquals(sender, response.getFrom()); - Assert.assertEquals(IQ.Type.result, response.getType()); - - Element formType = (Element) response.getElement() - .element("query") - .element("x") - .elements("field").get(4); - Assert.assertEquals("fixed", formType.attributeValue("type")); - Assert.assertEquals("page", formType.attributeValue("var")); - Assert.assertEquals(SearchGet.PAGE_FIELD_LABEL, formType.attributeValue("label")); - } -} \ No newline at end of file + + search.process(request); + + Assert.assertEquals(1, queue.size()); + + IQ response = (IQ) queue.poll(); + Assert.assertNull(response.getError()); + + Assert.assertEquals(receiver, response.getTo()); + Assert.assertEquals(sender, response.getFrom()); + Assert.assertEquals(IQ.Type.result, response.getType()); + + String instructions = response.getElement() + .element("query") + .element("x") + .elementText("instructions"); + Assert.assertNotNull(instructions); + Assert.assertEquals(SearchGet.INSTRUCTIONS, instructions); + } + + @Test + public void testReturnsDataFormTypeElement() throws Exception { + + search.process(request); + + Assert.assertEquals(1, queue.size()); + + IQ response = (IQ) queue.poll(); + Assert.assertNull(response.getError()); + + Assert.assertEquals(receiver, response.getTo()); + Assert.assertEquals(sender, response.getFrom()); + Assert.assertEquals(IQ.Type.result, response.getType()); + + Element formType = (Element) response.getElement() + .element("query") + .element("x") + .elements("field").get(0); + Assert.assertEquals(Search.NAMESPACE_URI, formType.elementText("value")); + Assert.assertEquals("hidden", formType.attributeValue("type")); + Assert.assertEquals("FORM_TYPE", formType.attributeValue("var")); + } + + @Test + public void testReturnsDataFormContentElement() throws Exception { + + search.process(request); + + Assert.assertEquals(1, queue.size()); + + IQ response = (IQ) queue.poll(); + Assert.assertNull(response.getError()); + + Assert.assertEquals(receiver, response.getTo()); + Assert.assertEquals(sender, response.getFrom()); + Assert.assertEquals(IQ.Type.result, response.getType()); + + Element formType = (Element) response.getElement() + .element("query") + .element("x") + .elements("field").get(1); + Assert.assertEquals("text-multi", formType.attributeValue("type")); + Assert.assertEquals("content", formType.attributeValue("var")); + Assert.assertEquals(SearchGet.CONTENT_FIELD_LABEL, formType.attributeValue("label")); + + } + + @Test + public void testReturnsDataFormAuthorElement() throws Exception { + + search.process(request); + + Assert.assertEquals(1, queue.size()); + + IQ response = (IQ) queue.poll(); + Assert.assertNull(response.getError()); + + Assert.assertEquals(receiver, response.getTo()); + Assert.assertEquals(sender, response.getFrom()); + Assert.assertEquals(IQ.Type.result, response.getType()); + + Element formType = (Element) response.getElement() + .element("query") + .element("x") + .elements("field").get(2); + Assert.assertEquals("jid-single", formType.attributeValue("type")); + Assert.assertEquals("author", formType.attributeValue("var")); + Assert.assertEquals(SearchGet.AUTHOR_FIELD_LABEL, formType.attributeValue("label")); + } + + @Test + public void testReturnsDataFormResultsPerPageElement() throws Exception { + + search.process(request); + + Assert.assertEquals(1, queue.size()); + + IQ response = (IQ) queue.poll(); + Assert.assertNull(response.getError()); + + Assert.assertEquals(receiver, response.getTo()); + Assert.assertEquals(sender, response.getFrom()); + Assert.assertEquals(IQ.Type.result, response.getType()); + + Element formType = (Element) response.getElement() + .element("query") + .element("x") + .elements("field").get(3); + Assert.assertEquals("fixed", formType.attributeValue("type")); + Assert.assertEquals("rpp", formType.attributeValue("var")); + Assert.assertEquals(SearchGet.RPP_FIELD_LABEL, formType.attributeValue("label")); + + } + + @Test + public void testReturnsDataFormPageElement() throws Exception { + + search.process(request); + + Assert.assertEquals(1, queue.size()); + + IQ response = (IQ) queue.poll(); + Assert.assertNull(response.getError()); + + Assert.assertEquals(receiver, response.getTo()); + Assert.assertEquals(sender, response.getFrom()); + Assert.assertEquals(IQ.Type.result, response.getType()); + + Element formType = (Element) response.getElement() + .element("query") + .element("x") + .elements("field").get(4); + Assert.assertEquals("fixed", formType.attributeValue("type")); + Assert.assertEquals("page", formType.attributeValue("var")); + Assert.assertEquals(SearchGet.PAGE_FIELD_LABEL, formType.attributeValue("label")); + } +} diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchSetTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchSetTest.java index b8922248..2c375a6d 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchSetTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/search/SearchSetTest.java @@ -28,453 +28,453 @@ public class SearchSetTest extends IQTestHandler { - private IQ request; - private BlockingQueue queue = new LinkedBlockingQueue(); - - private ChannelManager channelManager; - - private SearchSet search; - private JID sender; - private JID receiver; - private IQ setStanza; - - private String nodeItemNodeId1 = "/users/romeo@montague.lit/home"; - private String nodeItemNodeId2 = "/users/julet@capulet.lit/home"; - private String nodeItemId1 = "5w382609806986536982502859083409"; - private String nodeItemId2 = "fg455g542hg4hhtfgh4554hg5g5g54h4F"; - - @Before - public void setUp() throws Exception { - - queue = new LinkedBlockingQueue(); - channelManager = Mockito.mock(ChannelManager.class); - - search = new SearchSet(queue, channelManager); - - sender = new JID("channels.shakespeare.lit"); - receiver = new JID("romeo@shakespeare.lit/home"); - - request = new IQ(); - request.setFrom(receiver); - request.setType(IQ.Type.set); - request.setTo(sender); - Element query = request.getElement().addElement("query"); - query.addNamespace("", Search.NAMESPACE_URI); - - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); - - setStanza = readStanzaAsIq("/iq/search/set.stanza"); - } - - @Test - public void testOnlyAcceptsPacketsFromLocalUsers() throws Exception { - - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); - - search.process(request); - 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()); - } - - @Test - public void testReturnsErrorIfDataFormAbsent() throws Exception { - - search.process(request); - 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 testReturnsErrorIfNamespaceIncorrect() throws Exception { - Element query = request.getElement().element("query"); - Element x = query.addElement("x"); - x.addAttribute("xmlns", "some:other:namespace"); - - search.process(request); - 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 testReturnsErrorIfTypeIncorrect() throws Exception { - Element query = request.getElement().element("query"); - Element x = query.addElement("x"); - x.addAttribute("xmlns", DataForm.NAMESPACE); - x.addAttribute("type", "wrongtype"); - - search.process(request); - 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 testReturnsErrorIfFieldFormTypeIsIncorrect() throws Exception { - Element query = request.getElement().element("query"); - Element x = query.addElement("x"); - x.addAttribute("xmlns", DataForm.NAMESPACE); - x.addAttribute("type", "submit"); - - Element field = x.addElement("field"); - field.addAttribute("var", "NOT_FORM_TYPE"); - - search.process(request); - 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 testReturnsErrorIfFieldFormTypeValueIsIncorrect() - throws Exception { - Element query = request.getElement().element("query"); - Element x = query.addElement("x"); - x.addAttribute("xmlns", DataForm.NAMESPACE); - x.addAttribute("type", "submit"); - - Element field = x.addElement("field"); - field.addAttribute("var", "FORM_TYPE"); - field.addElement("value").addText("not:search:type"); - - search.process(request); - 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 testReturnsErrorIfTooFewFields() throws Exception { - Element query = request.getElement().element("query"); - Element x = query.addElement("x"); - x.addAttribute("xmlns", DataForm.NAMESPACE); - x.addAttribute("type", "submit"); - - Element field = x.addElement("field"); - field.addAttribute("var", "FORM_TYPE"); - field.addElement("value").addText(DataForm.NAMESPACE); - - Element singleField = x.addElement("field"); - singleField.addAttribute("var", "page"); - - search.process(request); - 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 testReturnsErrorIfContentValueIncorrect() throws Exception { - Element query = request.getElement().element("query"); - Element x = query.addElement("x"); - x.addAttribute("xmlns", DataForm.NAMESPACE); - x.addAttribute("type", "submit"); - - Element field = x.addElement("field"); - field.addAttribute("var", "FORM_TYPE"); - field.addElement("value").addText(Search.NAMESPACE_URI); - - Element singleField = x.addElement("field"); - singleField.addAttribute("var", "content"); - singleField.addElement("value"); - - search.process(request); - 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 testReturnsErrorIfAuthorValueIncorrect() throws Exception { - Element query = request.getElement().element("query"); - Element x = query.addElement("x"); - x.addAttribute("xmlns", DataForm.NAMESPACE); - x.addAttribute("type", "submit"); - - Element field = x.addElement("field"); - field.addAttribute("var", "FORM_TYPE"); - field.addElement("value").addText(Search.NAMESPACE_URI); - - Element singleField = x.addElement("field"); - singleField.addAttribute("var", "author"); - singleField.addElement("value"); - - search.process(request); - 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 testReturnsErrorIfAuthorValueInvalid() throws Exception { - Element query = request.getElement().element("query"); - Element x = query.addElement("x"); - x.addAttribute("xmlns", DataForm.NAMESPACE); - x.addAttribute("type", "submit"); - - Element field = x.addElement("field"); - field.addAttribute("var", "FORM_TYPE"); - field.addElement("value").addText(Search.NAMESPACE_URI); - - Element singleField = x.addElement("field"); - singleField.addAttribute("var", "author"); - singleField.addElement("value").setText("user@broken@jid.com"); - - search.process(request); - 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 testReturnsErrorIfPageValueIncorrect() throws Exception { - Element query = request.getElement().element("query"); - Element x = query.addElement("x"); - x.addAttribute("xmlns", DataForm.NAMESPACE); - x.addAttribute("type", "submit"); - - Element field = x.addElement("field"); - field.addAttribute("var", "FORM_TYPE"); - field.addElement("value").addText(Search.NAMESPACE_URI); - - Element singleField = x.addElement("field"); - singleField.addAttribute("var", "page"); - singleField.addElement("value").setText("sausages"); - - search.process(request); - 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 testReturnsErrorIfRppValueIncorrect() throws Exception { - Element query = request.getElement().element("query"); - Element x = query.addElement("x"); - x.addAttribute("xmlns", DataForm.NAMESPACE); - x.addAttribute("type", "submit"); - - Element field = x.addElement("field"); - field.addAttribute("var", "FORM_TYPE"); - field.addElement("value").addText(Search.NAMESPACE_URI); - - Element singleField = x.addElement("field"); - singleField.addAttribute("var", "rpp"); - singleField.addElement("value").setText("bananas"); - - search.process(request); - 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 testReturnsErrorOnChannelManagerException() throws Exception { - Mockito.when( - channelManager.performSearch(Mockito.any(JID.class), - Mockito.any(List.class), Mockito.any(JID.class), - Mockito.anyInt(), Mockito.anyInt())).thenThrow( - new NodeStoreException()); - - search.process(setStanza); - - Packet response = queue.poll(); - PacketError error = response.getError(); - Assert.assertNotNull(error); - Assert.assertEquals(PacketError.Type.wait, error.getType()); - Assert.assertEquals(PacketError.Condition.internal_server_error, - error.getCondition()); - } - - @Test - public void testNoResultsReturnsExpectedStanza() throws Exception { - NodeItem[] items = new NodeItem[0]; - CloseableIterator itemList = new ClosableIteratorImpl( - Arrays.asList(items).iterator()); - - Mockito.doReturn(itemList) - .when(channelManager) - .performSearch(Mockito.any(JID.class), Mockito.any(List.class), - Mockito.any(JID.class), Mockito.anyInt(), Mockito.anyInt()); - - search.process(setStanza); - - Packet response = queue.poll(); - Element query = response.getElement().element("query"); - Assert.assertNotNull(query); - Assert.assertEquals(Search.NAMESPACE_URI, query.attributeValue("xmlns")); - Assert.assertEquals(0, query.elements().size()); - } - - @Test - public void testReturnsDataInExpectedFormat() throws Exception { - NodeItemImpl item1 = new NodeItemImpl(nodeItemNodeId1, nodeItemId1, - new Date(), ""); - NodeItemImpl item2 = new NodeItemImpl(nodeItemNodeId2, nodeItemId2, - new Date(), ""); - - NodeItem[] itemArray = new NodeItem[2]; - itemArray[0] = item1; - itemArray[1] = item2; - - CloseableIterator itemList = new ClosableIteratorImpl( - Arrays.asList(itemArray).iterator()); - - Mockito.doReturn(itemList) - .when(channelManager) - .performSearch(Mockito.any(JID.class), Mockito.any(List.class), - Mockito.any(JID.class), Mockito.anyInt(), Mockito.anyInt()); - - search.process(setStanza); - - Packet response = queue.poll(); - Element query = response.getElement().element("query"); - Assert.assertNotNull(query); - - Element x = query.element("x"); - Assert.assertNotNull(x); - - Element field = x.element("field"); - Assert.assertNotNull(field); - Assert.assertEquals("FORM_TYPE", field.attributeValue("var")); - Assert.assertEquals(Search.NAMESPACE_URI, field.element("value") - .getText()); - - Element reported = x.element("reported"); - Assert.assertNotNull(reported); - - List fields = reported.elements("field"); - Assert.assertEquals(3, fields.size()); - - Assert.assertEquals("node", fields.get(0).attributeValue("var")); - Assert.assertEquals("Node", fields.get(0).attributeValue("label")); - Assert.assertEquals("text-single", fields.get(0).attributeValue("type")); - - Assert.assertEquals("id", fields.get(1).attributeValue("var")); - Assert.assertEquals("Item ID", fields.get(1).attributeValue("label")); - Assert.assertEquals("text-single", fields.get(1).attributeValue("type")); - - Assert.assertEquals("entry", fields.get(2).attributeValue("var")); - Assert.assertEquals("Item", fields.get(2).attributeValue("label")); - Assert.assertEquals("xml", fields.get(2) - .attributeValue("type")); - - List items = x.elements("item"); - Assert.assertEquals(2, items.size()); - - List itemFields = items.get(0).elements("field"); - Assert.assertEquals(3, itemFields.size()); - Assert.assertEquals("node", itemFields.get(0).attributeValue("var")); - Assert.assertEquals(nodeItemNodeId1, itemFields.get(0).element("value") - .getText()); - - Assert.assertEquals("id", itemFields.get(1).attributeValue("var")); - Assert.assertEquals(nodeItemId1, itemFields.get(1).element("value") - .getText()); - - Assert.assertEquals("entry", itemFields.get(2).attributeValue("var")); - Assert.assertEquals(1, - itemFields.get(2).element("value").elements("entry").size()); - - itemFields = items.get(1).elements("field"); - Assert.assertEquals(3, itemFields.size()); - Assert.assertEquals("node", itemFields.get(0).attributeValue("var")); - Assert.assertEquals(nodeItemNodeId2, itemFields.get(0).element("value") - .getText()); - - Assert.assertEquals("id", itemFields.get(1).attributeValue("var")); - Assert.assertEquals(nodeItemId2, itemFields.get(1).element("value") - .getText()); - - Assert.assertEquals("entry", itemFields.get(2).attributeValue("var")); - Assert.assertEquals(1, - itemFields.get(2).element("value").elements("entry2").size()); - } - - @Test - public void testBadlyFormedSourceDataIsIgnored() throws Exception { - NodeItemImpl item1 = new NodeItemImpl(nodeItemNodeId1, nodeItemId1, - new Date(), ""); - NodeItemImpl item2 = new NodeItemImpl(nodeItemNodeId2, nodeItemId2, - new Date(), ""); - - NodeItem[] itemArray = new NodeItem[2]; - itemArray[0] = item1; - itemArray[1] = item2; - - CloseableIterator itemList = new ClosableIteratorImpl( - Arrays.asList(itemArray).iterator()); - - Mockito.doReturn(itemList) - .when(channelManager) - .performSearch(Mockito.any(JID.class), Mockito.any(List.class), - Mockito.any(JID.class), Mockito.anyInt(), Mockito.anyInt()); - - search.process(setStanza); + private IQ request; + private BlockingQueue queue = new LinkedBlockingQueue(); + + private ChannelManager channelManager; + + private SearchSet search; + private JID sender; + private JID receiver; + private IQ setStanza; + + private String nodeItemNodeId1 = "/users/romeo@montague.lit/home"; + private String nodeItemNodeId2 = "/users/julet@capulet.lit/home"; + private String nodeItemId1 = "5w382609806986536982502859083409"; + private String nodeItemId2 = "fg455g542hg4hhtfgh4554hg5g5g54h4F"; + + @Before + public void setUp() throws Exception { + + queue = new LinkedBlockingQueue(); + channelManager = Mockito.mock(ChannelManager.class); + + search = new SearchSet(queue, channelManager); + + sender = new JID("channels.shakespeare.lit"); + receiver = new JID("romeo@shakespeare.lit/home"); + + request = new IQ(); + request.setFrom(receiver); + request.setType(IQ.Type.set); + request.setTo(sender); + Element query = request.getElement().addElement("query"); + query.addNamespace("", Search.NAMESPACE_URI); + + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); + + setStanza = readStanzaAsIq("/iq/search/set.stanza"); + } + + @Test + public void testOnlyAcceptsPacketsFromLocalUsers() throws Exception { + + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); + + search.process(request); + 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()); + } + + @Test + public void testReturnsErrorIfDataFormAbsent() throws Exception { + + search.process(request); + 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 testReturnsErrorIfNamespaceIncorrect() throws Exception { + Element query = request.getElement().element("query"); + Element x = query.addElement("x"); + x.addAttribute("xmlns", "some:other:namespace"); + + search.process(request); + 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 testReturnsErrorIfTypeIncorrect() throws Exception { + Element query = request.getElement().element("query"); + Element x = query.addElement("x"); + x.addAttribute("xmlns", DataForm.NAMESPACE); + x.addAttribute("type", "wrongtype"); + + search.process(request); + 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 testReturnsErrorIfFieldFormTypeIsIncorrect() throws Exception { + Element query = request.getElement().element("query"); + Element x = query.addElement("x"); + x.addAttribute("xmlns", DataForm.NAMESPACE); + x.addAttribute("type", "submit"); + + Element field = x.addElement("field"); + field.addAttribute("var", "NOT_FORM_TYPE"); + + search.process(request); + 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 testReturnsErrorIfFieldFormTypeValueIsIncorrect() + throws Exception { + Element query = request.getElement().element("query"); + Element x = query.addElement("x"); + x.addAttribute("xmlns", DataForm.NAMESPACE); + x.addAttribute("type", "submit"); + + Element field = x.addElement("field"); + field.addAttribute("var", "FORM_TYPE"); + field.addElement("value").addText("not:search:type"); + + search.process(request); + 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 testReturnsErrorIfTooFewFields() throws Exception { + Element query = request.getElement().element("query"); + Element x = query.addElement("x"); + x.addAttribute("xmlns", DataForm.NAMESPACE); + x.addAttribute("type", "submit"); + + Element field = x.addElement("field"); + field.addAttribute("var", "FORM_TYPE"); + field.addElement("value").addText(DataForm.NAMESPACE); + + Element singleField = x.addElement("field"); + singleField.addAttribute("var", "page"); + + search.process(request); + 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 testReturnsErrorIfContentValueIncorrect() throws Exception { + Element query = request.getElement().element("query"); + Element x = query.addElement("x"); + x.addAttribute("xmlns", DataForm.NAMESPACE); + x.addAttribute("type", "submit"); + + Element field = x.addElement("field"); + field.addAttribute("var", "FORM_TYPE"); + field.addElement("value").addText(Search.NAMESPACE_URI); + + Element singleField = x.addElement("field"); + singleField.addAttribute("var", "content"); + singleField.addElement("value"); + + search.process(request); + 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 testReturnsErrorIfAuthorValueIncorrect() throws Exception { + Element query = request.getElement().element("query"); + Element x = query.addElement("x"); + x.addAttribute("xmlns", DataForm.NAMESPACE); + x.addAttribute("type", "submit"); + + Element field = x.addElement("field"); + field.addAttribute("var", "FORM_TYPE"); + field.addElement("value").addText(Search.NAMESPACE_URI); + + Element singleField = x.addElement("field"); + singleField.addAttribute("var", "author"); + singleField.addElement("value"); + + search.process(request); + 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 testReturnsErrorIfAuthorValueInvalid() throws Exception { + Element query = request.getElement().element("query"); + Element x = query.addElement("x"); + x.addAttribute("xmlns", DataForm.NAMESPACE); + x.addAttribute("type", "submit"); + + Element field = x.addElement("field"); + field.addAttribute("var", "FORM_TYPE"); + field.addElement("value").addText(Search.NAMESPACE_URI); + + Element singleField = x.addElement("field"); + singleField.addAttribute("var", "author"); + singleField.addElement("value").setText("user@broken@jid.com"); + + search.process(request); + 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 testReturnsErrorIfPageValueIncorrect() throws Exception { + Element query = request.getElement().element("query"); + Element x = query.addElement("x"); + x.addAttribute("xmlns", DataForm.NAMESPACE); + x.addAttribute("type", "submit"); + + Element field = x.addElement("field"); + field.addAttribute("var", "FORM_TYPE"); + field.addElement("value").addText(Search.NAMESPACE_URI); + + Element singleField = x.addElement("field"); + singleField.addAttribute("var", "page"); + singleField.addElement("value").setText("sausages"); + + search.process(request); + 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 testReturnsErrorIfRppValueIncorrect() throws Exception { + Element query = request.getElement().element("query"); + Element x = query.addElement("x"); + x.addAttribute("xmlns", DataForm.NAMESPACE); + x.addAttribute("type", "submit"); + + Element field = x.addElement("field"); + field.addAttribute("var", "FORM_TYPE"); + field.addElement("value").addText(Search.NAMESPACE_URI); + + Element singleField = x.addElement("field"); + singleField.addAttribute("var", "rpp"); + singleField.addElement("value").setText("bananas"); + + search.process(request); + 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 testReturnsErrorOnChannelManagerException() throws Exception { + Mockito.when( + channelManager.performSearch(Mockito.any(JID.class), + Mockito.any(List.class), Mockito.any(JID.class), + Mockito.anyInt(), Mockito.anyInt())).thenThrow( + new NodeStoreException()); + + search.process(setStanza); + + Packet response = queue.poll(); + PacketError error = response.getError(); + Assert.assertNotNull(error); + Assert.assertEquals(PacketError.Type.wait, error.getType()); + Assert.assertEquals(PacketError.Condition.internal_server_error, + error.getCondition()); + } + + @Test + public void testNoResultsReturnsExpectedStanza() throws Exception { + NodeItem[] items = new NodeItem[0]; + CloseableIterator itemList = new ClosableIteratorImpl( + Arrays.asList(items).iterator()); + + Mockito.doReturn(itemList) + .when(channelManager) + .performSearch(Mockito.any(JID.class), Mockito.any(List.class), + Mockito.any(JID.class), Mockito.anyInt(), Mockito.anyInt()); + + search.process(setStanza); + + Packet response = queue.poll(); + Element query = response.getElement().element("query"); + Assert.assertNotNull(query); + Assert.assertEquals(Search.NAMESPACE_URI, query.attributeValue("xmlns")); + Assert.assertEquals(0, query.elements().size()); + } + + @Test + public void testReturnsDataInExpectedFormat() throws Exception { + NodeItemImpl item1 = new NodeItemImpl(nodeItemNodeId1, nodeItemId1, + new Date(), ""); + NodeItemImpl item2 = new NodeItemImpl(nodeItemNodeId2, nodeItemId2, + new Date(), ""); + + NodeItem[] itemArray = new NodeItem[2]; + itemArray[0] = item1; + itemArray[1] = item2; + + CloseableIterator itemList = new ClosableIteratorImpl( + Arrays.asList(itemArray).iterator()); + + Mockito.doReturn(itemList) + .when(channelManager) + .performSearch(Mockito.any(JID.class), Mockito.any(List.class), + Mockito.any(JID.class), Mockito.anyInt(), Mockito.anyInt()); + + search.process(setStanza); + + Packet response = queue.poll(); + Element query = response.getElement().element("query"); + Assert.assertNotNull(query); + + Element x = query.element("x"); + Assert.assertNotNull(x); + + Element field = x.element("field"); + Assert.assertNotNull(field); + Assert.assertEquals("FORM_TYPE", field.attributeValue("var")); + Assert.assertEquals(Search.NAMESPACE_URI, field.element("value") + .getText()); + + Element reported = x.element("reported"); + Assert.assertNotNull(reported); + + List fields = reported.elements("field"); + Assert.assertEquals(3, fields.size()); + + Assert.assertEquals("node", fields.get(0).attributeValue("var")); + Assert.assertEquals("Node", fields.get(0).attributeValue("label")); + Assert.assertEquals("text-single", fields.get(0).attributeValue("type")); + + Assert.assertEquals("id", fields.get(1).attributeValue("var")); + Assert.assertEquals("Item ID", fields.get(1).attributeValue("label")); + Assert.assertEquals("text-single", fields.get(1).attributeValue("type")); + + Assert.assertEquals("entry", fields.get(2).attributeValue("var")); + Assert.assertEquals("Item", fields.get(2).attributeValue("label")); + Assert.assertEquals("xml", fields.get(2) + .attributeValue("type")); + + List items = x.elements("item"); + Assert.assertEquals(2, items.size()); + + List itemFields = items.get(0).elements("field"); + Assert.assertEquals(3, itemFields.size()); + Assert.assertEquals("node", itemFields.get(0).attributeValue("var")); + Assert.assertEquals(nodeItemNodeId1, itemFields.get(0).element("value") + .getText()); + + Assert.assertEquals("id", itemFields.get(1).attributeValue("var")); + Assert.assertEquals(nodeItemId1, itemFields.get(1).element("value") + .getText()); + + Assert.assertEquals("entry", itemFields.get(2).attributeValue("var")); + Assert.assertEquals(1, + itemFields.get(2).element("value").elements("entry").size()); + + itemFields = items.get(1).elements("field"); + Assert.assertEquals(3, itemFields.size()); + Assert.assertEquals("node", itemFields.get(0).attributeValue("var")); + Assert.assertEquals(nodeItemNodeId2, itemFields.get(0).element("value") + .getText()); + + Assert.assertEquals("id", itemFields.get(1).attributeValue("var")); + Assert.assertEquals(nodeItemId2, itemFields.get(1).element("value") + .getText()); + + Assert.assertEquals("entry", itemFields.get(2).attributeValue("var")); + Assert.assertEquals(1, + itemFields.get(2).element("value").elements("entry2").size()); + } + + @Test + public void testBadlyFormedSourceDataIsIgnored() throws Exception { + NodeItemImpl item1 = new NodeItemImpl(nodeItemNodeId1, nodeItemId1, + new Date(), ""); + NodeItemImpl item2 = new NodeItemImpl(nodeItemNodeId2, nodeItemId2, + new Date(), ""); + + NodeItem[] itemArray = new NodeItem[2]; + itemArray[0] = item1; + itemArray[1] = item2; + + CloseableIterator itemList = new ClosableIteratorImpl( + Arrays.asList(itemArray).iterator()); + + Mockito.doReturn(itemList) + .when(channelManager) + .performSearch(Mockito.any(JID.class), Mockito.any(List.class), + Mockito.any(JID.class), Mockito.anyInt(), Mockito.anyInt()); + + search.process(setStanza); - Packet response = queue.poll(); - Element query = response.getElement().element("query"); - - Assert.assertNotNull(query); + Packet response = queue.poll(); + Element query = response.getElement().element("query"); + + Assert.assertNotNull(query); - Element x = query.element("x"); - Assert.assertNotNull(x); + Element x = query.element("x"); + Assert.assertNotNull(x); - List items = x.elements("item"); - Assert.assertEquals(1, items.size()); - - List itemFields = items.get(0).elements("field"); - Assert.assertEquals(3, itemFields.size()); - Assert.assertEquals("node", itemFields.get(0).attributeValue("var")); - Assert.assertEquals(nodeItemNodeId2, itemFields.get(0).element("value") - .getText()); - - Assert.assertEquals("id", itemFields.get(1).attributeValue("var")); - Assert.assertEquals(nodeItemId2, itemFields.get(1).element("value") - .getText()); - - Assert.assertEquals("entry", itemFields.get(2).attributeValue("var")); - Assert.assertEquals(1, - itemFields.get(2).element("value").elements("entry2").size()); - } -} \ No newline at end of file + List items = x.elements("item"); + Assert.assertEquals(1, items.size()); + + List itemFields = items.get(0).elements("field"); + Assert.assertEquals(3, itemFields.size()); + Assert.assertEquals("node", itemFields.get(0).attributeValue("var")); + Assert.assertEquals(nodeItemNodeId2, itemFields.get(0).element("value") + .getText()); + + Assert.assertEquals("id", itemFields.get(1).attributeValue("var")); + Assert.assertEquals(nodeItemId2, itemFields.get(1).element("value") + .getText()); + + Assert.assertEquals("entry", itemFields.get(2).attributeValue("var")); + Assert.assertEquals(1, + itemFields.get(2).element("value").elements("entry2").size()); + } +} diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/AffiliationProcessorTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/AffiliationProcessorTest.java index 4ef1c53e..9bb22686 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/AffiliationProcessorTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/AffiliationProcessorTest.java @@ -26,95 +26,95 @@ import org.xmpp.resultsetmanagement.ResultSetImpl; public class AffiliationProcessorTest extends IQTestHandler { - private Message message; - private AffiliationProcessor affiliationProcessor; - private Element affiliation; - private Element affiliations; - - private BlockingQueue queue = new LinkedBlockingQueue(); - private ChannelManager channelManager; - - private JID jid = new JID("juliet@shakespeare.lit"); - - @Before - public void setUp() throws Exception { - - Properties configuration = new Properties(); - configuration.setProperty("server.domain.channels", - "channels.shakespeare.lit"); - - channelManager = Mockito.mock(ChannelManager.class); - Configuration.getInstance().remove( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); - - ArrayList subscribers = new ArrayList(); - subscribers.add(new NodeMembershipImpl( - "/user/romeo@shakespeare.lit/posts", jid, - Subscriptions.subscribed, Affiliations.member, null)); - Mockito.doReturn(new ResultSetImpl(subscribers)) - .when(channelManager).getNodeMemberships(Mockito.anyString()); - - affiliationProcessor = new AffiliationProcessor(queue, configuration, - channelManager); - - message = new Message(); - message.setType(Message.Type.headline); - Element event = message.addChildElement("event", - JabberPubsub.NS_PUBSUB_EVENT); - - affiliations = event.addElement("affiliations"); - affiliations.addAttribute("node", "/user/juliet@denmark.lit/posts"); - - affiliation = affiliations.addElement("affiliation"); - affiliation.addAttribute("jid", "romeo@shakespeare.lit"); - affiliation.addAttribute("affiliation", - Affiliations.publisher.toString()); - } - - @Test(expected = IllegalArgumentException.class) - public void testInvalidAffiliationValueThrowsException() throws Exception { - Message badAffiliationValue = message.createCopy(); - badAffiliationValue.getElement().element("event").element("affiliations") - .element("affiliation").addAttribute("affiliation", "invalid"); - affiliationProcessor.process(badAffiliationValue); - } - - @Test - public void testMissingAffiliationElementDoesNotCauseError() - throws Exception { - Message noAffiliationElement = message.createCopy(); - noAffiliationElement.getElement().element("event").element("affiliations") - .element("affiliation").detach(); - affiliationProcessor.process(noAffiliationElement); - } - - @Test - public void testEventForLocalNodeIsIgnored() throws Exception { - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); - affiliationProcessor.process(message); - Assert.assertEquals(0, queue.size()); - } - - @Test(expected = NodeStoreException.class) - public void testNodeStoreExceptionIsThrownWhenExpected() throws Exception { - - Mockito.doThrow(new NodeStoreException()) - .when(channelManager) - .setUserAffiliation(Mockito.anyString(), - Mockito.any(JID.class), Mockito.any(Affiliations.class)); - affiliationProcessor.process(message); - } - - @Test - public void testNotificationsAreSentOutAsExpected() throws Exception { - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); - affiliationProcessor.process(message); - - Assert.assertEquals(1, queue.size()); - message.setTo(jid.toString()); - Message received = (Message) queue.poll(); - Assert.assertEquals(message.toString(), received.toString()); - } -} \ No newline at end of file + private Message message; + private AffiliationProcessor affiliationProcessor; + private Element affiliation; + private Element affiliations; + + private BlockingQueue queue = new LinkedBlockingQueue(); + private ChannelManager channelManager; + + private JID jid = new JID("juliet@shakespeare.lit"); + + @Before + public void setUp() throws Exception { + + Properties configuration = new Properties(); + configuration.setProperty("server.domain.channels", + "channels.shakespeare.lit"); + + channelManager = Mockito.mock(ChannelManager.class); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + + ArrayList subscribers = new ArrayList(); + subscribers.add(new NodeMembershipImpl( + "/user/romeo@shakespeare.lit/posts", jid, + Subscriptions.subscribed, Affiliations.member, null)); + Mockito.doReturn(new ResultSetImpl(subscribers)) + .when(channelManager).getNodeMemberships(Mockito.anyString()); + + affiliationProcessor = new AffiliationProcessor(queue, configuration, + channelManager); + + message = new Message(); + message.setType(Message.Type.headline); + Element event = message.addChildElement("event", + JabberPubsub.NS_PUBSUB_EVENT); + + affiliations = event.addElement("affiliations"); + affiliations.addAttribute("node", "/user/juliet@denmark.lit/posts"); + + affiliation = affiliations.addElement("affiliation"); + affiliation.addAttribute("jid", "romeo@shakespeare.lit"); + affiliation.addAttribute("affiliation", + Affiliations.publisher.toString()); + } + + @Test(expected = IllegalArgumentException.class) + public void testInvalidAffiliationValueThrowsException() throws Exception { + Message badAffiliationValue = message.createCopy(); + badAffiliationValue.getElement().element("event").element("affiliations") + .element("affiliation").addAttribute("affiliation", "invalid"); + affiliationProcessor.process(badAffiliationValue); + } + + @Test + public void testMissingAffiliationElementDoesNotCauseError() + throws Exception { + Message noAffiliationElement = message.createCopy(); + noAffiliationElement.getElement().element("event").element("affiliations") + .element("affiliation").detach(); + affiliationProcessor.process(noAffiliationElement); + } + + @Test + public void testEventForLocalNodeIsIgnored() throws Exception { + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); + affiliationProcessor.process(message); + Assert.assertEquals(0, queue.size()); + } + + @Test(expected = NodeStoreException.class) + public void testNodeStoreExceptionIsThrownWhenExpected() throws Exception { + + Mockito.doThrow(new NodeStoreException()) + .when(channelManager) + .setUserAffiliation(Mockito.anyString(), + Mockito.any(JID.class), Mockito.any(Affiliations.class)); + affiliationProcessor.process(message); + } + + @Test + public void testNotificationsAreSentOutAsExpected() throws Exception { + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); + affiliationProcessor.process(message); + + Assert.assertEquals(1, queue.size()); + message.setTo(jid.toString()); + Message received = (Message) queue.poll(); + Assert.assertEquals(message.toString(), received.toString()); + } +} diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/ConfigurationProcessorTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/ConfigurationProcessorTest.java index 8d2bb5ef..91897a37 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/ConfigurationProcessorTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/ConfigurationProcessorTest.java @@ -27,106 +27,106 @@ import org.xmpp.resultsetmanagement.ResultSetImpl; public class ConfigurationProcessorTest extends IQTestHandler { - private Message message; - private ConfigurationProcessor configurationProcessor; - private Element configurationElement; - private Element dataForm; - - private BlockingQueue queue = new LinkedBlockingQueue(); - private ChannelManager channelManager; - - private JID jid = new JID("juliet@shakespeare.lit"); - - @Before - public void setUp() throws Exception { - - Properties configuration = new Properties(); - configuration.setProperty("server.domain.channels", - "chgnnels.shakespeare.lit"); - - channelManager = Mockito.mock(ChannelManager.class); - Configuration.getInstance().remove( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); - - ArrayList members = new ArrayList(); - members.add(new NodeMembershipImpl( - "/user/romeo@denmark.lit/posts", jid, - Subscriptions.subscribed, Affiliations.member, null)); - Mockito.doReturn(new ResultSetImpl(members)) - .when(channelManager).getNodeMemberships(Mockito.anyString()); - - configurationProcessor = new ConfigurationProcessor(queue, - configuration, channelManager); - - HashMap nodeConfiguration = new HashMap(); - nodeConfiguration.put("config1", "value1"); - - Helper helper = Mockito.mock(Helper.class); - Mockito.when(helper.getValues()).thenReturn(nodeConfiguration); - configurationProcessor.setConfigurationHelper(helper); - - message = new Message(); - message.setType(Message.Type.headline); - Element event = message.addChildElement("event", - JabberPubsub.NS_PUBSUB_EVENT); - - configurationElement = event.addElement("configuration"); - configurationElement.addAttribute("jid", "romeo@shakespeare.lit"); - configurationElement.addAttribute("node", - "/user/juliet@denmark.lit/posts"); - dataForm = configurationElement.addElement("x"); - dataForm.addNamespace("", "jabber:x:data"); - dataForm.addAttribute("type", "result"); - Element field = dataForm.addElement("field"); - field.addAttribute("var", "config1"); - Element value = field.addElement("value"); - value.addText("config1"); - } - - @Test - public void testEventForLocalNodeIsIgnored() throws Exception { - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); - configurationProcessor.process(message); - Assert.assertEquals(0, queue.size()); - } - - @Test - public void testRemoteNodeIsCreatedIfNotInDataStore() throws Exception { - Mockito.when(channelManager.nodeExists(Mockito.anyString())) - .thenReturn(false); - - configurationProcessor.process(message); - - Mockito.verify(channelManager, Mockito.times(1)).addRemoteNode( - Mockito.anyString()); - } - - @Test - public void testExpectedDetailsAreSavedToTheDataStore() throws Exception { - Mockito.when(channelManager.nodeExists(Mockito.anyString())) - .thenReturn(true); - - configurationProcessor.process(message); - - HashMap match = new HashMap(); - match.put("config1", "value1"); - - Mockito.verify(channelManager, Mockito.times(1)).setNodeConf( - Mockito.anyString(), Mockito.eq(match)); - Mockito.verify(channelManager, Mockito.times(0)).addRemoteNode( - Mockito.anyString()); - } - - @Test - public void testNotificationsAreSentOutAsExpected() throws Exception { - - configurationProcessor.process(message); - - Assert.assertEquals(1, queue.size()); - message.setTo(jid.toString()); - Assert.assertEquals(message.toString(), queue.poll().toString()); - } -} \ No newline at end of file + private Message message; + private ConfigurationProcessor configurationProcessor; + private Element configurationElement; + private Element dataForm; + + private BlockingQueue queue = new LinkedBlockingQueue(); + private ChannelManager channelManager; + + private JID jid = new JID("juliet@shakespeare.lit"); + + @Before + public void setUp() throws Exception { + + Properties configuration = new Properties(); + configuration.setProperty("server.domain.channels", + "chgnnels.shakespeare.lit"); + + channelManager = Mockito.mock(ChannelManager.class); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); + + ArrayList members = new ArrayList(); + members.add(new NodeMembershipImpl( + "/user/romeo@denmark.lit/posts", jid, + Subscriptions.subscribed, Affiliations.member, null)); + Mockito.doReturn(new ResultSetImpl(members)) + .when(channelManager).getNodeMemberships(Mockito.anyString()); + + configurationProcessor = new ConfigurationProcessor(queue, + configuration, channelManager); + + HashMap nodeConfiguration = new HashMap(); + nodeConfiguration.put("config1", "value1"); + + Helper helper = Mockito.mock(Helper.class); + Mockito.when(helper.getValues()).thenReturn(nodeConfiguration); + configurationProcessor.setConfigurationHelper(helper); + + message = new Message(); + message.setType(Message.Type.headline); + Element event = message.addChildElement("event", + JabberPubsub.NS_PUBSUB_EVENT); + + configurationElement = event.addElement("configuration"); + configurationElement.addAttribute("jid", "romeo@shakespeare.lit"); + configurationElement.addAttribute("node", + "/user/juliet@denmark.lit/posts"); + dataForm = configurationElement.addElement("x"); + dataForm.addNamespace("", "jabber:x:data"); + dataForm.addAttribute("type", "result"); + Element field = dataForm.addElement("field"); + field.addAttribute("var", "config1"); + Element value = field.addElement("value"); + value.addText("config1"); + } + + @Test + public void testEventForLocalNodeIsIgnored() throws Exception { + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); + configurationProcessor.process(message); + Assert.assertEquals(0, queue.size()); + } + + @Test + public void testRemoteNodeIsCreatedIfNotInDataStore() throws Exception { + Mockito.when(channelManager.nodeExists(Mockito.anyString())) + .thenReturn(false); + + configurationProcessor.process(message); + + Mockito.verify(channelManager, Mockito.times(1)).addRemoteNode( + Mockito.anyString()); + } + + @Test + public void testExpectedDetailsAreSavedToTheDataStore() throws Exception { + Mockito.when(channelManager.nodeExists(Mockito.anyString())) + .thenReturn(true); + + configurationProcessor.process(message); + + HashMap match = new HashMap(); + match.put("config1", "value1"); + + Mockito.verify(channelManager, Mockito.times(1)).setNodeConf( + Mockito.anyString(), Mockito.eq(match)); + Mockito.verify(channelManager, Mockito.times(0)).addRemoteNode( + Mockito.anyString()); + } + + @Test + public void testNotificationsAreSentOutAsExpected() throws Exception { + + configurationProcessor.process(message); + + Assert.assertEquals(1, queue.size()); + message.setTo(jid.toString()); + Assert.assertEquals(message.toString(), queue.poll().toString()); + } +} diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/DeleteProcessorTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/DeleteProcessorTest.java index de274067..4dad1e95 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/DeleteProcessorTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/DeleteProcessorTest.java @@ -26,70 +26,70 @@ import org.xmpp.resultsetmanagement.ResultSetImpl; public class DeleteProcessorTest extends IQTestHandler { - private Message message; - private DeleteProcessor deleteProcessor; - private Element delete; - - private BlockingQueue queue = new LinkedBlockingQueue(); - private ChannelManager channelManager; - - private JID jid = new JID("juliet@shakespeare.lit"); - - @Before - public void setUp() throws Exception { - - Properties configuration = new Properties(); - configuration.setProperty("server.domain.channels", - "chgnnels.shakespeare.lit"); - - channelManager = Mockito.mock(ChannelManager.class); - Configuration.getInstance().remove( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); - - ArrayList members = new ArrayList(); - members.add(new NodeMembershipImpl( - "/user/romeo@denmark.lit/posts", jid, - Subscriptions.subscribed, Affiliations.member, null)); - Mockito.doReturn(new ResultSetImpl(members)) - .when(channelManager).getNodeMemberships(Mockito.anyString()); - - deleteProcessor = new DeleteProcessor(queue, configuration, - channelManager); - - message = new Message(); - message.setType(Message.Type.headline); - Element event = message.addChildElement("event", - JabberPubsub.NS_PUBSUB_EVENT); - - delete = event.addElement("delete"); - delete.addAttribute("node", "/user/juliet@denmark.lit/posts"); - } - - @Test - public void testEventForLocalNodeIsIgnored() throws Exception { - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); - deleteProcessor.process(message); - Assert.assertEquals(0, queue.size()); - } - - @Test(expected = NodeStoreException.class) - public void testNodeStoreExceptionIsThrownWhenExpected() throws Exception { - - Mockito.doThrow(new NodeStoreException()).when(channelManager) - .deleteNode(Mockito.anyString()); - deleteProcessor.process(message); - } - - @Test - public void testNotificationsAreSentOutAsExpected() throws Exception { - - deleteProcessor.process(message); - - Assert.assertEquals(1, queue.size()); - message.setTo(jid.toString()); - Assert.assertEquals(message.toString(), queue.poll().toString()); - } -} \ No newline at end of file + private Message message; + private DeleteProcessor deleteProcessor; + private Element delete; + + private BlockingQueue queue = new LinkedBlockingQueue(); + private ChannelManager channelManager; + + private JID jid = new JID("juliet@shakespeare.lit"); + + @Before + public void setUp() throws Exception { + + Properties configuration = new Properties(); + configuration.setProperty("server.domain.channels", + "chgnnels.shakespeare.lit"); + + channelManager = Mockito.mock(ChannelManager.class); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); + + ArrayList members = new ArrayList(); + members.add(new NodeMembershipImpl( + "/user/romeo@denmark.lit/posts", jid, + Subscriptions.subscribed, Affiliations.member, null)); + Mockito.doReturn(new ResultSetImpl(members)) + .when(channelManager).getNodeMemberships(Mockito.anyString()); + + deleteProcessor = new DeleteProcessor(queue, configuration, + channelManager); + + message = new Message(); + message.setType(Message.Type.headline); + Element event = message.addChildElement("event", + JabberPubsub.NS_PUBSUB_EVENT); + + delete = event.addElement("delete"); + delete.addAttribute("node", "/user/juliet@denmark.lit/posts"); + } + + @Test + public void testEventForLocalNodeIsIgnored() throws Exception { + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); + deleteProcessor.process(message); + Assert.assertEquals(0, queue.size()); + } + + @Test(expected = NodeStoreException.class) + public void testNodeStoreExceptionIsThrownWhenExpected() throws Exception { + + Mockito.doThrow(new NodeStoreException()).when(channelManager) + .deleteNode(Mockito.anyString()); + deleteProcessor.process(message); + } + + @Test + public void testNotificationsAreSentOutAsExpected() throws Exception { + + deleteProcessor.process(message); + + Assert.assertEquals(1, queue.size()); + message.setTo(jid.toString()); + Assert.assertEquals(message.toString(), queue.poll().toString()); + } +} diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/ItemsProcessorTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/ItemsProcessorTest.java index 65895505..97ed106c 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/ItemsProcessorTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/ItemsProcessorTest.java @@ -28,113 +28,113 @@ public class ItemsProcessorTest extends IQTestHandler { - private Message message; - private ItemsProcessor itemsProcessor; - private BlockingQueue queue = new LinkedBlockingQueue(); - private ChannelManager channelManager; - - private Element entry; - - @Before - public void setUp() throws Exception { - - JID jid = new JID("juliet@shakespeare.lit"); - Properties configuration = new Properties(); - configuration.setProperty("server.domain.channels", - "channels.shakespeare.lit"); - channelManager = Mockito.mock(ChannelManager.class); - - ArrayList members = new ArrayList(); - members.add(new NodeMembershipImpl( - "/users/romeo@shakespeare.lit/posts", jid, - Subscriptions.subscribed, Affiliations.member, null)); - Mockito.doReturn(new ResultSetImpl(members)) - .when(channelManager).getNodeMemberships(Mockito.anyString()); - Configuration.getInstance().remove( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); - - itemsProcessor = new ItemsProcessor(queue, configuration, - channelManager); - - message = new Message(); - message.setType(Message.Type.headline); - Element event = message.addChildElement("event", - JabberPubsub.NS_PUBSUB_EVENT); - Element items = event.addElement("items"); - Element item = items.addElement("item"); - - entry = item.addElement("entry"); - entry.addNamespace("thr", "http://purl.org/syndication/thread/1.0"); - - Element updated = entry.addElement("updated"); - updated.setText("2012-10-10T08:37:02.000Z"); - - items.addAttribute("node", "/user/romeo@denmark.lit/posts"); - item.addAttribute("id", "publish:1"); - entry.addElement("thr:in-reply-to", "http://purl.org/syndication/thread/1.0").addAttribute("ref", "123455"); - - } - - @Test - public void testLocalNodeEventDoesNotSendNotiifcations() throws Exception { - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); - itemsProcessor.process(message); - Assert.assertEquals(0, queue.size()); - } - - @Test(expected = NodeStoreException.class) - public void testNodeStoreExceptionIsThrown() throws Exception { - Mockito.doThrow(new NodeStoreException()).when(channelManager) - .getNodeMemberships(Mockito.anyString()); - itemsProcessor.process(message); - } - - @Test(expected = NullPointerException.class) - public void testConfigurationValueNotSetThrowsException() throws Exception { - itemsProcessor.setConfiguration(new Properties()); - itemsProcessor.process(message); - } - - @Test - public void testNotificationsAreForwarded() throws Exception { - itemsProcessor.process(message); - Assert.assertEquals(1, queue.size()); - } - - @Test - public void testRemoteNodeIsAddedIfNotInDatastore() throws Exception { - Mockito.when(channelManager.nodeExists(Mockito.anyString())) - .thenReturn(false); - - itemsProcessor.process(message); - - Mockito.verify(channelManager, Mockito.times(1)).addRemoteNode( - Mockito.anyString()); - } - - @Test - public void testItemIsDeletedBeforeAttemptToInsertIntoDatabase() - throws Exception { - Mockito.when(channelManager.nodeExists(Mockito.anyString())) - .thenReturn(false); - - itemsProcessor.process(message); - - Mockito.verify(channelManager, Mockito.times(1)).deleteNodeItemById( - Mockito.anyString(), Mockito.anyString()); - } - - @Test - public void testItemsAreCachedToDatastore() throws Exception { - Mockito.when(channelManager.nodeExists(Mockito.anyString())) - .thenReturn(true); - - itemsProcessor.process(message); - - Mockito.verify(channelManager, Mockito.times(1)).addNodeItem( - Mockito.any(NodeItem.class)); - } -} \ No newline at end of file + private Message message; + private ItemsProcessor itemsProcessor; + private BlockingQueue queue = new LinkedBlockingQueue(); + private ChannelManager channelManager; + + private Element entry; + + @Before + public void setUp() throws Exception { + + JID jid = new JID("juliet@shakespeare.lit"); + Properties configuration = new Properties(); + configuration.setProperty("server.domain.channels", + "channels.shakespeare.lit"); + channelManager = Mockito.mock(ChannelManager.class); + + ArrayList members = new ArrayList(); + members.add(new NodeMembershipImpl( + "/users/romeo@shakespeare.lit/posts", jid, + Subscriptions.subscribed, Affiliations.member, null)); + Mockito.doReturn(new ResultSetImpl(members)) + .when(channelManager).getNodeMemberships(Mockito.anyString()); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); + + itemsProcessor = new ItemsProcessor(queue, configuration, + channelManager); + + message = new Message(); + message.setType(Message.Type.headline); + Element event = message.addChildElement("event", + JabberPubsub.NS_PUBSUB_EVENT); + Element items = event.addElement("items"); + Element item = items.addElement("item"); + + entry = item.addElement("entry"); + entry.addNamespace("thr", "http://purl.org/syndication/thread/1.0"); + + Element updated = entry.addElement("updated"); + updated.setText("2012-10-10T08:37:02.000Z"); + + items.addAttribute("node", "/user/romeo@denmark.lit/posts"); + item.addAttribute("id", "publish:1"); + entry.addElement("thr:in-reply-to", "http://purl.org/syndication/thread/1.0").addAttribute("ref", "123455"); + + } + + @Test + public void testLocalNodeEventDoesNotSendNotiifcations() throws Exception { + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); + itemsProcessor.process(message); + Assert.assertEquals(0, queue.size()); + } + + @Test(expected = NodeStoreException.class) + public void testNodeStoreExceptionIsThrown() throws Exception { + Mockito.doThrow(new NodeStoreException()).when(channelManager) + .getNodeMemberships(Mockito.anyString()); + itemsProcessor.process(message); + } + + @Test(expected = NullPointerException.class) + public void testConfigurationValueNotSetThrowsException() throws Exception { + itemsProcessor.setConfiguration(new Properties()); + itemsProcessor.process(message); + } + + @Test + public void testNotificationsAreForwarded() throws Exception { + itemsProcessor.process(message); + Assert.assertEquals(1, queue.size()); + } + + @Test + public void testRemoteNodeIsAddedIfNotInDatastore() throws Exception { + Mockito.when(channelManager.nodeExists(Mockito.anyString())) + .thenReturn(false); + + itemsProcessor.process(message); + + Mockito.verify(channelManager, Mockito.times(1)).addRemoteNode( + Mockito.anyString()); + } + + @Test + public void testItemIsDeletedBeforeAttemptToInsertIntoDatabase() + throws Exception { + Mockito.when(channelManager.nodeExists(Mockito.anyString())) + .thenReturn(false); + + itemsProcessor.process(message); + + Mockito.verify(channelManager, Mockito.times(1)).deleteNodeItemById( + Mockito.anyString(), Mockito.anyString()); + } + + @Test + public void testItemsAreCachedToDatastore() throws Exception { + Mockito.when(channelManager.nodeExists(Mockito.anyString())) + .thenReturn(true); + + itemsProcessor.process(message); + + Mockito.verify(channelManager, Mockito.times(1)).addNodeItem( + Mockito.any(NodeItem.class)); + } +} diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/NotificationSendingMockTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/NotificationSendingMockTest.java index dbea78df..f7db3263 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/NotificationSendingMockTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/NotificationSendingMockTest.java @@ -23,149 +23,149 @@ import org.xmpp.resultsetmanagement.ResultSetImpl; public class NotificationSendingMockTest extends IQTestHandler { - - private static final String CHANNEL_SERVER = "channels.server.com"; + + private static final String CHANNEL_SERVER = "channels.server.com"; - private Message message; + private Message message; - private BlockingQueue queue = new LinkedBlockingQueue(); - private ChannelManager channelManager; + private BlockingQueue queue = new LinkedBlockingQueue(); + private ChannelManager channelManager; - private JID jid = new JID("juliet@shakespeare.lit"); - private NotificationSendingMock notificationSending; + private JID jid = new JID("juliet@shakespeare.lit"); + private NotificationSendingMock notificationSending; - @Before - public void setUp() throws Exception { + @Before + public void setUp() throws Exception { - channelManager = Mockito.mock(ChannelManager.class); + channelManager = Mockito.mock(ChannelManager.class); - Configuration.getInstance().remove( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); - Properties configuration = new Properties(); - configuration.setProperty(Configuration.CONFIGURATION_SERVER_CHANNELS_DOMAIN, CHANNEL_SERVER); - notificationSending = new NotificationSendingMock(channelManager, configuration, - queue); + Properties configuration = new Properties(); + configuration.setProperty(Configuration.CONFIGURATION_SERVER_CHANNELS_DOMAIN, CHANNEL_SERVER); + notificationSending = new NotificationSendingMock(channelManager, configuration, + queue); - message = new Message(); - message.setType(Message.Type.headline); - message.getElement().addAttribute("scheme", Integer.toString(1)); - } + message = new Message(); + message.setType(Message.Type.headline); + message.getElement().addAttribute("scheme", Integer.toString(1)); + } - @Test - public void noNotificationSentForRemoteUser() throws Exception { + @Test + public void noNotificationSentForRemoteUser() throws Exception { - registerUserResponse(Subscriptions.none, Affiliations.none); - - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); - - notificationSending.process(message); - Assert.assertEquals(0, queue.size()); - } - - @Test - public void sendsNotificationToSpecifiedUser() throws Exception { - ArrayList members = new ArrayList(); - Mockito.doReturn(new ResultSetImpl(members)) - .when(channelManager).getNodeMemberships(Mockito.anyString()); - - String user = "user@example.com"; - Message message = this.message.createCopy(); - message.getElement().addAttribute("jid", user); - - notificationSending.process(message); - Assert.assertEquals(1, queue.size()); - Assert.assertEquals(user, queue.poll().getElement().attributeValue("to")); - } - - @Test - public void onlySendsToValidSubscribers() throws Exception { - registerUserResponse(Subscriptions.none, Affiliations.none); - notificationSending.process(message); - Assert.assertEquals(0, queue.size()); - registerUserResponse(Subscriptions.none, Affiliations.outcast); - notificationSending.process(message); - Assert.assertEquals(0, queue.size()); - registerUserResponse(Subscriptions.pending, Affiliations.none); - notificationSending.process(message); - Assert.assertEquals(0, queue.size()); - registerUserResponse(Subscriptions.pending, Affiliations.owner); - notificationSending.process(message); - Assert.assertEquals(0, queue.size()); - registerUserResponse(Subscriptions.invited, Affiliations.owner); - notificationSending.process(message); - Assert.assertEquals(0, queue.size()); - registerUserResponse(Subscriptions.unconfigured, Affiliations.owner); - notificationSending.process(message); - Assert.assertEquals(0, queue.size()); - registerUserResponse(Subscriptions.subscribed, Affiliations.outcast); - notificationSending.process(message); - Assert.assertEquals(0, queue.size()); - registerUserResponse(Subscriptions.subscribed, Affiliations.none); - notificationSending.process(message); - Assert.assertEquals(1, queue.size()); - queue.clear(); - registerUserResponse(Subscriptions.subscribed, Affiliations.member); - notificationSending.process(message); - Assert.assertEquals(1, queue.size()); - } - - @Test - public void onlySendsToOwnersAndModerators() throws Exception { - Message message = this.message.createCopy(); - message.getElement().attribute("scheme").detach(); - message.getElement().addAttribute("scheme", Integer.toString(2)); - - registerUserResponse(Subscriptions.none, Affiliations.none); - notificationSending.process(message); - Assert.assertEquals(0, queue.size()); - registerUserResponse(Subscriptions.none, Affiliations.outcast); - notificationSending.process(message); - Assert.assertEquals(0, queue.size()); - registerUserResponse(Subscriptions.pending, Affiliations.none); - notificationSending.process(message); - Assert.assertEquals(0, queue.size()); - registerUserResponse(Subscriptions.pending, Affiliations.owner); - notificationSending.process(message); - Assert.assertEquals(0, queue.size()); - registerUserResponse(Subscriptions.invited, Affiliations.owner); - notificationSending.process(message); - Assert.assertEquals(0, queue.size()); - registerUserResponse(Subscriptions.unconfigured, Affiliations.owner); - notificationSending.process(message); - Assert.assertEquals(0, queue.size()); - registerUserResponse(Subscriptions.subscribed, Affiliations.outcast); - notificationSending.process(message); - Assert.assertEquals(0, queue.size()); - registerUserResponse(Subscriptions.subscribed, Affiliations.none); - notificationSending.process(message); - Assert.assertEquals(0, queue.size()); - registerUserResponse(Subscriptions.subscribed, Affiliations.member); - notificationSending.process(message); - Assert.assertEquals(0, queue.size()); - registerUserResponse(Subscriptions.subscribed, Affiliations.publisher); - notificationSending.process(message); - Assert.assertEquals(0, queue.size()); - registerUserResponse(Subscriptions.subscribed, Affiliations.moderator); - notificationSending.process(message); - Assert.assertEquals(1, queue.size()); - queue.clear(); - registerUserResponse(Subscriptions.subscribed, Affiliations.owner); - notificationSending.process(message); - Assert.assertEquals(1, queue.size()); - } - - - private void registerUserResponse(Subscriptions subscription, Affiliations affiliation) throws Exception { - ArrayList members = new ArrayList(); - members.add(new NodeMembershipImpl( - "/users/romeo@shakespeare.lit/posts", jid, - subscription, affiliation, null)); - Mockito.doReturn(new ResultSetImpl(members)) - .when(channelManager).getNodeMemberships(Mockito.anyString()); - } + registerUserResponse(Subscriptions.none, Affiliations.none); + + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); + + notificationSending.process(message); + Assert.assertEquals(0, queue.size()); + } + + @Test + public void sendsNotificationToSpecifiedUser() throws Exception { + ArrayList members = new ArrayList(); + Mockito.doReturn(new ResultSetImpl(members)) + .when(channelManager).getNodeMemberships(Mockito.anyString()); + + String user = "user@example.com"; + Message message = this.message.createCopy(); + message.getElement().addAttribute("jid", user); + + notificationSending.process(message); + Assert.assertEquals(1, queue.size()); + Assert.assertEquals(user, queue.poll().getElement().attributeValue("to")); + } + + @Test + public void onlySendsToValidSubscribers() throws Exception { + registerUserResponse(Subscriptions.none, Affiliations.none); + notificationSending.process(message); + Assert.assertEquals(0, queue.size()); + registerUserResponse(Subscriptions.none, Affiliations.outcast); + notificationSending.process(message); + Assert.assertEquals(0, queue.size()); + registerUserResponse(Subscriptions.pending, Affiliations.none); + notificationSending.process(message); + Assert.assertEquals(0, queue.size()); + registerUserResponse(Subscriptions.pending, Affiliations.owner); + notificationSending.process(message); + Assert.assertEquals(0, queue.size()); + registerUserResponse(Subscriptions.invited, Affiliations.owner); + notificationSending.process(message); + Assert.assertEquals(0, queue.size()); + registerUserResponse(Subscriptions.unconfigured, Affiliations.owner); + notificationSending.process(message); + Assert.assertEquals(0, queue.size()); + registerUserResponse(Subscriptions.subscribed, Affiliations.outcast); + notificationSending.process(message); + Assert.assertEquals(0, queue.size()); + registerUserResponse(Subscriptions.subscribed, Affiliations.none); + notificationSending.process(message); + Assert.assertEquals(1, queue.size()); + queue.clear(); + registerUserResponse(Subscriptions.subscribed, Affiliations.member); + notificationSending.process(message); + Assert.assertEquals(1, queue.size()); + } + + @Test + public void onlySendsToOwnersAndModerators() throws Exception { + Message message = this.message.createCopy(); + message.getElement().attribute("scheme").detach(); + message.getElement().addAttribute("scheme", Integer.toString(2)); + + registerUserResponse(Subscriptions.none, Affiliations.none); + notificationSending.process(message); + Assert.assertEquals(0, queue.size()); + registerUserResponse(Subscriptions.none, Affiliations.outcast); + notificationSending.process(message); + Assert.assertEquals(0, queue.size()); + registerUserResponse(Subscriptions.pending, Affiliations.none); + notificationSending.process(message); + Assert.assertEquals(0, queue.size()); + registerUserResponse(Subscriptions.pending, Affiliations.owner); + notificationSending.process(message); + Assert.assertEquals(0, queue.size()); + registerUserResponse(Subscriptions.invited, Affiliations.owner); + notificationSending.process(message); + Assert.assertEquals(0, queue.size()); + registerUserResponse(Subscriptions.unconfigured, Affiliations.owner); + notificationSending.process(message); + Assert.assertEquals(0, queue.size()); + registerUserResponse(Subscriptions.subscribed, Affiliations.outcast); + notificationSending.process(message); + Assert.assertEquals(0, queue.size()); + registerUserResponse(Subscriptions.subscribed, Affiliations.none); + notificationSending.process(message); + Assert.assertEquals(0, queue.size()); + registerUserResponse(Subscriptions.subscribed, Affiliations.member); + notificationSending.process(message); + Assert.assertEquals(0, queue.size()); + registerUserResponse(Subscriptions.subscribed, Affiliations.publisher); + notificationSending.process(message); + Assert.assertEquals(0, queue.size()); + registerUserResponse(Subscriptions.subscribed, Affiliations.moderator); + notificationSending.process(message); + Assert.assertEquals(1, queue.size()); + queue.clear(); + registerUserResponse(Subscriptions.subscribed, Affiliations.owner); + notificationSending.process(message); + Assert.assertEquals(1, queue.size()); + } + + + private void registerUserResponse(Subscriptions subscription, Affiliations affiliation) throws Exception { + ArrayList members = new ArrayList(); + members.add(new NodeMembershipImpl( + "/users/romeo@shakespeare.lit/posts", jid, + subscription, affiliation, null)); + Mockito.doReturn(new ResultSetImpl(members)) + .when(channelManager).getNodeMemberships(Mockito.anyString()); + } -} \ No newline at end of file +} diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/RetractItemProcessorTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/RetractItemProcessorTest.java index 73f9bd6f..82212780 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/RetractItemProcessorTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/RetractItemProcessorTest.java @@ -27,80 +27,80 @@ public class RetractItemProcessorTest extends IQTestHandler { - private Message message; - private RetractItemProcessor retractItemProcessor; - private BlockingQueue queue = new LinkedBlockingQueue(); - private ChannelManager channelManager; - - @Before - public void setUp() throws Exception { - - JID jid = new JID("juliet@denmark.lit"); - Properties configuration = new Properties(); - configuration.setProperty("server.domain.channels", - "channels.shakespeare.lit"); - channelManager = Mockito.mock(ChannelManager.class); - - ArrayList subscribers = new ArrayList(); - subscribers.add(new NodeMembershipImpl( - "/user/romeo@shakespeare.lit/posts", jid, - Subscriptions.subscribed, Affiliations.member, null)); - Mockito.doReturn(new ResultSetImpl(subscribers)) - .when(channelManager).getNodeMemberships(Mockito.anyString()); - Configuration.getInstance().remove( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); + private Message message; + private RetractItemProcessor retractItemProcessor; + private BlockingQueue queue = new LinkedBlockingQueue(); + private ChannelManager channelManager; + + @Before + public void setUp() throws Exception { + + JID jid = new JID("juliet@denmark.lit"); + Properties configuration = new Properties(); + configuration.setProperty("server.domain.channels", + "channels.shakespeare.lit"); + channelManager = Mockito.mock(ChannelManager.class); + + ArrayList subscribers = new ArrayList(); + subscribers.add(new NodeMembershipImpl( + "/user/romeo@shakespeare.lit/posts", jid, + Subscriptions.subscribed, Affiliations.member, null)); + Mockito.doReturn(new ResultSetImpl(subscribers)) + .when(channelManager).getNodeMemberships(Mockito.anyString()); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); - retractItemProcessor = new RetractItemProcessor(queue, configuration, - channelManager); - - message = new Message(); - message.setType(Message.Type.headline); - Element event = message.addChildElement("event", - JabberPubsub.NS_PUBSUB_EVENT); - Element items = event.addElement("items"); - Element retract = items.addElement("retract"); - - items.addAttribute("node", "/user/romeo@shakespeare.lit/posts"); - retract.addAttribute("id", "publish:1"); - - } - - @Test - public void testLocalNodeEventDoesNotSendNotiifcations() throws Exception { - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); - - retractItemProcessor.process(message); - Assert.assertEquals(0, queue.size()); - } - - @Test(expected = NodeStoreException.class) - public void testNodeStoreExceptionIsThrown() throws Exception { - Mockito.doThrow(new NodeStoreException()).when(channelManager) - .getNodeMemberships(Mockito.anyString()); - retractItemProcessor.process(message); - } - - @Test(expected = NullPointerException.class) - public void testConfigurationValueNotSetThrowsException() throws Exception { - retractItemProcessor.setConfiguration(new Properties()); - retractItemProcessor.process(message); - } - - @Test - public void testNotificationsAreForwarded() throws Exception { - retractItemProcessor.process(message); - Assert.assertEquals(1, queue.size()); - } - - @Test - public void testWhenRetractElementPassedItemIsDeleted() throws Exception { - - retractItemProcessor.process(message); - - Mockito.verify(channelManager, Mockito.times(1)).deleteNodeItemById( - Mockito.anyString(), Mockito.anyString()); - } -} \ No newline at end of file + retractItemProcessor = new RetractItemProcessor(queue, configuration, + channelManager); + + message = new Message(); + message.setType(Message.Type.headline); + Element event = message.addChildElement("event", + JabberPubsub.NS_PUBSUB_EVENT); + Element items = event.addElement("items"); + Element retract = items.addElement("retract"); + + items.addAttribute("node", "/user/romeo@shakespeare.lit/posts"); + retract.addAttribute("id", "publish:1"); + + } + + @Test + public void testLocalNodeEventDoesNotSendNotiifcations() throws Exception { + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); + + retractItemProcessor.process(message); + Assert.assertEquals(0, queue.size()); + } + + @Test(expected = NodeStoreException.class) + public void testNodeStoreExceptionIsThrown() throws Exception { + Mockito.doThrow(new NodeStoreException()).when(channelManager) + .getNodeMemberships(Mockito.anyString()); + retractItemProcessor.process(message); + } + + @Test(expected = NullPointerException.class) + public void testConfigurationValueNotSetThrowsException() throws Exception { + retractItemProcessor.setConfiguration(new Properties()); + retractItemProcessor.process(message); + } + + @Test + public void testNotificationsAreForwarded() throws Exception { + retractItemProcessor.process(message); + Assert.assertEquals(1, queue.size()); + } + + @Test + public void testWhenRetractElementPassedItemIsDeleted() throws Exception { + + retractItemProcessor.process(message); + + Mockito.verify(channelManager, Mockito.times(1)).deleteNodeItemById( + Mockito.anyString(), Mockito.anyString()); + } +} diff --git a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/SubscriptionProcessorTest.java b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/SubscriptionProcessorTest.java index 4a01ea1c..665a20b7 100644 --- a/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/SubscriptionProcessorTest.java +++ b/src/test/java/org/buddycloud/channelserver/packetprocessor/message/event/SubscriptionProcessorTest.java @@ -31,112 +31,112 @@ import org.xmpp.resultsetmanagement.ResultSetImpl; public class SubscriptionProcessorTest extends IQTestHandler { - private Message message; - private SubscriptionProcessor subscriptionProcessor; - private Element subscription; - private BlockingQueue queue = new LinkedBlockingQueue(); - private ChannelManager channelManager; - - private JID jid = new JID("juliet@denmark.lit"); - private String node = "/user/juliet@shakespeare.lit/posts"; - - @Before - public void setUp() throws Exception { - - Properties configuration = new Properties(); - configuration.setProperty("server.domain.channels", - "channels.shakespeare.lit"); - - channelManager = Mockito.mock(ChannelManager.class); - Configuration.getInstance().remove( - Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); - - ArrayList members = new ArrayList(); - members.add(new NodeMembershipImpl( - "/user/romeo@shakespeare.lit/posts", jid, - Subscriptions.subscribed, Affiliations.member, null)); - Mockito.doReturn(new ResultSetImpl(members)).when(channelManager) - .getNodeMemberships(Mockito.anyString()); - - subscriptionProcessor = new SubscriptionProcessor(queue, configuration, - channelManager); - - message = new Message(); - message.setType(Message.Type.headline); - Element event = message.addChildElement("event", - JabberPubsub.NS_PUBSUB_EVENT); - - subscription = event.addElement("subscription"); - subscription.addAttribute("jid", "romeo@shakespeare.lit"); - subscription - .addAttribute("node", node ); - subscription.addAttribute("subscription", - Subscriptions.subscribed.toString()); - } - - @Test(expected = IllegalArgumentException.class) - public void testInvalidSubscriptionValueThrowsException() throws Exception { - Message badSubscriptionValue = message.createCopy(); - badSubscriptionValue.getElement().element("event") - .element("subscription") - .addAttribute("subscription", "invalid"); - subscriptionProcessor.process(badSubscriptionValue); - } - - @Test - public void testMissingSubscriptionElementDoesNotCauseError() - throws Exception { - Message noSubscriptionElement = message.createCopy(); - noSubscriptionElement.getElement().element("event") - .element("subscription").detach(); - subscriptionProcessor.process(noSubscriptionElement); - } - - @Test - public void testEventForLocalNodeIsIgnored() throws Exception { - Configuration.getInstance().putProperty( - Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); - subscriptionProcessor.process(message); - Assert.assertEquals(0, queue.size()); - } - - @Test(expected = NodeStoreException.class) - public void testNodeStoreExceptionIsThrownWhenExpected() throws Exception { - - Mockito.doThrow(new NodeStoreException()).when(channelManager) - .addUserSubscription(Mockito.any(NodeSubscription.class)); - subscriptionProcessor.process(message); - } - - @Test - public void testNotificationsAreSentOutAsExpected() throws Exception { - - subscriptionProcessor.process(message); - - Assert.assertEquals(1, queue.size()); - message.setTo(jid.toString()); - Assert.assertEquals(message.toString(), queue.poll().toString()); - } - - @Test - public void setsInvitedByIfProvided() throws Exception { - - Message invite = message.createCopy(); - Element subscription = invite.getElement().element("event").element("subscription"); - subscription.attribute("subscription").detach(); - subscription.addAttribute("subscription", "invited"); - subscription.addAttribute("invited-by", "juliet@shakespeare.lit"); - - subscriptionProcessor.process(invite); - - ArgumentCaptor newSubscription = ArgumentCaptor.forClass(NodeSubscription.class); - - verify(channelManager, times(1)).addUserSubscription(newSubscription.capture()); - - Assert.assertEquals(new JID("juliet@shakespeare.lit"), newSubscription.getValue().getInvitedBy()); - Assert.assertEquals(Subscriptions.invited, newSubscription.getValue().getSubscription()); - Assert.assertEquals(node, newSubscription.getValue().getNodeId()); - } -} \ No newline at end of file + private Message message; + private SubscriptionProcessor subscriptionProcessor; + private Element subscription; + private BlockingQueue queue = new LinkedBlockingQueue(); + private ChannelManager channelManager; + + private JID jid = new JID("juliet@denmark.lit"); + private String node = "/user/juliet@shakespeare.lit/posts"; + + @Before + public void setUp() throws Exception { + + Properties configuration = new Properties(); + configuration.setProperty("server.domain.channels", + "channels.shakespeare.lit"); + + channelManager = Mockito.mock(ChannelManager.class); + Configuration.getInstance().remove( + Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit"); + + ArrayList members = new ArrayList(); + members.add(new NodeMembershipImpl( + "/user/romeo@shakespeare.lit/posts", jid, + Subscriptions.subscribed, Affiliations.member, null)); + Mockito.doReturn(new ResultSetImpl(members)).when(channelManager) + .getNodeMemberships(Mockito.anyString()); + + subscriptionProcessor = new SubscriptionProcessor(queue, configuration, + channelManager); + + message = new Message(); + message.setType(Message.Type.headline); + Element event = message.addChildElement("event", + JabberPubsub.NS_PUBSUB_EVENT); + + subscription = event.addElement("subscription"); + subscription.addAttribute("jid", "romeo@shakespeare.lit"); + subscription + .addAttribute("node", node); + subscription.addAttribute("subscription", + Subscriptions.subscribed.toString()); + } + + @Test(expected = IllegalArgumentException.class) + public void testInvalidSubscriptionValueThrowsException() throws Exception { + Message badSubscriptionValue = message.createCopy(); + badSubscriptionValue.getElement().element("event") + .element("subscription") + .addAttribute("subscription", "invalid"); + subscriptionProcessor.process(badSubscriptionValue); + } + + @Test + public void testMissingSubscriptionElementDoesNotCauseError() + throws Exception { + Message noSubscriptionElement = message.createCopy(); + noSubscriptionElement.getElement().element("event") + .element("subscription").detach(); + subscriptionProcessor.process(noSubscriptionElement); + } + + @Test + public void testEventForLocalNodeIsIgnored() throws Exception { + Configuration.getInstance().putProperty( + Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit"); + subscriptionProcessor.process(message); + Assert.assertEquals(0, queue.size()); + } + + @Test(expected = NodeStoreException.class) + public void testNodeStoreExceptionIsThrownWhenExpected() throws Exception { + + Mockito.doThrow(new NodeStoreException()).when(channelManager) + .addUserSubscription(Mockito.any(NodeSubscription.class)); + subscriptionProcessor.process(message); + } + + @Test + public void testNotificationsAreSentOutAsExpected() throws Exception { + + subscriptionProcessor.process(message); + + Assert.assertEquals(1, queue.size()); + message.setTo(jid.toString()); + Assert.assertEquals(message.toString(), queue.poll().toString()); + } + + @Test + public void setsInvitedByIfProvided() throws Exception { + + Message invite = message.createCopy(); + Element subscription = invite.getElement().element("event").element("subscription"); + subscription.attribute("subscription").detach(); + subscription.addAttribute("subscription", "invited"); + subscription.addAttribute("invited-by", "juliet@shakespeare.lit"); + + subscriptionProcessor.process(invite); + + ArgumentCaptor newSubscription = ArgumentCaptor.forClass(NodeSubscription.class); + + verify(channelManager, times(1)).addUserSubscription(newSubscription.capture()); + + Assert.assertEquals(new JID("juliet@shakespeare.lit"), newSubscription.getValue().getInvitedBy()); + Assert.assertEquals(Subscriptions.invited, newSubscription.getValue().getSubscription()); + Assert.assertEquals(node, newSubscription.getValue().getNodeId()); + } +}