package org.atomnuke.http; import org.atomnuke.service.ServiceUnavailableException; import org.atomnuke.service.jetty.server.ContextBuilder; import org.atomnuke.servlet.AtomSinkServlet; import org.atomnuke.source.AtomSource; import org.atomnuke.source.AtomSourceException; import org.atomnuke.source.result.AtomSourceResult; import org.atomnuke.util.source.QueueSource; import org.atomnuke.util.source.QueueSourceImpl; 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 HttpSource implements AtomSource { private static final Logger LOG = LoggerFactory.getLogger(HttpSource.class); private final QueueSource queueSource; private ServletContextHandler servletContextHandler; public HttpSource() { queueSource = new QueueSourceImpl(); } @Override public AtomSourceResult poll() throws AtomSourceException { return queueSource.poll(); } @Override public void init(AtomTaskContext tc) throws InitializationException { try { final ContextBuilder contextBuilder = tc.services().firstAvailable(ContextBuilder.class); servletContextHandler = contextBuilder.newContext("/publish"); } catch (ServiceUnavailableException sue) { LOG.error("The HttpSource source requires a service that provides a ContextBuilder implementation for regsitering servlets."); throw new InitializationException(sue); } // Register the JAX-RS servlet final ServletHolder servletInstance = new ServletHolder(new AtomSinkServlet(queueSource)); servletContextHandler.addServlet(servletInstance, "/*"); } @Override public void destroy() { if (servletContextHandler != null && !(servletContextHandler.isStopping() || servletContextHandler.isStopped())) { try { servletContextHandler.stop(); servletContextHandler.destroy(); } catch (Exception ex) { LOG.error(ex.getMessage(), ex); } } } }