From c83be52eb129b9bf0fb028ee6407ca45da9d37ca Mon Sep 17 00:00:00 2001
From: lutoff <lutoff@localhost>
Date: Wed, 13 Sep 2006 08:20:46 +0000
Subject: [PATCH] Synchronization feature: Implementation of the changeListner method for the Synchronization plugin Implemented by Gilles, Reviewed an tested by Daniel
---
opends/src/server/org/opends/server/core/SynchronizationProviderConfigManager.java | 4
opends/src/server/org/opends/server/synchronization/MultimasterSynchronization.java | 88 +++++++++++++++--
opends/src/server/org/opends/server/changelog/Changelog.java | 93 ++++++++++++++----
opends/src/server/org/opends/server/synchronization/SynchronizationDomain.java | 64 +++++++++++-
4 files changed, 206 insertions(+), 43 deletions(-)
diff --git a/opends/src/server/org/opends/server/changelog/Changelog.java b/opends/src/server/org/opends/server/changelog/Changelog.java
index 69ebfd7..2fbe670 100644
--- a/opends/src/server/org/opends/server/changelog/Changelog.java
+++ b/opends/src/server/org/opends/server/changelog/Changelog.java
@@ -81,7 +81,7 @@
private static boolean runListen = true;
/* The list of changelog servers configured by the administrator */
- private List<String> configuredChangelogs;
+ private List<String> changelogServers;
/* This table is used to store the list of dn for which we are currently
* handling servers.
@@ -92,15 +92,75 @@
private String localhostname = "null";
private String localURL = "null";
private static boolean shutdown = false;
- private List<String> changelogServers = null;
private short changelogServerId;
private DN configDn;
private List<ConfigAttribute> configAttributes =
new ArrayList<ConfigAttribute>();
- static String CHANGELOG_SERVER_ATTR = "ds-cfg-changelog-server";
- static String SERVER_ID_ATTR = "ds-cfg-changelog-server-id";
- static String CHANGELOG_PORT_ATTR = "ds-cfg-changelog-port";
+ static final String CHANGELOG_SERVER_ATTR = "ds-cfg-changelog-server";
+ static final String SERVER_ID_ATTR = "ds-cfg-changelog-server-id";
+ static final String CHANGELOG_PORT_ATTR = "ds-cfg-changelog-port";
+
+ static final IntegerConfigAttribute changelogPortStub =
+ new IntegerConfigAttribute(CHANGELOG_PORT_ATTR, "changelog port",
+ true, false, false, true, 0,
+ true, 65535);
+
+ static final IntegerConfigAttribute serverIdStub =
+ new IntegerConfigAttribute(SERVER_ID_ATTR, "server ID", true, false,
+ false, true, 0, true, 65535);
+
+ static final StringConfigAttribute changelogStub =
+ new StringConfigAttribute(CHANGELOG_SERVER_ATTR,
+ "changelog server information", true,
+ true, false);
+
+ /**
+ * Check if a ConfigEntry is valid.
+ * @param config The config entry that needs to be checked.
+ * @param unacceptableReason A description of the reason why the config entry
+ * is not acceptable (if return is false).
+ * @return a boolean indicating if the configEntry is valid.
+ */
+ public static boolean checkConfigEntry(ConfigEntry config,
+ StringBuilder unacceptableReason)
+ {
+ try
+ {
+ IntegerConfigAttribute changelogPortAttr;
+ changelogPortAttr =
+ (IntegerConfigAttribute) config.getConfigAttribute(changelogPortStub);
+
+ /* The config must provide a changelog port number
+ */
+ if (changelogPortAttr == null)
+ {
+ unacceptableReason.append(
+ MessageHandler.getMessage(MSGID_NEED_CHANGELOG_PORT,
+ config.getDN().toString()) );
+ }
+
+ /*
+ * read the server Id information
+ * this is a single valued integer, its value must fit on a
+ * short integer
+ */
+ IntegerConfigAttribute serverIdAttr =
+ (IntegerConfigAttribute) config.getConfigAttribute(serverIdStub);
+
+ if (serverIdAttr == null)
+ {
+ unacceptableReason.append(
+ MessageHandler.getMessage(MSGID_NEED_SERVER_ID,
+ config.getDN().toString()) );
+ }
+
+ return true;
+ } catch (ConfigException e)
+ {
+ return false;
+ }
+ }
/**
* Creates a new Changelog using the provided configuration entry.
@@ -110,10 +170,6 @@
*/
public Changelog(ConfigEntry config) throws ConfigException
{
- IntegerConfigAttribute changelogPortStub =
- new IntegerConfigAttribute(CHANGELOG_PORT_ATTR, "changelog port",
- true, false, false, true, 0,
- true, 65535);
IntegerConfigAttribute changelogPortAttr =
(IntegerConfigAttribute) config.getConfigAttribute(changelogPortStub);
/* if there is no changelog port configured, this process must not be a
@@ -133,9 +189,6 @@
* this is a single valued integer, its value must fit on a
* short integer
*/
- IntegerConfigAttribute serverIdStub =
- new IntegerConfigAttribute(SERVER_ID_ATTR, "server ID", true, false,
- false, true, 0, true, 65535);
IntegerConfigAttribute serverIdAttr =
(IntegerConfigAttribute) config.getConfigAttribute(serverIdStub);
@@ -152,19 +205,16 @@
* read the centralized changelog server configuration
* this is a multivalued attribute
*/
- StringConfigAttribute changelogStub =
- new StringConfigAttribute(CHANGELOG_SERVER_ATTR,
- "changelog server information", true,
- true, false);
StringConfigAttribute changelogServer =
(StringConfigAttribute) config.getConfigAttribute(changelogStub);
if (changelogServer == null)
{
- throw new ConfigException(MSGID_NEED_CHANGELOG_SERVER,
- MessageHandler.getMessage(MSGID_NEED_CHANGELOG_SERVER,
- config.getDN().toString()) );
+ changelogServers = new ArrayList<String>();
}
- changelogServers = changelogServer.activeValues();
+ else
+ {
+ changelogServers = changelogServer.activeValues();
+ }
configAttributes.add(changelogServer);
initialize(changelogServerId, changelogPort, changelogServers);
@@ -275,7 +325,7 @@
* check that all changelog in the config are in the connected Set
* if not create the connection
*/
- for (String serverURL : configuredChangelogs)
+ for (String serverURL : changelogServers)
{
if ((serverURL.compareTo(localURL) != 0) &&
(!connectedChangelogs.contains(serverURL)))
@@ -353,7 +403,6 @@
/*
* create changelog cache
*/
- configuredChangelogs = changelogServers;
serverId = changelogId;
/*
diff --git a/opends/src/server/org/opends/server/core/SynchronizationProviderConfigManager.java b/opends/src/server/org/opends/server/core/SynchronizationProviderConfigManager.java
index f1d810d..76ff68f 100644
--- a/opends/src/server/org/opends/server/core/SynchronizationProviderConfigManager.java
+++ b/opends/src/server/org/opends/server/core/SynchronizationProviderConfigManager.java
@@ -788,7 +788,7 @@
// NYI
- return false;
+ return true;
}
@@ -835,7 +835,7 @@
// NYI
- return false;
+ return true;
}
diff --git a/opends/src/server/org/opends/server/synchronization/MultimasterSynchronization.java b/opends/src/server/org/opends/server/synchronization/MultimasterSynchronization.java
index f9f2b10..d98d8cd 100644
--- a/opends/src/server/org/opends/server/synchronization/MultimasterSynchronization.java
+++ b/opends/src/server/org/opends/server/synchronization/MultimasterSynchronization.java
@@ -67,6 +67,7 @@
static String SYNCHRONIZATION_CLASS =
"ds-cfg-synchronization-provider-config";
+ private DN changelogConfigEntryDn = null;
private Changelog changelog = null;
private static Map<DN, SynchronizationDomain> domains =
new HashMap<DN, SynchronizationDomain>() ;
@@ -92,8 +93,6 @@
public void initializeSynchronizationProvider(ConfigEntry configEntry)
throws ConfigException
{
- DN configEntryDn = null;
-
SynchMessages.registerMessages();
configEntry.registerAddListener(this);
@@ -104,8 +103,9 @@
*/
try
{
- configEntryDn = DN.decode(CHANGELOG_DN);
- ConfigEntry config = DirectoryServer.getConfigEntry(configEntryDn);
+ changelogConfigEntryDn = DN.decode(CHANGELOG_DN);
+ ConfigEntry config =
+ DirectoryServer.getConfigEntry(changelogConfigEntryDn);
/*
* If there is no such entry, this process must not be a changelog server
*/
@@ -128,9 +128,7 @@
{
if (domainEntry.hasObjectClass(SYNCHRONIZATION_CLASS))
{
- SynchronizationDomain domain = new SynchronizationDomain(domainEntry);
- domains.put(domain.getBaseDN(), domain);
- domain.start();
+ createNewSynchronizationDomain(domainEntry);
}
}
}
@@ -176,7 +174,28 @@
public boolean configAddIsAcceptable(ConfigEntry configEntry,
StringBuilder unacceptableReason)
{
- // TODO Auto-generated method stub
+ // Check if the added entry is the changelog config entry
+ try
+ {
+ if (configEntry.getDN().equals(DN.decode(CHANGELOG_DN)))
+ {
+ return Changelog.checkConfigEntry(configEntry, unacceptableReason);
+ }
+ } catch (DirectoryException e)
+ {
+ /* never happens */
+ unacceptableReason.append("Invalid Changelog configuration DN");
+ return false;
+ }
+
+ // otherwise it must be a Synchronization domain, check for
+ // presence of the Synchronization configuration object class
+ if (configEntry.hasObjectClass(SYNCHRONIZATION_CLASS))
+ {
+ return SynchronizationDomain.checkConfigEntry(configEntry,
+ unacceptableReason);
+ }
+
return false;
}
@@ -185,8 +204,56 @@
*/
public ConfigChangeResult applyConfigurationAdd(ConfigEntry configEntry)
{
- // TODO Auto-generated method stub
- return null;
+ // check if the entry is the changelog configuration entry
+ if (configEntry.getDN().equals(changelogConfigEntryDn))
+ {
+ try
+ {
+ changelog = new Changelog(configEntry);
+ return new ConfigChangeResult(ResultCode.SUCCESS, false);
+ } catch (ConfigException e)
+ {
+ // we should never get to this point because the configEntry has
+ // already been validated in configAddisAcceptable
+ return new ConfigChangeResult(ResultCode.SUCCESS, false);
+ }
+ }
+
+ // otherwise it must be a synchronization domain, check for
+ // presence of the Synchronization configuration object class
+ if (configEntry.hasObjectClass(SYNCHRONIZATION_CLASS))
+ {
+ try
+ {
+ createNewSynchronizationDomain(configEntry);
+ return new ConfigChangeResult(ResultCode.SUCCESS, false);
+ } catch (ConfigException e)
+ {
+ // we should never get to this point because the configEntry has
+ // already been validated in configAddisAcceptable
+ return new ConfigChangeResult(ResultCode.SUCCESS, false);
+ }
+ }
+
+ // we should never get to this point because the configEntry has
+ // already been validated in configAddisAcceptable
+ return new ConfigChangeResult(ResultCode.SUCCESS, false);
+ }
+
+ /**
+ * Creates a New Synchronization domain from its configEntry, do the
+ * necessary initialization and starts it so that it is
+ * fully operational when this method returns.
+ * @param configEntry The entry whith the configuration of this domain.
+ * @throws ConfigException When the configuration is not valid.
+ */
+ private void createNewSynchronizationDomain(ConfigEntry configEntry)
+ throws ConfigException
+ {
+ SynchronizationDomain domain;
+ domain = new SynchronizationDomain(configEntry);
+ domains.put(domain.getBaseDN(), domain);
+ domain.start();
}
/**
@@ -195,6 +262,7 @@
public boolean configDeleteIsAcceptable(ConfigEntry configEntry,
StringBuilder unacceptableReason)
{
+
// TODO Auto-generated method stub
return false;
}
diff --git a/opends/src/server/org/opends/server/synchronization/SynchronizationDomain.java b/opends/src/server/org/opends/server/synchronization/SynchronizationDomain.java
index 428c528..a52c7a6 100644
--- a/opends/src/server/org/opends/server/synchronization/SynchronizationDomain.java
+++ b/opends/src/server/org/opends/server/synchronization/SynchronizationDomain.java
@@ -113,7 +113,6 @@
private BooleanConfigAttribute receiveStatusStub;
private int listenerThreadNumber = 10;
- private StringConfigAttribute changelogStub;
private boolean receiveStatus = true;
private List<String> changelogServers;
@@ -138,6 +137,17 @@
static String MAX_SEND_QUEUE = "ds-cfg-max-send-queue";
static String MAX_SEND_DELAY = "ds-cfg-max-send-delay";
+ private static final StringConfigAttribute changelogStub =
+ new StringConfigAttribute(CHANGELOG_SERVER_ATTR,
+ "changelog server information", true, true, false);
+
+ private static final IntegerConfigAttribute serverIdStub =
+ new IntegerConfigAttribute(SERVER_ID_ATTR, "server ID", true, false,
+ false, true, 0, true, 65535);
+
+ private static final DNConfigAttribute baseDnStub =
+ new DNConfigAttribute(BASE_DN_ATTR, "synchronization base DN",
+ true, false, false);
/**
* Creates a new SynchronizationDomain using configuration from configEntry.
@@ -153,8 +163,6 @@
* read the centralized changelog server configuration
* this is a multivalued attribute
*/
- changelogStub = new StringConfigAttribute(CHANGELOG_SERVER_ATTR,
- "changelog server information", true, true, false);
StringConfigAttribute changelogServer =
(StringConfigAttribute) configEntry.getConfigAttribute(changelogStub);
@@ -171,9 +179,6 @@
* read the server Id information
* this is a single valued integer, its value must fit on a short integer
*/
- IntegerConfigAttribute serverIdStub =
- new IntegerConfigAttribute(SERVER_ID_ATTR, "server ID", true, false,
- false, true, 0, true, 65535);
IntegerConfigAttribute serverIdAttr =
(IntegerConfigAttribute) configEntry.getConfigAttribute(serverIdStub);
if (serverIdAttr == null)
@@ -188,9 +193,6 @@
/*
* read the base DN
*/
- DNConfigAttribute baseDnStub =
- new DNConfigAttribute(BASE_DN_ATTR, "synchronization base DN",
- true, false, false);
DNConfigAttribute baseDn =
(DNConfigAttribute) configEntry.getConfigAttribute(baseDnStub);
if (baseDn == null)
@@ -1583,4 +1585,48 @@
}
}
+ /**
+ * Check if a ConfigEntry is valid.
+ * @param configEntry The config entry that needs to be checked.
+ * @param unacceptableReason A description of the reason why the config entry
+ * is not acceptable (if return is false).
+ * @return a boolean indicating if the configEntry is valid.
+ */
+ public static boolean checkConfigEntry(ConfigEntry configEntry,
+ StringBuilder unacceptableReason)
+ {
+ try
+ {
+ StringConfigAttribute changelogServer =
+ (StringConfigAttribute) configEntry.getConfigAttribute(changelogStub);
+
+ if (changelogServer == null)
+ {
+ unacceptableReason.append(
+ MessageHandler.getMessage(MSGID_NEED_CHANGELOG_SERVER,
+ configEntry.getDN().toString()) );
+ return false;
+ }
+
+ /*
+ * read the server Id information
+ * this is a single valued integer, its value must fit on a short integer
+ */
+ IntegerConfigAttribute serverIdAttr =
+ (IntegerConfigAttribute) configEntry.getConfigAttribute(serverIdStub);
+ if (serverIdAttr == null)
+ {
+ unacceptableReason.append(
+ MessageHandler.getMessage(MSGID_NEED_SERVER_ID,
+ configEntry.getDN().toString()) );
+ return false;
+ }
+ }
+ catch (ConfigException e)
+ {
+ unacceptableReason.append(e.getMessage());
+ return false;
+ }
+ return true;
+ }
}
--
Gitblit v1.10.0