package org.buddycloud.channelserver.packetprocessor.message.event; import java.util.Date; 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.channel.Conf; import org.buddycloud.channelserver.db.exception.ItemNotFoundException; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.pubsub.model.impl.GlobalItemIDImpl; import org.buddycloud.channelserver.pubsub.model.impl.NodeItemImpl; import org.buddycloud.channelserver.utils.NotificationScheme; import org.dom4j.Element; import org.xmpp.packet.Message; import org.xmpp.packet.Packet; public class ItemsProcessor extends AbstractMessageProcessor { private static final Logger logger = Logger.getLogger(ItemsProcessor.class); public ItemsProcessor(BlockingQueue<Packet> 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(); } 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; } } 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; } } }