private void notify(String fromJID, ActivityEntry entry) throws UserNotFoundException {
// TODO We may want to do some cleaning of activities before
// forwarding them (e.g. remove the acl, it is no one business)
final ActivityDomWriter writer = new DefaultActivityDomWriter();
final XMPPServer server = XMPPServer.getInstance();
final List<Subscription> subscriptions = getSubscribers(fromJID);
// final Roster roster = XMPPServer.getInstance().getRosterManager().getRoster(new JID(fromJID).getNode());
final DOMDocument domDocument = new DOMDocument();
// Prepare the message
final Element entryElement = (Element) domDocument.appendChild(domDocument.createElementNS(Atom.NAMESPACE, Atom.ENTRY_ELEMENT));
writer.write(entry, entryElement);
domDocument.removeChild(entryElement);
final Message message = new Message();
message.setFrom(fromJID);
message.setBody("New activity: " + entry.getTitle());
message.setType(Message.Type.headline);
org.dom4j.Element eventElement = message.addChildElement("event", "http://jabber.org/protocol/pubsub#event");
org.dom4j.Element itemsElement = eventElement.addElement("items");
itemsElement.addAttribute("node", PEPActivityHandler.NODE);
org.dom4j.Element itemElement = itemsElement.addElement("item");
itemElement.addAttribute("id", entry.getId());
itemElement.add((org.dom4j.Element) entryElement);
// Keep a list of people we sent it to avoid duplicates
List<String> alreadySent = new ArrayList<String>();
// Send to this user
alreadySent.add(fromJID);
message.setTo(fromJID);
server.getMessageRouter().route(message);
// Send to all subscribers
for (Subscription activitySubscription : subscriptions) {
String recipientJID = activitySubscription.getSubscriber();
if (!canSee(fromJID, entry, recipientJID)) {
continue;
}
alreadySent.add(recipientJID);
message.setTo(recipientJID);
server.getMessageRouter().route(message);
}
// Send to recipients, if they can see it and have not already received it
if (entry.hasRecipients()) {
for (AtomReplyTo recipient : entry.getRecipients()) {
//TODO This is dirty, the recipient should be an IRI etc...
String recipientJID = recipient.getHref();
if (!alreadySent.contains(recipientJID) && canSee(fromJID, entry, recipientJID)) {
alreadySent.add(fromJID);
message.setTo(recipientJID);
server.getMessageRouter().route(message);
}
}
}
}