From aa3eae8ed83ae3b8b3cc98826ee02d121795cb60 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Wed, 9 Oct 2019 11:41:23 +0200 Subject: [PATCH] The Equinox Jetty bundle should not be explicitly started anymore. --- demo/cms-e4-rap.properties | 1 - dist/argeo-node/base/share/argeo/config.ini | 1 - .../cms/internal/kernel/CmsDeployment.java | 8 ++++ .../cms/internal/kernel/DeployConfig.java | 23 +++++++++-- .../cms/internal/kernel/KernelConstants.java | 3 ++ org.argeo.ext.equinox.jetty/bnd.bnd | 2 + .../equinox/jetty/CmsJettyCustomizer.java | 38 +++++++------------ 7 files changed, 46 insertions(+), 30 deletions(-) diff --git a/demo/cms-e4-rap.properties b/demo/cms-e4-rap.properties index bbfb30655..e8f245840 100644 --- a/demo/cms-e4-rap.properties +++ b/demo/cms-e4-rap.properties @@ -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,\ diff --git a/dist/argeo-node/base/share/argeo/config.ini b/dist/argeo-node/base/share/argeo/config.ini index 269fcf6ee..1a49ded8c 100644 --- a/dist/argeo-node/base/share/argeo/config.ini +++ b/dist/argeo-node/base/share/argeo/config.ini @@ -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,\ diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java index 30d283c58..20418ec4d 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java @@ -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(); } diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/DeployConfig.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/DeployConfig.java index b1e36633a..ffb79b202 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/DeployConfig.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/DeployConfig.java @@ -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 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 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 { diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java index f221d0cdb..13ff4b8b2 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java @@ -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"; diff --git a/org.argeo.ext.equinox.jetty/bnd.bnd b/org.argeo.ext.equinox.jetty/bnd.bnd index 0f21e73c9..3422e55e7 100644 --- a/org.argeo.ext.equinox.jetty/bnd.bnd +++ b/org.argeo.ext.equinox.jetty/bnd.bnd @@ -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 diff --git a/org.argeo.ext.equinox.jetty/src/org/argeo/equinox/jetty/CmsJettyCustomizer.java b/org.argeo.ext.equinox.jetty/src/org/argeo/equinox/jetty/CmsJettyCustomizer.java index 60d23719e..e6d6c6970 100644 --- a/org.argeo.ext.equinox.jetty/src/org/argeo/equinox/jetty/CmsJettyCustomizer.java +++ b/org.argeo.ext.equinox.jetty/src/org/argeo/equinox/jetty/CmsJettyCustomizer.java @@ -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 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); - } - - } } -- 2.30.2