From c2d0d212b510d8e82b9b123b4d06a80b835c8cd4 Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Fri, 06 Dec 2013 16:52:01 +0000
Subject: [PATCH] OpenDJ 3 : config framework

---
 opendj-admin/src/main/java/org/opends/server/admin/Reference.java |  342 +++++++++++++++++++++++++-------------------------------
 1 files changed, 152 insertions(+), 190 deletions(-)

diff --git a/opendj-admin/src/main/java/org/opends/server/admin/Reference.java b/opendj-admin/src/main/java/org/opends/server/admin/Reference.java
index cf1cfbd..78a3ad9 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/Reference.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/Reference.java
@@ -26,220 +26,182 @@
  */
 package org.opends.server.admin;
 
+import static com.forgerock.opendj.util.StaticUtils.*;
 
-
-import org.opends.server.types.AttributeValue;
 import org.forgerock.opendj.ldap.DN;
-import org.opends.server.types.DirectoryException;
-import org.opends.server.types.RDN;
-import org.opends.server.util.StaticUtils;
-
-
+import org.forgerock.opendj.ldap.RDN;
 
 /**
  * A reference to another managed object.
  *
  * @param <C>
- *          The type of client managed object configuration that this
- *          reference refers to.
+ *            The type of client managed object configuration that this
+ *            reference refers to.
  * @param <S>
- *          The type of server managed object configuration that this
- *          reference refers to.
+ *            The type of server managed object configuration that this
+ *            reference refers to.
  */
