]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms.lib.jetty/src/org/argeo/cms/jetty/CmsJettyServer.java
Move Equinox specific code to the appropriate variant
[lgpl/argeo-commons.git] / org.argeo.cms.lib.jetty / src / org / argeo / cms / jetty / CmsJettyServer.java
1 package org.argeo.cms.jetty;
2
3 import java.io.IOException;
4 import java.nio.file.Files;
5 import java.nio.file.Path;
6 import java.util.concurrent.CompletableFuture;
7
8 import javax.servlet.ServletContext;
9 import javax.servlet.ServletException;
10 import javax.websocket.DeploymentException;
11 import javax.websocket.server.ServerContainer;
12
13 import org.eclipse.jetty.server.session.SessionHandler;
14 import org.eclipse.jetty.servlet.ServletContextHandler;
15 import org.eclipse.jetty.websocket.javax.server.config.JavaxWebSocketServletContainerInitializer;
16 import org.eclipse.jetty.websocket.javax.server.config.JavaxWebSocketServletContainerInitializer.Configurator;
17
18 /** A {@link JettyHttpServer} which is compatible with Equinox servlets. */
19 public class CmsJettyServer extends JettyHttpServer {
20 private static final String CONTEXT_TEMPDIR = "javax.servlet.context.tempdir";
21 // Equinox compatibility
22 private static final String INTERNAL_CONTEXT_CLASSLOADER = "org.eclipse.equinox.http.jetty.internal.ContextClassLoader";
23 private Path tempDir;
24
25 private CompletableFuture<ServerContainer> serverContainer = new CompletableFuture<>();
26
27 protected void addServlets(ServletContextHandler servletContextHandler) throws ServletException {
28 }
29
30 @Override
31 public void start() {
32 try {
33 tempDir = Files.createTempDirectory("jetty");
34 } catch (IOException e) {
35 throw new IllegalStateException("Cannot create temp dir", e);
36 }
37 super.start();
38 }
39
40 @Override
41 protected ServletContextHandler createRootContextHandler() {
42 ServletContextHandler servletContextHandler = new ServletContextHandler();
43 servletContextHandler.setAttribute(INTERNAL_CONTEXT_CLASSLOADER,
44 Thread.currentThread().getContextClassLoader());
45 servletContextHandler.setClassLoader(this.getClass().getClassLoader());
46 servletContextHandler.setContextPath("/");
47
48 servletContextHandler.setAttribute(CONTEXT_TEMPDIR, tempDir.toAbsolutePath().toFile());
49 SessionHandler handler = new SessionHandler();
50 handler.setMaxInactiveInterval(-1);
51 servletContextHandler.setSessionHandler(handler);
52
53 JavaxWebSocketServletContainerInitializer.configure(servletContextHandler, new Configurator() {
54
55 @Override
56 public void accept(ServletContext servletContext, ServerContainer serverContainer)
57 throws DeploymentException {
58 CmsJettyServer.this.serverContainer.complete(serverContainer);
59 }
60 });
61
62 return servletContextHandler;
63 }
64
65 @Override
66 protected ServerContainer getRootServerContainer() {
67 return serverContainer.join();
68 }
69
70 @Override
71 protected void configureRootContextHandler(ServletContextHandler servletContextHandler) throws ServletException {
72 addServlets(servletContextHandler);
73 }
74
75 /*
76 * WEB SOCKET
77 */
78
79 }