From c4743036d05cbea24b35705ad4f9735d4c2e8e62 Mon Sep 17 00:00:00 2001
From: neil_a_wilson <neil_a_wilson@localhost>
Date: Wed, 11 Jul 2007 23:15:50 +0000
Subject: [PATCH] Fix a problem that prevented attribute syntaxes and matching rules from being notified of configuration changes because they were registered against a version of the configuration that was thrown away after the schema initialization was complete. This fix preserves any add, delete, and change listeners that were registered with that old copy of the configuration and re-registers them with the new copy after the config is re-read following the schema initialization.
---
opends/src/server/org/opends/server/core/DirectoryServer.java | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 117 insertions(+), 1 deletions(-)
diff --git a/opends/src/server/org/opends/server/core/DirectoryServer.java b/opends/src/server/org/opends/server/core/DirectoryServer.java
index 984c9ab..6b4aaf3 100644
--- a/opends/src/server/org/opends/server/core/DirectoryServer.java
+++ b/opends/src/server/org/opends/server/core/DirectoryServer.java
@@ -2128,7 +2128,19 @@
// usable because it was all read before we had a schema (and therefore all
// of the attribute types and objectclasses are bogus and won't let us find
// anything). So we have to re-read the configuration so that we can
- // continue the necessary startup process.
+ // continue the necessary startup process. In the process, we want to
+ // preserve any configuration add/delete/change listeners that might have
+ // been registered with the old configuration (which will primarily be
+ // schema elements) so they can be re-registered with the new configuration.
+ LinkedHashMap<String,List<ConfigAddListener>> addListeners =
+ new LinkedHashMap<String,List<ConfigAddListener>>();
+ LinkedHashMap<String,List<ConfigDeleteListener>> deleteListeners =
+ new LinkedHashMap<String,List<ConfigDeleteListener>>();
+ LinkedHashMap<String,List<ConfigChangeListener>> changeListeners =
+ new LinkedHashMap<String,List<ConfigChangeListener>>();
+ getChangeListeners(configHandler.getConfigRootEntry(), addListeners,
+ deleteListeners, changeListeners);
+
try
{
configHandler.finalizeConfigHandler();
@@ -2165,6 +2177,110 @@
String message = getMessage(msgID, configClass, configFile, e);
throw new InitializationException(msgID, message);
}
+
+
+ // Re-register all of the change listeners with the configuration.
+ for (String dnStr : addListeners.keySet())
+ {
+ try
+ {
+ DN dn = DN.decode(dnStr);
+ for (ConfigAddListener listener : addListeners.get(dnStr))
+ {
+ configHandler.getConfigEntry(dn).registerAddListener(listener);
+ }
+ }
+ catch (DirectoryException de)
+ {
+ // This should never happen, so we'll just re-throw it.
+ throw new InitializationException(de.getMessageID(),
+ de.getErrorMessage());
+ }
+ }
+
+ for (String dnStr : deleteListeners.keySet())
+ {
+ try
+ {
+ DN dn = DN.decode(dnStr);
+ for (ConfigDeleteListener listener : deleteListeners.get(dnStr))
+ {
+ configHandler.getConfigEntry(dn).registerDeleteListener(listener);
+ }
+ }
+ catch (DirectoryException de)
+ {
+ // This should never happen, so we'll just re-throw it.
+ throw new InitializationException(de.getMessageID(),
+ de.getErrorMessage());
+ }
+ }
+
+ for (String dnStr : changeListeners.keySet())
+ {
+ try
+ {
+ DN dn = DN.decode(dnStr);
+ for (ConfigChangeListener listener : changeListeners.get(dnStr))
+ {
+ configHandler.getConfigEntry(dn).registerChangeListener(listener);
+ }
+ }
+ catch (DirectoryException de)
+ {
+ // This should never happen, so we'll just re-throw it.
+ throw new InitializationException(de.getMessageID(),
+ de.getErrorMessage());
+ }
+ }
+ }
+
+
+
+ /**
+ * Gets all of the add, delete, and change listeners from the provided
+ * configuration entry and all of its descendants and puts them in the
+ * appropriate lists.
+ *
+ * @param configEntry The configuration entry to be processed, along
+ * with all of its descendants.
+ * @param addListeners The set of add listeners mapped to the DN of the
+ * corresponding configuration entry.
+ * @param deleteListeners The set of delete listeners mapped to the DN of
+ * the corresponding configuration entry.
+ * @param changeListeners The set of change listeners mapped to the DN of
+ * the corresponding configuration entry.
+ */
+ private void getChangeListeners(ConfigEntry configEntry,
+ LinkedHashMap<String,List<ConfigAddListener>> addListeners,
+ LinkedHashMap<String,List<ConfigDeleteListener>> deleteListeners,
+ LinkedHashMap<String,List<ConfigChangeListener>> changeListeners)
+ {
+ CopyOnWriteArrayList<ConfigAddListener> cfgAddListeners =
+ configEntry.getAddListeners();
+ if ((cfgAddListeners != null) && (cfgAddListeners.size() > 0))
+ {
+ addListeners.put(configEntry.getDN().toString(), cfgAddListeners);
+ }
+
+ CopyOnWriteArrayList<ConfigDeleteListener> cfgDeleteListeners =
+ configEntry.getDeleteListeners();
+ if ((cfgDeleteListeners != null) && (cfgDeleteListeners.size() > 0))
+ {
+ deleteListeners.put(configEntry.getDN().toString(), cfgDeleteListeners);
+ }
+
+ CopyOnWriteArrayList<ConfigChangeListener> cfgChangeListeners =
+ configEntry.getChangeListeners();
+ if ((cfgChangeListeners != null) && (cfgChangeListeners.size() > 0))
+ {
+ changeListeners.put(configEntry.getDN().toString(), cfgChangeListeners);
+ }
+
+ for (ConfigEntry child : configEntry.getChildren().values())
+ {
+ getChangeListeners(child, addListeners, deleteListeners, changeListeners);
+ }
}
--
Gitblit v1.10.0