X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms.lib.jetty%2Fsrc%2Forg%2Fargeo%2Fcms%2Fjetty%2FContextHandlerHttpContext.java;fp=org.argeo.cms.lib.jetty%2Fsrc%2Forg%2Fargeo%2Fcms%2Fjetty%2FContextHandlerHttpContext.java;h=d6037ba8dbf799b3f5b14a71c8b40ac93226cdb3;hb=5b6b49fa655c7b3ae3dcc06d6c504e3d0225684f;hp=0000000000000000000000000000000000000000;hpb=fbdca9fcba285280f1d113671ef3ba7a670e45c7;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms.lib.jetty/src/org/argeo/cms/jetty/ContextHandlerHttpContext.java b/org.argeo.cms.lib.jetty/src/org/argeo/cms/jetty/ContextHandlerHttpContext.java new file mode 100644 index 000000000..d6037ba8d --- /dev/null +++ b/org.argeo.cms.lib.jetty/src/org/argeo/cms/jetty/ContextHandlerHttpContext.java @@ -0,0 +1,84 @@ +package org.argeo.cms.jetty; + +import java.util.AbstractMap; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import javax.servlet.ServletContext; +import javax.websocket.DeploymentException; +import javax.websocket.server.ServerContainer; + +import org.argeo.cms.servlet.httpserver.HttpContextServlet; +import org.argeo.cms.websocket.server.WebsocketEndpoints; +import org.eclipse.jetty.server.handler.ContextHandler; +import org.eclipse.jetty.server.session.SessionHandler; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHolder; +import org.eclipse.jetty.websocket.javax.server.config.JavaxWebSocketServletContainerInitializer; +import org.eclipse.jetty.websocket.javax.server.config.JavaxWebSocketServletContainerInitializer.Configurator; + +import com.sun.net.httpserver.HttpHandler; + +/** + * An @{HttpContext} implementation based on a Jetty + * {@link ServletContextHandler}. + */ +class ContextHandlerHttpContext extends JettyHttpContext { + private final ServletContextHandler servletContextHandler; + private final ContextHandlerAttributes attributes; + + public ContextHandlerHttpContext(JettyHttpServer httpServer, String path) { + super(httpServer, path); + + // Jetty context handler + this.servletContextHandler = new ServletContextHandler(); + servletContextHandler.setContextPath(path); + HttpContextServlet servlet = new HttpContextServlet(this); + servletContextHandler.addServlet(new ServletHolder(servlet), "/*"); + SessionHandler sessionHandler = new SessionHandler(); + // FIXME find a better default + sessionHandler.setMaxInactiveInterval(-1); + servletContextHandler.setSessionHandler(sessionHandler); + + attributes = new ContextHandlerAttributes(servletContextHandler); + } + + @Override + public void setHandler(HttpHandler handler) { + super.setHandler(handler); + + // web socket + if (handler instanceof WebsocketEndpoints) { + JavaxWebSocketServletContainerInitializer.configure(servletContextHandler, new Configurator() { + + @Override + public void accept(ServletContext servletContext, ServerContainer serverContainer) + throws DeploymentException { + for (Class clss : ((WebsocketEndpoints) handler).getEndPoints()) { + serverContainer.addEndpoint(clss); + } + } + }); + } + + if (getJettyHttpServer().isStarted()) + try { + servletContextHandler.start(); + } catch (Exception e) { + throw new IllegalStateException("Cannot start context handler", e); + } + } + + @Override + public Map getAttributes() { + return attributes; + } + + @Override + protected ServletContextHandler getServletContextHandler() { + return servletContextHandler; + } + +}