From 3f6373b52c42fd596d3659d335542909cfdd5fbb Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Fri, 20 Dec 2013 14:37:56 +0000
Subject: [PATCH] Checkpoint commit for OPENDJ-1235 : Migrate configuration framework

---
 opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObject.java |  316 ++++++++++++++++++++++++++++------------------------
 1 files changed, 168 insertions(+), 148 deletions(-)

diff --git a/opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObject.java b/opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObject.java
index 1ea7c61..5d82dee 100644
--- a/opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObject.java
+++ b/opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObject.java
@@ -27,7 +27,6 @@
 package org.opends.server.admin.server;
 
 import static com.forgerock.opendj.ldap.AdminMessages.*;
-import static com.forgerock.opendj.util.StaticUtils.*;
 
 import java.util.Collections;
 import java.util.LinkedList;
@@ -52,13 +51,13 @@
 import org.opends.server.api.ConfigAddListener;
 import org.opends.server.api.ConfigChangeListener;
 import org.opends.server.api.ConfigDeleteListener;
-import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryServer;
-import org.opends.server.util.DynamicConstants;
+import org.opends.server.config.ConfigurationRepository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.forgerock.opendj.util.Pair;
+
 
 /**
  * A server-side managed object.
@@ -71,21 +70,21 @@
 
     private static final Logger logger = LoggerFactory.getLogger(ServerManagedObject.class);
 
-    // The configuration entry associated with this server managed
-    // object (null if root).
-    private ConfigEntry configEntry;
+    /**
+     * The DN of configuration entry associated with this server managed object,
+     * which is {@code null} for root.
+     */
+    private DN configDN;
 
-    // The management context.
-    private final ServerManagementContext context = ServerManagementContext.getInstance();
+    private final ServerManagementContext serverContext;
 
-    // The managed object's definition.
+    private final ConfigurationRepository configRepository;
+
     private final ManagedObjectDefinition<?, S> definition;
 
-    // The managed object path identifying this managed object's
-    // location.
+    /** The managed object path identifying this managed object's location */
     private final ManagedObjectPath<?, S> path;
 
-    // The managed object's properties.
     private final Map<PropertyDefinition<?>, SortedSet<?>> properties;
 
     /**
@@ -97,15 +96,20 @@
      *            The managed object definition.
      * @param properties
      *            The managed object's properties.
-     * @param configEntry
+     * @param configDN
      *            The configuration entry associated with the managed object.
+     * @param context
+     *            The server management context.
      */
