From 33920c58e7946ff85b72c2ff513eb8ee4d2e1aa8 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Tue, 11 Jan 2022 18:08:26 +0100 Subject: [PATCH] Move Jetty factory to the servlet bundle --- org.argeo.cms.servlet/.project | 5 ++ .../OSGI-INF/jettyServiceFactory.xml | 8 ++ org.argeo.cms.servlet/bnd.bnd | 1 + org.argeo.cms.servlet/build.properties | 5 +- .../internal/jetty/JettyServiceFactory.java | 79 +++++++++++++++++++ org.argeo.cms/OSGI-INF/cmsContext.xml | 2 +- org.argeo.cms/OSGI-INF/cmsDeployment.xml | 2 +- org.argeo.cms/OSGI-INF/cmsState.xml | 2 +- org.argeo.cms/OSGI-INF/deployConfig.xml | 2 +- org.argeo.cms/OSGI-INF/nodeUserAdmin.xml | 2 +- .../argeo/cms/internal/osgi/DeployConfig.java | 68 ++++------------ .../cms/internal/osgi/NodeUserAdmin.java | 4 +- .../cms/internal/runtime/CmsContextImpl.java | 4 +- .../internal/runtime/CmsDeploymentImpl.java | 18 ++--- .../cms/internal/runtime/CmsStateImpl.java | 4 +- .../cms/internal/runtime/KernelConstants.java | 3 +- sdk/cms-e4-rap.properties | 1 + 17 files changed, 134 insertions(+), 76 deletions(-) create mode 100644 org.argeo.cms.servlet/OSGI-INF/jettyServiceFactory.xml create mode 100644 org.argeo.cms.servlet/src/org/argeo/cms/servlet/internal/jetty/JettyServiceFactory.java diff --git a/org.argeo.cms.servlet/.project b/org.argeo.cms.servlet/.project index b1a25fcc8..d39f97472 100644 --- a/org.argeo.cms.servlet/.project +++ b/org.argeo.cms.servlet/.project @@ -20,6 +20,11 @@ + + org.eclipse.pde.ds.core.builder + + + org.eclipse.pde.PluginNature diff --git a/org.argeo.cms.servlet/OSGI-INF/jettyServiceFactory.xml b/org.argeo.cms.servlet/OSGI-INF/jettyServiceFactory.xml new file mode 100644 index 000000000..c007351aa --- /dev/null +++ b/org.argeo.cms.servlet/OSGI-INF/jettyServiceFactory.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/org.argeo.cms.servlet/bnd.bnd b/org.argeo.cms.servlet/bnd.bnd index 14575ada8..b539a49bb 100644 --- a/org.argeo.cms.servlet/bnd.bnd +++ b/org.argeo.cms.servlet/bnd.bnd @@ -6,5 +6,6 @@ org.argeo.cms.osgi,\ * Service-Component:\ +OSGI-INF/jettyServiceFactory.xml,\ OSGI-INF/pkgServletContext.xml,\ OSGI-INF/pkgServlet.xml diff --git a/org.argeo.cms.servlet/build.properties b/org.argeo.cms.servlet/build.properties index 34d2e4d2d..ee94f53be 100644 --- a/org.argeo.cms.servlet/build.properties +++ b/org.argeo.cms.servlet/build.properties @@ -1,4 +1,5 @@ -source.. = src/ output.. = bin/ bin.includes = META-INF/,\ - . + .,\ + OSGI-INF/jettyServiceFactory.xml +source.. = src/ diff --git a/org.argeo.cms.servlet/src/org/argeo/cms/servlet/internal/jetty/JettyServiceFactory.java b/org.argeo.cms.servlet/src/org/argeo/cms/servlet/internal/jetty/JettyServiceFactory.java new file mode 100644 index 000000000..05de32c48 --- /dev/null +++ b/org.argeo.cms.servlet/src/org/argeo/cms/servlet/internal/jetty/JettyServiceFactory.java @@ -0,0 +1,79 @@ +package org.argeo.cms.servlet.internal.jetty; + +import java.util.Dictionary; + +import org.argeo.api.cms.CmsConstants; +import org.argeo.api.cms.CmsLog; +import org.eclipse.equinox.http.jetty.JettyConfigurator; +import org.osgi.framework.FrameworkUtil; +import org.osgi.service.cm.ConfigurationException; +import org.osgi.service.cm.ManagedServiceFactory; + +public class JettyServiceFactory implements ManagedServiceFactory { + private final CmsLog log = CmsLog.getLog(JettyServiceFactory.class); + + public void start() { + + } + + @Override + public String getName() { + return "Jetty Service Factory"; + } + + @Override + public void updated(String pid, Dictionary properties) throws ConfigurationException { + // Explicitly configures Jetty so that the default server is not started by the + // activator of the Equinox Jetty bundle. + +// if (!webServerConfig.isEmpty()) { +// webServerConfig.put("customizer.class", KernelConstants.CMS_JETTY_CUSTOMIZER_CLASS); +// +// // TODO centralise with Jetty extender +// Object webSocketEnabled = webServerConfig.get(InternalHttpConstants.WEBSOCKET_ENABLED); +// if (webSocketEnabled != null && webSocketEnabled.toString().equals("true")) { +// bc.registerService(ServerEndpointConfig.Configurator.class, new CmsWebSocketConfigurator(), null); +// webServerConfig.put(InternalHttpConstants.WEBSOCKET_ENABLED, "true"); +// } +// } + + int tryCount = 60; + try { + tryGettyJetty: while (tryCount > 0) { + try { + // FIXME deal with multiple ids + JettyConfigurator.startServer(CmsConstants.DEFAULT, properties); + // Explicitly starts Jetty OSGi HTTP bundle, so that it gets triggered if OSGi + // configuration is not cleaned + FrameworkUtil.getBundle(JettyConfigurator.class).start(); + break tryGettyJetty; + } catch (IllegalStateException e) { + // Jetty may not be ready + try { + Thread.sleep(1000); + } catch (Exception e1) { + // silent + } + tryCount--; + } + } + } catch (Exception e) { + log.error("Cannot start default Jetty server with config " + properties, e); + } + + } + + @Override + public void deleted(String pid) { + } + + public void stop() { + try { + JettyConfigurator.stopServer(CmsConstants.DEFAULT); + } catch (Exception e) { + log.error("Cannot stop default Jetty server.", e); + } + + } + +} diff --git a/org.argeo.cms/OSGI-INF/cmsContext.xml b/org.argeo.cms/OSGI-INF/cmsContext.xml index eab5b92b4..63d43192e 100644 --- a/org.argeo.cms/OSGI-INF/cmsContext.xml +++ b/org.argeo.cms/OSGI-INF/cmsContext.xml @@ -1,5 +1,5 @@ - + diff --git a/org.argeo.cms/OSGI-INF/cmsDeployment.xml b/org.argeo.cms/OSGI-INF/cmsDeployment.xml index 4093f3e21..d36a91110 100644 --- a/org.argeo.cms/OSGI-INF/cmsDeployment.xml +++ b/org.argeo.cms/OSGI-INF/cmsDeployment.xml @@ -1,5 +1,5 @@ - + diff --git a/org.argeo.cms/OSGI-INF/cmsState.xml b/org.argeo.cms/OSGI-INF/cmsState.xml index 9e9ecc4df..a81e9f068 100644 --- a/org.argeo.cms/OSGI-INF/cmsState.xml +++ b/org.argeo.cms/OSGI-INF/cmsState.xml @@ -1,5 +1,5 @@ - + diff --git a/org.argeo.cms/OSGI-INF/deployConfig.xml b/org.argeo.cms/OSGI-INF/deployConfig.xml index 85b309021..03094342e 100644 --- a/org.argeo.cms/OSGI-INF/deployConfig.xml +++ b/org.argeo.cms/OSGI-INF/deployConfig.xml @@ -1,5 +1,5 @@ - + diff --git a/org.argeo.cms/OSGI-INF/nodeUserAdmin.xml b/org.argeo.cms/OSGI-INF/nodeUserAdmin.xml index f86eba632..328d7bea5 100644 --- a/org.argeo.cms/OSGI-INF/nodeUserAdmin.xml +++ b/org.argeo.cms/OSGI-INF/nodeUserAdmin.xml @@ -1,5 +1,5 @@ - + diff --git a/org.argeo.cms/src/org/argeo/cms/internal/osgi/DeployConfig.java b/org.argeo.cms/src/org/argeo/cms/internal/osgi/DeployConfig.java index c31f50ded..deb330475 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/osgi/DeployConfig.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/osgi/DeployConfig.java @@ -27,8 +27,6 @@ import org.argeo.osgi.useradmin.UserAdminConf; import org.argeo.util.naming.AttributesDictionary; import org.argeo.util.naming.LdifParser; import org.argeo.util.naming.LdifWriter; -import org.eclipse.equinox.http.jetty.JettyConfigurator; -import org.osgi.framework.FrameworkUtil; import org.osgi.framework.InvalidSyntaxException; import org.osgi.service.cm.Configuration; import org.osgi.service.cm.ConfigurationAdmin; @@ -120,65 +118,29 @@ public 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 + Dictionary webServerConfig = InitUtils + .getHttpServerConfig(getProps(KernelConstants.JETTY_FACTORY_PID, CmsConstants.DEFAULT)); + if (!webServerConfig.isEmpty()) { + // TODO check for other customizers // webServerConfig.put("customizer.class", "org.argeo.equinox.jetty.CmsJettyCustomizer"); -// putFactoryDeployConfig(KernelConstants.JETTY_FACTORY_PID, webServerConfig); -// } - LdapName defaultHttpServiceDn = serviceDn(KernelConstants.JETTY_FACTORY_PID, CmsConstants.DEFAULT); - if (deployConfigs.containsKey(defaultHttpServiceDn)) { - // remove old default configs since we have now to start Jetty servlet bridge - // indirectly - deployConfigs.remove(defaultHttpServiceDn); + putFactoryDeployConfig(KernelConstants.JETTY_FACTORY_PID, webServerConfig); } +// LdapName defaultHttpServiceDn = serviceDn(KernelConstants.JETTY_FACTORY_PID, CmsConstants.DEFAULT); +// if (deployConfigs.containsKey(defaultHttpServiceDn)) { +// // remove old default configs since we have now to start Jetty servlet bridge +// // indirectly +// deployConfigs.remove(defaultHttpServiceDn); +// } // SAVE save(); // - // Explicitly configures 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, CmsConstants.DEFAULT)); -// if (!webServerConfig.isEmpty()) { -// webServerConfig.put("customizer.class", KernelConstants.CMS_JETTY_CUSTOMIZER_CLASS); -// -// // TODO centralise with Jetty extender -// Object webSocketEnabled = webServerConfig.get(InternalHttpConstants.WEBSOCKET_ENABLED); -// if (webSocketEnabled != null && webSocketEnabled.toString().equals("true")) { -// bc.registerService(ServerEndpointConfig.Configurator.class, new CmsWebSocketConfigurator(), null); -// webServerConfig.put(InternalHttpConstants.WEBSOCKET_ENABLED, "true"); -// } -// } - - int tryCount = 60; - try { - tryGettyJetty: while (tryCount > 0) { - try { - JettyConfigurator.startServer(KernelConstants.DEFAULT_JETTY_SERVER, webServerConfig); - // Explicitly starts Jetty OSGi HTTP bundle, so that it gets triggered if OSGi - // configuration is not cleaned - FrameworkUtil.getBundle(JettyConfigurator.class).start(); - break tryGettyJetty; - } catch (IllegalStateException e) { - // Jetty may not be ready - try { - Thread.sleep(1000); - } catch (Exception e1) { - // silent - } - tryCount--; - } - } - } catch (Exception e) { - log.error("Cannot start default Jetty server with config " + webServerConfig, e); - } - +// Dictionary webServerConfig = InitUtils +// .getHttpServerConfig(getProps(KernelConstants.JETTY_FACTORY_PID, CmsConstants.DEFAULT)); } - public void init() throws IOException { + public void start() throws IOException { if (!isInitialized()) { // first init isFirstInit = true; firstInit(); @@ -205,7 +167,7 @@ public class DeployConfig implements ConfigurationListener { // TODO check consistency if not clean } - public void destroy() { + public void stop() { } diff --git a/org.argeo.cms/src/org/argeo/cms/internal/osgi/NodeUserAdmin.java b/org.argeo.cms/src/org/argeo/cms/internal/osgi/NodeUserAdmin.java index d9524e897..3850010e9 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/osgi/NodeUserAdmin.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/osgi/NodeUserAdmin.java @@ -111,10 +111,10 @@ public class NodeUserAdmin extends AggregatingUserAdmin implements ManagedServic // } } - public void init() { + public void start() { } - public void destroy() { + public void stop() { } @Override diff --git a/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsContextImpl.java b/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsContextImpl.java index 7ce2e8bd5..8e29f6673 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsContextImpl.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsContextImpl.java @@ -39,7 +39,7 @@ public class CmsContextImpl implements CmsContext { // initTrackers(); // } - public void init() { + public void start() { Object defaultLocaleValue = KernelUtils.getFrameworkProp(CmsConstants.I18N_DEFAULT_LOCALE); defaultLocale = defaultLocaleValue != null ? new Locale(defaultLocaleValue.toString()) : new Locale(ENGLISH.getLanguage()); @@ -70,7 +70,7 @@ public class CmsContextImpl implements CmsContext { setInstance(this); } - public void destroy() { + public void stop() { setInstance(null); } diff --git a/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsDeploymentImpl.java b/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsDeploymentImpl.java index 83f688a6a..4ffa03a63 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsDeploymentImpl.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsDeploymentImpl.java @@ -8,7 +8,6 @@ import org.argeo.api.cms.CmsDeployment; import org.argeo.api.cms.CmsLog; import org.argeo.api.cms.CmsState; import org.argeo.cms.internal.osgi.DeployConfig; -import org.eclipse.equinox.http.jetty.JettyConfigurator; import org.osgi.service.http.HttpService; /** Implementation of a CMS deployment. */ @@ -111,7 +110,7 @@ public class CmsDeploymentImpl implements CmsDeployment { // KernelUtils.asyncOpen(confAdminSt); } - public void init() { + public void start() { httpExpected = deployConfig.getProps(KernelConstants.JETTY_FACTORY_PID, "default") != null; if (deployConfig.hasDomain()) { loadIpaJaasConfiguration(); @@ -177,18 +176,19 @@ public class CmsDeploymentImpl implements CmsDeployment { } } - public void destroy() { + public void stop() { // if (nodeHttp != null) // nodeHttp.destroy(); - try { - JettyConfigurator.stopServer(KernelConstants.DEFAULT_JETTY_SERVER); - } catch (Exception e) { - log.error("Cannot stop default Jetty server.", e); - } +// 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(); + deployConfig.save(); + // new Thread(() -> deployConfig.save(), "Save Argeo Deploy Config").start(); } } diff --git a/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsStateImpl.java b/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsStateImpl.java index c07128394..b493c08ef 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsStateImpl.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsStateImpl.java @@ -33,7 +33,7 @@ public class CmsStateImpl implements CmsState { // private final boolean cleanState; private String hostname; - public void init() { + public void start() { // instance = this; Runtime.getRuntime().addShutdownHook(new CmsShutdown()); @@ -175,7 +175,7 @@ public class CmsStateImpl implements CmsState { // log.debug("Initialised default Bitronix transaction manager"); // } - public void destroy() { + public void stop() { if (log.isDebugEnabled()) log.debug("CMS stopping... (" + this.stateUuid + ")"); // new GogoShellKiller().start(); diff --git a/org.argeo.cms/src/org/argeo/cms/internal/runtime/KernelConstants.java b/org.argeo.cms/src/org/argeo/cms/internal/runtime/KernelConstants.java index d491a6623..dfe86cfaa 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/runtime/KernelConstants.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/runtime/KernelConstants.java @@ -39,7 +39,8 @@ public interface KernelConstants { // String PATH_WORKBENCH = "/ui"; // String PATH_WORKBENCH_PUBLIC = PATH_WORKBENCH + "/public"; - String JETTY_FACTORY_PID = "org.eclipse.equinox.http.jetty.config"; +// String JETTY_FACTORY_PID = "org.eclipse.equinox.http.jetty.config"; + String JETTY_FACTORY_PID = "org.argeo.equinox.jetty.config"; String WHITEBOARD_PATTERN_PROP = "osgi.http.whiteboard.servlet.pattern"; // default Jetty server configured via JettyConfigurator String DEFAULT_JETTY_SERVER = "default"; diff --git a/sdk/cms-e4-rap.properties b/sdk/cms-e4-rap.properties index fd897d48f..a11ba7e1c 100644 --- a/sdk/cms-e4-rap.properties +++ b/sdk/cms-e4-rap.properties @@ -10,6 +10,7 @@ argeo.osgi.start.3.node=\ org.argeo.cms argeo.osgi.start.4.node=\ +org.argeo.cms.servlet,\ org.argeo.cms.jcr argeo.osgi.start.5.node=\ -- 2.30.2