package org.buddycloud.channelserver.packetprocessor.message;
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.buddycloud.channelserver.packetprocessor.message.event.AbstractMessageProcessor;
import org.buddycloud.channelserver.packetprocessor.message.event.AffiliationProcessor;
import org.buddycloud.channelserver.packetprocessor.message.event.ConfigurationProcessor;
import org.buddycloud.channelserver.packetprocessor.message.event.DeleteProcessor;
import org.buddycloud.channelserver.packetprocessor.message.event.ItemsProcessor;
import org.buddycloud.channelserver.packetprocessor.message.event.RetractItemProcessor;
import org.buddycloud.channelserver.packetprocessor.message.event.SubscriptionProcessor;
import org.dom4j.Element;
import org.xmpp.packet.Message;
import org.xmpp.packet.Packet;
public class MessageProcessor extends AbstractMessageProcessor {
private static final Logger logger = Logger.getLogger(MessageProcessor.class);
private Element event;
public static final String ITEMS = "items";
public static final String SUBSCRIPTION = "subscription";
private static final String AFFILIATIONS = "affiliations";
private static final String CONFIGURATION = "configuration";
private static final String DELETE = "delete";
public MessageProcessor(BlockingQueue<Packet> outQueue, Properties conf, ChannelManager channelManager) {
super(channelManager, conf, outQueue);
}
public void process(Message packet) throws Exception {
message = packet;
if (false == message.getType().equals(Message.Type.headline)) {
return;
}
event = message.getElement().element("event");
if (null != event) {
processEventContent(((Element) event.elements().get(0)).getName());
return;
}
logger.debug("Unsupported message type: " + packet.toXML());
throw new UnsupportedOperationException("Unknown message type", null);
}
private void processEventContent(String name) throws Exception {
logger.info("Processing event content type: '" + name + "'");
PacketProcessor<Message> handler = null;
if (name.equals(ITEMS)) {
handler = processItems();
} else if (true == name.equals(SUBSCRIPTION)) {
handler = new SubscriptionProcessor(outQueue, configuration, channelManager);
} else if (true == name.equals(AFFILIATIONS)) {
handler = new AffiliationProcessor(outQueue, configuration, channelManager);
} else if (true == name.equals(CONFIGURATION)) {
handler = new ConfigurationProcessor(outQueue, configuration, channelManager);
} else if (true == name.equals(DELETE)) {
handler = new DeleteProcessor(outQueue, configuration, channelManager);
}
if (null == handler) {
throw new UnknownEventContentException("Unknown event content '" + name + "'");
}
handler.process(message);
}
private AbstractMessageProcessor processItems() {
Element item = event.element("items").element("item");
if (null != item) {
return new ItemsProcessor(outQueue, configuration, channelManager);
}
Element retract = event.element("items").element("retract");
if (null != retract) {
return new RetractItemProcessor(outQueue, configuration, channelManager);
}
return null;
}
}