From 5d6e9428fedead57a9c9438cebe58b485ff476d2 Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Fri, 14 Sep 2007 10:22:17 +0000
Subject: [PATCH] Avoid managed object definition initialization dependency problems. Using features like inherited default values and aggregation properties it is quite straightforward to encounter initialization dependency problems. For example: the global configuration will contain an aggregation property which references the default password policy. This aggregation definition is defined using a managed object path which, when decoded, contains a reference to the root configuration and its "password-policy" relation. This is what happens during initialization of the root configuration:

---
 opends/src/server/org/opends/server/admin/AbsoluteInheritedDefaultBehaviorProvider.java |   43 +++++++++++++++++++++++++------------------
 1 files changed, 25 insertions(+), 18 deletions(-)

diff --git a/opends/src/server/org/opends/server/admin/AbsoluteInheritedDefaultBehaviorProvider.java b/opends/src/server/org/opends/server/admin/AbsoluteInheritedDefaultBehaviorProvider.java
index e0f961c..178342a 100644
--- a/opends/src/server/org/opends/server/admin/AbsoluteInheritedDefaultBehaviorProvider.java
+++ b/opends/src/server/org/opends/server/admin/AbsoluteInheritedDefaultBehaviorProvider.java
@@ -30,18 +30,22 @@
 
 /**
  * A default behavior provider which retrieves default values from a
- * managed object in an abolute location. It should be used by
+ * managed object in an absolute location. It should be used by
  * properties which inherit their default value(s) from properties
  * held in an other managed object.
  *
  * @param <T>
  *          The type of values represented by this provider.
  */
-public final class AbsoluteInheritedDefaultBehaviorProvider<T> implements
+public final class AbsoluteInheritedDefaultBehaviorProvider<T> extends
     DefaultBehaviorProvider<T> {
 
   // The absolute path to the managed object containing the property.
-  private final ManagedObjectPath<?, ?> path;
+  private ManagedObjectPath<?, ?> path = null;
+
+  // The string representation of the managed object path specifying
+  // the absolute location of the managed object.
+  private final String pathString;
 
   // The name of the property containing the inherited default values.
   private final String propertyName;
@@ -52,24 +56,16 @@
    * Create an absolute inherited default behavior provider associated
    * with the managed object at the specified absolute location.
    *
-   * @param path
-   *          The absolute location of the managed object.
+   * @param pathString
+   *          The string representation of the managed object path
+   *          specifying the absolute location of the managed object.
    * @param propertyName
    *          The name of the property containing the inherited
    *          default values.
-   * @throws IllegalArgumentException
-   *           If the named property is associated with the managed
-   *           object definition identified by the path.
-   * @throws ClassCastException
-   *           If the named property does not have the same type of
-   *           property values as this default behavior provider.
    */
-  @SuppressWarnings("unchecked")
-  public AbsoluteInheritedDefaultBehaviorProvider(ManagedObjectPath path,
-      String propertyName) throws IllegalArgumentException, ClassCastException {
-    // We do not decode the property name now because the property
-    // might not have been constructed at this point.
-    this.path = path;
+  public AbsoluteInheritedDefaultBehaviorProvider(String pathString,
+      String propertyName) {
+    this.pathString = pathString;
     this.propertyName = propertyName;
   }
 
@@ -111,7 +107,7 @@
 
 
   /**
-   * Get the name of the property containing the inherited default
+   * Gets the name of the property containing the inherited default
    * values.
    *
    * @return Returns the name of the property containing the inherited
@@ -121,4 +117,15 @@
     return propertyName;
   }
 
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  protected void initialize() throws Exception {
+    // Decode the path.
+    path = ManagedObjectPath.valueOf(pathString);
+  }
+
 }

--
Gitblit v1.10.0