From c15ef13192cb53cf8fd0931975a17b1c79441b74 Mon Sep 17 00:00:00 2001
From: jcambon <jcambon@localhost>
Date: Mon, 07 Apr 2008 08:55:04 +0000
Subject: [PATCH] Fix for issue #3089: Configuration Reference - Missing aggregation relations 

---
 opendj-sdk/opends/src/server/org/opends/server/admin/AbstractManagedObjectDefinition.java |  183 +++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 174 insertions(+), 9 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/admin/AbstractManagedObjectDefinition.java b/opendj-sdk/opends/src/server/org/opends/server/admin/AbstractManagedObjectDefinition.java
index fb842c1..b9a3f66 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/admin/AbstractManagedObjectDefinition.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/admin/AbstractManagedObjectDefinition.java
@@ -42,6 +42,7 @@
 import java.util.MissingResourceException;
 import java.util.Set;
 
+import java.util.Vector;
 import org.opends.messages.Message;
 import org.opends.server.admin.DefinitionDecodingException.Reason;
 
@@ -94,6 +95,21 @@
   // object definition including inherited relation definitions.
   private final Map<String, RelationDefinition<?, ?>> allRelationDefinitions;
 
+  // The set of aggregation property definitions applicable to this
+  // managed object definition.
+  private final Map<String, AggregationPropertyDefinition<?, ?>>
+    aggregationPropertyDefinitions;
+
+  // The set of aggregation property definitions directly referencing this
+  // managed object definition.
+  private final Vector<AggregationPropertyDefinition<?, ?>>
+    reverseAggregationPropertyDefinitions;
+
+  // The set of all aggregation property definitions associated with this
+  // managed object definition including inherited relation definitions.
+  private final Map<String, AggregationPropertyDefinition<?, ?>>
+    allAggregationPropertyDefinitions;
+
   // The set of tags associated with this managed object.
   private final Set<Tag> allTags;
 
@@ -128,6 +144,12 @@
     this.allPropertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
     this.allRelationDefinitions =
       new HashMap<String, RelationDefinition<?, ?>>();
+    this.aggregationPropertyDefinitions =
+      new HashMap<String, AggregationPropertyDefinition<?,?>>();
+    this.reverseAggregationPropertyDefinitions =
+      new Vector<AggregationPropertyDefinition<?,?>>();
+    this.allAggregationPropertyDefinitions =
+      new HashMap<String, AggregationPropertyDefinition<?, ?>>();
     this.allTags = new HashSet<Tag>();
     this.options = EnumSet.noneOf(ManagedObjectOption.class);
 
@@ -146,6 +168,12 @@
         allRelationDefinitions.put(rd.getName(), rd);
       }
 
+      for (AggregationPropertyDefinition<?, ?> apd :
+        parent.getAllAggregationPropertyDefinitions()) {
+
+        allAggregationPropertyDefinitions.put(apd.getName(), apd);
+      }
+
       // Tag inheritance is performed during preprocessing.
     }
   }
