From cc08b5573ab5fb3b88ef64a48d3edeae475b852a Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Tue, 04 Sep 2007 19:27:20 +0000
Subject: [PATCH] Move the DNBuilder implementation into the core ManagedObjectPath class and add the following methods:

---
 opends/src/server/org/opends/server/admin/ManagedObjectPath.java |  130 +++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 130 insertions(+), 0 deletions(-)

diff --git a/opends/src/server/org/opends/server/admin/ManagedObjectPath.java b/opends/src/server/org/opends/server/admin/ManagedObjectPath.java
index d37816c..6f788e8 100644
--- a/opends/src/server/org/opends/server/admin/ManagedObjectPath.java
+++ b/opends/src/server/org/opends/server/admin/ManagedObjectPath.java
@@ -38,6 +38,12 @@
 import org.opends.server.admin.std.client.RootCfgClient;
 import org.opends.server.admin.std.meta.RootCfgDefn;
 import org.opends.server.admin.std.server.RootCfg;
+import org.opends.server.core.DirectoryServer;
+import org.opends.server.types.AttributeType;
+import org.opends.server.types.AttributeValue;
+import org.opends.server.types.DN;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.RDN;
 
 
 
@@ -114,6 +120,95 @@
     S extends Configuration> {
 
   /**
+   * A serialize which is used to generate the toDN representation.
+   */
+  private static final class DNSerializer implements
+      ManagedObjectPathSerializer {
+
+    // The current DN.
+    private DN dn;
+
+    // The LDAP profile.
+    private final LDAPProfile profile;
+
+
+
+    // Create a new DN builder.
+    private DNSerializer() {
+      this.dn = DN.nullDN();
+      this.profile = LDAPProfile.getInstance();
+    }
+
+
+
+    /**
+     * {@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((RelationDefinition<?, ?>) r);
+
+      // Now add the single RDN representing the named instance.
+      String type = profile.getInstantiableRelationChildRDNType(r);
+      AttributeType atype = DirectoryServer.getAttributeType(
+          type.toLowerCase(), true);
+      AttributeValue avalue = new AttributeValue(atype, name);
+      dn = dn.concat(RDN.create(atype, avalue));
+    }
+
+
+
+    /**
+     * {@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((RelationDefinition<?, ?>) 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((RelationDefinition<?, ?>) r);
+    }
+
+
+
+    // Appends the RDN sequence representing the provided relation.
+    private void appendManagedObjectPathElement(RelationDefinition<?, ?> r) {
+      // Add the RDN sequence representing the relation.
+      try {
+        DN localName = DN.decode(profile.getRelationRDNSequence(r));
+        dn = dn.concat(localName);
+      } catch (DirectoryException e) {
+        throw new RuntimeException(e);
+      }
+    }
+
+
+
+    // Gets the serialized DN value.
+    private DN toDN() {
+      return dn;
+    }
+  }
+
+
+
+  /**
    * Abstract path element.
    */
   private static abstract class Element<C extends ConfigurationClient,
@@ -943,6 +1038,27 @@
 
 
   /**
+   * Determines whether this managed object path references the same
+   * location as the provided managed object path.
+   * <p>
+   * This method differs from <code>equals</code> in that it ignores
+   * sub-type definitions.
+   *
+   * @param other
+   *          The managed object path to be compared.
+   * @return Returns <code>true</code> if this managed object path
+   *         references the same location as the provided managed
+   *         object path.
+   */
+  public boolean matches(ManagedObjectPath<?, ?> other) {
+    DN thisDN = toDN();
+    DN otherDN = other.toDN();
+    return thisDN.equals(otherDN);
+  }
+
+
+
+  /**
    * Creates a new parent managed object path representing the
    * immediate parent of this path. This method is a short-hand for
    * <code>parent(1)</code>.
@@ -1065,6 +1181,20 @@
 
 
   /**
+   * Creates a DN representation of this managed object path.
+   *
+   * @return Returns a DN representation of this managed object path.
+   */
+  public DN toDN() {
+    // Use a simple serializer to create the contents.
+    DNSerializer serializer = new DNSerializer();
+    serialize(serializer);
+    return serializer.toDN();
+  }
+
+
+
+  /**
    * {@inheritDoc}
    */
   @Override

--
Gitblit v1.10.0