package org.buddycloud.channelserver.packetprocessor.iq.namespace; import java.util.Properties; import java.util.concurrent.BlockingQueue; import org.apache.log4j.Logger; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.packetprocessor.PacketProcessor; import org.xmpp.packet.IQ; import org.xmpp.packet.IQ.Type; import org.xmpp.packet.Packet; import org.xmpp.packet.PacketError; public abstract class AbstractNamespace implements PacketProcessor<IQ> { private static final Logger logger = Logger.getLogger(AbstractNamespace.class); private BlockingQueue<Packet> outQueue; private Properties conf; private ChannelManager channelManager; public AbstractNamespace(BlockingQueue<Packet> outQueue, Properties conf, ChannelManager channelManager) { logger.trace("In " + this.getClass().getName()); this.outQueue = outQueue; this.conf = conf; this.channelManager = channelManager; } protected abstract PacketProcessor<IQ> get(); protected abstract PacketProcessor<IQ> set(); protected abstract PacketProcessor<IQ> result(); protected abstract PacketProcessor<IQ> error(); @Override public void process(IQ reqIQ) throws Exception { PacketProcessor<IQ> processor = null; logger.info("Using processor for packet type: " + reqIQ.getType().toString()); switch (reqIQ.getType()) { case get: processor = get(); break; case set: processor = set(); break; case result: processor = result(); break; case error: processor = error(); break; default: break; } if (processor != null) { processor.process(reqIQ); return; } if (reqIQ.getType().equals(IQ.Type.error) || reqIQ.getType().equals(IQ.Type.result)) { // handleStateReply(reqIQ); } else { handleUnexpectedRequest(reqIQ); } } private void handleUnexpectedRequest(IQ reqIQ) throws InterruptedException { IQ reply = IQ.createResultIQ(reqIQ); reply.setChildElement(reqIQ.getChildElement().createCopy()); reply.setType(Type.error); PacketError pe = new PacketError(PacketError.Condition.unexpected_request, PacketError.Type.wait); reply.setError(pe); outQueue.put(reply); } private void handleStateReply(IQ reqIQ) throws InterruptedException { // TODO /* * // This might be a reply to a state we are on. Map<String, String> state = * channelManager.getState(reqIQ.getID()); if (state != null && !state.isEmpty()) { * IStatemachine sm = StateMachineBuilder.buildFromState(reqIQ, state, channelManager); * outQueue.put(sm.nextStep()); } else { * logger.error("This result was not handled in any way: '" + reqIQ.toXML() + "'."); } */ } protected ChannelManager getChannelManager() { return channelManager; } protected BlockingQueue<Packet> getOutQueue() { return outQueue; } public Properties getConf() { return conf; } }