X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fkernel%2FDeployConfig.java;h=036aa93d2156df3c07e53f4268180d4c8dca05a8;hb=a1e5c8447beec2b896b0a03e38a4c17608a4b85d;hp=450b9dba42d1dcfb8ca1d3f21332c166b45ecb9a;hpb=e7dc62c485696931a3e048d9102a7c86f9323b92;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 450b9dba4..036aa93d2 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 @@ -12,18 +12,15 @@ import java.util.SortedMap; import java.util.TreeMap; import javax.naming.InvalidNameException; +import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; import javax.naming.directory.BasicAttributes; import javax.naming.ldap.LdapName; import javax.naming.ldap.Rdn; -import javax.websocket.server.ServerEndpointConfig; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.api.NodeConstants; -import org.argeo.cms.CmsException; -import org.argeo.cms.internal.http.InternalHttpConstants; -import org.argeo.cms.websocket.CmsWebSocketConfigurator; import org.argeo.naming.AttributesDictionary; import org.argeo.naming.LdifParser; import org.argeo.naming.LdifWriter; @@ -45,19 +42,25 @@ class DeployConfig implements ConfigurationListener { private SortedMap deployConfigs = new TreeMap<>(); 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; // ConfigurationAdmin configurationAdmin = // bc.getService(bc.getServiceReference(ConfigurationAdmin.class)); try { - boolean isFirstInit = false; if (!isInitialized()) { // first init isFirstInit = true; firstInit(); } + this.configurationAdmin = configurationAdmin; 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); @@ -80,21 +83,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(); @@ -102,7 +90,12 @@ class DeployConfig implements ConfigurationListener { List activeCns = new ArrayList<>(); for (int i = 0; i < userDirectoryConfigs.size(); i++) { Dictionary userDirectoryConfig = userDirectoryConfigs.get(i); - String cn = UserAdminConf.baseDnHash(userDirectoryConfig); + String baseDn = (String) userDirectoryConfig.get(UserAdminConf.baseDn.name()); + String cn; + if (NodeConstants.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); @@ -111,15 +104,15 @@ 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); +// } } } } @@ -147,16 +140,16 @@ class DeployConfig implements ConfigurationListener { // 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); - - // 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"); - } - } +// 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 { @@ -174,6 +167,7 @@ class DeployConfig implements ConfigurationListener { } catch (Exception e1) { // silent } + tryCount--; } } } catch (Exception e) { @@ -188,32 +182,61 @@ 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); - 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 - } - } else { - // 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); + 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 + 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 + } + } 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); } } } - // 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 @@ -335,7 +358,7 @@ class DeployConfig implements ConfigurationListener { } } - 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); @@ -343,8 +366,12 @@ class DeployConfig implements ConfigurationListener { return null; } - static boolean isInitialized() { + private static boolean isInitialized() { return Files.exists(deployConfigPath); } + public boolean isFirstInit() { + return isFirstInit; + } + }