From 2249aa0a04b99d513828d8d60c2a8bd7d936b336 Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Mon, 03 Sep 2007 23:45:45 +0000
Subject: [PATCH] Fix issue 1451: constraint and dependency support.

---
 opends/src/server/org/opends/server/admin/server/ServerManagedObject.java |  631 +++------------------------------------------------------
 1 files changed, 36 insertions(+), 595 deletions(-)

diff --git a/opends/src/server/org/opends/server/admin/server/ServerManagedObject.java b/opends/src/server/org/opends/server/admin/server/ServerManagedObject.java
index c453cbe..0c527d8 100644
--- a/opends/src/server/org/opends/server/admin/server/ServerManagedObject.java
+++ b/opends/src/server/org/opends/server/admin/server/ServerManagedObject.java
@@ -26,55 +26,28 @@
  */
 
 package org.opends.server.admin.server;
-import org.opends.messages.Message;
 
 
 
 import static org.opends.server.loggers.debug.DebugLogger.*;
 import static org.opends.server.util.StaticUtils.*;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
 
-import org.opends.server.admin.AbsoluteInheritedDefaultBehaviorProvider;
-import org.opends.server.admin.AbstractManagedObjectDefinition;
-import org.opends.server.admin.AliasDefaultBehaviorProvider;
+import org.opends.messages.AdminMessages;
+import org.opends.messages.Message;
 import org.opends.server.admin.Configuration;
-import org.opends.server.admin.DefaultBehaviorException;
-import org.opends.server.admin.DefaultBehaviorProviderVisitor;
-import org.opends.server.admin.DefinedDefaultBehaviorProvider;
-import org.opends.server.admin.DefinitionDecodingException;
-import org.opends.server.admin.DefinitionResolver;
-import org.opends.server.admin.IllegalPropertyValueException;
-import org.opends.server.admin.IllegalPropertyValueStringException;
 import org.opends.server.admin.InstantiableRelationDefinition;
-import org.opends.server.admin.LDAPProfile;
 import org.opends.server.admin.ManagedObjectDefinition;
 import org.opends.server.admin.ManagedObjectPath;
 import org.opends.server.admin.OptionalRelationDefinition;
 import org.opends.server.admin.PropertyDefinition;
-import org.opends.server.admin.PropertyException;
-import org.opends.server.admin.PropertyIsMandatoryException;
-import org.opends.server.admin.PropertyIsSingleValuedException;
-import org.opends.server.admin.PropertyNotFoundException;
-import org.opends.server.admin.PropertyOption;
 import org.opends.server.admin.PropertyProvider;
 import org.opends.server.admin.RelationDefinition;
-import org.opends.server.admin.RelativeInheritedDefaultBehaviorProvider;
 import org.opends.server.admin.SingletonRelationDefinition;
-import org.opends.server.admin.UndefinedDefaultBehaviorProvider;
-import org.opends.server.admin.DefinitionDecodingException.Reason;
-import org.opends.server.admin.std.meta.RootCfgDefn;
-import org.opends.server.admin.std.server.RootCfg;
-import org.opends.server.api.AttributeValueDecoder;
 import org.opends.server.api.ConfigAddListener;
 import org.opends.server.api.ConfigChangeListener;
 import org.opends.server.api.ConfigDeleteListener;
@@ -82,12 +55,8 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.loggers.debug.DebugTracer;
-import org.opends.messages.AdminMessages;
-import org.opends.server.types.AttributeType;
-import org.opends.server.types.AttributeValue;
 import org.opends.server.types.DN;
 import org.opends.server.types.DebugLogLevel;
-import org.opends.server.types.DirectoryException;
 
 
 
