package org.neo4j.smack; import java.net.InetSocketAddress; import java.util.concurrent.Executors; import org.jboss.netty.bootstrap.ServerBootstrap; import org.jboss.netty.channel.group.ChannelGroup; import org.jboss.netty.channel.group.DefaultChannelGroup; import org.jboss.netty.channel.socket.ServerSocketChannelFactory; import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory; import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.smack.pipeline.DaemonThreadFactory; import org.neo4j.smack.pipeline.DefaultExceptionHandler; import org.neo4j.smack.pipeline.core.CoreWorkPipeline; import org.neo4j.smack.pipeline.core.DeserializationHandler; import org.neo4j.smack.pipeline.core.RoutingHandler; import org.neo4j.smack.pipeline.core.TransactionPreparationHandler; import org.neo4j.smack.pipeline.core.WorkDivisionHandler; import org.neo4j.smack.pipeline.http.NettyHttpPipelineFactory; import org.neo4j.smack.routing.Endpoint; import org.neo4j.smack.routing.Router; import org.neo4j.smack.routing.RoutingDefinition; public class Smack { private int port; private String host; private Router router = new Router(); private ServerBootstrap netty; private CoreWorkPipeline inputPipeline; private ServerSocketChannelFactory channelFactory; private ChannelGroup openChannels = new DefaultChannelGroup("SmackServer"); private GraphDatabaseService database; private WorkDivisionHandler workDivisionHandler; private DefaultExceptionHandler exceptionHandler; public Smack(String host, int port, GraphDatabaseService db) { this.host = host; this.port = port; this.database = db; } public void start() { router.compileRoutes(); // MAIN PIPELINE exceptionHandler = new DefaultExceptionHandler(); workDivisionHandler = new WorkDivisionHandler(database, exceptionHandler); inputPipeline = new CoreWorkPipeline(exceptionHandler, new RoutingHandler(router), new DeserializationHandler(), new TransactionPreparationHandler(), workDivisionHandler); inputPipeline.start(); // NETTY channelFactory = new NioServerSocketChannelFactory( Executors.newCachedThreadPool(new DaemonThreadFactory("SocketMaster")), Executors.newCachedThreadPool(new DaemonThreadFactory("SocketSlave"))); netty = new ServerBootstrap(channelFactory); // Set up the event pipeline factory. netty.setPipelineFactory(new NettyHttpPipelineFactory(inputPipeline, openChannels)); // Bind and start to accept incoming connections. openChannels.add(netty.bind(new InetSocketAddress(host, port))); } public void stop() { if (openChannels!=null) openChannels.close().awaitUninterruptibly(); if (channelFactory!=null) channelFactory.releaseExternalResources(); if (workDivisionHandler!=null) workDivisionHandler.stop(); if (inputPipeline!=null) inputPipeline.stop(); } public void addRoute(String route, RoutingDefinition target) { router.addRoute(route, target); } public void addRoute(String route, Endpoint target) { router.addRoute(route, target); } public void addRoute(String route, Object target) { router.addRoute(route, target); } public GraphDatabaseService getDatabase() { return database; } }