package net.johnewart.gearman.server.web; import com.codahale.metrics.servlets.HealthCheckServlet; import com.codahale.metrics.servlets.MetricsServlet; import net.johnewart.gearman.server.config.GearmanServerConfiguration; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.server.handler.ResourceHandler; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.http.HttpServlet; import java.net.URL; import java.util.HashMap; import java.util.Map; public class WebListener { private final Logger LOG = LoggerFactory.getLogger(WebListener.class); private final static String TEMPLATE_PATH = "net/johnewart/gearman/server/web/templates"; private final GearmanServerConfiguration serverConfiguration; public WebListener(GearmanServerConfiguration serverConfiguration) { this.serverConfiguration = serverConfiguration; } public Map<String, HttpServlet> getServletMappings() { final MetricsServlet metricsServlet = new MetricsServlet(serverConfiguration.getMetricRegistry()); final HealthCheckServlet healthCheckServlet = new HealthCheckServlet(serverConfiguration.getHealthCheckRegistry()); final GearmanServlet gearmanServlet = new GearmanServlet(serverConfiguration.getJobQueueMonitor(), serverConfiguration.getJobManager(), serverConfiguration.getQueueMetrics()); final DashboardServlet dashboardServlet = new DashboardServlet(serverConfiguration.getJobQueueMonitor(), serverConfiguration.getQueueMetrics()); final JobQueueServlet jobQueueServlet = new JobQueueServlet(serverConfiguration.getJobManager()); final ClusterServlet clusterServlet = new ClusterServlet(serverConfiguration); final ExceptionsServlet exceptionsServlet = new ExceptionsServlet(serverConfiguration.getExceptionStorageEngine()); Map<String, HttpServlet> mappings = new HashMap<>(); mappings.put("/gearman/*", gearmanServlet); mappings.put("/queues/*", jobQueueServlet); mappings.put("/metrics/*", metricsServlet); mappings.put("/health/*", healthCheckServlet); mappings.put("/cluster/*", clusterServlet); mappings.put("/exceptions/*", exceptionsServlet); mappings.put("/", dashboardServlet); return mappings; } public void start() throws Exception { LOG.info("Listening on " + ":" + serverConfiguration.getHttpPort()); final Server httpServer = new Server(serverConfiguration.getHttpPort()); final HandlerList handlerList = new HandlerList(); final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); final URL templateURL = classLoader.getResource(TEMPLATE_PATH); if (templateURL != null) { final String webResourceDir = templateURL.toExternalForm(); final ResourceHandler resourceHandler = new ResourceHandler(); final ContextHandler resourceContext = new ContextHandler("/static"); final ServletContextHandler servletHandler = new ServletContextHandler( ServletContextHandler.SESSIONS); resourceHandler.setResourceBase(webResourceDir); resourceContext.setHandler(resourceHandler); servletHandler.setContextPath("/"); Map<String, HttpServlet> servletMap = getServletMappings(); for(Map.Entry<String, HttpServlet> map : servletMap.entrySet()) { servletHandler.addServlet(new ServletHolder(map.getValue()), map.getKey()); } handlerList.addHandler(resourceContext); handlerList.addHandler(servletHandler); httpServer.setHandler(handlerList); httpServer.start(); } else { throw new IllegalArgumentException("Template path inaccessible / does not exist."); } } }