@@ -262,6 +290,52 @@
 
 
   /**
+   * Get all the aggregation property definitions associated with this type of
+   * managed object. The returned collection will contain inherited
+   * aggregation property definitions.
+   *
+   * @return Returns an unmodifiable collection containing all the
+   *         aggregation property definitions associated with this type of
+   *         managed object.
+   */
+  public final Collection<AggregationPropertyDefinition<?, ?>>
+      getAllAggregationPropertyDefinitions() {
+    return Collections.unmodifiableCollection(
+      allAggregationPropertyDefinitions.values());
+  }
+
+
+
+  /**
+   * Get all the aggregation property definitions which refer to this managed
+   * object definition. The returned collection will contain aggregation
+   * property definitions which refer to parents of this managed object
+   * definition.
+   *
+   * @return Returns a collection containing all the aggregation property
+   *         definitions which refer to this managed object
+   *         definition. The caller is free to modify the collection
+   *         if required.
+   */
+  public final Collection<AggregationPropertyDefinition<?, ?>>
+  getAllReverseAggregationPropertyDefinitions() {
+    // This method does not used a cached set of aggregation properties because
+    // aggregation properties may be updated after child definitions have been
+    // defined.
+    List<AggregationPropertyDefinition<?, ?>> apdlist =
+      new LinkedList<AggregationPropertyDefinition<?, ?>>();
+
+    if (parent != null) {
+      apdlist.addAll(parent.getAllReverseAggregationPropertyDefinitions());
+    }
+    apdlist.addAll(reverseAggregationPropertyDefinitions);
+
+    return apdlist;
+  }
+
+
+
+  /**
    * Get all the tags associated with this type of managed object. The
    * returned collection will contain inherited tags.
    *
@@ -524,6 +598,68 @@
 
 
   /**
+   * Get the specified aggregation property definition associated with this type
+   * of managed object.The search will include any inherited aggregation
+   * property definitions.
+   *
+   * @param name
+   *          The name of the aggregation property definition to be retrieved.
+   * @return Returns the specified aggregation property definition associated
+   *         with this type of managed object.
+   * @throws IllegalArgumentException
+   *           If the specified aggregation property name was null or empty or
+   *           if the requested aggregation property definition was not found.
+   */
+  public final AggregationPropertyDefinition<?, ?>
+    getAggregationPropertyDefinition(String name)
+    throws IllegalArgumentException {
+    if ((name == null) || (name.length() == 0)) {
+      throw new IllegalArgumentException(
+        "null or empty aggregation property name");
+    }
+
+    AggregationPropertyDefinition<?, ?> d =
+      allAggregationPropertyDefinitions.get(name);
+    if (d == null) {
+      throw new IllegalArgumentException("aggregation property definition \""
+        + name + "\" not found");
+    }
+
+    return d;
+  }
+
+  /**
+   * Get the aggregation property definitions defined by this managed object
+   * definition. The returned collection will not contain inherited
+   * aggregation property definitions.
+   *
+   * @return Returns an unmodifiable collection containing the
+   *         aggregation property definitions defined by this managed object
+   *         definition.
+   */
+  public final Collection<AggregationPropertyDefinition<?, ?>>
+    getAggregationPropertyDefinitions() {
+    return Collections.unmodifiableCollection(
+      aggregationPropertyDefinitions.values());
+  }
+
+  /**
+   * Get the aggregation property definitions which refer directly to this
+   * managed object definition. The returned collection will not contain
+   * aggregation property definitions which refer to parents of this managed
+   * object definition.
+   *
+   * @return Returns an unmodifiable collection containing the
+   *         aggregation property definitions which refer directly to this
+   *         managed object definition.
+   */
+  public final Collection<AggregationPropertyDefinition<?, ?>>
+    getReverseAggregationPropertyDefinitions() {
+    return Collections.unmodifiableCollection(
+      reverseAggregationPropertyDefinitions);
+  }
+
+  /**
    * Gets the synopsis of this managed object definition in the
    * default locale.
    *
@@ -817,6 +953,15 @@
       rd.initialize();
     }
 
+    for (AggregationPropertyDefinition<?, ?> apd :
+      getAllAggregationPropertyDefinitions()) {
+
+      apd.initialize();
+      // Now register the aggregation property in the referenced managed object
+      // definition for reverse lookups.
+      registerReverseAggregationPropertyDefinition(apd);
+    }
+
     for (Constraint constraint : getAllConstraints()) {
       constraint.initialize();
     }
@@ -848,10 +993,19 @@
    *          The property definition to be registered.
    */
   protected final void registerPropertyDefinition(PropertyDefinition<?> d) {
-    String name = d.getName();
+    String propName = d.getName();
 
-    propertyDefinitions.put(name, d);
-    allPropertyDefinitions.put(name, d);
+    propertyDefinitions.put(propName, d);
+    allPropertyDefinitions.put(propName, d);
+
+    if (d instanceof AggregationPropertyDefinition) {
+      AggregationPropertyDefinition apd = (AggregationPropertyDefinition) d;
+      aggregationPropertyDefinitions.put(propName, apd);
+      // The key must also contain the managed object name, since several MOs
+      // in an inheritance tree may aggregate the same aggregation property name
+      allAggregationPropertyDefinitions.put(
+        apd.getManagedObjectDefinition().getName() + ":" + propName, apd);
+    }
   }
 
 
@@ -867,10 +1021,10 @@
    */
   protected final void registerRelationDefinition(RelationDefinition<?, ?> d) {
     // Register the relation in this managed object definition.
-    String name = d.getName();
+    String relName = d.getName();
 
-    relationDefinitions.put(name, d);
-    allRelationDefinitions.put(name, d);
+    relationDefinitions.put(relName, d);
+    allRelationDefinitions.put(relName, d);
 
     // Now register the relation in the referenced managed object
     // definition for reverse lookups.
@@ -937,9 +1091,9 @@
   final void deregisterRelationDefinition(
       RelationDefinition<?, ?> d) {
    // Deregister the relation from this managed object definition.
-    String name = d.getName();
-    relationDefinitions.remove(name);
-    allRelationDefinitions.remove(name);
+    String relName = d.getName();
+    relationDefinitions.remove(relName);
+    allRelationDefinitions.remove(relName);
 
     // Now deregister the relation from the referenced managed object
     // definition for reverse lookups.
@@ -971,6 +1125,17 @@
 
 
 
+  // Register a aggregation property definition in the referenced managed object
+  // definition's reverse lookup table.
+  private void registerReverseAggregationPropertyDefinition(
+    AggregationPropertyDefinition<?, ?> apd) {
+
+    apd.getRelationDefinition().getChildDefinition().
+      reverseAggregationPropertyDefinitions.add(apd);
+  }
+
+
+
   // Recursively descend definition hierarchy to find the best match definition.
   private AbstractManagedObjectDefinition<? extends C, ? extends S>
       resolveManagedObjectDefinitionAux(

--
Gitblit v1.10.0