X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fkernel%2FDeployConfig.java;h=4a75f519d0782e2077ea3ae968ff1413ef2cf7dd;hb=7954fac52a6e7db11d9240cfbea85017c5612f19;hp=572631effec0487231da9dd0c4c6c114f06c60f5;hpb=828c592e047d6dd0b88c1835093e07b1526036b0;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 572631eff..4a75f519d 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 @@ -5,7 +5,9 @@ import java.io.InputStream; import java.io.Writer; import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; import java.util.Dictionary; +import java.util.List; import java.util.SortedMap; import java.util.TreeMap; @@ -18,11 +20,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.jcr.ArgeoJcrConstants; +import org.argeo.naming.AttributesDictionary; +import org.argeo.naming.LdifParser; +import org.argeo.naming.LdifWriter; import org.argeo.node.NodeConstants; -import org.argeo.util.naming.AttributesDictionary; -import org.argeo.util.naming.LdifParser; -import org.argeo.util.naming.LdifWriter; +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; @@ -30,20 +33,26 @@ 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(); - private Path deployConfigPath = KernelUtils.getOsgiInstancePath(KernelConstants.DEPLOY_CONFIG_PATH); + private static Path deployConfigPath = KernelUtils.getOsgiInstancePath(KernelConstants.DEPLOY_CONFIG_PATH); private SortedMap deployConfigs = new TreeMap<>(); + private final DataModels dataModels; - public DeployConfig(boolean isClean) { - ConfigurationAdmin configurationAdmin = bc.getService(bc.getServiceReference(ConfigurationAdmin.class)); + public DeployConfig(ConfigurationAdmin configurationAdmin, DataModels dataModels, boolean isClean) { + this.dataModels = dataModels; + // ConfigurationAdmin configurationAdmin = + // bc.getService(bc.getServiceReference(ConfigurationAdmin.class)); try { - if (!Files.exists(deployConfigPath)) { // first init + boolean isFirstInit = false; + if (!isInitialized()) { // first init + isFirstInit = true; firstInit(); } - init(configurationAdmin, isClean); + init(configurationAdmin, isClean, isFirstInit); } catch (IOException e) { throw new CmsException("Could not init deploy configs", e); } @@ -52,37 +61,121 @@ class DeployConfig implements ConfigurationListener { } private void firstInit() throws IOException { + log.info("## FIRST INIT ##"); Files.createDirectories(deployConfigPath.getParent()); - FirstInitProperties firstInit = new FirstInitProperties(); - firstInit.prepareInstanceArea(); + // FirstInit firstInit = new FirstInit(); + InitUtils.prepareFirstInitInstanceArea(); - if (!Files.exists(deployConfigPath))// could have juste been copied - Files.createFile(deployConfigPath); - - try (InputStream in = Files.newInputStream(deployConfigPath)) { - deployConfigs = new LdifParser().read(in); - } + if (!Files.exists(deployConfigPath)) + deployConfigs = new TreeMap<>(); + else// config file could have juste been copied by preparation + try (InputStream in = Files.newInputStream(deployConfigPath)) { + deployConfigs = new LdifParser().read(in); + } + save(); + } - Dictionary nodeConfig = firstInit - .getNodeRepositoryConfig(getProps(NodeConstants.NODE_REPOS_FACTORY_PID, ArgeoJcrConstants.ALIAS_NODE)); + private void setFromFrameworkProperties(boolean isFirstInit) { + // node repository + Dictionary nodeConfig = InitUtils + .getNodeRepositoryConfig(getProps(NodeConstants.NODE_REPOS_FACTORY_PID, NodeConstants.NODE)); // node repository is mandatory putFactoryDeployConfig(NodeConstants.NODE_REPOS_FACTORY_PID, nodeConfig); - Dictionary webServerConfig = firstInit - .getHttpServerConfig(getProps(KernelConstants.JETTY_FACTORY_PID, ArgeoJcrConstants.ALIAS_NODE)); - if (!webServerConfig.isEmpty()) - putFactoryDeployConfig(KernelConstants.JETTY_FACTORY_PID, webServerConfig); + // additional repositories + dataModels: for (DataModels.DataModel dataModel : dataModels.getNonAbstractDataModels()) { + if (NodeConstants.NODE.equals(dataModel.getName())) + continue dataModels; + Dictionary config = InitUtils.getRepositoryConfig(dataModel.getName(), + getProps(NodeConstants.NODE_REPOS_FACTORY_PID, dataModel.getName())); + if (config.size() != 0) + putFactoryDeployConfig(NodeConstants.NODE_REPOS_FACTORY_PID, config); + } + + // user admin + List> userDirectoryConfigs = InitUtils.getUserDirectoryConfigs(); + if (userDirectoryConfigs.size() != 0) { + List activeCns = new ArrayList<>(); + for (int i = 0; i < userDirectoryConfigs.size(); i++) { + Dictionary userDirectoryConfig = userDirectoryConfigs.get(i); + String cn = UserAdminConf.baseDnHash(userDirectoryConfig); + activeCns.add(cn); + userDirectoryConfig.put(NodeConstants.CN, cn); + putFactoryDeployConfig(NodeConstants.NODE_USER_ADMIN_PID, userDirectoryConfig); + } + // disable others + 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); + } + } + } + } + // 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()) { + webServerConfig.put("customizer.class", KernelConstants.CMS_JETTY_CUSTOMIZER_CLASS); + } + + int tryCount = 60; + try { + tryGettyJetty: while (tryCount > 0) { + try { + JettyConfigurator.startServer(KernelConstants.DEFAULT_JETTY_SERVER, webServerConfig); + break tryGettyJetty; + } catch (IllegalStateException e) { + // Jetty may not be ready + try { + Thread.sleep(1000); + } catch (Exception e1) { + // silent + } + } + } + } catch (Exception e) { + log.error("Cannot start default Jetty server with config " + webServerConfig, e); + } + } - private void init(ConfigurationAdmin configurationAdmin, boolean isClean) throws IOException { + private void init(ConfigurationAdmin configurationAdmin, boolean isClean, boolean isFirstInit) throws IOException { try (InputStream in = Files.newInputStream(deployConfigPath)) { deployConfigs = new LdifParser().read(in); } if (isClean) { + setFromFrameworkProperties(isFirstInit); for (LdapName dn : deployConfigs.keySet()) { Rdn lastRdn = dn.getRdn(dn.size() - 1); LdapName prefix = (LdapName) dn.getPrefix(dn.size() - 1); @@ -193,10 +286,15 @@ class DeployConfig implements ConfigurationListener { try (Writer writer = Files.newBufferedWriter(deployConfigPath)) { new LdifWriter(writer).write(deployConfigs); } catch (IOException e) { - throw new CmsException("Cannot save deploy configs", e); + // throw new CmsException("Cannot save deploy configs", e); + log.error("Cannot save deploy configs", e); } } + boolean isStandalone(String dataModelName) { + return getProps(NodeConstants.NODE_REPOS_FACTORY_PID, dataModelName) != null; + } + /* * UTILITIES */ @@ -232,4 +330,8 @@ class DeployConfig implements ConfigurationListener { return null; } + static boolean isInitialized() { + return Files.exists(deployConfigPath); + } + }