package org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub; import java.util.LinkedList; import java.util.List; import java.util.concurrent.BlockingQueue; import org.apache.commons.lang.StringUtils; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.packetprocessor.PacketProcessor; import org.buddycloud.channelserver.utils.XMLConstants; import org.buddycloud.channelserver.utils.node.item.payload.Buddycloud; import org.dom4j.Element; import org.dom4j.Namespace; import org.dom4j.QName; import org.dom4j.dom.DOMElement; import org.xmpp.packet.IQ; import org.xmpp.packet.IQ.Type; import org.xmpp.packet.JID; import org.xmpp.packet.Packet; import org.xmpp.packet.PacketError; public abstract class PacketProcessorAbstract implements PacketProcessor<IQ> { protected BlockingQueue<Packet> outQueue; protected ChannelManager channelManager; protected List<PubSubElementProcessor> elementProcessors = new LinkedList<PubSubElementProcessor>(); protected Element pubsub; protected JID actor; protected void validateActor(IQ reqIQ) throws InterruptedException, IllegalActorException { if (pubsub.elementText(XMLConstants.ACTOR_ELEM) == null) { return; } actor = new JID(pubsub.elementText(XMLConstants.ACTOR_ELEM).trim()); if (StringUtils.endsWithIgnoreCase(reqIQ.getFrom().getDomain(), "." + actor.getDomain())) { return; } throw new IllegalActorException(); } @Override public void process(IQ reqIQ) throws Exception { pubsub = reqIQ.getChildElement(); try { validateActor(reqIQ); } catch (IllegalActorException e) { sendPolicyViolationResponse(reqIQ); return; } // Let's get the possible rsm element Element rsm = pubsub.element(new QName("set", new Namespace("", "http://jabber.org/protocol/rsm"))); @SuppressWarnings("unchecked") List<Element> elements = pubsub.elements(); boolean handled = false; for (Element x : elements) { for (PubSubElementProcessor elementProcessor : elementProcessors) { if (elementProcessor.accept(x)) { elementProcessor.process(x, actor, reqIQ, rsm); handled = true; } } } if (!handled) { sendFeatureNotImplementedResponse(reqIQ); } } public void purgeElementProcessors() { elementProcessors.clear(); } public void addElementProcessor(PubSubElementProcessor processor) { elementProcessors.add(processor); } private void sendFeatureNotImplementedResponse(IQ reqIQ) throws InterruptedException { IQ reply = IQ.createResultIQ(reqIQ); reply.setChildElement(reqIQ.getChildElement().createCopy()); reply.setType(Type.error); PacketError pe = new PacketError(org.xmpp.packet.PacketError.Condition.feature_not_implemented, org.xmpp.packet.PacketError.Type.cancel); reply.setError(pe); outQueue.put(reply); } private void sendPolicyViolationResponse(IQ reqIQ) throws InterruptedException { IQ reply = IQ.createResultIQ(reqIQ); reply.setChildElement(reqIQ.getChildElement().createCopy()); reply.setType(Type.error); Element standardError = new DOMElement(XMLConstants.POLICY_VIOLATION, new org.dom4j.Namespace("", JabberPubsub.NS_XMPP_STANZAS)); Element extraError = new DOMElement(XMLConstants.INVALID_NODE, new org.dom4j.Namespace("", Buddycloud.NS_ERROR)); Element error = new DOMElement(XMLConstants.ERROR_ELEM); error.addAttribute(XMLConstants.TYPE_ATTR, PacketError.Type.cancel.toXMPP()); error.add(standardError); error.add(extraError); reply.setChildElement(error); outQueue.put(reply); } }