From: Mathieu Baudier Date: Mon, 5 Sep 2016 08:18:06 +0000 (+0000) Subject: Restore first init capability X-Git-Tag: argeo-commons-2.1.45~24 X-Git-Url: https://git.argeo.org/?a=commitdiff_plain;h=a7970d75a320e1702ff62392242499e7c2527ba3;p=lgpl%2Fargeo-commons.git Restore first init capability git-svn-id: https://svn.argeo.org/commons/trunk@9089 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java index 2f1b16f3c..724108fb1 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java @@ -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 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 nodeConfig = firstInitProperties.getNodeRepositoryConfig(); - // node repository is mandatory - putFactoryDeployConfig(NodeConstants.NODE_REPOS_FACTORY_PID, nodeConfig); - - Dictionary 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 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 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 index 000000000..376323aac --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/DeployConfig.java @@ -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 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 nodeConfig = firstInit + .getNodeRepositoryConfig(getProps(NodeConstants.NODE_REPOS_FACTORY_PID, ArgeoJcrConstants.ALIAS_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); + + 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 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 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 getProps(String factoryPid, String cn) { + Attributes attrs = deployConfigs.get(serviceDn(factoryPid, cn)); + if (attrs != null) + return new AttributesDictionary(attrs); + else + return null; + } + +} diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/FirstInitProperties.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/FirstInitProperties.java index cc2c3efe4..6b34c207c 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/FirstInitProperties.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/FirstInitProperties.java @@ -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 getNodeRepositoryConfig() { - Hashtable props = new Hashtable(); + private final static Log log = LogFactory.getLog(FirstInitProperties.class); + + public FirstInitProperties() { + log.info("## FIRST INIT ##"); + } + + /** Override the provided config with the framework properties */ + Dictionary getNodeRepositoryConfig(Dictionary provided) { + Dictionary props = provided != null ? provided : new Hashtable(); 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 getHttpServerConfig() { + Dictionary getHttpServerConfig(Dictionary 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); + } + } + } diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java index 4ce7f0fc5..79e735976 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java @@ -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"; diff --git a/org.argeo.security.core/src/org/argeo/util/naming/AttributesDictionary.java b/org.argeo.security.core/src/org/argeo/util/naming/AttributesDictionary.java index 73099ef4e..c211e8e8a 100644 --- a/org.argeo.security.core/src/org/argeo/util/naming/AttributesDictionary.java +++ b/org.argeo.security.core/src/org/argeo/util/naming/AttributesDictionary.java @@ -120,10 +120,16 @@ public class AttributesDictionary extends Dictionary { } 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; } diff --git a/org.argeo.security.core/src/org/argeo/util/naming/LdifParser.java b/org.argeo.security.core/src/org/argeo/util/naming/LdifParser.java index 66e529e5e..c2cd77186 100644 --- a/org.argeo.security.core/src/org/argeo/util/naming/LdifParser.java +++ b/org.argeo.security.core/src/org/argeo/util/naming/LdifParser.java @@ -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 res, - int lineNumber, LdapName currentDn, Attributes currentAttributes) { + protected Attributes addAttributes(SortedMap 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 res = new TreeMap(); try { List 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);