X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fkernel%2FDeployConfig.java;h=4a88dd1b499e4fd3e15c67d64512108d846d34a3;hb=549ff25baf9371d910065303e22daf49321b517a;hp=f481f3fa10e2ce9bf1ef9838b42dbc37fecf8f18;hpb=9ec85110269f8be5c83ea26e283359bb451a67b7;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 f481f3fa1..4a88dd1b4 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 @@ -18,13 +18,12 @@ import javax.naming.directory.BasicAttributes; import javax.naming.ldap.LdapName; import javax.naming.ldap.Rdn; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.argeo.api.NodeConstants; -import org.argeo.naming.AttributesDictionary; -import org.argeo.naming.LdifParser; -import org.argeo.naming.LdifWriter; +import org.argeo.api.cms.CmsConstants; +import org.argeo.api.cms.CmsLog; 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.BundleContext; import org.osgi.framework.FrameworkUtil; @@ -35,19 +34,21 @@ 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 CmsLog log = CmsLog.getLog(getClass()); private final BundleContext bc = FrameworkUtil.getBundle(getClass()).getBundleContext(); private static Path deployConfigPath = KernelUtils.getOsgiInstancePath(KernelConstants.DEPLOY_CONFIG_PATH); private SortedMap deployConfigs = new TreeMap<>(); - private final DataModels dataModels; +// private final DataModels dataModels; private boolean isFirstInit = false; private final static String ROLES = "roles"; + + private ConfigurationAdmin configurationAdmin; - public DeployConfig(ConfigurationAdmin configurationAdmin, DataModels dataModels, boolean isClean) { - this.dataModels = dataModels; + public DeployConfig(ConfigurationAdmin configurationAdmin, boolean isClean) { +// this.dataModels = dataModels; // ConfigurationAdmin configurationAdmin = // bc.getService(bc.getServiceReference(ConfigurationAdmin.class)); try { @@ -55,6 +56,7 @@ class DeployConfig implements ConfigurationListener { isFirstInit = true; firstInit(); } + this.configurationAdmin = configurationAdmin; init(configurationAdmin, isClean, isFirstInit); } catch (IOException e) { throw new RuntimeException("Could not init deploy configs", e); @@ -80,21 +82,6 @@ class DeployConfig implements ConfigurationListener { } 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); - - // additional repositories - dataModels: for (DataModels.DataModel dataModel : dataModels.getNonAbstractDataModels()) { - if (NodeConstants.NODE_REPOSITORY.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(); @@ -104,16 +91,16 @@ class DeployConfig implements ConfigurationListener { Dictionary userDirectoryConfig = userDirectoryConfigs.get(i); String baseDn = (String) userDirectoryConfig.get(UserAdminConf.baseDn.name()); String cn; - if (NodeConstants.ROLES_BASEDN.equals(baseDn)) + if (CmsConstants.ROLES_BASEDN.equals(baseDn)) cn = ROLES; else cn = UserAdminConf.baseDnHash(userDirectoryConfig); activeCns.add(cn); - userDirectoryConfig.put(NodeConstants.CN, cn); - putFactoryDeployConfig(NodeConstants.NODE_USER_ADMIN_PID, userDirectoryConfig); + userDirectoryConfig.put(CmsConstants.CN, cn); + putFactoryDeployConfig(CmsConstants.NODE_USER_ADMIN_PID, userDirectoryConfig); } // disable others - LdapName userAdminFactoryName = serviceFactoryDn(NodeConstants.NODE_USER_ADMIN_PID); + LdapName userAdminFactoryName = serviceFactoryDn(CmsConstants.NODE_USER_ADMIN_PID); for (LdapName name : deployConfigs.keySet()) { if (name.startsWith(userAdminFactoryName) && !name.equals(userAdminFactoryName)) { // try { @@ -137,7 +124,7 @@ class DeployConfig implements ConfigurationListener { // webServerConfig.put("customizer.class", "org.argeo.equinox.jetty.CmsJettyCustomizer"); // putFactoryDeployConfig(KernelConstants.JETTY_FACTORY_PID, webServerConfig); // } - LdapName defaultHttpServiceDn = serviceDn(KernelConstants.JETTY_FACTORY_PID, NodeConstants.DEFAULT); + 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 @@ -151,7 +138,7 @@ class DeployConfig implements ConfigurationListener { // 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)); + .getHttpServerConfig(getProps(KernelConstants.JETTY_FACTORY_PID, CmsConstants.DEFAULT)); // if (!webServerConfig.isEmpty()) { // webServerConfig.put("customizer.class", KernelConstants.CMS_JETTY_CUSTOMIZER_CLASS); // @@ -197,54 +184,58 @@ class DeployConfig implements ConfigurationListener { if (log.isDebugEnabled()) log.debug("Clean state, loading from framework properties..."); setFromFrameworkProperties(isFirstInit); - + loadConfigs(); + } + // TODO check consistency if not clean + } + + public void loadConfigs() throws IOException { + // FIXME make it more robust + Configuration systemRolesConf = null; + LdapName systemRolesDn; + try { // FIXME make it more robust - Configuration systemRolesConf = null; - LdapName systemRolesDn; - try { - // FIXME make it more robust - systemRolesDn = new LdapName("cn=roles,ou=org.argeo.api.userAdmin,ou=deploy,ou=node"); - } catch (InvalidNameException e) { - throw new IllegalArgumentException(e); - } - deployConfigs: for (LdapName dn : deployConfigs.keySet()) { - Rdn lastRdn = dn.getRdn(dn.size() - 1); - LdapName prefix = (LdapName) dn.getPrefix(dn.size() - 1); - if (prefix.toString().equals(NodeConstants.DEPLOY_BASEDN)) { - if (lastRdn.getType().equals(NodeConstants.CN)) { - // service - String pid = lastRdn.getValue().toString(); - Configuration conf = configurationAdmin.getConfiguration(pid); - AttributesDictionary dico = new AttributesDictionary(deployConfigs.get(dn)); - conf.update(dico); - } else { - // service factory definition - } + systemRolesDn = new LdapName("cn=roles,ou=org.argeo.api.userAdmin,ou=deploy,ou=node"); + } catch (InvalidNameException e) { + throw new IllegalArgumentException(e); + } + deployConfigs: for (LdapName dn : deployConfigs.keySet()) { + Rdn lastRdn = dn.getRdn(dn.size() - 1); + LdapName prefix = (LdapName) dn.getPrefix(dn.size() - 1); + if (prefix.toString().equals(CmsConstants.DEPLOY_BASEDN)) { + if (lastRdn.getType().equals(CmsConstants.CN)) { + // service + String pid = lastRdn.getValue().toString(); + Configuration conf = configurationAdmin.getConfiguration(pid); + AttributesDictionary dico = new AttributesDictionary(deployConfigs.get(dn)); + conf.update(dico); } else { - Attributes config = deployConfigs.get(dn); - Attribute disabled = config.get(UserAdminConf.disabled.name()); - if (disabled != null) - continue deployConfigs; - // service factory service - Rdn beforeLastRdn = dn.getRdn(dn.size() - 2); - assert beforeLastRdn.getType().equals(NodeConstants.OU); - String factoryPid = beforeLastRdn.getValue().toString(); - Configuration conf = configurationAdmin.createFactoryConfiguration(factoryPid.toString(), null); - if (systemRolesDn.equals(dn)) { - systemRolesConf = configurationAdmin.createFactoryConfiguration(factoryPid.toString(), null); - } else { - AttributesDictionary dico = new AttributesDictionary(config); - conf.update(dico); - } + // service factory definition + } + } else { + Attributes config = deployConfigs.get(dn); + Attribute disabled = config.get(UserAdminConf.disabled.name()); + if (disabled != null) + continue deployConfigs; + // service factory service + Rdn beforeLastRdn = dn.getRdn(dn.size() - 2); + assert beforeLastRdn.getType().equals(CmsConstants.OU); + String factoryPid = beforeLastRdn.getValue().toString(); + Configuration conf = configurationAdmin.createFactoryConfiguration(factoryPid.toString(), null); + if (systemRolesDn.equals(dn)) { + systemRolesConf = configurationAdmin.createFactoryConfiguration(factoryPid.toString(), null); + } else { + AttributesDictionary dico = new AttributesDictionary(config); + conf.update(dico); } } - - // system roles must be last since it triggers node user admin publication - if (systemRolesConf == null) - throw new IllegalStateException("System roles are not configured."); - systemRolesConf.update(new AttributesDictionary(deployConfigs.get(systemRolesDn))); } - // TODO check consistency if not clean + + // system roles must be last since it triggers node user admin publication + if (systemRolesConf == null) + throw new IllegalStateException("System roles are not configured."); + systemRolesConf.update(new AttributesDictionary(deployConfigs.get(systemRolesDn))); + } @Override @@ -261,7 +252,7 @@ class DeployConfig implements ConfigurationListener { for (LdapName dn : deployConfigs.keySet()) { if (dn.startsWith(serviceFactoryDn)) { Rdn lastRdn = dn.getRdn(dn.size() - 1); - assert lastRdn.getType().equals(NodeConstants.CN); + assert lastRdn.getType().equals(CmsConstants.CN); Object value = conf.getProperties().get(lastRdn.getType()); assert value != null; if (value.equals(lastRdn.getValue())) { @@ -271,7 +262,7 @@ class DeployConfig implements ConfigurationListener { } } - Object cn = conf.getProperties().get(NodeConstants.CN); + Object cn = conf.getProperties().get(CmsConstants.CN); if (cn == null) throw new IllegalArgumentException("Properties must contain cn"); if (serviceDn == null) { @@ -307,12 +298,12 @@ class DeployConfig implements ConfigurationListener { } void putFactoryDeployConfig(String factoryPid, Dictionary props) { - Object cn = props.get(NodeConstants.CN); + Object cn = props.get(CmsConstants.CN); if (cn == null) throw new IllegalArgumentException("cn must be set in properties"); LdapName serviceFactoryDn = serviceFactoryDn(factoryPid); if (!deployConfigs.containsKey(serviceFactoryDn)) - deployConfigs.put(serviceFactoryDn, new BasicAttributes(NodeConstants.OU, factoryPid)); + deployConfigs.put(serviceFactoryDn, new BasicAttributes(CmsConstants.OU, factoryPid)); LdapName serviceDn = serviceDn(factoryPid, cn.toString()); Attributes attrs = new BasicAttributes(); AttributesDictionary.copy(props, attrs); @@ -321,7 +312,7 @@ class DeployConfig implements ConfigurationListener { void putDeployConfig(String servicePid, Dictionary props) { LdapName serviceDn = serviceDn(servicePid); - Attributes attrs = new BasicAttributes(NodeConstants.CN, servicePid); + Attributes attrs = new BasicAttributes(CmsConstants.CN, servicePid); AttributesDictionary.copy(props, attrs); deployConfigs.put(serviceDn, attrs); } @@ -335,16 +326,12 @@ class DeployConfig implements ConfigurationListener { } } - boolean isStandalone(String dataModelName) { - return getProps(NodeConstants.NODE_REPOS_FACTORY_PID, dataModelName) != null; - } - /* * UTILITIES */ private LdapName serviceFactoryDn(String factoryPid) { try { - return new LdapName(NodeConstants.OU + "=" + factoryPid + "," + NodeConstants.DEPLOY_BASEDN); + return new LdapName(CmsConstants.OU + "=" + factoryPid + "," + CmsConstants.DEPLOY_BASEDN); } catch (InvalidNameException e) { throw new IllegalArgumentException("Cannot generate DN from " + factoryPid, e); } @@ -352,7 +339,7 @@ class DeployConfig implements ConfigurationListener { private LdapName serviceDn(String servicePid) { try { - return new LdapName(NodeConstants.CN + "=" + servicePid + "," + NodeConstants.DEPLOY_BASEDN); + return new LdapName(CmsConstants.CN + "=" + servicePid + "," + CmsConstants.DEPLOY_BASEDN); } catch (InvalidNameException e) { throw new IllegalArgumentException("Cannot generate DN from " + servicePid, e); } @@ -360,13 +347,13 @@ class DeployConfig implements ConfigurationListener { private LdapName serviceDn(String factoryPid, String cn) { try { - return (LdapName) serviceFactoryDn(factoryPid).add(new Rdn(NodeConstants.CN, cn)); + return (LdapName) serviceFactoryDn(factoryPid).add(new Rdn(CmsConstants.CN, cn)); } catch (InvalidNameException e) { throw new IllegalArgumentException("Cannot generate DN from " + factoryPid + " and " + cn, e); } } - Dictionary getProps(String factoryPid, String cn) { +public Dictionary getProps(String factoryPid, String cn) { Attributes attrs = deployConfigs.get(serviceDn(factoryPid, cn)); if (attrs != null) return new AttributesDictionary(attrs);