package org.buddycloud.channelserver.queue;
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.ChannelManagerFactory;
import org.buddycloud.channelserver.db.exception.NodeStoreException;
import org.buddycloud.channelserver.packetprocessor.iq.IQProcessor;
import org.buddycloud.channelserver.packetprocessor.message.MessageProcessor;
import org.buddycloud.channelserver.packetprocessor.presence.PresenceProcessor;
import org.buddycloud.channelserver.utils.users.OnlineResourceManager;
import org.xmpp.packet.IQ;
import org.xmpp.packet.Message;
import org.xmpp.packet.Packet;
import org.xmpp.packet.Presence;
public class InQueueConsumer extends QueueConsumer {
private static final Logger logger = Logger.getLogger(InQueueConsumer.class);
private final BlockingQueue<Packet> outQueue;
private final Configuration conf;
private final ChannelManagerFactory channelManagerFactory;
private final FederatedQueueManager federatedQueueManager;
private OnlineResourceManager onlineUsers;
public InQueueConsumer(BlockingQueue<Packet> outQueue, Configuration conf, BlockingQueue<Packet> inQueue, ChannelManagerFactory channelManagerFactory,
FederatedQueueManager federatedQueueManager, OnlineResourceManager onlineUsers) {
super(inQueue);
this.outQueue = outQueue;
this.conf = conf;
this.channelManagerFactory = channelManagerFactory;
this.federatedQueueManager = federatedQueueManager;
this.onlineUsers = onlineUsers;
}
@Override
protected void consume(Packet p) {
ChannelManager channelManager = null;
try {
Long start = System.currentTimeMillis();
String xml = p.toXML();
logger.debug("Received payload: '" + xml + "'.");
channelManager = channelManagerFactory.create();
if (p instanceof IQ) {
new IQProcessor(outQueue, conf, channelManager, federatedQueueManager).process((IQ) p);
} else if (p instanceof Message) {
new MessageProcessor(outQueue, conf, channelManager).process((Message) p);
} else if (p instanceof Presence) {
new PresenceProcessor(conf, onlineUsers).process((Presence) p);
} else {
logger.info("Not handling following stanzas yet: '" + xml + "'.");
}
logger.debug("Payload handled in '" + Long.toString((System.currentTimeMillis() - start)) + "' milliseconds.");
} catch (Exception e) {
logger.error("Exception: " + e.getMessage(), e);
} finally {
try {
channelManager.close();
} catch (NodeStoreException e) {
logger.error(e);
}
}
}
}