Restore first init capability
authorMathieu Baudier <mbaudier@argeo.org>
Mon, 5 Sep 2016 08:18:06 +0000 (08:18 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Mon, 5 Sep 2016 08:18:06 +0000 (08:18 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@9089 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/DeployConfig.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/internal/kernel/FirstInitProperties.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java
org.argeo.security.core/src/org/argeo/util/naming/AttributesDictionary.java
org.argeo.security.core/src/org/argeo/util/naming/LdifParser.java

index 2f1b16f3ce5686401f3846a8a017a8195994417b..724108fb198c6c3d963b806c81309a955046d85f 100644 (file)
@@ -55,189 +55,24 @@ import org.osgi.service.cm.SynchronousConfigurationListener;
 import org.osgi.util.tracker.ServiceTracker;
 import org.osgi.util.tracker.ServiceTrackerCustomizer;
 
-public class CmsDeployment implements NodeDeployment, SynchronousConfigurationListener {
+public class CmsDeployment implements NodeDeployment {
        private final Log log = LogFactory.getLog(getClass());
        private final BundleContext bc = FrameworkUtil.getBundle(getClass()).getBundleContext();
 
-       private Path deployPath = KernelUtils.getOsgiInstancePath(KernelConstants.DEPLOY_PATH);
-       private SortedMap<LdapName, Attributes> deployConfigs = new TreeMap<>();
-
+       private final DeployConfig deployConfig;
        // private Repository deployedNodeRepository;
        private HomeRepository homeRepository;
 
        private Long availableSince;
 
        public CmsDeployment() {
-               ConfigurationAdmin configurationAdmin = bc.getService(bc.getServiceReference(ConfigurationAdmin.class));
                // FIXME no guarantee this is already available
                NodeState nodeState = bc.getService(bc.getServiceReference(NodeState.class));
-               try {
-                       initDeployConfigs(configurationAdmin, nodeState);
-               } catch (IOException e) {
-                       throw new CmsException("Could not init deploy configs", e);
-               }
-               bc.registerService(SynchronousConfigurationListener.class, this, null);
+               deployConfig = new DeployConfig(nodeState.isClean());
 
                new ServiceTracker<>(bc, RepositoryContext.class, new RepositoryContextStc()).open();
        }
 
-       private void initDeployConfigs(ConfigurationAdmin configurationAdmin, NodeState nodeState) throws IOException {
-               if (!Files.exists(deployPath)) {// first init
-                       Files.createDirectories(deployPath.getParent());
-                       Files.createFile(deployPath);
-                       FirstInitProperties firstInitProperties = new FirstInitProperties();
-
-                       Dictionary<String, Object> nodeConfig = firstInitProperties.getNodeRepositoryConfig();
-                       // node repository is mandatory
-                       putFactoryDeployConfig(NodeConstants.NODE_REPOS_FACTORY_PID, nodeConfig);
-
-                       Dictionary<String, Object> webServerConfig = firstInitProperties.getHttpServerConfig();
-                       if (!webServerConfig.isEmpty())
-                               putFactoryDeployConfig(KernelConstants.JETTY_FACTORY_PID, webServerConfig);
-
-                       saveDeployedConfigs();
-               }
-
-               try (InputStream in = Files.newInputStream(deployPath)) {
-                       deployConfigs = new LdifParser().read(in);
-               }
-               if (nodeState.isClean()) {
-                       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);
-                                       AttributesDictionary dico = new AttributesDictionary(deployConfigs.get(dn));
-                                       conf.update(dico);
-                               }
-                       }
-               }
-               // TODO check consistency if not clean
-       }
-
-       @Override
-       public void configurationEvent(ConfigurationEvent event) {
-               try {
-                       if (ConfigurationEvent.CM_UPDATED == event.getType()) {
-                               ConfigurationAdmin configurationAdmin = bc.getService(event.getReference());
-                               Configuration conf = configurationAdmin.getConfiguration(event.getPid(), null);
-                               LdapName serviceDn = null;
-                               String factoryPid = conf.getFactoryPid();
-                               if (factoryPid != null) {
-                                       LdapName serviceFactoryDn = serviceFactoryDn(factoryPid);
-                                       if (deployConfigs.containsKey(serviceFactoryDn)) {
-                                               for (LdapName dn : deployConfigs.keySet()) {
-                                                       if (dn.startsWith(serviceFactoryDn)) {
-                                                               Rdn lastRdn = dn.getRdn(dn.size() - 1);
-                                                               assert lastRdn.getType().equals(NodeConstants.CN);
-                                                               Object value = conf.getProperties().get(lastRdn.getType());
-                                                               assert value != null;
-                                                               if (value.equals(lastRdn.getValue())) {
-                                                                       serviceDn = dn;
-                                                                       break;
-                                                               }
-                                                       }
-                                               }
-
-                                               Object cn = conf.getProperties().get(NodeConstants.CN);
-                                               if (cn == null)
-                                                       throw new IllegalArgumentException("Properties must contain cn");
-                                               if (serviceDn == null) {
-                                                       putFactoryDeployConfig(factoryPid, conf.getProperties());
-                                               } else {
-                                                       Attributes attrs = deployConfigs.get(serviceDn);
-                                                       assert attrs != null;
-                                                       AttributesDictionary.copy(conf.getProperties(), attrs);
-                                               }
-                                               saveDeployedConfigs();
-                                               if (log.isDebugEnabled())
-                                                       log.debug("Updated deploy config " + serviceDn(factoryPid, cn.toString()));
-                                       } else {
-                                               // ignore non config-registered service factories
-                                       }
-                               } else {
-                                       serviceDn = serviceDn(event.getPid());
-                                       if (deployConfigs.containsKey(serviceDn)) {
-                                               Attributes attrs = deployConfigs.get(serviceDn);
-                                               assert attrs != null;
-                                               AttributesDictionary.copy(conf.getProperties(), attrs);
-                                               saveDeployedConfigs();
-                                               if (log.isDebugEnabled())
-                                                       log.debug("Updated deploy config " + serviceDn);
-                                       } else {
-                                               // ignore non config-registered services
-                                       }
-                               }
-                       }
-               } catch (Exception e) {
-                       log.error("Could not handle configuration event", e);
-               }
-       }
-
-       private void putFactoryDeployConfig(String factoryPid, Dictionary<String, Object> props) {
-               Object cn = props.get(NodeConstants.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));
-               LdapName serviceDn = serviceDn(factoryPid, cn.toString());
-               Attributes attrs = new BasicAttributes();
-               AttributesDictionary.copy(props, attrs);
-               deployConfigs.put(serviceDn, attrs);
-       }
-
-       private void putDeployConfig(String servicePid, Dictionary<String, Object> props) {
-               LdapName serviceDn = serviceDn(servicePid);
-               Attributes attrs = new BasicAttributes(NodeConstants.CN, servicePid);
-               AttributesDictionary.copy(props, attrs);
-               deployConfigs.put(serviceDn, attrs);
-       }
-
-       void saveDeployedConfigs() throws IOException {
-               try (Writer writer = Files.newBufferedWriter(deployPath)) {
-                       new LdifWriter(writer).write(deployConfigs);
-               }
-       }
-
-       private LdapName serviceFactoryDn(String factoryPid) {
-               try {
-                       return new LdapName(NodeConstants.OU + "=" + factoryPid + "," + NodeConstants.DEPLOY_BASEDN);
-               } catch (InvalidNameException e) {
-                       throw new IllegalArgumentException("Cannot generate DN from " + factoryPid, e);
-               }
-       }
-
-       private LdapName serviceDn(String servicePid) {
-               try {
-                       return new LdapName(NodeConstants.CN + "=" + servicePid + "," + NodeConstants.DEPLOY_BASEDN);
-               } catch (InvalidNameException e) {
-                       throw new IllegalArgumentException("Cannot generate DN from " + servicePid, e);
-               }
-       }
-
-       private LdapName serviceDn(String factoryPid, String cn) {
-               try {
-                       return (LdapName) serviceFactoryDn(factoryPid).add(new Rdn(NodeConstants.CN, cn));
-               } catch (InvalidNameException e) {
-                       throw new IllegalArgumentException("Cannot generate DN from " + factoryPid + " and " + cn, e);
-               }
-       }
-
        private void prepareNodeRepository(Repository deployedNodeRepository) {
                if (availableSince != null) {
                        throw new CmsException("Deployment is already available");
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
new file mode 100644 (file)
index 0000000..376323a
--- /dev/null
@@ -0,0 +1,233 @@
+package org.argeo.cms.internal.kernel;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Writer;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Dictionary;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import javax.naming.InvalidNameException;
+import javax.naming.directory.Attributes;
+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.cms.CmsException;
+import org.argeo.jcr.ArgeoJcrConstants;
+import org.argeo.node.NodeConstants;
+import org.argeo.node.NodeState;
+import org.argeo.util.naming.AttributesDictionary;
+import org.argeo.util.naming.LdifParser;
+import org.argeo.util.naming.LdifWriter;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.cm.ConfigurationEvent;
+import org.osgi.service.cm.SynchronousConfigurationListener;
+
+class DeployConfig implements SynchronousConfigurationListener {
+       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 SortedMap<LdapName, Attributes> deployConfigs = new TreeMap<>();
+
+       public DeployConfig(boolean isClean) {
+               ConfigurationAdmin configurationAdmin = bc.getService(bc.getServiceReference(ConfigurationAdmin.class));
+               try {
+                       if (!Files.exists(deployConfigPath)) { // first init
+                               firstInit();
+                       }
+                       init(configurationAdmin, isClean);
+               } catch (IOException e) {
+                       throw new CmsException("Could not init deploy configs", e);
+               }
+               bc.registerService(SynchronousConfigurationListener.class, this, null);
+       }
+
+       private void firstInit() throws IOException {
+               Files.createDirectories(deployConfigPath.getParent());
+
+               FirstInitProperties firstInit = new FirstInitProperties();
+               firstInit.prepareInstanceArea();
+
+               if (!Files.exists(deployConfigPath))// could have juste been copied
+                       Files.createFile(deployConfigPath);
+
+               try (InputStream in = Files.newInputStream(deployConfigPath)) {
+                       deployConfigs = new LdifParser().read(in);
+               }
+
+               Dictionary<String, Object> nodeConfig = firstInit
+                               .getNodeRepositoryConfig(getProps(NodeConstants.NODE_REPOS_FACTORY_PID, ArgeoJcrConstants.ALIAS_NODE));
+               // node repository is mandatory
+               putFactoryDeployConfig(NodeConstants.NODE_REPOS_FACTORY_PID, nodeConfig);
+
+               Dictionary<String, Object> webServerConfig = firstInit
+                               .getHttpServerConfig(getProps(KernelConstants.JETTY_FACTORY_PID, ArgeoJcrConstants.ALIAS_NODE));
+               if (!webServerConfig.isEmpty())
+                       putFactoryDeployConfig(KernelConstants.JETTY_FACTORY_PID, webServerConfig);
+
+               saveDeployedConfigs();
+       }
+
+       private void init(ConfigurationAdmin configurationAdmin, boolean isClean) throws IOException {
+
+               try (InputStream in = Files.newInputStream(deployConfigPath)) {
+                       deployConfigs = new LdifParser().read(in);
+               }
+               if (isClean) {
+                       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);
+                                       AttributesDictionary dico = new AttributesDictionary(deployConfigs.get(dn));
+                                       conf.update(dico);
+                               }
+                       }
+               }
+               // TODO check consistency if not clean
+       }
+
+       @Override
+       public void configurationEvent(ConfigurationEvent event) {
+               try {
+                       if (ConfigurationEvent.CM_UPDATED == event.getType()) {
+                               ConfigurationAdmin configurationAdmin = bc.getService(event.getReference());
+                               Configuration conf = configurationAdmin.getConfiguration(event.getPid(), null);
+                               LdapName serviceDn = null;
+                               String factoryPid = conf.getFactoryPid();
+                               if (factoryPid != null) {
+                                       LdapName serviceFactoryDn = serviceFactoryDn(factoryPid);
+                                       if (deployConfigs.containsKey(serviceFactoryDn)) {
+                                               for (LdapName dn : deployConfigs.keySet()) {
+                                                       if (dn.startsWith(serviceFactoryDn)) {
+                                                               Rdn lastRdn = dn.getRdn(dn.size() - 1);
+                                                               assert lastRdn.getType().equals(NodeConstants.CN);
+                                                               Object value = conf.getProperties().get(lastRdn.getType());
+                                                               assert value != null;
+                                                               if (value.equals(lastRdn.getValue())) {
+                                                                       serviceDn = dn;
+                                                                       break;
+                                                               }
+                                                       }
+                                               }
+
+                                               Object cn = conf.getProperties().get(NodeConstants.CN);
+                                               if (cn == null)
+                                                       throw new IllegalArgumentException("Properties must contain cn");
+                                               if (serviceDn == null) {
+                                                       putFactoryDeployConfig(factoryPid, conf.getProperties());
+                                               } else {
+                                                       Attributes attrs = deployConfigs.get(serviceDn);
+                                                       assert attrs != null;
+                                                       AttributesDictionary.copy(conf.getProperties(), attrs);
+                                               }
+                                               saveDeployedConfigs();
+                                               if (log.isDebugEnabled())
+                                                       log.debug("Updated deploy config " + serviceDn(factoryPid, cn.toString()));
+                                       } else {
+                                               // ignore non config-registered service factories
+                                       }
+                               } else {
+                                       serviceDn = serviceDn(event.getPid());
+                                       if (deployConfigs.containsKey(serviceDn)) {
+                                               Attributes attrs = deployConfigs.get(serviceDn);
+                                               assert attrs != null;
+                                               AttributesDictionary.copy(conf.getProperties(), attrs);
+                                               saveDeployedConfigs();
+                                               if (log.isDebugEnabled())
+                                                       log.debug("Updated deploy config " + serviceDn);
+                                       } else {
+                                               // ignore non config-registered services
+                                       }
+                               }
+                       }
+               } catch (Exception e) {
+                       log.error("Could not handle configuration event", e);
+               }
+       }
+
+       void putFactoryDeployConfig(String factoryPid, Dictionary<String, Object> props) {
+               Object cn = props.get(NodeConstants.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));
+               LdapName serviceDn = serviceDn(factoryPid, cn.toString());
+               Attributes attrs = new BasicAttributes();
+               AttributesDictionary.copy(props, attrs);
+               deployConfigs.put(serviceDn, attrs);
+       }
+
+       void putDeployConfig(String servicePid, Dictionary<String, Object> props) {
+               LdapName serviceDn = serviceDn(servicePid);
+               Attributes attrs = new BasicAttributes(NodeConstants.CN, servicePid);
+               AttributesDictionary.copy(props, attrs);
+               deployConfigs.put(serviceDn, attrs);
+       }
+
+       void saveDeployedConfigs() throws IOException {
+               try (Writer writer = Files.newBufferedWriter(deployConfigPath)) {
+                       new LdifWriter(writer).write(deployConfigs);
+               }
+       }
+
+       /*
+        * UTILITIES
+        */
+       private LdapName serviceFactoryDn(String factoryPid) {
+               try {
+                       return new LdapName(NodeConstants.OU + "=" + factoryPid + "," + NodeConstants.DEPLOY_BASEDN);
+               } catch (InvalidNameException e) {
+                       throw new IllegalArgumentException("Cannot generate DN from " + factoryPid, e);
+               }
+       }
+
+       private LdapName serviceDn(String servicePid) {
+               try {
+                       return new LdapName(NodeConstants.CN + "=" + servicePid + "," + NodeConstants.DEPLOY_BASEDN);
+               } catch (InvalidNameException e) {
+                       throw new IllegalArgumentException("Cannot generate DN from " + servicePid, e);
+               }
+       }
+
+       private LdapName serviceDn(String factoryPid, String cn) {
+               try {
+                       return (LdapName) serviceFactoryDn(factoryPid).add(new Rdn(NodeConstants.CN, cn));
+               } catch (InvalidNameException e) {
+                       throw new IllegalArgumentException("Cannot generate DN from " + factoryPid + " and " + cn, e);
+               }
+       }
+
+       private Dictionary<String, Object> getProps(String factoryPid, String cn) {
+               Attributes attrs = deployConfigs.get(serviceDn(factoryPid, cn));
+               if (attrs != null)
+                       return new AttributesDictionary(attrs);
+               else
+                       return null;
+       }
+
+}
index cc2c3efe4ce2802d44909055eeb8dcb8b2bbb843..6b34c207ccfc12482178a024b0b6985ca2920793 100644 (file)
@@ -2,9 +2,16 @@ package org.argeo.cms.internal.kernel;
 
 import static org.argeo.cms.internal.kernel.KernelUtils.getFrameworkProp;
 
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
 import java.util.Dictionary;
 import java.util.Hashtable;
 