-    ServerManagedObject(ManagedObjectPath<?, S> path, ManagedObjectDefinition<?, S> d,
-            Map<PropertyDefinition<?>, SortedSet<?>> properties, ConfigEntry configEntry) {
+    ServerManagedObject(final ManagedObjectPath<?, S> path, final ManagedObjectDefinition<?, S> d,
+            final Map<PropertyDefinition<?>, SortedSet<?>> properties, final DN configDN,
+            final ServerManagementContext context) {
         this.definition = d;
         this.path = path;
         this.properties = properties;
-        this.configEntry = configEntry;
+        this.configDN = configDN;
+        this.serverContext = context;
+        this.configRepository = context.getConfigRepository();
     }
 
     /**
@@ -124,7 +128,6 @@
     public <M extends Configuration> void deregisterAddListener(InstantiableRelationDefinition<?, M> d,
             ConfigurationAddListener<M> listener) throws IllegalArgumentException {
         validateRelationDefinition(d);
-
         DN baseDN = DNBuilder.create(path, d);
         deregisterAddListener(baseDN, listener);
     }
@@ -145,7 +148,6 @@
     public <M extends Configuration> void deregisterAddListener(InstantiableRelationDefinition<?, M> d,
             ServerManagedObjectAddListener<M> listener) throws IllegalArgumentException {
         validateRelationDefinition(d);
-
         DN baseDN = DNBuilder.create(path, d);
         deregisterAddListener(baseDN, listener);
     }
@@ -166,7 +168,6 @@
     public <M extends Configuration> void deregisterAddListener(OptionalRelationDefinition<?, M> d,
             ConfigurationAddListener<M> listener) throws IllegalArgumentException {
         validateRelationDefinition(d);
-
         DN baseDN = DNBuilder.create(path, d).parent();
         deregisterAddListener(baseDN, listener);
     }
@@ -187,7 +188,6 @@
     public <M extends Configuration> void deregisterAddListener(OptionalRelationDefinition<?, M> d,
             ServerManagedObjectAddListener<M> listener) throws IllegalArgumentException {
         validateRelationDefinition(d);
-
         DN baseDN = DNBuilder.create(path, d).parent();
         deregisterAddListener(baseDN, listener);
     }
@@ -208,7 +208,6 @@
     public <M extends Configuration> void deregisterAddListener(SetRelationDefinition<?, M> d,
             ConfigurationAddListener<M> listener) throws IllegalArgumentException {
         validateRelationDefinition(d);
-
         DN baseDN = DNBuilder.create(path, d);
         deregisterAddListener(baseDN, listener);
     }
@@ -229,7 +228,6 @@
     public <M extends Configuration> void deregisterAddListener(SetRelationDefinition<?, M> d,
             ServerManagedObjectAddListener<M> listener) throws IllegalArgumentException {
         validateRelationDefinition(d);
-
         DN baseDN = DNBuilder.create(path, d);
         deregisterAddListener(baseDN, listener);
     }
@@ -241,7 +239,7 @@
      *            The configuration change listener.
      */
     public void deregisterChangeListener(ConfigurationChangeListener<? super S> listener) {
-        for (ConfigChangeListener l : configEntry.getChangeListeners()) {
+        for (ConfigChangeListener l : configRepository.getChangeListeners(configDN)) {
             if (l instanceof ConfigChangeListenerAdaptor) {
                 ConfigChangeListenerAdaptor<?> adaptor = (ConfigChangeListenerAdaptor<?>) l;
                 ServerManagedObjectChangeListener<?> l2 = adaptor.getServerManagedObjectChangeListener();
@@ -249,7 +247,7 @@
                     ServerManagedObjectChangeListenerAdaptor<?> adaptor2 = (ServerManagedObjectChangeListenerAdaptor<?>) l2;
                     if (adaptor2.getConfigurationChangeListener() == listener) {
                         adaptor.finalizeChangeListener();
-                        configEntry.deregisterChangeListener(adaptor);
+                        configRepository.deregisterChangeListener(configDN, adaptor);
                     }
                 }
             }
@@ -263,12 +261,12 @@
      *            The server managed object change listener.
      */
     public void deregisterChangeListener(ServerManagedObjectChangeListener<? super S> listener) {
-        for (ConfigChangeListener l : configEntry.getChangeListeners()) {
+        for (ConfigChangeListener l : configRepository.getChangeListeners(configDN)) {
             if (l instanceof ConfigChangeListenerAdaptor) {
                 ConfigChangeListenerAdaptor<?> adaptor = (ConfigChangeListenerAdaptor<?>) l;
                 if (adaptor.getServerManagedObjectChangeListener() == listener) {
                     adaptor.finalizeChangeListener();
-                    configEntry.deregisterChangeListener(adaptor);
+                    configRepository.deregisterChangeListener(configDN, adaptor);
                 }
             }
         }
@@ -421,7 +419,7 @@
     public <M extends Configuration> ServerManagedObject<? extends M> getChild(InstantiableRelationDefinition<?, M> d,
             String name) throws IllegalArgumentException, ConfigException {
         validateRelationDefinition(d);
-        return context.getManagedObject(path.child(d, name));
+        return serverContext.getManagedObject(path.child(d, name));
     }
 
     /**
@@ -443,7 +441,7 @@
     public <M extends Configuration> ServerManagedObject<? extends M> getChild(OptionalRelationDefinition<?, M> d)
             throws IllegalArgumentException, ConfigException {
         validateRelationDefinition(d);
-        return context.getManagedObject(path.child(d));
+        return serverContext.getManagedObject(path.child(d));
     }
 
     /**
@@ -470,7 +468,7 @@
             String name) throws IllegalArgumentException, ConfigException {
         validateRelationDefinition(d);
 
-        return context.getManagedObject(path.child(d, name));
+        return serverContext.getManagedObject(path.child(d, name));
     }
 
     /**
@@ -492,7 +490,16 @@
     public <M extends Configuration> ServerManagedObject<? extends M> getChild(SingletonRelationDefinition<?, M> d)
             throws IllegalArgumentException, ConfigException {
         validateRelationDefinition(d);
-        return context.getManagedObject(path.child(d));
+        return serverContext.getManagedObject(path.child(d));
+    }
+
+    /**
+     * Returns the server management context used by this object.
+     *
+     * @return the context
+     */
+    public ServerManagementContext getServerContext() {
+        return serverContext;
     }
 
     /**
@@ -511,8 +518,8 @@
      *         managed object, or an null DN if this is the root managed object.
      */
     public DN getDN() {
-        if (configEntry != null) {
-            return configEntry.getDN();
+        if (configDN != null) {
+            return configDN;
         } else {
             return DN.rootDN();
         }
@@ -600,7 +607,7 @@
      */
     public boolean hasChild(OptionalRelationDefinition<?, ?> d) throws IllegalArgumentException {
         validateRelationDefinition(d);
-        return context.managedObjectExists(path.child(d));
+        return serverContext.managedObjectExists(path.child(d));
     }
 
     /**
@@ -616,7 +623,7 @@
      */
     public String[] listChildren(InstantiableRelationDefinition<?, ?> d) throws IllegalArgumentException {
         validateRelationDefinition(d);
-        return context.listManagedObjects(path, d);
+        return serverContext.listManagedObjects(path, d);
     }
 
     /**
@@ -632,7 +639,7 @@
      */
     public String[] listChildren(SetRelationDefinition<?, ?> d) throws IllegalArgumentException {
         validateRelationDefinition(d);
-        return context.listManagedObjects(path, d);
+        return serverContext.listManagedObjects(path, d);
     }
 
     /**
@@ -678,7 +685,7 @@
             ServerManagedObjectAddListener<M> listener) throws IllegalArgumentException, ConfigException {
         validateRelationDefinition(d);
         DN baseDN = DNBuilder.create(path, d);
-        ConfigAddListener adaptor = new ConfigAddListenerAdaptor<M>(path, d, listener);
+        ConfigAddListener adaptor = new ConfigAddListenerAdaptor<M>(serverContext, path, d, listener);
         registerAddListener(baseDN, adaptor);
     }
 
@@ -725,7 +732,7 @@
             ServerManagedObjectAddListener<M> listener) throws IllegalArgumentException, ConfigException {
         validateRelationDefinition(d);
         DN baseDN = DNBuilder.create(path, d).parent();
-        ConfigAddListener adaptor = new ConfigAddListenerAdaptor<M>(path, d, listener);
+        ConfigAddListener adaptor = new ConfigAddListenerAdaptor<M>(serverContext, path, d, listener);
         registerAddListener(baseDN, adaptor);
     }
 
@@ -772,7 +779,7 @@
             ServerManagedObjectAddListener<M> listener) throws IllegalArgumentException, ConfigException {
         validateRelationDefinition(d);
         DN baseDN = DNBuilder.create(path, d);
-        ConfigAddListener adaptor = new ConfigAddListenerAdaptor<M>(path, d, listener);
+        ConfigAddListener adaptor = new ConfigAddListenerAdaptor<M>(serverContext, path, d, listener);
         registerAddListener(baseDN, adaptor);
     }
 
@@ -793,8 +800,9 @@
      *            The server managed object change listener.
      */
     public void registerChangeListener(ServerManagedObjectChangeListener<? super S> listener) {
-        ConfigChangeListener adaptor = new ConfigChangeListenerAdaptor<S>(path, listener);
-        configEntry.registerChangeListener(adaptor);
+
+        ConfigChangeListener adaptor = new ConfigChangeListenerAdaptor<S>(serverContext, path, listener);
+        configRepository.registerChangeListener(configDN, adaptor);
 
         // TODO : go toward this
         // Entry entry;
@@ -860,7 +868,7 @@
             ServerManagedObjectDeleteListener<M> listener) throws IllegalArgumentException, ConfigException {
         validateRelationDefinition(d);
         DN baseDN = DNBuilder.create(path, d);
-        ConfigDeleteListener adaptor = new ConfigDeleteListenerAdaptor<M>(path, d, listener);
+        ConfigDeleteListener adaptor = new ConfigDeleteListenerAdaptor<M>(serverContext, path, d, listener);
         registerDeleteListener(baseDN, adaptor);
     }
 
@@ -907,7 +915,7 @@
             ServerManagedObjectDeleteListener<M> listener) throws IllegalArgumentException, ConfigException {
         validateRelationDefinition(d);
         DN baseDN = DNBuilder.create(path, d).parent();
-        ConfigDeleteListener adaptor = new ConfigDeleteListenerAdaptor<M>(path, d, listener);
+        ConfigDeleteListener adaptor = new ConfigDeleteListenerAdaptor<M>(serverContext, path, d, listener);
         registerDeleteListener(baseDN, adaptor);
     }
 
@@ -954,7 +962,7 @@
             ServerManagedObjectDeleteListener<M> listener) throws IllegalArgumentException, ConfigException {
         validateRelationDefinition(d);
         DN baseDN = DNBuilder.create(path, d);
-        ConfigDeleteListener adaptor = new ConfigDeleteListenerAdaptor<M>(path, d, listener);
+        ConfigDeleteListener adaptor = new ConfigDeleteListenerAdaptor<M>(serverContext, path, d, listener);
         registerDeleteListener(baseDN, adaptor);
     }
 
@@ -1012,30 +1020,29 @@
     }
 
     /**
-     * Update the config entry associated with this server managed object. This
+     * Update the config DN associated with this server managed object. This
      * is only intended to be used by change listener call backs in order to
-     * update the managed object with the correct config entry.
+     * update the managed object with the correct config DN.
      *
-     * @param configEntry
-     *            The configuration entry.
+     * @param configDN
+     *            The DN of the underlying configuration entry.
      */
-    void setConfigEntry(ConfigEntry configEntry) {
-        this.configEntry = configEntry;
+    void setConfigDN(DN configDN) {
+        this.configDN = configDN;
     }
 
     // Deregister an add listener.
     private <M extends Configuration> void deregisterAddListener(DN baseDN, ConfigurationAddListener<M> listener) {
         try {
-            ConfigEntry configEntry = getListenerConfigEntry(baseDN);
-            if (configEntry != null) {
-                for (ConfigAddListener l : configEntry.getAddListeners()) {
-                    if (l instanceof ConfigAddListenerAdaptor) {
-                        ConfigAddListenerAdaptor<?> adaptor = (ConfigAddListenerAdaptor<?>) l;
-                        ServerManagedObjectAddListener<?> l2 = adaptor.getServerManagedObjectAddListener();
-                        if (l2 instanceof ServerManagedObjectAddListenerAdaptor<?>) {
-                            ServerManagedObjectAddListenerAdaptor<?> adaptor2 = (ServerManagedObjectAddListenerAdaptor<?>) l2;
+            if (configRepository.hasEntry(baseDN)) {
+                for (ConfigAddListener configListener : configRepository.getAddListeners(baseDN)) {
+                    if (configListener instanceof ConfigAddListenerAdaptor) {
+                        ConfigAddListenerAdaptor<?> adaptor = (ConfigAddListenerAdaptor<?>) configListener;
+                        ServerManagedObjectAddListener<?> smoListener = adaptor.getServerManagedObjectAddListener();
+                        if (smoListener instanceof ServerManagedObjectAddListenerAdaptor<?>) {
+                            ServerManagedObjectAddListenerAdaptor<?> adaptor2 = (ServerManagedObjectAddListenerAdaptor<?>) smoListener;
                             if (adaptor2.getConfigurationAddListener() == listener) {
-                                configEntry.deregisterAddListener(adaptor);
+                                configRepository.deregisterAddListener(baseDN, adaptor);
                             }
                         }
                     }
@@ -1054,13 +1061,12 @@
     // Deregister an add listener.
     private <M extends Configuration> void deregisterAddListener(DN baseDN, ServerManagedObjectAddListener<M> listener) {
         try {
-            ConfigEntry configEntry = getListenerConfigEntry(baseDN);
-            if (configEntry != null) {
-                for (ConfigAddListener l : configEntry.getAddListeners()) {
-                    if (l instanceof ConfigAddListenerAdaptor) {
-                        ConfigAddListenerAdaptor<?> adaptor = (ConfigAddListenerAdaptor<?>) l;
+            if (configRepository.hasEntry(baseDN)) {
+                for (ConfigAddListener configListener : configRepository.getAddListeners(baseDN)) {
+                    if (configListener instanceof ConfigAddListenerAdaptor) {
+                        ConfigAddListenerAdaptor<?> adaptor = (ConfigAddListenerAdaptor<?>) configListener;
                         if (adaptor.getServerManagedObjectAddListener() == listener) {
-                            configEntry.deregisterAddListener(adaptor);
+                            configRepository.deregisterAddListener(baseDN, adaptor);
                         }
                     }
                 }
@@ -1075,19 +1081,62 @@
         }
     }
 
+    /**
+     * Convenience method to retrieve the initial listener and its intermediate
+     * adaptor from the provided configListener.
+     *
+     * @param <T>
+     *            Type of the configuration.
+     * @param configListener
+     *            Listener from wich to extract the initial listener.
+     * @return a pair of (intermediate adaptor, intermediate listener) or
+     *         {@code Pair.EMPTY} if listener can't be extracted
+     */
+    static <T extends Configuration> Pair<ConfigAddListenerAdaptor<T>, ConfigurationAddListener<T>>
+        extractInitialListener(ConfigAddListener configListener) {
+        Pair<ConfigAddListenerAdaptor<T>, ServerManagedObjectAddListener<T>> pair =
+                extractIntermediateListener(configListener);
+        if (!pair.equals(Pair.EMPTY) && pair.getSecond() instanceof ServerManagedObjectAddListenerAdaptor) {
+            ServerManagedObjectAddListenerAdaptor<T> adaptor2 = (ServerManagedObjectAddListenerAdaptor<T>)
+                    pair.getSecond();
+            return Pair.of(pair.getFirst(), adaptor2.getConfigurationAddListener());
+        }
+        return Pair.empty();
+    }
+
+    /**
+     * Convenience method to retrieve the intermediate listener and its
+     * intermediate adaptor from the provided configListener.
+     *
+     * @param <T>
+     *            Type of the configuration.
+     * @param configListener
+     *            Listener from wich to extract the initial listener.
+     * @return a pair of (intermediate adaptor, initial listener) or
+     *         {@code Pair.EMPTY} if listener can't be extracted
+     */
+    @SuppressWarnings("unchecked")
+    static <T extends Configuration> Pair<ConfigAddListenerAdaptor<T>, ServerManagedObjectAddListener<T>>
+        extractIntermediateListener(ConfigAddListener configListener) {
+        if (configListener instanceof ConfigAddListenerAdaptor) {
+            ConfigAddListenerAdaptor<T> adaptor = ((ConfigAddListenerAdaptor<T>) configListener);
+            return Pair.of(adaptor, adaptor.getServerManagedObjectAddListener());
+        }
+        return Pair.empty();
+    }
+
     // Deregister a delete listener.
     private <M extends Configuration> void deregisterDeleteListener(DN baseDN, ConfigurationDeleteListener<M> listener) {
         try {
-            ConfigEntry configEntry = getListenerConfigEntry(baseDN);
-            if (configEntry != null) {
-                for (ConfigDeleteListener l : configEntry.getDeleteListeners()) {
+            if (configRepository.hasEntry(baseDN)) {
+                for (ConfigDeleteListener l : configRepository.getDeleteListeners(baseDN)) {
                     if (l instanceof ConfigDeleteListenerAdaptor) {
                         ConfigDeleteListenerAdaptor<?> adaptor = (ConfigDeleteListenerAdaptor<?>) l;
                         ServerManagedObjectDeleteListener<?> l2 = adaptor.getServerManagedObjectDeleteListener();
                         if (l2 instanceof ServerManagedObjectDeleteListenerAdaptor<?>) {
                             ServerManagedObjectDeleteListenerAdaptor<?> adaptor2 = (ServerManagedObjectDeleteListenerAdaptor<?>) l2;
                             if (adaptor2.getConfigurationDeleteListener() == listener) {
-                                configEntry.deregisterDeleteListener(adaptor);
+                                configRepository.deregisterDeleteListener(baseDN, adaptor);
                             }
                         }
                     }
@@ -1107,13 +1156,12 @@
     private <M extends Configuration> void deregisterDeleteListener(DN baseDN,
             ServerManagedObjectDeleteListener<M> listener) {
         try {
-            ConfigEntry configEntry = getListenerConfigEntry(baseDN);
-            if (configEntry != null) {
-                for (ConfigDeleteListener l : configEntry.getDeleteListeners()) {
+            if (configRepository.hasEntry(baseDN)) {
+                for (ConfigDeleteListener l : configRepository.getDeleteListeners(baseDN)) {
                     if (l instanceof ConfigDeleteListenerAdaptor) {
                         ConfigDeleteListenerAdaptor<?> adaptor = (ConfigDeleteListenerAdaptor<?>) l;
                         if (adaptor.getServerManagedObjectDeleteListener() == listener) {
-                            configEntry.deregisterDeleteListener(adaptor);
+                            configRepository.deregisterDeleteListener(baseDN, adaptor);
                         }
                     }
                 }
@@ -1128,34 +1176,15 @@
         }
     }
 
-    // Gets a config entry required for a listener and throws a config
-    // exception on failure or returns null if the entry does not exist.
-    private ConfigEntry getListenerConfigEntry(DN dn) throws ConfigException {
-        // Attempt to retrieve the listener base entry.
-        ConfigEntry configEntry;
-        try {
-            configEntry = DirectoryServer.getConfigEntry(dn);
-        } catch (ConfigException e) {
-            logger.trace("Unable to get listener base entry", e);
-            LocalizableMessage message = ERR_ADMIN_CANNOT_GET_LISTENER_BASE.get(String.valueOf(dn),
-                    stackTraceToSingleLineString(e, DynamicConstants.DEBUG_BUILD));
-            throw new ConfigException(message, e);
-        }
-
-        return configEntry;
-    }
-
     // Register an instantiable or optional relation add listener.
     private void registerAddListener(DN baseDN, ConfigAddListener adaptor) throws IllegalArgumentException,
             ConfigException {
-        ConfigEntry relationEntry = getListenerConfigEntry(baseDN);
-
-        if (relationEntry != null) {
-            relationEntry.registerAddListener(adaptor);
+        if (configRepository.hasEntry(baseDN)) {
+            configRepository.registerAddListener(baseDN, adaptor);
         } else {
-            // The relation entry does not exist yet so register a delayed
-            // add listener.
-            ConfigAddListener delayedListener = new DelayedConfigAddListener(baseDN, adaptor);
+            // The relation entry does not exist yet
+            // so register a delayed add listener.
+            ConfigAddListener delayedListener = new DelayedConfigAddListener(baseDN, adaptor, configRepository);
             registerDelayedListener(baseDN, delayedListener);
         }
     }
@@ -1163,14 +1192,15 @@
     // Register a delayed listener with the nearest existing parent
     // entry to the provided base DN.
     private void registerDelayedListener(DN baseDN, ConfigAddListener delayedListener) throws ConfigException {
-        DN parentDN = baseDN.parent();
-        while (parentDN != null) {
-            ConfigEntry relationEntry = getListenerConfigEntry(parentDN);
-            if (relationEntry == null) {
-                delayedListener = new DelayedConfigAddListener(parentDN, delayedListener);
-                parentDN = parentDN.parent();
+        DN currentDN = baseDN.parent();
+        DN previousDN = currentDN;
+        while (currentDN != null) {
+            if (!configRepository.hasEntry(currentDN)) {
+                delayedListener = new DelayedConfigAddListener(currentDN, delayedListener, configRepository);
+                previousDN = currentDN;
+                currentDN = currentDN.parent();
             } else {
-                relationEntry.registerAddListener(delayedListener);
+                configRepository.registerAddListener(previousDN, delayedListener);
                 return;
             }
         }
@@ -1187,30 +1217,28 @@
         DN parentDN = baseDN.parent();
         int delayWrappers = 0;
         while (parentDN != null) {
-            ConfigEntry relationEntry = getListenerConfigEntry(parentDN);
-            if (relationEntry == null) {
+            if (!configRepository.hasEntry(parentDN)) {
                 parentDN = parentDN.parent();
                 delayWrappers++;
             } else {
-                for (ConfigAddListener l : relationEntry.getAddListeners()) {
-                    if (l instanceof DelayedConfigAddListener) {
-                        DelayedConfigAddListener delayListener = (DelayedConfigAddListener) l;
+                for (ConfigAddListener configListener : configRepository.getAddListeners(parentDN)) {
+                    if (configListener instanceof DelayedConfigAddListener) {
+                        DelayedConfigAddListener delayListener = (DelayedConfigAddListener) configListener;
                         ConfigAddListener wrappedListener;
 
                         int i = delayWrappers;
                         for (; i > 0; i--) {
                             wrappedListener = delayListener.getDelayedAddListener();
                             if (wrappedListener != null && wrappedListener instanceof DelayedConfigAddListener) {
-                                delayListener = (DelayedConfigAddListener) l;
+                                delayListener = (DelayedConfigAddListener) configListener;
                             } else {
                                 break;
                             }
                         }
 
                         if (i > 0) {
-                            // There are not enough level of wrapping so this
-                            // can't be
-                            // the listener we are looking for.
+                            // There are not enough level of wrapping
+                            // so this can't be the listener we are looking for.
                             continue;
                         }
 
@@ -1222,7 +1250,7 @@
                             if (l2 instanceof ServerManagedObjectAddListenerAdaptor<?>) {
                                 ServerManagedObjectAddListenerAdaptor<?> adaptor2 = (ServerManagedObjectAddListenerAdaptor<?>) l2;
                                 if (adaptor2.getConfigurationAddListener() == listener) {
-                                    relationEntry.deregisterAddListener(l);
+                                    configRepository.deregisterAddListener(parentDN, configListener);
                                 }
                             }
                         }
@@ -1240,12 +1268,11 @@
         DN parentDN = baseDN.parent();
         int delayWrappers = 0;
         while (parentDN != null) {
-            ConfigEntry relationEntry = getListenerConfigEntry(parentDN);
-            if (relationEntry == null) {
+            if (!configRepository.hasEntry(parentDN)) {
                 parentDN = parentDN.parent();
                 delayWrappers++;
             } else {
-                for (ConfigAddListener l : relationEntry.getAddListeners()) {
+                for (ConfigAddListener l : configRepository.getAddListeners(parentDN)) {
                     if (l instanceof DelayedConfigAddListener) {
                         DelayedConfigAddListener delayListener = (DelayedConfigAddListener) l;
                         ConfigAddListener wrappedListener;
@@ -1261,9 +1288,8 @@
                         }
 
                         if (i > 0) {
-                            // There are not enough level of wrapping so this
-                            // can't be
-                            // the listener we are looking for.
+                            // There are not enough level of wrapping
+                            // so this can't be the listener we are looking for.
                             continue;
                         }
 
@@ -1275,7 +1301,7 @@
                             if (l2 instanceof ServerManagedObjectDeleteListenerAdaptor<?>) {
                                 ServerManagedObjectDeleteListenerAdaptor<?> adaptor2 = (ServerManagedObjectDeleteListenerAdaptor<?>) l2;
                                 if (adaptor2.getConfigurationDeleteListener() == listener) {
-                                    relationEntry.deregisterAddListener(l);
+                                    configRepository.deregisterAddListener(parentDN, l);
                                 }
                             }
                         }
@@ -1293,30 +1319,28 @@
         DN parentDN = baseDN.parent();
         int delayWrappers = 0;
         while (parentDN != null) {
-            ConfigEntry relationEntry = getListenerConfigEntry(parentDN);
-            if (relationEntry == null) {
+            if (!configRepository.hasEntry(parentDN)) {
                 parentDN = parentDN.parent();
                 delayWrappers++;
             } else {
-                for (ConfigAddListener l : relationEntry.getAddListeners()) {
-                    if (l instanceof DelayedConfigAddListener) {
-                        DelayedConfigAddListener delayListener = (DelayedConfigAddListener) l;
+                for (ConfigAddListener configListener : configRepository.getAddListeners(parentDN)) {
+                    if (configListener instanceof DelayedConfigAddListener) {
+                        DelayedConfigAddListener delayListener = (DelayedConfigAddListener) configListener;
                         ConfigAddListener wrappedListener;
 
                         int i = delayWrappers;
                         for (; i > 0; i--) {
                             wrappedListener = delayListener.getDelayedAddListener();
                             if (wrappedListener != null && wrappedListener instanceof DelayedConfigAddListener) {
-                                delayListener = (DelayedConfigAddListener) l;
+                                delayListener = (DelayedConfigAddListener) configListener;
                             } else {
                                 break;
                             }
                         }
 
                         if (i > 0) {
-                            // There are not enough level of wrapping so this
-                            // can't be
-                            // the listener we are looking for.
+                            // There are not enough level of wrapping
+                            // so this can't be the listener we are looking for.
                             continue;
                         }
 
@@ -1325,7 +1349,7 @@
                         if (delayedListener != null && delayedListener instanceof ConfigAddListenerAdaptor) {
                             ConfigAddListenerAdaptor<?> adaptor = (ConfigAddListenerAdaptor<?>) delayedListener;
                             if (adaptor.getServerManagedObjectAddListener() == listener) {
-                                relationEntry.deregisterAddListener(l);
+                                configRepository.deregisterAddListener(parentDN, configListener);
                             }
                         }
                     }
@@ -1342,30 +1366,28 @@
         DN parentDN = baseDN.parent();
         int delayWrappers = 0;
         while (parentDN != null) {
-            ConfigEntry relationEntry = getListenerConfigEntry(parentDN);
-            if (relationEntry == null) {
+            if (!configRepository.hasEntry(parentDN)) {
                 parentDN = parentDN.parent();
                 delayWrappers++;
             } else {
-                for (ConfigAddListener l : relationEntry.getAddListeners()) {
-                    if (l instanceof DelayedConfigAddListener) {
-                        DelayedConfigAddListener delayListener = (DelayedConfigAddListener) l;
+                for (ConfigAddListener configListener : configRepository.getAddListeners(parentDN)) {
+                    if (configListener instanceof DelayedConfigAddListener) {
+                        DelayedConfigAddListener delayListener = (DelayedConfigAddListener) configListener;
                         ConfigAddListener wrappedListener;
 
                         int i = delayWrappers;
                         for (; i > 0; i--) {
                             wrappedListener = delayListener.getDelayedAddListener();
                             if (wrappedListener != null && wrappedListener instanceof DelayedConfigAddListener) {
-                                delayListener = (DelayedConfigAddListener) l;
+                                delayListener = (DelayedConfigAddListener) configListener;
                             } else {
                                 break;
                             }
                         }
 
                         if (i > 0) {
-                            // There are not enough level of wrapping so this
-                            // can't be
-                            // the listener we are looking for.
+                            // There are not enough level of wrapping
+                            // so this can't be the listener we are looking for.
                             continue;
                         }
 
@@ -1374,7 +1396,7 @@
                         if (delayedListener != null && delayedListener instanceof ConfigDeleteListenerAdaptor) {
                             ConfigDeleteListenerAdaptor<?> adaptor = (ConfigDeleteListenerAdaptor<?>) delayedListener;
                             if (adaptor.getServerManagedObjectDeleteListener() == listener) {
-                                relationEntry.deregisterAddListener(l);
+                                configRepository.deregisterAddListener(parentDN, configListener);
                             }
                         }
                     }
@@ -1386,14 +1408,12 @@
 
     // Register an instantiable or optional relation delete listener.
     private void registerDeleteListener(DN baseDN, ConfigDeleteListener adaptor) throws ConfigException {
-        ConfigEntry relationEntry = getListenerConfigEntry(baseDN);
-
-        if (relationEntry != null) {
-            relationEntry.registerDeleteListener(adaptor);
+        if (configRepository.hasEntry(baseDN)) {
+            configRepository.registerDeleteListener(baseDN, adaptor);
         } else {
-            // The relation entry does not exist yet so register a delayed
-            // add listener.
-            ConfigAddListener delayedListener = new DelayedConfigAddListener(baseDN, adaptor);
+            // The relation entry does not exist yet
+            // so register a delayed add listener.
+            ConfigAddListener delayedListener = new DelayedConfigAddListener(baseDN, adaptor, configRepository);
             registerDelayedListener(baseDN, delayedListener);
         }
     }

--
Gitblit v1.10.0