]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms.lib.jetty/src/org/argeo/cms/jetty/ContextHandlerHttpContext.java
Move Equinox specific code to the appropriate variant
[lgpl/argeo-commons.git] / org.argeo.cms.lib.jetty / src / org / argeo / cms / jetty / ContextHandlerHttpContext.java
1 package org.argeo.cms.jetty;
2
3 import java.util.AbstractMap;
4 import java.util.Enumeration;
5 import java.util.HashSet;
6 import java.util.Map;
7 import java.util.Set;
8
9 import javax.servlet.ServletContext;
10 import javax.websocket.DeploymentException;
11 import javax.websocket.server.ServerContainer;
12
13 import org.argeo.cms.servlet.httpserver.HttpContextServlet;
14 import org.argeo.cms.websocket.server.WebsocketEndpoints;
15 import org.eclipse.jetty.server.handler.ContextHandler;
16 import org.eclipse.jetty.server.session.SessionHandler;
17 import org.eclipse.jetty.servlet.ServletContextHandler;
18 import org.eclipse.jetty.servlet.ServletHolder;
19 import org.eclipse.jetty.websocket.javax.server.config.JavaxWebSocketServletContainerInitializer;
20 import org.eclipse.jetty.websocket.javax.server.config.JavaxWebSocketServletContainerInitializer.Configurator;
21
22 import com.sun.net.httpserver.HttpHandler;
23
24 /**
25 * An @{HttpContext} implementation based on a Jetty
26 * {@link ServletContextHandler}.
27 */
28 class ContextHandlerHttpContext extends JettyHttpContext {
29 private final ServletContextHandler servletContextHandler;
30 private final ContextHandlerAttributes attributes;
31
32 public ContextHandlerHttpContext(JettyHttpServer httpServer, String path) {
33 super(httpServer, path);
34
35 // Jetty context handler
36 this.servletContextHandler = new ServletContextHandler();
37 servletContextHandler.setContextPath(path);
38 HttpContextServlet servlet = new HttpContextServlet(this);
39 servletContextHandler.addServlet(new ServletHolder(servlet), "/*");
40 SessionHandler sessionHandler = new SessionHandler();
41 // FIXME find a better default
42 sessionHandler.setMaxInactiveInterval(-1);
43 servletContextHandler.setSessionHandler(sessionHandler);
44
45 attributes = new ContextHandlerAttributes(servletContextHandler);
46 }
47
48 @Override
49 public void setHandler(HttpHandler handler) {
50 super.setHandler(handler);
51
52 // web socket
53 if (handler instanceof WebsocketEndpoints) {
54 JavaxWebSocketServletContainerInitializer.configure(servletContextHandler, new Configurator() {
55
56 @Override
57 public void accept(ServletContext servletContext, ServerContainer serverContainer)
58 throws DeploymentException {
59 for (Class<?> clss : ((WebsocketEndpoints) handler).getEndPoints()) {
60 serverContainer.addEndpoint(clss);
61 }
62 }
63 });
64 }
65
66 if (getJettyHttpServer().isStarted())
67 try {
68 servletContextHandler.start();
69 } catch (Exception e) {
70 throw new IllegalStateException("Cannot start context handler", e);
71 }
72 }
73
74 @Override
75 public Map<String, Object> getAttributes() {
76 return attributes;
77 }
78
79 @Override
80 protected ServletContextHandler getServletContextHandler() {
81 return servletContextHandler;
82 }
83
84 }