+import org.apache.commons.io.FileUtils;
+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.node.NodeConstants;
 import org.argeo.node.RepoConf;
@@ -15,8 +22,15 @@ import org.eclipse.equinox.http.jetty.JettyConstants;
  * configuration.
  */
 class FirstInitProperties {
-       Dictionary<String, Object> getNodeRepositoryConfig() {
-               Hashtable<String, Object> props = new Hashtable<String, Object>();
+       private final static Log log = LogFactory.getLog(FirstInitProperties.class);
+
+       public FirstInitProperties() {
+               log.info("## FIRST INIT ##");
+       }
+
+       /** Override the provided config with the framework properties */
+       Dictionary<String, Object> getNodeRepositoryConfig(Dictionary<String, Object> provided) {
+               Dictionary<String, Object> props = provided != null ? provided : new Hashtable<String, Object>();
                for (RepoConf repoConf : RepoConf.values()) {
                        Object value = getFrameworkProp(NodeConstants.NODE_REPO_PROP_PREFIX + repoConf.name());
                        if (value != null)
@@ -27,7 +41,7 @@ class FirstInitProperties {
                return props;
        }
 
-       Dictionary<String, Object> getHttpServerConfig() {
+       Dictionary<String, Object> getHttpServerConfig(Dictionary<String, Object> provided) {
                String httpPort = getFrameworkProp("org.osgi.service.http.port");
                String httpsPort = getFrameworkProp("org.osgi.service.http.port.secure");
                /// TODO make it more generic
@@ -56,4 +70,42 @@ class FirstInitProperties {
                }
                return props;
        }
+
+       /**
+        * Called before node initialisation, in order populate OSGi instance are
+        * with some files (typically LDIF, etc).
+        */
+       void prepareInstanceArea() {
+               String nodeInit = getFrameworkProp(NodeConstants.NODE_INIT);
+               if (nodeInit == null)
+                       nodeInit = "../../init";
+               if (nodeInit.startsWith("http")) {
+                       // remoteFirstInit(nodeInit);
+                       return;
+               }
+
+               // TODO use java.nio.file
+               File initDir;
+               if (nodeInit.startsWith("."))
+                       initDir = KernelUtils.getExecutionDir(nodeInit);
+               else
+                       initDir = new File(nodeInit);
+               // TODO also uncompress archives
+               if (initDir.exists())
+                       try {
+                               FileUtils.copyDirectory(initDir, KernelUtils.getOsgiInstanceDir(), new FileFilter() {
+
+                                       @Override
+                                       public boolean accept(File pathname) {
+                                               if (pathname.getName().equals(".svn") || pathname.getName().equals(".git"))
+                                                       return false;
+                                               return true;
+                                       }
+                               });
+                               log.info("CMS initialized from " + initDir.getCanonicalPath());
+                       } catch (IOException e) {
+                               throw new CmsException("Cannot initialize from " + initDir, e);
+                       }
+       }
+
 }
index 4ce7f0fc5f5b955a84996bf2a053340214c315f6..79e735976fbebe96bb50d8d4ab4a803ff9a0205d 100644 (file)
@@ -18,7 +18,7 @@ public interface KernelConstants {
        final static String DIR_PKI_PRIVATE = DIR_PKI + "/private";
 
        // Files
-       String DEPLOY_PATH = KernelConstants.DIR_NODE + '/' + NodeConstants.DEPLOY_BASEDN + ".ldif";
+       String DEPLOY_CONFIG_PATH = KernelConstants.DIR_NODE + '/' + NodeConstants.DEPLOY_BASEDN + ".ldif";
        
        // Security
        final static String DEFAULT_SECURITY_KEY = "argeo";
index 73099ef4e414d83ecdefd364e91b11f96902ac8c..c211e8e8a40b0316d230f0d7e68cf34f0a8dfdb9 100644 (file)
@@ -120,10 +120,16 @@ public class AttributesDictionary extends Dictionary<String, Object> {
                } else {
                        if (attr.size() > 1)
                                throw new IllegalArgumentException("Attribute " + key + " is multi-valued");
-                       if (attr.size() == 1)
-                               attr.set(0, value.toString());
-                       else
+                       if (attr.size() == 1) {
+                               try {
+                                       if (!attr.get(0).equals(value))
+                                               attr.set(0, value.toString());
+                               } catch (NamingException e) {
+                                       throw new RuntimeException("Cannot check existing value", e);
+                               }
+                       } else {
                                attr.add(value.toString());
+                       }
                }
                return oldValue;
        }
index 66e529e5e6857d8d4b58b4909084064bbcace687..c2cd7718654a501ff0c7cfd01855ca325d592320 100644 (file)
@@ -27,19 +27,17 @@ import org.argeo.osgi.useradmin.UserDirectoryException;
 public class LdifParser {
        private final static Log log = LogFactory.getLog(LdifParser.class);
 
-       protected Attributes addAttributes(SortedMap<LdapName, Attributes> res,
-                       int lineNumber, LdapName currentDn, Attributes currentAttributes) {
+       protected Attributes addAttributes(SortedMap<LdapName, Attributes> res, int lineNumber, LdapName currentDn,
+                       Attributes currentAttributes) {
                try {
                        Rdn nameRdn = currentDn.getRdn(currentDn.size() - 1);
                        Attribute nameAttr = currentAttributes.get(nameRdn.getType());
                        if (nameAttr == null)
                                currentAttributes.put(nameRdn.getType(), nameRdn.getValue());
                        else if (!nameAttr.get().equals(nameRdn.getValue()))
-                               throw new UserDirectoryException("Attribute "
-                                               + nameAttr.getID() + "=" + nameAttr.get()
-                                               + " not consistent with DN " + currentDn
-                                               + " (shortly before line " + lineNumber
-                                               + " in LDIF file)");
+                               throw new UserDirectoryException(
+                                               "Attribute " + nameAttr.getID() + "=" + nameAttr.get() + " not consistent with DN " + currentDn
+                                                               + " (shortly before line " + lineNumber + " in LDIF file)");
                        Attributes previous = res.put(currentDn, currentAttributes);
                        if (log.isTraceEnabled())
                                log.trace("Added " + currentDn);
@@ -53,6 +51,8 @@ public class LdifParser {
                SortedMap<LdapName, Attributes> res = new TreeMap<LdapName, Attributes>();
                try {
                        List<String> lines = IOUtils.readLines(in);
+                       if (lines.size() == 0)
+                               return res;
                        // add an empty new line since the last line is not checked
                        if (!lines.get(lines.size() - 1).equals(""))
                                lines.add("");
@@ -79,8 +79,7 @@ public class LdifParser {
                                        readAttrId: for (int i = 0; i < currentEntry.length(); i++) {
                                                char c = currentEntry.charAt(i);
                                                if (c == ':') {
-                                                       if (i + 1 < currentEntry.length()
-                                                                       && currentEntry.charAt(i + 1) == ':')
+                                                       if (i + 1 < currentEntry.length() && currentEntry.charAt(i + 1) == ':')
                                                                isBase64 = true;
                                                        currentEntry.delete(0, i + (isBase64 ? 2 : 1));
                                                        break readAttrId;
@@ -91,8 +90,7 @@ public class LdifParser {
 
                                        String attributeId = attrId.toString();
                                        String cleanValueStr = currentEntry.toString().trim();
-                                       Object attributeValue = isBase64 ? Base64
-                                                       .decodeBase64(cleanValueStr) : cleanValueStr;
+                                       Object attributeValue = isBase64 ? Base64.decodeBase64(cleanValueStr) : cleanValueStr;
 
                                        // manage DN attributes
                                        if (attributeId.equals(dn.name()) || isLastLine) {
@@ -100,23 +98,19 @@ public class LdifParser {
                                                        //
                                                        // ADD
                                                        //
-                                                       Attributes previous = addAttributes(res,
-                                                                       lineNumber, currentDn, currentAttributes);
+                                                       Attributes previous = addAttributes(res, lineNumber, currentDn, currentAttributes);
                                                        if (previous != null) {
-                                                               log.warn("There was already an entry with DN "
-                                                                               + currentDn
+                                                               log.warn("There was already an entry with DN " + currentDn
                                                                                + ", which has been discarded by a subsequent one.");
                                                        }
                                                }
 
                                                if (attributeId.equals(dn.name()))
                                                        try {
-                                                               currentDn = new LdapName(
-                                                                               attributeValue.toString());
+                                                               currentDn = new LdapName(attributeValue.toString());
                                                                currentAttributes = new BasicAttributes(true);
                                                        } catch (InvalidNameException e) {
-                                                               log.error(attributeValue
-                                                                               + " not a valid DN, skipping the entry.");
+                                                               log.error(attributeValue + " not a valid DN, skipping the entry.");
                                                                currentDn = null;
                                                                currentAttributes = null;
                                                        }
@@ -124,8 +118,7 @@ public class LdifParser {
 
                                        // store attribute
                                        if (currentAttributes != null) {
-                                               Attribute attribute = currentAttributes
-                                                               .get(attributeId);
+                                               Attribute attribute = currentAttributes.get(attributeId);
                                                if (attribute == null) {
                                                        attribute = new BasicAttribute(attributeId);
                                                        currentAttributes.put(attribute);