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");
--- /dev/null
+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;
+ }
+
+}
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;
* 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)
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
}
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);
+ }
+ }
+
}
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";
} 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;
}
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);
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("");
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;
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) {
//
// 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;
}
// 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);