Improve Jetty integration in order to support consistent HTTP sessions.
[lgpl/argeo-commons.git] / org.argeo.cms.lib.jetty / src / org / argeo / cms / jetty / CmsJettyServer.java
index 90a800f7eff894cbfde502d956da8e6aadec77b0..b0b348d9ccfec48a514b93042cd20b2fc2f87757 100644 (file)
@@ -3,11 +3,17 @@ package org.argeo.cms.jetty;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.util.concurrent.CompletableFuture;
 
+import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
+import javax.websocket.DeploymentException;
+import javax.websocket.server.ServerContainer;
 
 import org.eclipse.jetty.server.session.SessionHandler;
 import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.websocket.javax.server.config.JavaxWebSocketServletContainerInitializer;
+import org.eclipse.jetty.websocket.javax.server.config.JavaxWebSocketServletContainerInitializer.Configurator;
 
 /** A {@link JettyHttpServer} which is compatible with Equinox servlets. */
 public class CmsJettyServer extends JettyHttpServer {
@@ -16,6 +22,8 @@ public class CmsJettyServer extends JettyHttpServer {
        private static final String INTERNAL_CONTEXT_CLASSLOADER = "org.eclipse.equinox.http.jetty.internal.ContextClassLoader";
        private Path tempDir;
 
+       private CompletableFuture<ServerContainer> serverContainer = new CompletableFuture<>();
+
        protected void addServlets(ServletContextHandler servletContextHandler) throws ServletException {
        }
 
@@ -29,6 +37,7 @@ public class CmsJettyServer extends JettyHttpServer {
                super.start();
        }
 
+       @Override
        protected ServletContextHandler createRootContextHandler() {
                ServletContextHandler servletContextHandler = new ServletContextHandler();
                servletContextHandler.setAttribute(INTERNAL_CONTEXT_CLASSLOADER,
@@ -41,11 +50,30 @@ public class CmsJettyServer extends JettyHttpServer {
                handler.setMaxInactiveInterval(-1);
                servletContextHandler.setSessionHandler(handler);
 
+               JavaxWebSocketServletContainerInitializer.configure(servletContextHandler, new Configurator() {
+
+                       @Override
+                       public void accept(ServletContext servletContext, ServerContainer serverContainer)
+                                       throws DeploymentException {
+                               CmsJettyServer.this.serverContainer.complete(serverContainer);
+                       }
+               });
+
                return servletContextHandler;
        }
 
+       @Override
+       protected ServerContainer getRootServerContainer() {
+               return serverContainer.join();
+       }
+
        @Override
        protected void configureRootContextHandler(ServletContextHandler servletContextHandler) throws ServletException {
                addServlets(servletContextHandler);
        }
+
+       /*
+        * WEB SOCKET
+        */
+
 }