package org.atomnuke.category.index; import com.sun.jersey.spi.container.servlet.ServletContainer; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.atomnuke.atom.model.Category; import org.atomnuke.atom.model.Entry; import org.atomnuke.atom.model.Feed; import org.atomnuke.category.index.jaxrs.CategoryIndexResource; import org.atomnuke.sink.AtomSink; import org.atomnuke.sink.AtomSinkException; import org.atomnuke.sink.AtomSinkResult; import org.atomnuke.sink.SinkResult; import org.atomnuke.task.context.AtomTaskContext; import org.atomnuke.lifecycle.InitializationException; import org.atomnuke.service.ServiceUnavailableException; import org.atomnuke.service.jetty.server.ContextBuilder; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * * @author zinic */ public class CategoryIndex implements AtomSink { private static final Logger LOG = LoggerFactory.getLogger(CategoryIndex.class); private final CategoryTracker categoryTracker; private ServletContextHandler servletContextHandler; public CategoryIndex() { categoryTracker = new CategoryTrackerImpl(); } public void indexCategories(List<Category> categories) { for (Category indexCat : categories) { if (StringUtils.isNotBlank(indexCat.scheme()) || StringUtils.isNotBlank(indexCat.term())) { final String indexKey = indexCat.scheme() + "_" + indexCat.term(); categoryTracker.setCategory(indexKey, indexCat); } } } @Override public SinkResult entry(Entry entry) throws AtomSinkException { indexCategories(entry.categories()); return AtomSinkResult.ok(); } @Override public SinkResult feedPage(Feed page) throws AtomSinkException { indexCategories(page.categories()); for (Entry e : page.entries()) { indexCategories(e.categories()); } return AtomSinkResult.ok(); } @Override public void init(AtomTaskContext context) throws InitializationException { try { final ContextBuilder contextBuilder = context.services().firstAvailable(ContextBuilder.class); servletContextHandler = contextBuilder.newContext("/categoryIndex"); initServletContext(servletContextHandler); } 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) { // Set up the subscription manager context.setAttribute(CategoryIndexResource.CAT_TRACKER_CTX_NAME, categoryTracker); // Register the JAX-RS servlet final ServletHolder servletInstance = new ServletHolder(ServletContainer.class); servletInstance.setInitParameter("com.sun.jersey.config.property.packages", "org.atomnuke.category.index.jaxrs"); servletInstance.setInitParameter("com.sun.jersey.api.json.POJOMappingFeature", "true"); context.addServlet(servletInstance, "/*"); } }