From 6401e69f22f9b5044c53bbdb4051851cb0f4cd7a Mon Sep 17 00:00:00 2001
From: pgamba <pgamba@localhost>
Date: Tue, 10 Nov 2009 08:52:03 +0000
Subject: [PATCH] Fix#4262 ECL One should be able to disable ECL for each domain
---
opends/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java | 123 ++++++++++++++++++++++++++++++++++++++++
1 files changed, 121 insertions(+), 2 deletions(-)
diff --git a/opends/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java b/opends/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java
index 2668ae5..ca1cf7d 100644
--- a/opends/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java
+++ b/opends/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java
@@ -41,6 +41,7 @@
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
+import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collection;
@@ -66,7 +67,9 @@
import org.opends.messages.Message;
import org.opends.messages.MessageBuilder;
import org.opends.server.admin.server.ConfigurationChangeListener;
+import org.opends.server.admin.std.meta.ReplicationDomainCfgDefn.AssuredType;
import org.opends.server.admin.std.meta.ReplicationDomainCfgDefn.*;
+import org.opends.server.admin.std.server.ExternalChangelogDomainCfg;
import org.opends.server.admin.std.server.ReplicationDomainCfg;
import org.opends.server.api.AlertGenerator;
import org.opends.server.api.Backend;
@@ -157,6 +160,7 @@
import org.opends.server.types.operation.PreOperationModifyDNOperation;
import org.opends.server.types.operation.PreOperationModifyOperation;
import org.opends.server.types.operation.PreOperationOperation;
+import org.opends.server.util.LDIFReader;
import org.opends.server.workflowelement.externalchangelog.ECLWorkflowElement;
import org.opends.server.workflowelement.localbackend.*;
@@ -256,6 +260,7 @@
* The DN of the configuration entry of this domain.
*/
private final DN configDn;
+ private ExternalChangelogDomain eclDomain;
/**
* A boolean indicating if the thread used to save the persistentServerState
@@ -432,7 +437,7 @@
setGroupId((byte)configuration.getGroupId());
setURLs(configuration.getReferralsUrl());
- setCfgEclInclude(configuration.getEclInclude());
+ createECLDomainCfg(configuration);
/*
* Modify conflicts are solved for all suffixes but the schema suffix
@@ -2305,6 +2310,15 @@
}
/**
+ * Delete this ReplicationDomain.
+ */
+ public void delete()
+ {
+ shutdown();
+ removeECLDomainCfg();
+ }
+
+ /**
* Shutdown this ReplicationDomain.
*/
public void shutdown()
@@ -4093,6 +4107,15 @@
solveConflictFlag = configuration.isSolveConflicts();
}
+ try
+ {
+ createECLDomainCfg(configuration);
+ }
+ catch(Exception e)
+ {
+ return new ConfigChangeResult(ResultCode.OTHER, false);
+ }
+
return new ConfigChangeResult(ResultCode.SUCCESS, false);
}
@@ -4166,6 +4189,94 @@
/**
+ * Remove from this domain configuration, the configuration of the
+ * external change log.
+ */
+ public void removeECLDomainCfg()
+ {
+ try
+ {
+ DN eclConfigEntryDN = DN.decode(
+ "cn=external changeLog," + configDn);
+
+ if (DirectoryServer.getConfigHandler().entryExists(eclConfigEntryDN))
+ {
+ DirectoryServer.getConfigHandler().deleteEntry(eclConfigEntryDN, null);
+ }
+ }
+ catch(Exception e)
+ {
+ TRACER.debugCaught(DebugLogLevel.ERROR, e);
+ MessageBuilder mb = new MessageBuilder();
+ mb.append(e.getMessage());
+ Message msg = ERR_CHECK_CREATE_REPL_BACKEND_FAILED.get(mb.toString());
+ logError(msg);
+ }
+ }
+
+ /**
+ * Create the ECl configuration.
+ * @param configuration The provided configuration.
+ * @throws ConfigException a.
+ */
+ public void createECLDomainCfg(ReplicationDomainCfg configuration)
+ throws ConfigException
+ {
+ // create the ecl config if it does not exist
+ // There may ot be any config entry related to this domain in some
+ // unit test cases
+ try
+ {
+ ExternalChangelogDomainCfg eclDomCfg = null;
+ if (DirectoryServer.getConfigHandler().entryExists(configDn))
+ {
+ try
+ { eclDomCfg = configuration.getExternalChangelogDomain();
+ }catch(Exception e) {}
+ if (eclDomCfg==null)
+ {
+ DN eclConfigEntryDN = DN.decode("cn=external changelog," + configDn);
+ if (!DirectoryServer.getConfigHandler().entryExists(eclConfigEntryDN))
+ {
+ String ldif = makeLdif(
+ "dn: cn=external changelog," + configDn,
+ "objectClass: top",
+ "objectClass: ds-cfg-external-changelog-domain",
+ "cn: external changelog",
+ "ds-cfg-enabled: " + (!getBackend().isPrivateBackend()));
+ LDIFImportConfig ldifImportConfig = new LDIFImportConfig(
+ new StringReader(ldif));
+ LDIFReader reader = new LDIFReader(ldifImportConfig);
+ Entry eclEntry = reader.readEntry();
+ DirectoryServer.getConfigHandler().addEntry(eclEntry, null);
+ ldifImportConfig.close();
+ }
+ }
+ }
+ eclDomCfg = configuration.getExternalChangelogDomain();
+ eclDomain = new ExternalChangelogDomain(this, eclDomCfg);
+ }
+ catch(Exception de)
+ {
+ throw new ConfigException(
+ NOTE_ERR_UNABLE_TO_ENABLE_ECL.get(
+ "Replication Domain on" + baseDn,
+ de.getMessage() + " " + de.getCause().getMessage()), de);
+ }
+ }
+
+ private static String makeLdif(String... lines)
+ {
+ StringBuilder buffer = new StringBuilder();
+ for (String line : lines) {
+ buffer.append(line).append(EOL);
+ }
+ // Append an extra line so we can append LDIF Strings.
+ buffer.append(EOL);
+ return buffer.toString();
+ }
+
+ /**
* {@inheritDoc}
*/
@Override
@@ -4197,7 +4308,6 @@
}
catch(DirectoryException de)
{
- //FIXME:DirectoryException is raised by initializeECL => fix err msg
Message message =
NOTE_ERR_UNABLE_TO_ENABLE_ECL.get(
"Replication Domain on" + baseDn,
@@ -5080,4 +5190,13 @@
return true;
}
}
+
+ /**
+ * Specifies whether this domain is enabled/disabled regarding the ECL.
+ * @return enabled/disabled for the ECL.
+ */
+ public boolean isECLEnabled()
+ {
+ return this.eclDomain.isEnabled();
+ }
}
--
Gitblit v1.10.0