package org.atomnuke.pubsub.sink; import org.atomnuke.pubsub.sub.TemporarySubscriptionManager; import org.atomnuke.pubsub.sub.SubscriptionManager; import com.sun.jersey.spi.container.servlet.ServletContainer; import org.apache.http.client.HttpClient; import org.atomnuke.service.ServiceUnavailableException; import org.atomnuke.service.jetty.server.ContextBuilder; import org.atomnuke.sink.eps.EventletChainSink; import org.atomnuke.task.context.AtomTaskContext; import org.atomnuke.lifecycle.InitializationException; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * * @author zinic */ public class PubSubSink extends EventletChainSink { private static final Logger LOG = LoggerFactory.getLogger(PubSubSink.class); private ServletContextHandler servletContextHandler; @Override public void init(AtomTaskContext context) throws InitializationException { // Make sure we let our parent know that were initializing super.init(context); try { final ContextBuilder contextBuilder = context.services().firstAvailable(ContextBuilder.class); final SubscriptionManager subManager = new TemporarySubscriptionManager(context.services().firstAvailable(HttpClient.class), this); servletContextHandler = contextBuilder.newContext("/pubsub"); initServletContext(servletContextHandler, subManager); } catch (ServiceUnavailableException sue) { throw new InitializationException(sue); } } @Override public void destroy() { if (servletContextHandler != null && !(servletContextHandler.isStopping() || servletContextHandler.isStopped())) { try { servletContextHandler.stop(); servletContextHandler.destroy(); } catch (Exception ex) { LOG.error(ex.getMessage(), ex); } } } private void initServletContext(ServletContextHandler context, SubscriptionManager subManager) { // Set up the subscription manager context.setAttribute(SubscriptionManager.SERVLET_CTX_NAME, subManager); // Register the JAX-RS servlet final ServletHolder servletInstance = new ServletHolder(ServletContainer.class); servletInstance.setInitParameter("com.sun.jersey.config.property.packages", "org.atomnuke.pubsub.api"); servletInstance.setInitParameter("com.sun.jersey.api.json.POJOMappingFeature", "true"); context.addServlet(servletInstance, "/*"); } }