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/DefaultBehaviorProvider.java |   67 ++++++++++++++++++++++++---------
 1 files changed, 49 insertions(+), 18 deletions(-)

diff --git a/opends/src/server/org/opends/server/admin/DefaultBehaviorProvider.java b/opends/src/server/org/opends/server/admin/DefaultBehaviorProvider.java
index 565f7d1..a9aef47 100644
--- a/opends/src/server/org/opends/server/admin/DefaultBehaviorProvider.java
+++ b/opends/src/server/org/opends/server/admin/DefaultBehaviorProvider.java
@@ -29,31 +29,43 @@
 
 
 /**
- * An interface for determining the default behavior of a property. A property
- * exhibits default behavior when it has no values defined. There are four
- * different types of default behavior:
+ * An interface for determining the default behavior of a property. A
+ * property exhibits default behavior when it has no values defined.
+ * There are four different types of default behavior:
  * <ol>
- * <li>there is no default behavior - e.g. leaving a "description" unset has
- * no side-effects. This default behavior is represented using the
- * {@link UndefinedDefaultBehaviorProvider} implementation
- * <li>the property defaults to one or more real values of the property. This
- * default behavior is represented using the
+ * <li>there is no default behavior - e.g. leaving a "description"
+ * unset has no side-effects. This default behavior is represented
+ * using the {@link UndefinedDefaultBehaviorProvider} implementation
+ * <li>the property defaults to one or more real values of the
+ * property. This default behavior is represented using the
  * {@link DefinedDefaultBehaviorProvider} implementation
  * <li>the property defaults to some special behavior that cannot be
- * represented using real property values. This default behavior is represented
- * using the {@link AliasDefaultBehaviorProvider} implementation
- * <li>the property inherits its values from property held in another managed
- * object (e.g. the parent managed object). This default behavior is
- * represented using the {@link AbsoluteInheritedDefaultBehaviorProvider} and
+ * represented using real property values. This default behavior is
+ * represented using the {@link AliasDefaultBehaviorProvider}
+ * implementation
+ * <li>the property inherits its values from property held in another
+ * managed object (e.g. the parent managed object). This default
+ * behavior is represented using the
+ * {@link AbsoluteInheritedDefaultBehaviorProvider} and
  * {@link RelativeInheritedDefaultBehaviorProvider} implementations.
  * </ol>
- * An application can perform actions based on the type of the default behavior
- * by implementing the {@link DefaultBehaviorProviderVisitor} interface.
+ * An application can perform actions based on the type of the default
+ * behavior by implementing the {@link DefaultBehaviorProviderVisitor}
+ * interface.
  *
  * @param <T>
  *          The type of values represented by this provider.
  */
-public interface DefaultBehaviorProvider<T> {
+public abstract class DefaultBehaviorProvider<T> {
+
+  /**
+   * Creates a new default behavior provider.
+   */
+  protected DefaultBehaviorProvider() {
+    // No implementation required.
+  }
+
+
 
   /**
    * Apply a visitor to this default behavior provider.
@@ -61,13 +73,32 @@
    * @param <R>
    *          The return type of the visitor's methods.
    * @param <P>
-   *          The type of the additional parameters to the visitor's methods.
+   *          The type of the additional parameters to the visitor's
+   *          methods.
    * @param v
    *          The default behavior visitor.
    * @param p
    *          Optional additional visitor parameter.
    * @return Returns a result as specified by the visitor.
    */
-  <R, P> R accept(DefaultBehaviorProviderVisitor<T, R, P> v, P p);
+  public abstract <R, P>
+  R accept(DefaultBehaviorProviderVisitor<T, R, P> v, P p);
+
+
+
+  /**
+   * Performs any run-time initialization required by this default
+   * behavior provider. This may include resolving managed object
+   * paths and property names.
+   * <p>
+   * The default implementation is to do nothing.
+   *
+   * @throws Exception
+   *           If this default behavior provider could not be
+   *           initialized.
+   */
+  protected void initialize() throws Exception {
+    // Default implementation is to do nothing.
+  }
 
 }

--
Gitblit v1.10.0