package org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.get; import java.io.StringReader; 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; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.JabberPubsub; import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.PubSubElementProcessorAbstract; import org.buddycloud.channelserver.pubsub.model.NodeItem; import org.buddycloud.channelserver.utils.XMLConstants; 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; public class RepliesGet extends PubSubElementProcessorAbstract { private Element pubsub; private SAXReader xmlReader; // RSM details private String firstItemId = null; private String lastItemId = null; public static final Logger LOGGER = Logger.getLogger(RecentItemsGet.class); public RepliesGet(BlockingQueue<Packet> outQueue, ChannelManager channelManager) { setChannelManager(channelManager); setOutQueue(outQueue); xmlReader = new SAXReader(); acceptedElementName = XMLConstants.REPLIES; } @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 (!isValidStanza()) { outQueue.put(response); return; } try { if (!Configuration.getInstance().isLocalJID(request.getFrom())) { response.getElement().addAttribute(XMLConstants.REMOTE_SERVER_DISCOVER_ATTR, Boolean.FALSE.toString()); } pubsub = response.getElement().addElement(XMLConstants.PUBSUB_ELEM, JabberPubsub.NAMESPACE_URI); if ((!userCanViewNode()) || (!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; } protected void addRsmElement() throws NodeStoreException { Element rsm = pubsub.addElement(XMLConstants.SET_ELEM); rsm.addNamespace("", NS_RSM); if (null != firstItemId) { 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 { String rsmItem = afterItemId; boolean after = true; if (null != beforeItemId) { rsmItem = beforeItemId; after = false; } CloseableIterator<NodeItem> items = channelManager.getNodeItemReplies(node, parentId, rsmItem, after, maxResults); NodeItem item; Element entry; Element itemElement; Element itemsElement = pubsub.addElement(XMLConstants.ITEMS_ELEM); itemsElement.addAttribute(XMLConstants.NODE_ATTR, node); while (items.hasNext()) { item = items.next(); try { entry = xmlReader.read(new StringReader(item.getPayload())).getRootElement(); itemElement = itemsElement.addElement(XMLConstants.ITEM_ELEM); itemElement.addAttribute(XMLConstants.ID_ATTR, 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()); } } } }