/* ESXX - The friendly ECMAscript/XML Application Server Copyright (C) 2007-2015 Martin Blom <martin@blom.org> This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.esxx; import java.io.IOException; import java.net.URI; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.lang.management.ManagementFactory; import org.eclipse.jetty.ajp.Ajp13SocketConnector; import org.eclipse.jetty.jmx.MBeanContainer; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.AbstractHandler; import org.eclipse.jetty.server.nio.SelectChannelConnector; import org.eclipse.jetty.util.log.JavaUtilLog; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.thread.ExecutorThreadPool; import org.esxx.request.AsyncServletRequest; public abstract class Jetty { public static void runJettyServer(int http_port, int ajp_port, URI fs_root_uri) throws Exception { ESXX esxx = ESXX.getInstance(); Log.setLog(new JavaUtilLog(esxx.getLogger().getName())); int timeout = (int) (Double.parseDouble(esxx.getSettings() .getProperty("esxx.net.timeout", "60")) * 1000); Server server = new Server(); if (http_port != -1) { SelectChannelConnector http = new SelectChannelConnector(); http.setPort(http_port); http.setMaxIdleTime(timeout); server.addConnector(http); } if (ajp_port != -1) { Ajp13SocketConnector ajp = new Ajp13SocketConnector(); ajp.setPort(ajp_port); ajp.setMaxIdleTime(timeout); server.addConnector(ajp); } MBeanContainer cont = new MBeanContainer(ManagementFactory.getPlatformMBeanServer()); server.getContainer().addEventListener(cont); server.addBean(cont); cont.addBean(Log.getLog()); server.setThreadPool(new ExecutorThreadPool(esxx.getExecutor())); server.setStopAtShutdown(true); server.setHandler(new Handler(fs_root_uri)); server.start(); server.join(); } private static class Handler // Using a non-anonymous class makes the JMX name look better extends AbstractHandler { public Handler(URI fs_root_uri) { fsRootURI = fs_root_uri; } @Override public void handle(String target, org.eclipse.jetty.server.Request req, HttpServletRequest sreq, HttpServletResponse sres) throws IOException, ServletException { req.setHandled(true); AsyncServletRequest.handleServletRequest(sreq, sres, fsRootURI, "Jetty Error"); } private URI fsRootURI; } }