Skip to content

Commit 4409e70

Browse files
author
Lloyd Watkin
committed
Support retrieval of individual items
1 parent aa4cab3 commit 4409e70

2 files changed

Lines changed: 105 additions & 14 deletions

File tree

  • src
    • main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items
    • test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items

src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/UserItemsGet.java

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -128,14 +128,35 @@ public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm)
128128
outQueue.put(reply);
129129
return;
130130
}
131-
getItems();
131+
if (null == element.element("item")) {
132+
getItems();
133+
} else {
134+
if (false == getItem()) return;
135+
}
132136
} catch (NodeStoreException e) {
133137
setErrorCondition(PacketError.Type.wait,
134138
PacketError.Condition.internal_server_error);
135139
}
136140
outQueue.put(reply);
137141
}
138142

143+
private boolean getItem() throws Exception {
144+
NodeItem nodeItem = channelManager.getNodeItem(node, element.element("item").attributeValue("id"));
145+
if (null == nodeItem) {
146+
if (false == channelManager.isLocalNode(node)) {
147+
makeRemoteRequest();
148+
return false;
149+
}
150+
setErrorCondition(PacketError.Type.cancel, PacketError.Condition.item_not_found);
151+
return true;
152+
}
153+
Element pubsub = reply.getElement().addElement("pubsub");
154+
pubsub.addNamespace("", JabberPubsub.NAMESPACE_URI);
155+
Element items = pubsub.addElement("items").addAttribute("node", node);
156+
addItemToResponse(nodeItem, items);
157+
return true;
158+
}
159+
139160
private void makeRemoteRequest() throws InterruptedException {
140161
requestIq.setTo(new JID(node.split("/")[2]).getDomain());
141162
if (null == requestIq.getElement().element("pubsub").element("actor")) {
@@ -300,19 +321,8 @@ private int getNodeItems(Element items, int maxItemsToReturn,
300321
if (firstItem == null) {
301322
firstItem = nodeItem.getId();
302323
}
303-
try {
304-
entry = xmlReader.read(
305-
new StringReader(nodeItem.getPayload()))
306-
.getRootElement();
307-
Element item = items.addElement("item");
308-
item.addAttribute("id", nodeItem.getId());
309-
item.add(entry);
310-
lastItem = nodeItem.getId();
311-
} catch (DocumentException e) {
312-
logger.error("Error parsing a node entry, ignoring. "
313-
+ nodeItem);
314-
}
315-
324+
addItemToResponse(nodeItem, items);
325+
lastItem = nodeItem.getId();
316326
}
317327
logger.debug("Including RSM there are " + rsmEntriesCount
318328
+ " items for node " + node);
@@ -323,6 +333,20 @@ private int getNodeItems(Element items, int maxItemsToReturn,
323333
}
324334
}
325335

336+
private void addItemToResponse(NodeItem nodeItem, Element parent) {
337+
try {
338+
entry = xmlReader.read(
339+
new StringReader(nodeItem.getPayload()))
340+
.getRootElement();
341+
Element item = parent.addElement("item");
342+
item.addAttribute("id", nodeItem.getId());
343+
item.add(entry);
344+
} catch (DocumentException e) {
345+
logger.error("Error parsing a node entry, ignoring. "
346+
+ nodeItem);
347+
}
348+
}
349+
326350
/**
327351
* Get items for the /subscriptions node
328352
*/

src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/UserItemsGetTest.java

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.buddycloud.channelserver.pubsub.model.NodeItem;
2525
import org.buddycloud.channelserver.pubsub.model.NodeSubscription;
2626
import org.buddycloud.channelserver.pubsub.model.impl.NodeAffiliationImpl;
27+
import org.buddycloud.channelserver.pubsub.model.impl.NodeItemImpl;
2728
import org.buddycloud.channelserver.pubsub.model.impl.NodeSubscriptionImpl;
2829
import org.buddycloud.channelserver.pubsub.subscription.Subscriptions;
2930
import org.buddycloud.channelserver.utils.node.NodeAclRefuseReason;
@@ -662,4 +663,70 @@ public void testPagingAfterItemWithInvalidNode() throws Exception {
662663

663664
assertEquals("Error expected", "error", p.getElement().attributeValue("type"));
664665
}
666+
667+
@Test
668+
public void testGetItemNotFoundIfSingleItemNotFound() throws Exception {
669+
element.addAttribute("node", "/user/francisco@denmark.lit/posts");
670+
element.addElement("item").addAttribute("id", "12345");
671+
672+
Mockito.when(channelManager.getNodeItem(eq(node), Mockito.anyString()))
673+
.thenReturn(null);
674+
Mockito.when(channelManager.getUserSubscription(node, jid)).thenReturn(
675+
new NodeSubscriptionImpl(node, jid, Subscriptions.subscribed));
676+
Mockito.when(channelManager.getUserAffiliation(node, jid)).thenReturn(
677+
new NodeAffiliationImpl(node, jid, Affiliations.member, new Date()));
678+
679+
itemsGet.process(element, jid, request, null);
680+
681+
Packet p = queue.poll();
682+
assertEquals("Error expected", "error", p.getElement().attributeValue("type"));
683+
assertEquals(
684+
"Expected 'cancel'",
685+
"cancel",
686+
p.getElement().element("error").attributeValue("type")
687+
);
688+
assertNotNull(p.getElement().element("error").element("item-not-found"));
689+
}
690+
691+
692+
@Test
693+
public void testCanRetrieveSingleItem() throws Exception {
694+
695+
String id = "12345";
696+
String payload = "<entry>entry text</entry>";
697+
698+
element.addAttribute("node", node);
699+
element.addElement("item").addAttribute("id", id);
700+
701+
NodeItem nodeItem = new NodeItemImpl(node, id, new Date(), payload);
702+
Mockito.when(channelManager.getNodeItem(eq(node), Mockito.anyString()))
703+
.thenReturn(nodeItem);
704+
Mockito.when(channelManager.getUserSubscription(node, jid)).thenReturn(
705+
new NodeSubscriptionImpl(node, jid, Subscriptions.subscribed));
706+
Mockito.when(channelManager.getUserAffiliation(node, jid)).thenReturn(
707+
new NodeAffiliationImpl(node, jid, Affiliations.member, new Date()));
708+
709+
itemsGet.process(element, jid, request, null);
710+
711+
Packet p = queue.poll();
712+
Packet response = queue.poll();
713+
Element element = response.getElement();
714+
715+
Assert.assertEquals(IQ.Type.result.toString(),
716+
element.attributeValue("type"));
717+
Assert.assertEquals(node, element.element("pubsub").element("items")
718+
.attributeValue("node"));
719+
720+
Assert.assertEquals(1, element.element("pubsub").element("items")
721+
.nodeCount());
722+
Assert.assertEquals(
723+
node,
724+
element.element("pubsub").element("items").attributeValue("node")
725+
);
726+
Assert.assertEquals(id, element.element("pubsub").element("items")
727+
.element("item").attributeValue("id"));
728+
Assert.assertEquals("entry text",
729+
element.element("pubsub").element("items").element("item")
730+
.elementText("entry"));
731+
}
665732
}

0 commit comments

Comments
 (0)