-public final class Reference<C extends ConfigurationClient,
-                             S extends Configuration> {
+public final class Reference<C extends ConfigurationClient, S extends Configuration> {
 
-  /**
-   * Parses a DN string value as a reference using the provided
-   * managed object path and relation definition.
-   *
-   * @param <C>
-   *          The type of client managed object configuration that
-   *          this reference refers to.
-   * @param <S>
-   *          The type of server managed object configuration that
-   *          this reference refers to.
-   * @param p
-   *          The path of the referenced managed object's parent.
-   * @param rd
-   *          The instantiable relation in the parent which contains
-   *          the referenced managed object.
-   * @param s
-   *          The DN string value.
-   * @return Returns the new reference based on the provided DN string
-   *         value.
-   * @throws IllegalArgumentException
-   *           If the DN string value could not be decoded as a DN or
-   *           if the provided DN did not correspond to the provided
-   *           path and relation.
-   */
-  public static <C extends ConfigurationClient, S extends Configuration>
-  Reference<C, S> parseDN(
-      ManagedObjectPath<?, ?> p, InstantiableRelationDefinition<C, S> rd,
-      String s) throws IllegalArgumentException {
-    AbstractManagedObjectDefinition<?, ?> d = p.getManagedObjectDefinition();
-    RelationDefinition<?, ?> tmp = d.getRelationDefinition(rd.getName());
-    if (tmp != rd) {
-      throw new IllegalArgumentException("The relation \"" + rd.getName()
-          + "\" is not associated with the definition \"" + d.getName() + "\"");
+    /**
+     * Parses a DN string value as a reference using the provided managed object
+     * path and relation definition.
+     *
+     * @param <C>
+     *            The type of client managed object configuration that this
+     *            reference refers to.
+     * @param <S>
+     *            The type of server managed object configuration that this
+     *            reference refers to.
+     * @param path
+     *            The path of the referenced managed object's parent.
+     * @param relationDef
+     *            The instantiable relation in the parent which contains the
+     *            referenced managed object.
+     * @param dnAsString
+     *            The DN string value.
+     * @return Returns the new reference based on the provided DN string value.
+     * @throws IllegalArgumentException
+     *             If the DN string value could not be decoded as a DN or if the
+     *             provided DN did not correspond to the provided path and
+     *             relation.
+     */
+    public static <C extends ConfigurationClient, S extends Configuration> Reference<C, S> parseDN(
+            ManagedObjectPath<?, ?> path, InstantiableRelationDefinition<C, S> relationDef, String dnAsString)
+            throws IllegalArgumentException {
+        AbstractManagedObjectDefinition<?, ?> definition = path.getManagedObjectDefinition();
+        RelationDefinition<?, ?> tmp = definition.getRelationDefinition(relationDef.getName());
+        if (tmp != relationDef) {
+            // TODO : i18n ?
+            throw new IllegalArgumentException("The relation \"" + relationDef.getName()
+                    + "\" is not associated with the definition \"" + definition.getName() + "\"");
+        }
+
+        DN dn = DN.valueOf(dnAsString);
+        RDN rdn = dn.rdn();
+        if (rdn == null) {
+            // TODO : i18n ?
+            throw new IllegalArgumentException("Unabled to decode the DN string: \"" + dnAsString + "\"");
+        }
+
+        // Check that the DN was valid.
+        String name = rdn.getFirstAVA().getAttributeValue().toString();
+        DN expected = path.child(relationDef, name).toDN();
+        if (!dn.equals(expected)) {
+            // TODO : i18n ?
+            throw new IllegalArgumentException("Unabled to decode the DN string: \"" + dnAsString + "\"");
+        }
+
+        return new Reference<C, S>(path, relationDef, name);
     }
 
-    DN dn;
-    try {
-      dn = DN.decode(s);
-    } catch (DirectoryException e) {
-      throw new IllegalArgumentException("Unabled to decode the DN string: \""
-          + s + "\"");
+    /**
+     * Parses a name as a reference using the provided managed object path and
+     * relation definition.
+     *
+     * @param <C>
+     *            The type of client managed object configuration that this
+     *            reference refers to.
+     * @param <S>
+     *            The type of server managed object configuration that this
+     *            reference refers to.
+     * @param p
+     *            The path of the referenced managed object's parent.
+     * @param rd
+     *            The instantiable relation in the parent which contains the
+     *            referenced managed object.
+     * @param s
+     *            The name of the referenced managed object.
+     * @return Returns the new reference based on the provided name.
+     * @throws IllegalArgumentException
+     *             If the relation is not associated with the provided parent's
+     *             definition, or if the provided name is empty.
+     */
+    public static <C extends ConfigurationClient, S extends Configuration> Reference<C, S> parseName(
+            ManagedObjectPath<?, ?> p, InstantiableRelationDefinition<C, S> rd, String s)
+            throws IllegalArgumentException {
+        // Sanity checks.
+        AbstractManagedObjectDefinition<?, ?> d = p.getManagedObjectDefinition();
+        RelationDefinition<?, ?> tmp = d.getRelationDefinition(rd.getName());
+        if (tmp != rd) {
+            throw new IllegalArgumentException("The relation \"" + rd.getName()
+                    + "\" is not associated with the definition \"" + d.getName() + "\"");
+        }
+
+        if (s.trim().length() == 0) {
+            throw new IllegalArgumentException("Empty names are not allowed");
+        }
+
+        return new Reference<C, S>(p, rd, s);
     }
 
-    RDN rdn = dn.getRDN();
-    if (rdn == null) {
-      throw new IllegalArgumentException("Unabled to decode the DN string: \""
-          + s + "\"");
+    // The name of the referenced managed object.
+    private final String name;
+
+    // The path of the referenced managed object.
+    private final ManagedObjectPath<C, S> path;
+
+    // The instantiable relation in the parent which contains the
+    // referenced managed object.
+    private final InstantiableRelationDefinition<C, S> relation;
+
+    // Private constructor.
+    private Reference(ManagedObjectPath<?, ?> parent, InstantiableRelationDefinition<C, S> relation, String name)
+            throws IllegalArgumentException {
+        this.relation = relation;
+        this.name = name;
+        this.path = parent.child(relation, name);
     }
 
-    AttributeValue av = rdn.getAttributeValue(0);
-    if (av == null) {
-      throw new IllegalArgumentException("Unabled to decode the DN string: \""
-          + s + "\"");
+    /**
+     * Gets the name of the referenced managed object.
+     *
+     * @return Returns the name of the referenced managed object.
+     */
+    public String getName() {
+        return name;
     }
 
-    String name = av.getValue().toString();
-
-    // Check that the DN was valid.
-    DN expected = p.child(rd, name).toDN();
-    if (!dn.equals(expected)) {
-      throw new IllegalArgumentException("Unabled to decode the DN string: \""
-          + s + "\"");
+    /**
+     * Gets the normalized name of the referenced managed object.
+     *
+     * @return Returns the normalized name of the referenced managed object.
+     */
+    public String getNormalizedName() {
+        PropertyDefinition<?> pd = relation.getNamingPropertyDefinition();
+        return normalizeName(pd);
     }
 
-    return new Reference<C, S>(p, rd, name);
-  }
-
-
-
-  /**
-   * Parses a name as a reference using the provided managed object
-   * path and relation definition.
-   *
-   * @param <C>
-   *          The type of client managed object configuration that
-   *          this reference refers to.
-   * @param <S>
-   *          The type of server managed object configuration that
-   *          this reference refers to.
-   * @param p
-   *          The path of the referenced managed object's parent.
-   * @param rd
-   *          The instantiable relation in the parent which contains
-   *          the referenced managed object.
-   * @param s
-   *          The name of the referenced managed object.
-   * @return Returns the new reference based on the provided name.
-   * @throws IllegalArgumentException
-   *           If the relation is not associated with the provided
-   *           parent's definition, or if the provided name is empty.
-   */
-  public static <C extends ConfigurationClient, S extends Configuration>
-  Reference<C, S> parseName(
-      ManagedObjectPath<?, ?> p, InstantiableRelationDefinition<C, S> rd,
-      String s) throws IllegalArgumentException {
-    // Sanity checks.
-    AbstractManagedObjectDefinition<?, ?> d = p.getManagedObjectDefinition();
-    RelationDefinition<?, ?> tmp = d.getRelationDefinition(rd.getName());
-    if (tmp != rd) {
-      throw new IllegalArgumentException("The relation \"" + rd.getName()
-          + "\" is not associated with the definition \"" + d.getName() + "\"");
+    /**
+     * Gets the DN of the referenced managed object.
+     *
+     * @return Returns the DN of the referenced managed object.
+     */
+    public DN toDN() {
+        return path.toDN();
     }
 
-    if (s.trim().length() == 0) {
-      throw new IllegalArgumentException("Empty names are not allowed");
+    /**
+     * {@inheritDoc}
+     */
+    public String toString() {
+        return name;
     }
 
-    return new Reference<C, S>(p, rd, s);
-  }
+    // Normalize a value using the specified naming property definition
+    // if defined.
+    private <T> String normalizeName(PropertyDefinition<T> pd) {
+        if (pd != null) {
+            try {
+                T tvalue = pd.decodeValue(name);
+                return pd.normalizeValue(tvalue);
+            } catch (IllegalPropertyValueStringException e) {
+                // Fall through to default normalization.
+            }
+        }
 
-  // The name of the referenced managed object.
-  private final String name;
-
-  // The path of the referenced managed object.
-  private final ManagedObjectPath<C, S> path;
-
-  // The instantiable relation in the parent which contains the
-  // referenced managed object.
-  private final InstantiableRelationDefinition<C, S> relation;
-
-
-
-  // Private constructor.
-  private Reference(ManagedObjectPath<?, ?> parent,
-      InstantiableRelationDefinition<C, S> relation, String name)
-      throws IllegalArgumentException {
-    this.relation = relation;
-    this.name = name;
-    this.path = parent.child(relation, name);
-  }
-
-
-
-  /**
-   * Gets the name of the referenced managed object.
-   *
-   * @return Returns the name of the referenced managed object.
-   */
-  public String getName() {
-    return name;
-  }
-
-
-
-  /**
-   * Gets the normalized name of the referenced managed object.
-   *
-   * @return Returns the normalized name of the referenced managed
-   *         object.
-   */
-  public String getNormalizedName() {
-    PropertyDefinition<?> pd = relation.getNamingPropertyDefinition();
-    return normalizeName(pd);
-  }
-
-
-
-  /**
-   * Gets the DN of the referenced managed object.
-   *
-   * @return Returns the DN of the referenced managed object.
-   */
-  public DN toDN() {
-    return path.toDN();
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  public String toString() {
-    return name;
-  }
-
-
-
-  // Normalize a value using the specified naming property definition
-  // if defined.
-  private <T> String normalizeName(PropertyDefinition<T> pd) {
-    if (pd != null) {
-      try {
-        T tvalue = pd.decodeValue(name);
-        return pd.normalizeValue(tvalue);
-      } catch (IllegalPropertyValueStringException e) {
-        // Fall through to default normalization.
-      }
+        // FIXME: should really use directory string normalizer.
+        String s = name.trim().replaceAll(" +", " ");
+        return toLowerCase(s);
     }
-
-    // FIXME: should really use directory string normalizer.
-    String s = name.trim().replaceAll(" +", " ");
-    return StaticUtils.toLowerCase(s);
-  }
 }

--
Gitblit v1.10.0