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 a18f4b495632f908c9be762ac1587c49af46b5b2..b0b348d9ccfec48a514b93042cd20b2fc2f87757 100644 (file)
@@ -3,45 +3,26 @@ package org.argeo.cms.jetty;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.util.Map;
+import java.util.concurrent.CompletableFuture;
 
 import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
 import javax.websocket.DeploymentException;
 import javax.websocket.server.ServerContainer;
-import javax.websocket.server.ServerEndpointConfig;
-import com.sun.net.httpserver.Authenticator;
-import com.sun.net.httpserver.HttpContext;
-
-import org.argeo.api.cms.CmsState;
-import org.argeo.cms.CmsDeployProperty;
-import org.argeo.cms.websocket.server.CmsWebSocketConfigurator;
-import org.argeo.cms.websocket.server.TestEndpoint;
+
 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 {
        private static final String CONTEXT_TEMPDIR = "javax.servlet.context.tempdir";
        // Equinox compatibility
        private static final String INTERNAL_CONTEXT_CLASSLOADER = "org.eclipse.equinox.http.jetty.internal.ContextClassLoader";
-//     private static final CmsLog log = CmsLog.getLog(CmsJettyServer.class);
-
-//     private Server server;
-//     private Path tempDir;
-//
-//     private ServerConnector httpConnector;
-//     private ServerConnector httpsConnector;
        private Path tempDir;
 
-       // WebSocket
-//     private ServerContainer wsServerContainer;
-       private ServerEndpointConfig.Configurator wsEndpointConfigurator;
-
-       private CmsState cmsState;
-
-       private Authenticator defaultAuthenticator;
+       private CompletableFuture<ServerContainer> serverContainer = new CompletableFuture<>();
 
        protected void addServlets(ServletContextHandler servletContextHandler) throws ServletException {
        }
@@ -56,6 +37,7 @@ public class CmsJettyServer extends JettyHttpServer {
                super.start();
        }
 
+       @Override
        protected ServletContextHandler createRootContextHandler() {
                ServletContextHandler servletContextHandler = new ServletContextHandler();
                servletContextHandler.setAttribute(INTERNAL_CONTEXT_CLASSLOADER,
@@ -68,59 +50,30 @@ public class CmsJettyServer extends JettyHttpServer {
                handler.setMaxInactiveInterval(-1);
                servletContextHandler.setSessionHandler(handler);
 
-               return servletContextHandler;
-       }
+               JavaxWebSocketServletContainerInitializer.configure(servletContextHandler, new Configurator() {
 
-       @Override
-       protected void configureRootContextHandler(ServletContextHandler servletContextHandler) throws ServletException {
-               addServlets(servletContextHandler);
-               enableWebSocket(servletContextHandler);
+                       @Override
+                       public void accept(ServletContext servletContext, ServerContainer serverContainer)
+                                       throws DeploymentException {
+                               CmsJettyServer.this.serverContainer.complete(serverContainer);
+                       }
+               });
 
+               return servletContextHandler;
        }
 
        @Override
-       public synchronized HttpContext createContext(String path) {
-               HttpContext httpContext = super.createContext(path);
-               httpContext.setAuthenticator(defaultAuthenticator);
-               return httpContext;
-       }
-
-       protected void enableWebSocket(ServletContextHandler servletContextHandler) {
-               String webSocketEnabled = getDeployProperty(CmsDeployProperty.WEBSOCKET_ENABLED);
-               // web socket
-               if (webSocketEnabled != null && webSocketEnabled.equals(Boolean.toString(true))) {
-//                     JavaxWebSocketServletContainerInitializer.configure(servletContextHandler, new Configurator() {
-//
-//                             @Override
-//                             public void accept(ServletContext servletContext, ServerContainer serverContainer)
-//                                             throws DeploymentException {
-////                                   wsServerContainer = serverContainer;
-//
-//                                     CmsWebSocketConfigurator wsEndpointConfigurator = new CmsWebSocketConfigurator();
-//
-//                                     ServerEndpointConfig config = ServerEndpointConfig.Builder
-//                                                     .create(TestEndpoint.class, "/ws/test/events/{topic}").configurator(wsEndpointConfigurator)
-//                                                     .build();
-//                                     try {
-//                                             serverContainer.addEndpoint(config);
-//                                     } catch (DeploymentException e) {
-//                                             throw new IllegalStateException("Cannot initalise the WebSocket server runtime.", e);
-//                                     }
-//                             }
-//                     });
-               }
-       }
-
-       protected String getDeployProperty(CmsDeployProperty deployProperty) {
-               return cmsState.getDeployProperty(deployProperty.getProperty());
+       protected ServerContainer getRootServerContainer() {
+               return serverContainer.join();
        }
 
-       public void setCmsState(CmsState cmsState) {
-               this.cmsState = cmsState;
+       @Override
+       protected void configureRootContextHandler(ServletContextHandler servletContextHandler) throws ServletException {
+               addServlets(servletContextHandler);
        }
 
-       public void setDefaultAuthenticator(Authenticator defaultAuthenticator) {
-               this.defaultAuthenticator = defaultAuthenticator;
-       }
+       /*
+        * WEB SOCKET
+        */
 
 }