From 2a52b482ba335b393356c00fac36d9ae597c8441 Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Fri, 20 Jul 2007 08:43:07 +0000
Subject: [PATCH] Fix issues 1966 and 1792.

---
 opends/src/server/org/opends/server/admin/RelationDefinition.java |  182 +++++++++++++++++++++++++++++++++++++-------
 1 files changed, 151 insertions(+), 31 deletions(-)

diff --git a/opends/src/server/org/opends/server/admin/RelationDefinition.java b/opends/src/server/org/opends/server/admin/RelationDefinition.java
index 72e16a6..05e4332 100644
--- a/opends/src/server/org/opends/server/admin/RelationDefinition.java
+++ b/opends/src/server/org/opends/server/admin/RelationDefinition.java
@@ -29,8 +29,12 @@
 
 
 
+import static org.opends.server.util.Validator.*;
+
+import java.util.EnumSet;
 import java.util.Locale;
 import java.util.MissingResourceException;
+import java.util.Set;
 
 
 
@@ -79,34 +83,135 @@
 public abstract class RelationDefinition
     <C extends ConfigurationClient, S extends Configuration> {
 
-  // The name of the relation.
-  private final String name;
+  /**
+   * An interface for incrementally constructing relation definitions.
+   *
+   * @param <C>
+   *          The type of client managed object configuration that
+   *          this relation definition refers to.
+   * @param <S>
+   *          The type of server managed object configuration that
+   *          this relation definition refers to.
+   * @param <D>
+   *          The type of relation definition constructed by this
+   *          builder.
+   */
+  protected abstract static class AbstractBuilder
+      <C extends ConfigurationClient, S extends Configuration,
+       D extends RelationDefinition<C, S>> {
 
-  // The definition of the parent managed object.
-  private final AbstractManagedObjectDefinition<?, ?> pd;
+    // Common fields.
+    private final Common<C, S> common;
 
-  // The definition of the child managed object.
-  private final AbstractManagedObjectDefinition<C, S> cd;
+
+
+    /**
+     * Create a property definition builder.
+     *
+     * @param pd
+     *          The parent managed object definition.
+     * @param name
+     *          The name of the relation.
+     * @param cd
+     *          The child managed object definition.
+     */
+    protected AbstractBuilder(AbstractManagedObjectDefinition<?, ?> pd,
+        String name, AbstractManagedObjectDefinition<C, S> cd) {
+      this.common = new Common<C, S>(pd, name, cd);
+    }
+
+
+
+    /**
+     * Construct a relation definition based on the properties of this
+     * builder.
+     *
+     * @return The new relation definition.
+     */
+    public final D getInstance() {
+      return buildInstance(common);
+    }
+
+
+
+    /**
+     * Add a relation definition option.
+     *
+     * @param option
+     *          The relation option.
+     */
+    public final void setOption(RelationOption option) {
+      ensureNotNull(option);
+      common.options.add(option);
+    }
+
+
+
+    /**
+     * Build a relation definition based on the properties of this
+     * builder.
+     *
+     * @param common
+     *          The common fields of the new relation definition.
+     * @return The new relation definition.
+     */
+    protected abstract D buildInstance(Common<C, S> common);
+  }
+
+
+
+  /**
+   * Opaque structure containing fields common to all relation
+   * definition types.
+   *
+   * @param <C>
+   *          The type of client managed object configuration that
+   *          this relation definition refers to.
+   * @param <S>
+   *          The type of server managed object configuration that
+   *          this relation definition refers to.
+   */
+  protected static final class Common
+    <C extends ConfigurationClient, S extends Configuration> {
+
+    // The definition of the child managed object.
+    private final AbstractManagedObjectDefinition<C, S> cd;
+
+    // The name of the relation.
+    private final String name;
+
+    // Options applicable to this definition.
+    private final Set<RelationOption> options;
+
+    // The definition of the parent managed object.
+    private final AbstractManagedObjectDefinition<?, ?> pd;
+
+
+
+    // Private constructor.
+    private Common(AbstractManagedObjectDefinition<?, ?> pd, String name,
+        AbstractManagedObjectDefinition<C, S> cd) {
+      this.name = name;
+      this.pd = pd;
+      this.cd = cd;
+      this.options = EnumSet.noneOf(RelationOption.class);
+    }
+  }
+
+  // Common fields.
+  private final Common<C, S> common;
 
 
 
   /**
    * Create a new managed object relation definition with the
-   * specified name and referenced managed object definition.
+   * specified common fields.
    *
-   * @param pd
-   *          The parent managed object definition.
-   * @param name
-   *          The name of the relation.
-   * @param cd
-   *          The child managed object definition.
+   * @param common
+   *          The common fields of the new relation definition.
    */
-  protected RelationDefinition(
-      AbstractManagedObjectDefinition<?, ?> pd, String name,
-      AbstractManagedObjectDefinition<C, S> cd) {
-    this.name = name;
-    this.pd = pd;
-    this.cd = cd;
+  protected RelationDefinition(Common<C, S> common) {
+    this.common = common;
   }
 
 
@@ -135,7 +240,7 @@
    * @return Returns the definition of the child managed object.
    */
   public final AbstractManagedObjectDefinition<C, S> getChildDefinition() {
-    return cd;
+    return common.cd;
   }
 
 
@@ -166,9 +271,9 @@
    */
   public final String getDescription(Locale locale) {
     try {
-      String property = "relation." + name + ".description";
-      return ManagedObjectDefinitionI18NResource.getInstance()
-          .getMessage(getParentDefinition(), property, locale);
+      String property = "relation." + common.name + ".description";
+      return ManagedObjectDefinitionI18NResource.getInstance().getMessage(
+          getParentDefinition(), property, locale);
     } catch (MissingResourceException e) {
       return null;
     }
@@ -182,7 +287,7 @@
    * @return Returns the name of the relation.
    */
   public final String getName() {
-    return name;
+    return common.name;
   }
 
 
@@ -193,7 +298,7 @@
    * @return Returns the definition of the parent managed object.
    */
   public final AbstractManagedObjectDefinition<?, ?> getParentDefinition() {
-    return pd;
+    return common.pd;
   }
 
 
@@ -221,9 +326,9 @@
    *         specified locale.
    */
   public final String getSynopsis(Locale locale) {
-    String property = "relation." + name + ".synopsis";
-    return ManagedObjectDefinitionI18NResource.getInstance()
-        .getMessage(getParentDefinition(), property, locale);
+    String property = "relation." + common.name + ".synopsis";
+    return ManagedObjectDefinitionI18NResource.getInstance().getMessage(
+        getParentDefinition(), property, locale);
   }
 
 
@@ -251,9 +356,24 @@
    *         definition in the specified locale.
    */
   public final String getUserFriendlyName(Locale locale) {
-    String property = "relation." + name + ".user-friendly-name";
-    return ManagedObjectDefinitionI18NResource.getInstance()
-        .getMessage(getParentDefinition(), property, locale);
+    String property = "relation." + common.name + ".user-friendly-name";
+    return ManagedObjectDefinitionI18NResource.getInstance().getMessage(
+        getParentDefinition(), property, locale);
+  }
+
+
+
+  /**
+   * Check if the specified option is set for this relation
+   * definition.
+   *
+   * @param option
+   *          The option to test.
+   * @return Returns <code>true</code> if the option is set, or
+   *         <code>false</code> otherwise.
+   */
+  public final boolean hasOption(RelationOption option) {
+    return common.options.contains(option);
   }
 
 

--
Gitblit v1.10.0