@@ -102,518 +71,44 @@
     PropertyProvider {
 
   /**
-   * A default behavior visitor used for retrieving the default values
-   * of a property.
-   *
-   * @param <T>
-   *          The type of the property.
-   */
-  private static class DefaultValueFinder<T> implements
-      DefaultBehaviorProviderVisitor<T, Collection<T>, Void> {
-
-    /**
-     * Get the default values for the specified property.
-     *
-     * @param <T>
-     *          The type of the property.
-     * @param p
-     *          The managed object path of the current managed object.
-     * @param pd
-     *          The property definition.
-     * @param newConfigEntry
-     *          Optional new configuration entry which does not yet
-     *          exist in the configuration back-end.
-     * @return Returns the default values for the specified property.
-     * @throws DefaultBehaviorException
-     *           If the default values could not be retrieved or
-     *           decoded properly.
-     */
-    public static <T> Collection<T> getDefaultValues(ManagedObjectPath<?, ?> p,
-        PropertyDefinition<T> pd, ConfigEntry newConfigEntry)
-        throws DefaultBehaviorException {
-      DefaultValueFinder<T> v = new DefaultValueFinder<T>(newConfigEntry);
-      return v.find(p, pd);
-    }
-
-    // Any exception that occurred whilst retrieving inherited default
-    // values.
-    private DefaultBehaviorException exception = null;
-
-    // The path of the managed object containing the next property.
-    private ManagedObjectPath<?, ?> nextPath = null;
-
-    // The next property whose default values were required.
-    private PropertyDefinition<T> nextProperty = null;
-
-    // Optional new configuration entry which does not yet exist in
-    // the configuration back-end.
-    private ConfigEntry newConfigEntry;
-
-
-
-    // Private constructor.
-    private DefaultValueFinder(ConfigEntry newConfigEntry) {
-      this.newConfigEntry = newConfigEntry;
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public Collection<T> visitAbsoluteInherited(
-        AbsoluteInheritedDefaultBehaviorProvider<T> d, Void p) {
-      try {
-        return getInheritedProperty(d.getManagedObjectPath(), d
-            .getManagedObjectDefinition(), d.getPropertyName());
-      } catch (DefaultBehaviorException e) {
-        exception = e;
-        return Collections.emptySet();
-      }
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public Collection<T> visitAlias(AliasDefaultBehaviorProvider<T> d, Void p) {
-      return Collections.emptySet();
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public Collection<T> visitDefined(DefinedDefaultBehaviorProvider<T> d,
-        Void p) {
-      Collection<String> stringValues = d.getDefaultValues();
-      List<T> values = new ArrayList<T>(stringValues.size());
-
-      for (String stringValue : stringValues) {
-        try {
-          values.add(nextProperty.decodeValue(stringValue));
-        } catch (IllegalPropertyValueStringException e) {
-          exception = new DefaultBehaviorException(nextProperty, e);
-          break;
-        }
-      }
-
-      return values;
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public Collection<T> visitRelativeInherited(
-        RelativeInheritedDefaultBehaviorProvider<T> d, Void p) {
-      try {
-        return getInheritedProperty(d.getManagedObjectPath(nextPath), d
-            .getManagedObjectDefinition(), d.getPropertyName());
-      } catch (DefaultBehaviorException e) {
-        exception = e;
-        return Collections.emptySet();
-      }
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public Collection<T> visitUndefined(UndefinedDefaultBehaviorProvider<T> d,
-        Void p) {
-      return Collections.emptySet();
-    }
-
-
-
-    // Find the default values for the next path/property.
-    private Collection<T> find(ManagedObjectPath<?, ?> p,
-        PropertyDefinition<T> pd) throws DefaultBehaviorException {
-      nextPath = p;
-      nextProperty = pd;
-
-      Collection<T> values = nextProperty.getDefaultBehaviorProvider().accept(
-          this, null);
-
-      if (exception != null) {
-        throw exception;
-      }
-
-      if (values.size() > 1 && !pd.hasOption(PropertyOption.MULTI_VALUED)) {
-        throw new DefaultBehaviorException(pd,
-            new PropertyIsSingleValuedException(pd));
-      }
-
-      return values;
-    }
-
-
-
-    // Get an inherited property value.
-    @SuppressWarnings("unchecked")
-    private Collection<T> getInheritedProperty(ManagedObjectPath target,
-        AbstractManagedObjectDefinition<?, ?> d, String propertyName)
-        throws DefaultBehaviorException {
-      // First check that the requested type of managed object
-      // corresponds to the path.
-      AbstractManagedObjectDefinition<?, ?> supr = target
-          .getManagedObjectDefinition();
-      if (!supr.isParentOf(d)) {
-        throw new DefaultBehaviorException(
-            nextProperty, new DefinitionDecodingException(supr,
-                Reason.WRONG_TYPE_INFORMATION));
-      }
-
-      // Save the current property in case of recursion.
-      PropertyDefinition<T> pd1 = nextProperty;
-
-      try {
-        // Get the actual managed object definition.
-        DN dn = DNBuilder.create(target);
-        ConfigEntry configEntry;
-        if (newConfigEntry != null && newConfigEntry.getDN().equals(dn)) {
-          configEntry = newConfigEntry;
-        } else {
-          configEntry = getManagedObjectConfigEntry(dn);
-        }
-
-        DefinitionResolver resolver = new MyDefinitionResolver(configEntry);
-        ManagedObjectDefinition<?, ?> mod = d
-            .resolveManagedObjectDefinition(resolver);
-
-        PropertyDefinition<T> pd2;
-        try {
-          PropertyDefinition<?> pdTmp = mod.getPropertyDefinition(propertyName);
-          pd2 = pd1.getClass().cast(pdTmp);
-        } catch (IllegalArgumentException e) {
-          throw new PropertyNotFoundException(propertyName);
-        } catch (ClassCastException e) {
-          // FIXME: would be nice to throw a better exception here.
-          throw new PropertyNotFoundException(propertyName);
-        }
-
-        List<String> stringValues = getAttribute(mod, pd2, configEntry);
-        if (stringValues.isEmpty()) {
-          // Recursively retrieve this property's default values.
-          Collection<T> tmp = find(target, pd2);
-          Collection<T> values = new ArrayList<T>(tmp.size());
-          for (T value : tmp) {
-            pd1.validateValue(value);
-            values.add(value);
-          }
-          return values;
-        } else {
-          Collection<T> values = new ArrayList<T>(stringValues.size());
-          for (String s : stringValues) {
-            values.add(pd1.decodeValue(s));
-          }
-          return values;
-        }
-      } catch (DefinitionDecodingException e) {
-        throw new DefaultBehaviorException(pd1, e);
-      } catch (PropertyNotFoundException e) {
-        throw new DefaultBehaviorException(pd1, e);
-      } catch (IllegalPropertyValueException e) {
-        throw new DefaultBehaviorException(pd1, e);
-      } catch (IllegalPropertyValueStringException e) {
-        throw new DefaultBehaviorException(pd1, e);
-      } catch (ConfigException e) {
-        throw new DefaultBehaviorException(pd1, e);
-      }
-    }
-  }
-
-
-
-  /**
-   * A definition resolver that determines the managed object
-   * definition from the object classes of a ConfigEntry.
-   */
-  private static class MyDefinitionResolver implements DefinitionResolver {
-
-    // The config entry.
-    private final ConfigEntry entry;
-
-
-
-    // Private constructor.
-    private MyDefinitionResolver(ConfigEntry entry) {
-      this.entry = entry;
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean matches(AbstractManagedObjectDefinition<?, ?> d) {
-      String oc = LDAPProfile.getInstance().getObjectClass(d);
-      return entry.hasObjectClass(oc);
-    }
-  };
-
-  /**
-   * The root server managed object.
-   */
-  private static final ServerManagedObject<RootCfg> ROOT =
-    new ServerManagedObject<RootCfg>(
-      ManagedObjectPath.emptyPath(), RootCfgDefn.getInstance(), Collections
-          .<PropertyDefinition<?>, SortedSet<?>> emptyMap(), null);
-
-  /**
    * The tracer object for the debug logger.
    */
   private static final DebugTracer TRACER = getTracer();
 
-
-
-  /**
-   * Decodes a configuration entry into the required type of server
-   * managed object.
-   *
-   * @param <S>
-   *          The type of server configuration represented by the
-   *          decoded server managed object.
-   * @param path
-   *          The location of the server managed object.
-   * @param definition
-   *          The required managed object type.
-   * @param configEntry
-   *          The configuration entry that should be decoded.
-   * @return Returns the new server-side managed object from the
-   *         provided definition and configuration entry.
-   * @throws DefinitionDecodingException
-   *           If the managed object's type could not be determined.
-   * @throws ServerManagedObjectDecodingException
-   *           If one or more of the managed object's properties could
-   *           not be decoded.
-   */
-  static <S extends Configuration> ServerManagedObject<? extends S> decode(
-      ManagedObjectPath<?, ?> path,
-      AbstractManagedObjectDefinition<?, S> definition,
-      ConfigEntry configEntry) throws DefinitionDecodingException,
-      ServerManagedObjectDecodingException {
-    return decode(path, definition, configEntry, null);
-  }
-
-
-
-  /**
-   * Decodes a configuration entry into the required type of server
-   * managed object.
-   *
-   * @param <S>
-   *          The type of server configuration represented by the
-   *          decoded server managed object.
-   * @param path
-   *          The location of the server managed object.
-   * @param definition
-   *          The required managed object type.
-   * @param configEntry
-   *          The configuration entry that should be decoded.
-   * @param newConfigEntry
-   *          Optional new configuration that does not exist yet in
-   *          the configuration back-end. This will be used for
-   *          resolving inherited default values.
-   * @return Returns the new server-side managed object from the
-   *         provided definition and configuration entry.
-   * @throws DefinitionDecodingException
-   *           If the managed object's type could not be determined.
-   * @throws ServerManagedObjectDecodingException
-   *           If one or more of the managed object's properties could
-   *           not be decoded.
-   */
-  static <S extends Configuration> ServerManagedObject<? extends S> decode(
-      ManagedObjectPath<?, ?> path,
-      AbstractManagedObjectDefinition<?, S> definition,
-      ConfigEntry configEntry, ConfigEntry newConfigEntry)
-      throws DefinitionDecodingException, ServerManagedObjectDecodingException {
-    // First determine the correct definition to use for the entry.
-    // This could either be the provided definition, or one of its
-    // sub-definitions.
-    DefinitionResolver resolver = new MyDefinitionResolver(configEntry);
-    ManagedObjectDefinition<?, ? extends S> mod = definition
-        .resolveManagedObjectDefinition(resolver);
-
-    // Build the managed object's properties.
-    List<PropertyException> exceptions = new LinkedList<PropertyException>();
-    Map<PropertyDefinition<?>, SortedSet<?>> properties =
-      new HashMap<PropertyDefinition<?>, SortedSet<?>>();
-    for (PropertyDefinition<?> pd : mod.getAllPropertyDefinitions()) {
-      List<String> values = getAttribute(mod, pd, configEntry);
-      try {
-        decodeProperty(properties, path, pd, values, newConfigEntry);
-      } catch (PropertyException e) {
-        exceptions.add(e);
-      }
-    }
-
-    // If there were no decoding problems then return the managed
-    // object, otherwise throw an operations exception.
-    ServerManagedObject<? extends S> mo = decodeAux(path, mod, properties,
-        configEntry);
-    if (exceptions.isEmpty()) {
-      return mo;
-    } else {
-      throw new ServerManagedObjectDecodingException(mo, exceptions);
-    }
-  }
-
-
-
-  /**
-   * Gets the root server managed object.
-   *
-   * @return Returns the root server managed object.
-   */
-  static ServerManagedObject<RootCfg> getRootManagedObject() {
-    return ROOT;
-  }
-
-
-
-  // Decode helper method required to avoid generics warning.
-  private static <S extends Configuration> ServerManagedObject<S> decodeAux(
-      ManagedObjectPath<?, ?> path, ManagedObjectDefinition<?, S> d,
-      Map<PropertyDefinition<?>, SortedSet<?>> properties,
-      ConfigEntry configEntry) {
-    return new ServerManagedObject<S>(path, d, properties, configEntry);
-  }
-
-
-
-  // Create a property using the provided string values.
-  private static <T> void decodeProperty(
-      Map<PropertyDefinition<?>, SortedSet<?>> properties,
-      ManagedObjectPath<?, ?> path, PropertyDefinition<T> pd,
-      List<String> stringValues, ConfigEntry newConfigEntry)
-      throws PropertyException {
-    PropertyException exception = null;
-    SortedSet<T> values = new TreeSet<T>(pd);
-
-    if (!stringValues.isEmpty()) {
-      // The property has values defined for it.
-      for (String value : stringValues) {
-        try {
-          values.add(pd.decodeValue(value));
-        } catch (IllegalPropertyValueStringException e) {
-          exception = e;
-        }
-      }
-    } else {
-      // No values defined so get the defaults.
-      try {
-        values.addAll(DefaultValueFinder.getDefaultValues(path, pd,
-            newConfigEntry));
-      } catch (DefaultBehaviorException e) {
-        exception = e;
-      }
-    }
-
-    if (values.size() > 1 && !pd.hasOption(PropertyOption.MULTI_VALUED)) {
-      // This exception takes precedence over previous exceptions.
-      exception = new PropertyIsSingleValuedException(pd);
-      T value = values.first();
-      values.clear();
-      values.add(value);
-    }
-
-    if (values.isEmpty() && pd.hasOption(PropertyOption.MANDATORY)) {
-      // The values maybe empty because of a previous exception.
-      if (exception == null) {
-        exception = new PropertyIsMandatoryException(pd);
-      }
-    }
-
-    // TODO: If an exception occurs should we leave the property
-    // empty?
-    properties.put(pd, values);
-    if (exception != null) {
-      throw exception;
-    }
-  }
-
-
-
-  // Gets the attribute associated with a property from a ConfigEntry.
-  private static List<String> getAttribute(ManagedObjectDefinition<?, ?> d,
-      PropertyDefinition<?> pd, ConfigEntry configEntry) {
-    // TODO: we create a default attribute type if it is
-    // undefined. We should log a warning here if this is the case
-    // since the attribute should have been defined.
-    String attrID = LDAPProfile.getInstance().getAttributeName(d, pd);
-    AttributeType type = DirectoryServer.getAttributeType(attrID, true);
-    AttributeValueDecoder<String> decoder =
-      new AttributeValueDecoder<String>() {
-
-      public String decode(AttributeValue value) throws DirectoryException {
-        return value.getStringValue();
-      }
-    };
-
-    List<String> values = new LinkedList<String>();
-    try {
-      configEntry.getEntry().getAttributeValues(type, decoder, values);
-    } catch (DirectoryException e) {
-      // Should not happen.
-      throw new RuntimeException(e);
-    }
-    return values;
-  }
-
-
-
-  // Gets a config entry required for a managed object and throws a
-  // config exception on failure.
-  private static ConfigEntry getManagedObjectConfigEntry(DN dn)
-      throws ConfigException {
-    ConfigEntry configEntry;
-    try {
-      configEntry = DirectoryServer.getConfigEntry(dn);
-    } catch (ConfigException e) {
-      if (debugEnabled()) {
-        TRACER.debugCaught(DebugLogLevel.ERROR, e);
-      }
-
-      Message message = AdminMessages.ERR_ADMIN_CANNOT_GET_MANAGED_OBJECT.get(
-          String.valueOf(dn), stackTraceToSingleLineString(e));
-      throw new ConfigException(message, e);
-    }
-
-    // The configuration handler is free to return null indicating
-    // that the entry does not exist.
-    if (configEntry == null) {
-      Message message = AdminMessages.ERR_ADMIN_MANAGED_OBJECT_DOES_NOT_EXIST.
-          get(String.valueOf(dn));
-      throw new ConfigException(message);
-    }
-
-    return configEntry;
-  }
-
   // The configuration entry associated with this server managed
   // object (null if root).
   private ConfigEntry configEntry;
 
+  // The management context.
+  private final ServerManagementContext context = ServerManagementContext
+      .getInstance();
+
   // The managed object's definition.
   private final ManagedObjectDefinition<?, S> definition;
 
   // The managed object path identifying this managed object's
   // location.
-  private final ManagedObjectPath<?, ?> path;
+  private final ManagedObjectPath<?, S> path;
 
   // The managed object's properties.
   private final Map<PropertyDefinition<?>, SortedSet<?>> properties;
 
 
 
-  // Create an new server side managed object.
-  private ServerManagedObject(ManagedObjectPath<?, ?> path,
+  /**
+   * Creates an new server side managed object.
+   *
+   * @param path
+   *          The managed object path.
+   * @param d
+   *          The managed object definition.
+   * @param properties
+   *          The managed object's properties.
+   * @param configEntry
+   *          The configuration entry associated with the managed
+   *          object.
+   */
+  ServerManagedObject(ManagedObjectPath<?, S> path,
       ManagedObjectDefinition<?, S> d,
       Map<PropertyDefinition<?>, SortedSet<?>> properties,
       ConfigEntry configEntry) {
@@ -764,8 +259,7 @@
       InstantiableRelationDefinition<?, M> d, String name)
       throws IllegalArgumentException, ConfigException {
     validateRelationDefinition(d);
-    ManagedObjectPath<?, ?> childPath = path.child(d, name);
-    return getChild(childPath, d);
+    return context.getManagedObject(path.child(d, name));
   }
 
 
@@ -790,8 +284,7 @@
       OptionalRelationDefinition<?, M> d) throws IllegalArgumentException,
       ConfigException {
     validateRelationDefinition(d);
-    ManagedObjectPath<?, ?> childPath = path.child(d);
-    return getChild(childPath, d);
+    return context.getManagedObject(path.child(d));
   }
 
 
@@ -816,8 +309,7 @@
       SingletonRelationDefinition<?, M> d) throws IllegalArgumentException,
       ConfigException {
     validateRelationDefinition(d);
-    ManagedObjectPath<?, ?> childPath = path.child(d);
-    return getChild(childPath, d);
+    return context.getManagedObject(path.child(d));
   }
 
 
@@ -869,7 +361,7 @@
    *
    * @return Returns the path of this server managed object.
    */
-  public ManagedObjectPath<?, ?> getManagedObjectPath() {
+  public ManagedObjectPath<?, S> getManagedObjectPath() {
     return path;
   }
 
@@ -949,15 +441,7 @@
   public boolean hasChild(OptionalRelationDefinition<?, ?> d)
       throws IllegalArgumentException {
     validateRelationDefinition(d);
-
-    // Get the configuration entry.
-    DN targetDN = DNBuilder.create(path, d);
-    try {
-      return (getManagedObjectConfigEntry(targetDN) != null);
-    } catch (ConfigException e) {
-      // Assume it doesn't exist.
-      return false;
-    }
+    return context.managedObjectExists(path.child(d));
   }
 
 
@@ -976,30 +460,7 @@
   public String[] listChildren(InstantiableRelationDefinition<?, ?> d)
       throws IllegalArgumentException {
     validateRelationDefinition(d);
-
-    // Get the target entry.
-    DN targetDN = DNBuilder.create(path, d);
-    ConfigEntry configEntry;
-    try {
-      configEntry = DirectoryServer.getConfigEntry(targetDN);
-    } catch (ConfigException e) {
-      return new String[0];
-    }
-
-    if (configEntry == null) {
-      return new String[0];
-    }
-
-    // Retrieve the children.
-    Set<DN> children = configEntry.getChildren().keySet();
-    ArrayList<String> names = new ArrayList<String>(children.size());
-    for (DN child : children) {
-      // Assume that RDNs are single-valued and can be trimmed.
-      AttributeValue av = child.getRDN().getAttributeValue(0);
-      names.add(av.getStringValue().trim());
-    }
-
-    return names.toArray(new String[names.size()]);
+    return context.listManagedObjects(path, d);
   }
 
 
@@ -1048,8 +509,8 @@
    *           If the optional relation definition is not associated
    *           with this managed object's definition.
    * @throws ConfigException
-   *           If the configuration entry associated with the
-   *           optional relation could not be retrieved.
+   *           If the configuration entry associated with the optional
+   *           relation could not be retrieved.
    */
   public <M extends Configuration> void registerAddListener(
       OptionalRelationDefinition<?, M> d, ConfigurationAddListener<M> listener)
@@ -1073,7 +534,7 @@
   public void registerChangeListener(
       ConfigurationChangeListener<? super S> listener) {
     ConfigChangeListener adaptor = new ConfigChangeListenerAdaptor<S>(path,
-        definition, listener);
+        listener);
     configEntry.registerChangeListener(adaptor);
   }
 
@@ -1123,8 +584,8 @@
    *           If the optional relation definition is not associated
    *           with this managed object's definition.
    * @throws ConfigException
-   *           If the configuration entry associated with the
-   *           optional relation could not be retrieved.
+   *           If the configuration entry associated with the optional
+   *           relation could not be retrieved.
    */
   public <M extends Configuration> void registerDeleteListener(
       OptionalRelationDefinition<?, M> d,
@@ -1206,26 +667,6 @@
 
 
 
-  // Get a child managed object.
-  private <M extends Configuration> ServerManagedObject<? extends M> getChild(
-      ManagedObjectPath<?, ?> childPath, RelationDefinition<?, M> d)
-      throws ConfigException {
-    // Get the configuration entry.
-    DN targetDN = DNBuilder.create(childPath);
-    ConfigEntry configEntry = getManagedObjectConfigEntry(targetDN);
-    try {
-      return decode(childPath, d.getChildDefinition(), configEntry);
-    } catch (DefinitionDecodingException e) {
-      throw ConfigExceptionFactory.getInstance()
-          .createDecodingExceptionAdaptor(targetDN, e);
-    } catch (ServerManagedObjectDecodingException e) {
-      throw ConfigExceptionFactory.getInstance()
-          .createDecodingExceptionAdaptor(e);
-    }
-  }
-
-
-
   // 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 {
@@ -1284,8 +725,8 @@
     }
 
     // No parent entry could be found.
-    Message message = AdminMessages.ERR_ADMIN_UNABLE_TO_REGISTER_LISTENER.get(
-        String.valueOf(baseDN));
+    Message message = AdminMessages.ERR_ADMIN_UNABLE_TO_REGISTER_LISTENER
+        .get(String.valueOf(baseDN));
     throw new ConfigException(message);
   }
 
@@ -1313,8 +754,8 @@
   // object.
   private void validateRelationDefinition(RelationDefinition<?, ?> rd)
       throws IllegalArgumentException {
-    RelationDefinition<?, ?> tmp =
-      definition.getRelationDefinition(rd.getName());
+    RelationDefinition<?, ?> tmp = definition.getRelationDefinition(rd
+        .getName());
     if (tmp != rd) {
       throw new IllegalArgumentException("The relation " + rd.getName()
           + " is not associated with a " + definition.getName());

--
Gitblit v1.10.0