The Equinox Jetty bundle should not be explicitly started anymore.
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 9 Oct 2019 09:41:23 +0000 (11:41 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 9 Oct 2019 09:41:23 +0000 (11:41 +0200)
demo/cms-e4-rap.properties
dist/argeo-node/base/share/argeo/config.ini
org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/DeployConfig.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java
org.argeo.ext.equinox.jetty/bnd.bnd
org.argeo.ext.equinox.jetty/src/org/argeo/equinox/jetty/CmsJettyCustomizer.java

index bbfb30655dc7da4d7ea2e0e6022859c8ad402c11..e8f2458401f2b885dec81a6a7c0ac8ef6893f2da 100644 (file)
@@ -3,7 +3,6 @@ org.apache.aries.spifly.dynamic.bundle
 
 argeo.osgi.start.2.node=\
 org.eclipse.equinox.http.servlet,\
-org.eclipse.equinox.http.jetty,\
 org.eclipse.equinox.metatype,\
 org.eclipse.equinox.cm,\
 org.eclipse.equinox.ds,\
index 269fcf6ee72f23d91df3a87979f284e86dfb74f2..1a49ded8c8a78424152982b734c1ec8ad4322690 100644 (file)
@@ -4,7 +4,6 @@ osgi.bundles=org.argeo.osgi.boot@start
 # Required standard bundles to start
 argeo.osgi.start.2.node=\
 org.eclipse.equinox.http.servlet,\
-org.eclipse.equinox.http.jetty,\
 org.eclipse.equinox.metatype,\
 org.eclipse.equinox.cm,\
 org.eclipse.equinox.ds,\
index 30d283c580583ed090df96b2694ad093bd414b89..20418ec4d21e803890e838abdfaec1b092a24337 100644 (file)
@@ -34,6 +34,7 @@ import org.argeo.node.security.CryptoKeyring;
 import org.argeo.node.security.Keyring;
 import org.argeo.osgi.useradmin.UserAdminConf;
 import org.argeo.util.LangUtils;
+import org.eclipse.equinox.http.jetty.JettyConfigurator;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
@@ -192,6 +193,13 @@ public class CmsDeployment implements NodeDeployment {
        public void shutdown() {
                if (nodeHttp != null)
                        nodeHttp.destroy();
+
+               try {
+                       JettyConfigurator.stopServer(KernelConstants.DEFAULT_JETTY_SERVER);
+               } catch (Exception e) {
+                       log.error("Cannot stop default Jetty server.", e);
+               }
+
                if (deployConfig != null) {
                        new Thread(() -> deployConfig.save(), "Save Argeo Deploy Config").start();
                }
index b1e36633a1da9cd704d0e787e4fa8673a40d5c9d..ffb79b202b7eb0390cdec879068ab449d7a9e1ce 100644 (file)
@@ -25,6 +25,7 @@ import org.argeo.naming.LdifParser;
 import org.argeo.naming.LdifWriter;
 import org.argeo.node.NodeConstants;
 import org.argeo.osgi.useradmin.UserAdminConf;
+import org.eclipse.equinox.http.jetty.JettyConfigurator;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.FrameworkUtil;
 import org.osgi.service.cm.Configuration;
@@ -120,14 +121,28 @@ class DeployConfig implements ConfigurationListener {
                }
 
                // http server
+//             Dictionary<String, Object> webServerConfig = InitUtils
+//                             .getHttpServerConfig(getProps(KernelConstants.JETTY_FACTORY_PID, NodeConstants.DEFAULT));
+//             if (!webServerConfig.isEmpty()) {
+//                     // TODO check for other customizers
+//                     webServerConfig.put("customizer.class", "org.argeo.equinox.jetty.CmsJettyCustomizer");
+//                     putFactoryDeployConfig(KernelConstants.JETTY_FACTORY_PID, webServerConfig);
+//             }
+               save();
+
+               // Explicitly configure Jetty so that the default server is not started by the
+               // activator of the Equinox Jetty bundle.
                Dictionary<String, Object> webServerConfig = InitUtils
                                .getHttpServerConfig(getProps(KernelConstants.JETTY_FACTORY_PID, NodeConstants.DEFAULT));
                if (!webServerConfig.isEmpty()) {
-                       // TODO chekc for other customizers
-                       webServerConfig.put("customizer.class", "org.argeo.equinox.jetty.CmsJettyCustomizer");
-                       putFactoryDeployConfig(KernelConstants.JETTY_FACTORY_PID, webServerConfig);
+                       webServerConfig.put("customizer.class", KernelConstants.CMS_JETTY_CUSTOMIZER_CLASS);
                }
-               save();
+               try {
+                       JettyConfigurator.startServer(KernelConstants.DEFAULT_JETTY_SERVER, webServerConfig);
+               } catch (Exception e) {
+                       log.error("Cannot start default Jetty server with config " + webServerConfig, e);
+               }
+
        }
 
        private void init(ConfigurationAdmin configurationAdmin, boolean isClean, boolean isFirstInit) throws IOException {
index f221d0cdbf7dee2d08f9d57ae12bf0e837dbad67..13ff4b8b2780eec7d309dfd3231b289d8be3cf40 100644 (file)
@@ -37,6 +37,9 @@ public interface KernelConstants {
 
        String JETTY_FACTORY_PID = "org.eclipse.equinox.http.jetty.config";
        String WHITEBOARD_PATTERN_PROP = "osgi.http.whiteboard.servlet.pattern";
+       // default Jetty server configured via JettyConfigurator
+       String DEFAULT_JETTY_SERVER = "default";
+       String CMS_JETTY_CUSTOMIZER_CLASS = "org.argeo.equinox.jetty.CmsJettyCustomizer";
 
        // avoid dependencies
        String CONTEXT_NAME_PROP = "contextName";
index 0f21e73c91b7983885c8fd8a02d555762177a708..3422e55e7ca7844e14d184fa234d663a98eeb42c 100644 (file)
@@ -4,4 +4,6 @@ Import-Package: org.eclipse.jetty.websocket.jsr356,\
 org.eclipse.jetty.websocket.api,\
 org.eclipse.jetty.websocket.common,\
 org.osgi.service.http,\
+org.argeo.cms.auth,\
+org.argeo.node,\
 *
\ No newline at end of file
index 60d23719edb107c3ca811f841f594e596005b421..e6d6c697074cd45909880d4fc8ce858d75726313 100644 (file)
@@ -2,12 +2,14 @@ package org.argeo.equinox.jetty;
 
 import java.util.Dictionary;
 
-import javax.servlet.ServletException;
+import javax.servlet.ServletContext;
+import javax.websocket.DeploymentException;
 
 import org.eclipse.equinox.http.jetty.JettyCustomizer;
 import org.eclipse.jetty.servlet.ServletContextHandler;
 import org.eclipse.jetty.websocket.jsr356.server.ServerContainer;
 import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer;
+import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer.Configurator;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.FrameworkUtil;
 
@@ -19,33 +21,21 @@ public class CmsJettyCustomizer extends JettyCustomizer {
        public Object customizeContext(Object context, Dictionary<String, ?> settings) {
                // WebSocket
                Object webSocketEnabled = settings.get("websocket.enabled");
+               if (webSocketEnabled == null) {
+                       webSocketEnabled = bc.getProperty("org.eclipse.equinox.http.jetty.websocket.enabled");
+               }
                if (webSocketEnabled != null && webSocketEnabled.toString().equals("true")) {
                        ServletContextHandler servletContextHandler = (ServletContextHandler) context;
-                       new WebSocketInit(servletContextHandler).start();
+                       WebSocketServerContainerInitializer.configure(servletContextHandler, new Configurator() {
+
+                               @Override
+                               public void accept(ServletContext servletContext, ServerContainer serverContainer)
+                                               throws DeploymentException {
+                                       bc.registerService(javax.websocket.server.ServerContainer.class, serverContainer, null);
+                               }
+                       });
                }
                return super.customizeContext(context, settings);
 
        }
-
-       /** Configure websocket container asynchronously as it may take some time */
-       private class WebSocketInit extends Thread {
-               ServletContextHandler servletContextHandler;
-
-               public WebSocketInit(ServletContextHandler servletContextHandler) {
-                       super("WebSocket Init");
-                       this.servletContextHandler = servletContextHandler;
-               }
-
-               @Override
-               public void run() {
-                       ServerContainer serverContainer;
-                       try {
-                               serverContainer = WebSocketServerContainerInitializer.configureContext(servletContextHandler);
-                       } catch (ServletException e) {
-                               throw new IllegalStateException("Cannot configure web sockets", e);
-                       }
-                       bc.registerService(javax.websocket.server.ServerContainer.class, serverContainer, null);
-               }
-
-       }
 }