package org.buddycloud.channelserver; import java.util.ArrayList; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import org.apache.log4j.Logger; import org.buddycloud.channelserver.channel.ChannelManagerFactory; import org.buddycloud.channelserver.channel.ChannelManagerFactoryImpl; import org.buddycloud.channelserver.db.DefaultNodeStoreFactoryImpl; import org.buddycloud.channelserver.db.NodeStoreFactory; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.queue.FederatedQueueManager; import org.buddycloud.channelserver.queue.InQueueConsumer; import org.buddycloud.channelserver.queue.OutQueueConsumer; import org.buddycloud.channelserver.sync.ServerSync; import org.buddycloud.channelserver.utils.users.OnlineResourceManager; import org.xmpp.component.Component; import org.xmpp.component.ComponentException; import org.xmpp.component.ComponentManager; import org.xmpp.packet.JID; import org.xmpp.packet.Message; import org.xmpp.packet.Packet; public class ChannelsEngine implements Component { private static final Logger LOGGER = Logger.getLogger(ChannelsEngine.class); private JID jid = null; private ComponentManager manager = null; private BlockingQueue<Packet> outQueue = new LinkedBlockingQueue<Packet>(); private BlockingQueue<Packet> inQueue = new LinkedBlockingQueue<Packet>(); private ChannelManagerFactory channelManagerFactory; private FederatedQueueManager federatedQueueManager; private ServerSync serverSync; private OnlineResourceManager onlineUsers; private Configuration configuration; public ChannelsEngine(Configuration conf) { this.configuration = conf; } @Override public String getDescription() { return "buddycloud channel server (Java implementation)"; } @Override public String getName() { return "buddycloud-channel-server"; } @Override public void initialize(JID jid, ComponentManager manager) throws ComponentException { this.jid = jid; this.manager = manager; setupManagers(); startQueueConsumers(); serverSync(); LOGGER.info("XMPP component started. We are '" + jid.toString() + "' and ready to accept packages."); sendConnectionNotification(jid); } private void sendConnectionNotification(JID jid2) throws ComponentException { ArrayList<JID> sendTo = this.configuration.getNotificationsList( Configuration.NOTIFICATIONS_CONNECTED); Message message = new Message(); message.setFrom(jid); message.setType(Message.Type.chat); message.setBody("XMPP component started"); for (JID user : sendTo) { message.setTo(user); this.sendPacket(message.createCopy()); } } private void serverSync() { serverSync = new ServerSync(channelManagerFactory, inQueue, outQueue, configuration); serverSync.start(); } private void startQueueConsumers() { OutQueueConsumer outQueueConsumer = new OutQueueConsumer(this, outQueue, federatedQueueManager, configuration, onlineUsers, inQueue); InQueueConsumer inQueueConsumer = new InQueueConsumer(outQueue, configuration, inQueue, channelManagerFactory, federatedQueueManager, onlineUsers); outQueueConsumer.start(); inQueueConsumer.start(); } private void setupManagers() throws ComponentException { NodeStoreFactory nodeStoreFactory; try { nodeStoreFactory = new DefaultNodeStoreFactoryImpl(configuration); } catch (NodeStoreException e) { throw new ComponentException(e); } channelManagerFactory = new ChannelManagerFactoryImpl(nodeStoreFactory); federatedQueueManager = new FederatedQueueManager(this, configuration); onlineUsers = new OnlineResourceManager(configuration, channelManagerFactory.create()); } @Override public void processPacket(Packet p) { try { this.inQueue.put(p); } catch (InterruptedException e) { LOGGER.error(p); } } public void sendPacket(Packet p) throws ComponentException { LOGGER.debug("OUT -> " + p.toXML()); p.setFrom(jid); manager.sendPacket(this, p); } @Override public void shutdown() { } @Override public void start() { /** * Notification message indicating that the component will start receiving incoming packets. * At this time the component may finish pending initialization issues that require * information obtained from the server. * * It is likely that most of the component will leave this method empty. */ } public JID getJID() { return this.jid; } }