From 70b0e3d553e5a2a896337730b6c0540488b78f08 Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Tue, 10 Dec 2013 12:43:16 +0000
Subject: [PATCH] OpenDJ 3 : config framework

---
 opendj-admin/src/main/java/org/opends/server/admin/client/ldap/LDAPNameBuilder.java |  338 ++++++++++++++++++++++++-------------------------------
 1 files changed, 148 insertions(+), 190 deletions(-)

diff --git a/opendj-admin/src/main/java/org/opends/server/admin/client/ldap/LDAPNameBuilder.java b/opendj-admin/src/main/java/org/opends/server/admin/client/ldap/LDAPNameBuilder.java
index 0bbc756..6602373 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/client/ldap/LDAPNameBuilder.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/client/ldap/LDAPNameBuilder.java
@@ -27,14 +27,11 @@
 
 package org.opends.server.admin.client.ldap;
 
-
-
+import java.util.Collections;
 import java.util.LinkedList;
 
-import javax.naming.InvalidNameException;
-import javax.naming.ldap.LdapName;
-import javax.naming.ldap.Rdn;
-
+import org.forgerock.opendj.ldap.DN;
+import org.forgerock.opendj.ldap.RDN;
 import org.opends.server.admin.AbstractManagedObjectDefinition;
 import org.opends.server.admin.Configuration;
 import org.opends.server.admin.ConfigurationClient;
@@ -47,200 +44,161 @@
 import org.opends.server.admin.SetRelationDefinition;
 import org.opends.server.admin.SingletonRelationDefinition;
 
