X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fkernel%2FDeployConfig.java;h=228ccbb4a172d2bacae5af3e3ea385064c68de92;hb=8633b7d69ebb6e1c5af0b1e170d7b4f2af3567d3;hp=8ad51fc9f0b3dc4ef68169b81bd0a164b5fc51b0;hpb=088c1b517a543e935d8ab65c3b2fd2d0269b551d;p=lgpl%2Fargeo-commons.git 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 8ad51fc9f..228ccbb4a 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 @@ -19,12 +19,12 @@ import javax.naming.ldap.Rdn; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.argeo.cms.CmsException; +import org.argeo.api.NodeConstants; import org.argeo.naming.AttributesDictionary; 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; @@ -32,6 +32,7 @@ import org.osgi.service.cm.ConfigurationAdmin; import org.osgi.service.cm.ConfigurationEvent; import org.osgi.service.cm.ConfigurationListener; +/** Manages the LDIF-based deployment configuration. */ class DeployConfig implements ConfigurationListener { private final Log log = LogFactory.getLog(getClass()); private final BundleContext bc = FrameworkUtil.getBundle(getClass()).getBundleContext(); @@ -40,19 +41,20 @@ class DeployConfig implements ConfigurationListener { private SortedMap deployConfigs = new TreeMap<>(); private final DataModels dataModels; + private boolean isFirstInit = false; + public DeployConfig(ConfigurationAdmin configurationAdmin, DataModels dataModels, boolean isClean) { this.dataModels = dataModels; // ConfigurationAdmin configurationAdmin = // bc.getService(bc.getServiceReference(ConfigurationAdmin.class)); try { - boolean isFirstInit = false; if (!isInitialized()) { // first init isFirstInit = true; firstInit(); } init(configurationAdmin, isClean, isFirstInit); } catch (IOException e) { - throw new CmsException("Could not init deploy configs", e); + throw new RuntimeException("Could not init deploy configs", e); } // FIXME check race conditions during initialization // bc.registerService(ConfigurationListener.class, this, null); @@ -83,7 +85,7 @@ class DeployConfig implements ConfigurationListener { // additional repositories dataModels: for (DataModels.DataModel dataModel : dataModels.getNonAbstractDataModels()) { - if (NodeConstants.NODE.equals(dataModel.getName())) + if (NodeConstants.NODE_REPOSITORY.equals(dataModel.getName())) continue dataModels; Dictionary config = InitUtils.getRepositoryConfig(dataModel.getName(), getProps(NodeConstants.NODE_REPOS_FACTORY_PID, dataModel.getName())); @@ -106,26 +108,76 @@ class DeployConfig implements ConfigurationListener { LdapName userAdminFactoryName = serviceFactoryDn(NodeConstants.NODE_USER_ADMIN_PID); for (LdapName name : deployConfigs.keySet()) { if (name.startsWith(userAdminFactoryName) && !name.equals(userAdminFactoryName)) { - try { - Attributes attrs = deployConfigs.get(name); - String cn = name.getRdn(name.size() - 1).getValue().toString(); - if (!activeCns.contains(cn)) { - attrs.put(UserAdminConf.disabled.name(), "true"); - } - } catch (Exception e) { - throw new CmsException("Cannot disable user directory " + name, e); +// try { + Attributes attrs = deployConfigs.get(name); + String cn = name.getRdn(name.size() - 1).getValue().toString(); + if (!activeCns.contains(cn)) { + attrs.put(UserAdminConf.disabled.name(), "true"); } +// } catch (Exception e) { +// throw new CmsException("Cannot disable user directory " + name, e); +// } } } } // 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); +// } + LdapName defaultHttpServiceDn = serviceDn(KernelConstants.JETTY_FACTORY_PID, NodeConstants.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, NodeConstants.DEFAULT)); - if (!webServerConfig.isEmpty()) - putFactoryDeployConfig(KernelConstants.JETTY_FACTORY_PID, webServerConfig); +// 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); + } - save(); } private void init(ConfigurationAdmin configurationAdmin, boolean isClean, boolean isFirstInit) throws IOException { @@ -134,6 +186,8 @@ class DeployConfig implements ConfigurationListener { deployConfigs = new LdifParser().read(in); } if (isClean) { + if (log.isDebugEnabled()) + log.debug("Clean state, loading from framework properties..."); setFromFrameworkProperties(isFirstInit); for (LdapName dn : deployConfigs.keySet()) { Rdn lastRdn = dn.getRdn(dn.size() - 1); @@ -289,8 +343,12 @@ class DeployConfig implements ConfigurationListener { return null; } - static boolean isInitialized() { + private static boolean isInitialized() { return Files.exists(deployConfigPath); } + public boolean isFirstInit() { + return isFirstInit; + } + }