Skip to content

Commit eb05b16

Browse files
author
Lloyd Watkin
committed
MAM tests and code updated. outcast shown as none to non-Owner/Moderator
1 parent ef0ff79 commit eb05b16

2 files changed

Lines changed: 151 additions & 50 deletions

File tree

src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/mam/MessageArchiveManagement.java

Lines changed: 65 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.buddycloud.channelserver.db.exception.NodeStoreException;
1212
import org.buddycloud.channelserver.packetprocessor.PacketProcessor;
1313
import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.JabberPubsub;
14+
import org.buddycloud.channelserver.pubsub.affiliation.Affiliations;
1415
import org.buddycloud.channelserver.pubsub.model.NodeAffiliation;
1516
import org.buddycloud.channelserver.pubsub.model.NodeItem;
1617
import org.buddycloud.channelserver.pubsub.model.NodeSubscription;
@@ -36,7 +37,7 @@ public class MessageArchiveManagement implements PacketProcessor<IQ> {
3637
.getLogger(MessageArchiveManagement.class);
3738
private final BlockingQueue<Packet> outQueue;
3839
private ChannelManager channelManager;
39-
40+
4041
private SAXReader xmlReader = new SAXReader();
4142
private Message wrapper;
4243

@@ -76,10 +77,10 @@ private void generateMessageWrapper() {
7677
wrapper = new Message();
7778
wrapper.setFrom(requestIq.getTo());
7879
wrapper.setTo(requestIq.getFrom());
79-
Element result = wrapper.addChildElement("result",
80-
NAMESPACE_MAM);
80+
Element result = wrapper.addChildElement("result", NAMESPACE_MAM);
8181
result.addAttribute("id", requestIq.getID());
82-
Element forwarded = wrapper.addChildElement("forwarded", NAMESPACE_FORWARDED);
82+
Element forwarded = wrapper.addChildElement("forwarded",
83+
NAMESPACE_FORWARDED);
8384
Element delay = forwarded.addElement("delay", NAMESPACE_DELAY);
8485
delay.addAttribute("stamp", Conf.formatDate(new Date()));
8586
Element message = forwarded.addElement("msg");
@@ -99,38 +100,43 @@ private boolean isValidRequest() throws InterruptedException {
99100
return true;
100101
} catch (IllegalArgumentException e) {
101102
logger.error(e);
102-
sendErrorPacket(PacketError.Type.modify, PacketError.Condition.bad_request);
103+
sendErrorPacket(PacketError.Type.modify,
104+
PacketError.Condition.bad_request);
103105
return false;
104106
}
105107
}
106108

107109
private void sendItemUpdates() {
108110
try {
109-
CloseableIterator<NodeItem> items = channelManager.getNewNodeItemsForUser(requestIq.getFrom(), startTimestamp, endTimestamp);
111+
CloseableIterator<NodeItem> items = channelManager
112+
.getNewNodeItemsForUser(requestIq.getFrom(),
113+
startTimestamp, endTimestamp);
110114
if (false == items.hasNext()) {
111115
return;
112116
}
113-
117+
114118
Message notification = wrapper.createCopy();
115119
Element forwarded = notification.getElement().element("forwarded");
116-
notification.getElement().addAttribute("remote-server-discover", "false");
120+
notification.getElement().addAttribute("remote-server-discover",
121+
"false");
117122
Element event = forwarded.addElement("event");
118123
event.addNamespace("", JabberPubsub.NS_PUBSUB_EVENT);
119124
Element itemsElement = event.addElement("items");
120125
Element i = itemsElement.addElement("item");
121-
126+
122127
NodeItem item;
123128
while (items.hasNext()) {
124129
item = items.next();
125130
itemsElement.addAttribute("node", item.getNodeId());
126131
i.addAttribute("id", item.getId());
127-
128-
if (null != i.element("entry")) i.remove(i.element("entry"));
129-
i.add(xmlReader.read(
130-
new StringReader(item.getPayload()))
132+
133+
if (null != i.element("entry"))
134+
i.remove(i.element("entry"));
135+
i.add(xmlReader.read(new StringReader(item.getPayload()))
131136
.getRootElement());
132-
133-
forwarded.element("delay").addAttribute("stamp", Conf.formatDate(item.getUpdated()));
137+
138+
forwarded.element("delay").addAttribute("stamp",
139+
Conf.formatDate(item.getUpdated()));
134140
outQueue.put(notification.createCopy());
135141
}
136142
} catch (NodeStoreException e) {
@@ -144,21 +150,33 @@ private void sendItemUpdates() {
144150

145151
private void sendAffiliationUpdated() {
146152
try {
147-
ResultSet<NodeAffiliation> changes = channelManager.getAffiliationChanges(requestIq.getFrom(), startTimestamp, endTimestamp);
148-
if (0 == changes.size()) return;
153+
ResultSet<NodeAffiliation> changes = channelManager
154+
.getAffiliationChanges(requestIq.getFrom(), startTimestamp,
155+
endTimestamp);
156+
if (0 == changes.size())
157+
return;
149158
Message notification = wrapper.createCopy();
150159
Element forwarded = notification.getElement().element("forwarded");
151-
160+
152161
Element event = forwarded.addElement("event");
153162
Element affiliations = event.addElement("affiliations");
154-
Element affiliation = affiliations.addElement("affiliation");
163+
Element affiliationElement = affiliations.addElement("affiliation");
155164
event.addNamespace("", JabberPubsub.NS_PUBSUB_EVENT);
156-
165+
Affiliations affiliation;
157166
for (NodeAffiliation change : changes) {
167+
affiliation = change.getAffiliation();
168+
if ((true == isOwnerModerator(change.getNodeId()))
169+
&& (true == Affiliations.outcast.equals(change
170+
.getAffiliation()))) {
171+
affiliation = Affiliations.none;
172+
}
158173
affiliations.addAttribute("node", change.getNodeId());
159-
affiliation.addAttribute("jid", change.getUser().toBareJID());
160-
affiliation.addAttribute("affiliation", change.getAffiliation().toString());
161-
forwarded.element("delay").addAttribute("stamp", Conf.formatDate(change.getLastUpdated()));
174+
affiliationElement.addAttribute("jid", change.getUser()
175+
.toBareJID());
176+
affiliationElement.addAttribute("affiliation",
177+
affiliation.toString());
178+
forwarded.element("delay").addAttribute("stamp",
179+
Conf.formatDate(change.getLastUpdated()));
162180
outQueue.put(notification.createCopy());
163181
}
164182
} catch (NodeStoreException e) {
@@ -170,20 +188,25 @@ private void sendAffiliationUpdated() {
170188

171189
private void sendSubscriptionUpdates() {
172190
try {
173-
ResultSet<NodeSubscription> changes = channelManager.getSubscriptionChanges(requestIq.getFrom(), endTimestamp, endTimestamp);
174-
if (0 == changes.size()) return;
191+
ResultSet<NodeSubscription> changes = channelManager
192+
.getSubscriptionChanges(requestIq.getFrom(), endTimestamp,
193+
endTimestamp);
194+
if (0 == changes.size())
195+
return;
175196
Message notification = wrapper.createCopy();
176197
Element forwarded = notification.getElement().element("forwarded");
177-
198+
178199
Element event = forwarded.addElement("event");
179200
event.addNamespace("", JabberPubsub.NS_PUBSUB_EVENT);
180201
Element subscription = event.addElement("subscription");
181-
202+
182203
for (NodeSubscription change : changes) {
183204
subscription.addAttribute("node", change.getNodeId());
184205
subscription.addAttribute("jid", change.getUser().toBareJID());
185-
subscription.addAttribute("subscription", change.getSubscription().toString());
186-
forwarded.element("delay").addAttribute("stamp", Conf.formatDate(change.getLastUpdated()));
206+
subscription.addAttribute("subscription", change
207+
.getSubscription().toString());
208+
forwarded.element("delay").addAttribute("stamp",
209+
Conf.formatDate(change.getLastUpdated()));
187210
outQueue.put(notification.createCopy());
188211
}
189212
} catch (NodeStoreException e) {
@@ -194,15 +217,23 @@ private void sendSubscriptionUpdates() {
194217
}
195218

196219
private void _sendNotHandledStanza() throws InterruptedException {
197-
sendErrorPacket(PacketError.Type.cancel, PacketError.Condition.service_unavailable);
220+
sendErrorPacket(PacketError.Type.cancel,
221+
PacketError.Condition.service_unavailable);
198222
}
199223

200-
201-
private void sendErrorPacket(PacketError.Type type,
202-
Condition condition) throws InterruptedException {
224+
private void sendErrorPacket(PacketError.Type type, Condition condition)
225+
throws InterruptedException {
203226
reply.setChildElement(requestIq.getChildElement().createCopy());
204227
reply.setType(Type.error);
205228
PacketError pe = new PacketError(condition, type);
206229
reply.setError(pe);
207230
outQueue.put(reply);
208-
}}
231+
}
232+
233+
private boolean isOwnerModerator(String node) throws NodeStoreException {
234+
NodeAffiliation affiliation = channelManager.getUserAffiliation(node,
235+
requestIq.getFrom());
236+
return affiliation.getAffiliation().in(Affiliations.moderator,
237+
Affiliations.owner);
238+
}
239+
}

src/test/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/mam/MessageArchiveManagementTest.java

Lines changed: 86 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public void setUp() throws Exception {
8080
date1 = Conf.parseDate("1995-10-26T10:00:00Z");
8181
date2 = Conf.parseDate("2015-10-21T16:29:00Z");
8282
date3 = Conf.parseDate("1985-10-27T09:59:00Z");
83-
83+
8484
Mockito.when(
8585
channelManager.getAffiliationChanges(Mockito.any(JID.class),
8686
Mockito.any(Date.class), Mockito.any(Date.class)))
@@ -93,6 +93,13 @@ public void setUp() throws Exception {
9393
channelManager.getNewNodeItemsForUser(Mockito.any(JID.class),
9494
Mockito.any(Date.class), Mockito.any(Date.class)))
9595
.thenReturn(noItems);
96+
97+
NodeAffiliation requesterAffiliation = new NodeAffiliationImpl(node1,
98+
jid1, Affiliations.member, new Date());
99+
Mockito.when(
100+
channelManager.getUserAffiliation(Mockito.anyString(),
101+
Mockito.any(JID.class))).thenReturn(
102+
requesterAffiliation);
96103
}
97104

98105
@Test
@@ -122,7 +129,7 @@ public void testInvalidStartTimestampResultsInBadRequestStanza()
122129
Assert.assertEquals(1, queue.size());
123130

124131
Packet response = queue.poll(100, TimeUnit.MILLISECONDS);
125-
132+
126133
PacketError error = response.getError();
127134
Assert.assertNotNull(error);
128135
Assert.assertEquals(PacketError.Type.modify, error.getType());
@@ -172,7 +179,65 @@ public void testTwoAffiliationChangesReportAsExpected() throws Exception {
172179
channelManager.getAffiliationChanges(Mockito.any(JID.class),
173180
Mockito.any(Date.class), Mockito.any(Date.class)))
174181
.thenReturn(new ResultSetImpl<NodeAffiliation>(affiliations));
182+
183+
mam.process(request);
184+
185+
Assert.assertEquals(3, queue.size());
186+
checkAffiliationStanza(queue.poll(), jid1, date1, node1,
187+
Affiliations.member);
188+
checkAffiliationStanza(queue.poll(), jid2, date2, node2,
189+
Affiliations.publisher);
190+
191+
IQ result = (IQ) queue.poll();
192+
Assert.assertEquals("result", result.getType().toString());
193+
}
194+
195+
@Test
196+
public void testOutcastChangeReportedAsExpected() throws Exception {
197+
198+
NodeAffiliation requesterAffiliation = new NodeAffiliationImpl(node1,
199+
jid1, Affiliations.owner, new Date());
200+
Mockito.when(
201+
channelManager.getUserAffiliation(Mockito.anyString(),
202+
Mockito.any(JID.class))).thenReturn(
203+
requesterAffiliation);
175204

205+
ArrayList<NodeAffiliation> affiliations = new ArrayList<NodeAffiliation>();
206+
207+
affiliations.add(new NodeAffiliationImpl(node1, jid1,
208+
Affiliations.outcast, date1));
209+
210+
Mockito.when(
211+
channelManager.getAffiliationChanges(Mockito.any(JID.class),
212+
Mockito.any(Date.class), Mockito.any(Date.class)))
213+
.thenReturn(new ResultSetImpl<NodeAffiliation>(affiliations));
214+
215+
mam.process(request);
216+
217+
Assert.assertEquals(2, queue.size());
218+
checkAffiliationStanza(queue.poll(), jid1, date1, node1,
219+
Affiliations.none);
220+
221+
IQ result = (IQ) queue.poll();
222+
Assert.assertEquals("result", result.getType().toString());
223+
}
224+
225+
@Test
226+
public void testOutcastChangeReportedAsExpectedToOwnerModerator()
227+
throws Exception {
228+
229+
ArrayList<NodeAffiliation> affiliations = new ArrayList<NodeAffiliation>();
230+
231+
affiliations.add(new NodeAffiliationImpl(node1, jid1,
232+
Affiliations.member, date1));
233+
affiliations.add(new NodeAffiliationImpl(node2, jid2,
234+
Affiliations.publisher, date2));
235+
236+
Mockito.when(
237+
channelManager.getAffiliationChanges(Mockito.any(JID.class),
238+
Mockito.any(Date.class), Mockito.any(Date.class)))
239+
.thenReturn(new ResultSetImpl<NodeAffiliation>(affiliations));
240+
176241
mam.process(request);
177242

178243
Assert.assertEquals(3, queue.size());
@@ -205,7 +270,7 @@ private void checkAffiliationStanza(Packet result, JID jid, Date date,
205270
Assert.assertTrue(outgoingMessage.contains(node));
206271
Assert.assertTrue(outgoingMessage.contains(affiliation.toString()));
207272
}
208-
273+
209274
@Test
210275
public void testTwoSubscriptionChangesReportAsExpected() throws Exception {
211276

@@ -219,7 +284,7 @@ public void testTwoSubscriptionChangesReportAsExpected() throws Exception {
219284
channelManager.getSubscriptionChanges(Mockito.any(JID.class),
220285
Mockito.any(Date.class), Mockito.any(Date.class)))
221286
.thenReturn(new ResultSetImpl<NodeSubscription>(subscriptions));
222-
287+
223288
mam.process(request);
224289

225290
Assert.assertEquals(3, queue.size());
@@ -242,22 +307,24 @@ private void checkSubscriptionStanza(Packet result, JID jid, Date date,
242307
message.element("forwarded").getNamespaceURI());
243308

244309
Element delay = message.element("forwarded").element("delay");
245-
Element sub = message.element("forwarded").element("event").element("subscription");
246-
310+
Element sub = message.element("forwarded").element("event")
311+
.element("subscription");
312+
247313
Assert.assertEquals(node, sub.attributeValue("node"));
248314
Assert.assertEquals(jid.toBareJID(), sub.attributeValue("jid"));
249-
Assert.assertEquals(subscription, Subscriptions.valueOf(sub.attributeValue("subscription")));
315+
Assert.assertEquals(subscription,
316+
Subscriptions.valueOf(sub.attributeValue("subscription")));
250317

251318
Assert.assertEquals(date, Conf.parseDate(delay.attributeValue("stamp")));
252319
}
253-
320+
254321
@Test
255322
public void testTwoNewItemsReportAsExpected() throws Exception {
256323

257324
String item1 = "<entry>item1</entry>";
258325
String item2 = "<entry>item2</entry>";
259326
String item3 = "<entry>item3</entry>";
260-
327+
261328
ArrayList<NodeItem> items = new ArrayList<NodeItem>();
262329
items.add(new NodeItemImpl(node1, "1", date1, item1));
263330
items.add(new NodeItemImpl(node1, "2", date2, item2));
@@ -266,8 +333,9 @@ public void testTwoNewItemsReportAsExpected() throws Exception {
266333
Mockito.when(
267334
channelManager.getNewNodeItemsForUser(Mockito.any(JID.class),
268335
Mockito.any(Date.class), Mockito.any(Date.class)))
269-
.thenReturn(new ClosableIteratorImpl<NodeItem>(items.iterator()));
270-
336+
.thenReturn(
337+
new ClosableIteratorImpl<NodeItem>(items.iterator()));
338+
271339
mam.process(request);
272340

273341
Assert.assertEquals(4, queue.size());
@@ -279,8 +347,8 @@ public void testTwoNewItemsReportAsExpected() throws Exception {
279347
Assert.assertEquals("result", result.getType().toString());
280348
}
281349

282-
private void checkItemStanza(Packet result, Date date,
283-
String node, String id, String entry) throws ParseException {
350+
private void checkItemStanza(Packet result, Date date, String node,
351+
String id, String entry) throws ParseException {
284352

285353
Element message = result.getElement();
286354
Assert.assertEquals(MessageArchiveManagement.NAMESPACE_MAM, message
@@ -289,13 +357,15 @@ private void checkItemStanza(Packet result, Date date,
289357
message.element("forwarded").getNamespaceURI());
290358

291359
Element delay = message.element("forwarded").element("delay");
292-
Element items = message.element("forwarded").element("event").element("items");
360+
Element items = message.element("forwarded").element("event")
361+
.element("items");
293362
Element item = items.element("item");
294-
363+
295364
Assert.assertEquals(id, item.attributeValue("id"));
296365
Assert.assertEquals(node, items.attributeValue("node"));
297366
// Hack to make up for SMACK
298-
Assert.assertTrue(item.asXML().replace(" xmlns=\"\"", "").contains(entry));
367+
Assert.assertTrue(item.asXML().replace(" xmlns=\"\"", "")
368+
.contains(entry));
299369

300370
Assert.assertEquals(date, Conf.parseDate(delay.attributeValue("stamp")));
301371
}

0 commit comments

Comments
 (0)