-
-
 /**
- * A strategy for creating <code>LdapName</code>s from managed object paths.
+ * A strategy for creating <code>DN</code>s from managed object paths.
  */
 final class LDAPNameBuilder implements ManagedObjectPathSerializer {
 
-  /**
-   * Creates a new LDAP name representing the specified managed object
-   * path.
-   *
-   * @param path
-   *          The managed object path.
-   * @param profile
-   *          The LDAP profile which should be used to construct LDAP
-   *          names.
-   * @return Returns a new LDAP name representing the specified
-   *         managed object path.
-   */
-  public static LdapName create(ManagedObjectPath<?, ?> path,
-      LDAPProfile profile) {
-    LDAPNameBuilder builder = new LDAPNameBuilder(profile);
-    path.serialize(builder);
-    return builder.getInstance();
-  }
-
-
-
-  /**
-   * Creates a new LDAP name representing the specified managed object
-   * path and instantiable relation.
-   *
-   * @param path
-   *          The managed object path.
-   * @param relation
-   *          The child instantiable relation.
-   * @param profile
-   *          The LDAP profile which should be used to construct LDAP
-   *          names.
-   * @return Returns a new LDAP name representing the specified
-   *         managed object path and instantiable relation.
-   */
-  public static LdapName create(ManagedObjectPath<?, ?> path,
-      InstantiableRelationDefinition<?, ?> relation, LDAPProfile profile) {
-    LDAPNameBuilder builder = new LDAPNameBuilder(profile);
-    path.serialize(builder);
-    builder.appendManagedObjectPathElement(relation);
-    return builder.getInstance();
-  }
-
-
-
-  /**
-   * Creates a new LDAP name representing the specified managed object
-   * path and set relation.
-   *
-   * @param path
-   *          The managed object path.
-   * @param relation
-   *          The child set relation.
-   * @param profile
-   *          The LDAP profile which should be used to construct LDAP
-   *          names.
-   * @return Returns a new LDAP name representing the specified
-   *         managed object path and set relation.
-   */
-  public static LdapName create(ManagedObjectPath<?, ?> path,
-      SetRelationDefinition<?, ?> relation, LDAPProfile profile) {
-    LDAPNameBuilder builder = new LDAPNameBuilder(profile);
-    path.serialize(builder);
-    builder.appendManagedObjectPathElement(relation);
-    return builder.getInstance();
-  }
-
-  // The list of RDNs in big-endian order.
-  private final LinkedList<Rdn> rdns;
-
-  // The LDAP profile.
-  private final LDAPProfile profile;
-
-
-
-  /**
-   * Create a new JNDI LDAP name builder.
-   *
-   * @param profile
-   *          The LDAP profile which should be used to construct LDAP
-   *          names.
-   */
-  public LDAPNameBuilder(LDAPProfile profile) {
-    this.rdns = new LinkedList<Rdn>();
-    this.profile = profile;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  public <C extends ConfigurationClient, S extends Configuration>
-      void appendManagedObjectPathElement(
-          InstantiableRelationDefinition<? super C, ? super S> r,
-          AbstractManagedObjectDefinition<C, S> d, String name) {
-    // Add the RDN sequence representing the relation.
-    appendManagedObjectPathElement(r);
-
-    // Now add the single RDN representing the named instance.
-    String type = profile.getRelationChildRDNType(r);
-    try {
-      Rdn rdn = new Rdn(type, name.trim());
-      rdns.add(rdn);
-    } catch (InvalidNameException e1) {
-      // Should not happen.
-      throw new RuntimeException(e1);
+    /**
+     * Creates a new DN representing the specified managed object path.
+     *
+     * @param path
+     *            The managed object path.
+     * @param profile
+     *            The LDAP profile which should be used to construct LDAP names.
+     * @return Returns a new DN representing the specified managed object path.
+     */
+    public static DN create(ManagedObjectPath<?, ?> path, LDAPProfile profile) {
+        LDAPNameBuilder builder = new LDAPNameBuilder(profile);
+        path.serialize(builder);
+        return builder.getInstance();
     }
-  }
 
-
-
-  /**
-   * Appends the RDN sequence representing the provided relation.
-   *
-   * @param r
-   *          The relation definition.
-   */
-  public void appendManagedObjectPathElement(RelationDefinition<?, ?> r) {
-    // Add the RDN sequence representing the relation.
-    try {
-      LdapName tmp = new LdapName(profile.getRelationRDNSequence(r));
-      rdns.addAll(tmp.getRdns());
-    } catch (InvalidNameException e1) {
-      // Should not happen.
-      throw new RuntimeException(e1);
+    /**
+     * Creates a new DN representing the specified managed object path and
+     * instantiable relation.
+     *
+     * @param path
+     *            The managed object path.
+     * @param relation
+     *            The child instantiable relation.
+     * @param profile
+     *            The LDAP profile which should be used to construct LDAP names.
+     * @return Returns a new DN representing the specified managed object path
+     *         and instantiable relation.
+     */
+    public static DN create(ManagedObjectPath<?, ?> path, InstantiableRelationDefinition<?, ?> relation,
+            LDAPProfile profile) {
+        LDAPNameBuilder builder = new LDAPNameBuilder(profile);
+        path.serialize(builder);
+        builder.appendManagedObjectPathElement(relation);
+        return builder.getInstance();
     }
-  }
 
-
-
-  /**
-   * {@inheritDoc}
-   */
-  public <C extends ConfigurationClient, S extends Configuration>
-      void appendManagedObjectPathElement(
-          OptionalRelationDefinition<? super C, ? super S> r,
-          AbstractManagedObjectDefinition<C, S> d) {
-    // Add the RDN sequence representing the relation.
-    appendManagedObjectPathElement(r);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  public <C extends ConfigurationClient, S extends Configuration>
-      void appendManagedObjectPathElement(
-          SingletonRelationDefinition<? super C, ? super S> r,
-          AbstractManagedObjectDefinition<C, S> d) {
-    // Add the RDN sequence representing the relation.
-    appendManagedObjectPathElement(r);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  public <C extends ConfigurationClient, S extends Configuration>
-      void appendManagedObjectPathElement(
-          SetRelationDefinition<? super C, ? super S> r,
-          AbstractManagedObjectDefinition<C, S> d) {
-    // Add the RDN sequence representing the relation.
-    appendManagedObjectPathElement(r);
-
-    // Now add the single RDN representing the named instance.
-    String type = profile.getRelationChildRDNType(r);
-    try {
-      Rdn rdn = new Rdn(type, d.getName());
-      rdns.add(rdn);
-    } catch (InvalidNameException e1) {
-      // Should not happen.
-      throw new RuntimeException(e1);
+    /**
+     * Creates a new DN representing the specified managed object path and set
+     * relation.
+     *
+     * @param path
+     *            The managed object path.
+     * @param relation
+     *            The child set relation.
+     * @param profile
+     *            The LDAP profile which should be used to construct LDAP names.
+     * @return Returns a new DN representing the specified managed object path
+     *         and set relation.
+     */
+    public static DN create(ManagedObjectPath<?, ?> path, SetRelationDefinition<?, ?> relation, LDAPProfile profile) {
+        LDAPNameBuilder builder = new LDAPNameBuilder(profile);
+        path.serialize(builder);
+        builder.appendManagedObjectPathElement(relation);
+        return builder.getInstance();
     }
-  }
 
+    // The list of RDNs in big-endian order.
+    private final LinkedList<RDN> rdns;
 
+    // The LDAP profile.
+    private final LDAPProfile profile;
 
-  /**
-   * Create a new JNDI LDAP name using the current state of this LDAP name
-   * builder.
-   *
-   * @return Returns the new JNDI LDAP name instance.
-   */
-  public LdapName getInstance() {
-    return new LdapName(rdns);
-  }
+    /**
+     * Create a new DN builder.
+     *
+     * @param profile
+     *            The LDAP profile which should be used to construct DNs.
+     */
+    public LDAPNameBuilder(LDAPProfile profile) {
+        this.rdns = new LinkedList<RDN>();
+        this.profile = profile;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public <C extends ConfigurationClient, S extends Configuration> void appendManagedObjectPathElement(
+            InstantiableRelationDefinition<? super C, ? super S> r, AbstractManagedObjectDefinition<C, S> d, String name) {
+        // Add the RDN sequence representing the relation.
+        appendManagedObjectPathElement(r);
+
+        // Now add the single RDN representing the named instance.
+        String type = profile.getRelationChildRDNType(r);
+        RDN rdn = new RDN(type, name.trim());
+        rdns.add(rdn);
+
+    }
+
+    /**
+     * Appends the RDN sequence representing the provided relation.
+     *
+     * @param r
+     *            The relation definition.
+     */
+    public void appendManagedObjectPathElement(RelationDefinition<?, ?> r) {
+        // Add the RDN sequence representing the relation.
+        DN dn = DN.valueOf(profile.getRelationRDNSequence(r));
+        for (RDN rdn : dn) {
+            rdns.add(rdn);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public <C extends ConfigurationClient, S extends Configuration> void appendManagedObjectPathElement(
+            OptionalRelationDefinition<? super C, ? super S> r, AbstractManagedObjectDefinition<C, S> d) {
+        // Add the RDN sequence representing the relation.
+        appendManagedObjectPathElement(r);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public <C extends ConfigurationClient, S extends Configuration> void appendManagedObjectPathElement(
+            SingletonRelationDefinition<? super C, ? super S> r, AbstractManagedObjectDefinition<C, S> d) {
+        // Add the RDN sequence representing the relation.
+        appendManagedObjectPathElement(r);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public <C extends ConfigurationClient, S extends Configuration> void appendManagedObjectPathElement(
+            SetRelationDefinition<? super C, ? super S> r, AbstractManagedObjectDefinition<C, S> d) {
+        // Add the RDN sequence representing the relation.
+        appendManagedObjectPathElement(r);
+
+        // Now add the single RDN representing the named instance.
+        String type = profile.getRelationChildRDNType(r);
+        RDN rdn = new RDN(type, d.getName());
+        rdns.add(rdn);
+    }
+
+    /**
+     * Create a new DN using the current state of this builder.
+     *
+     * @return Returns the new DN instance.
+     */
+    public DN getInstance() {
+        if (rdns.isEmpty()) {
+            return DN.rootDN();
+        }
+        else {
+            Collections.reverse(rdns);
+            DN dn = DN.valueOf(rdns.removeFirst().toString());
+            for (RDN rdn : rdns) {
+                dn = dn.child(rdn);
+            }
+            return dn;
+        }
+    }
 }

--
Gitblit v1.10.0