From 0e8d607d49d683199d938e0dba22c79342937991 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Fri, 07 Mar 2014 09:28:45 +0000
Subject: [PATCH] OPENDJ-1343: Migrate dsconfig

---
 opendj-config/src/main/java/org/forgerock/opendj/config/client/ldap/LDAPDriver.java |   84 ++++++++++++++++++++++++++----------------
 1 files changed, 52 insertions(+), 32 deletions(-)

diff --git a/opendj-config/src/main/java/org/forgerock/opendj/config/client/ldap/LDAPDriver.java b/opendj-config/src/main/java/org/forgerock/opendj/config/client/ldap/LDAPDriver.java
index 7fa3165..26bd074 100644
--- a/opendj-config/src/main/java/org/forgerock/opendj/config/client/ldap/LDAPDriver.java
+++ b/opendj-config/src/main/java/org/forgerock/opendj/config/client/ldap/LDAPDriver.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2008-2009 Sun Microsystems, Inc.
- *      Portions Copyright 2013 ForgeRock, AS.
+ *      Portions Copyright 2013-2014 ForgeRock, AS.
  */
 package org.forgerock.opendj.config.client.ldap;
 
@@ -66,10 +66,17 @@
 import org.forgerock.opendj.config.client.spi.PropertySet;
 import org.forgerock.opendj.ldap.Attribute;
 import org.forgerock.opendj.ldap.ByteString;
+import org.forgerock.opendj.ldap.Connection;
 import org.forgerock.opendj.ldap.DN;
+import org.forgerock.opendj.ldap.EntryNotFoundException;
 import org.forgerock.opendj.ldap.ErrorResultException;
+import org.forgerock.opendj.ldap.ErrorResultIOException;
+import org.forgerock.opendj.ldap.Filter;
 import org.forgerock.opendj.ldap.ResultCode;
+import org.forgerock.opendj.ldap.SearchResultReferenceIOException;
+import org.forgerock.opendj.ldap.SearchScope;
 import org.forgerock.opendj.ldap.responses.SearchResultEntry;
+import org.forgerock.opendj.ldif.ConnectionEntryReader;
 
 /**
  * The LDAP management context driver implementation.
@@ -132,7 +139,7 @@
 
     private LDAPManagementContext context;
 
-    private final LDAPConnection connection;
+    private final Connection connection;
 
     // The LDAP profile which should be used to construct LDAP
     // requests and decode LDAP responses.
@@ -147,7 +154,7 @@
      * @param profile
      *            The LDAP profile.
      */
-    public LDAPDriver(LDAPConnection connection, LDAPProfile profile) {
+    LDAPDriver(Connection connection, LDAPProfile profile) {
         this.connection = connection;
         this.profile = profile;
     }
@@ -161,7 +168,7 @@
      */
     @Override
     public void close() {
-        connection.unbind();
+        connection.close();
     }
 
     /**
@@ -177,7 +184,7 @@
 
         try {
             // Read the entry associated with the managed object.
-            DN dn = LDAPNameBuilder.create(path, profile);
+            DN dn = DNBuilder.create(path, profile);
             AbstractManagedObjectDefinition<C, S> d = path.getManagedObjectDefinition();
             ManagedObjectDefinition<? extends C, ? extends S> mod = getEntryDefinition(d, dn);
 
@@ -186,8 +193,8 @@
                 String attrId = profile.getAttributeName(mod, pd);
                 attrIds.add(attrId);
             }
-
-            SearchResultEntry searchResultEntry = connection.readEntry(dn, attrIds);
+            SearchResultEntry searchResultEntry =
+                    connection.readEntry(dn, attrIds.toArray(new String[0]));
 
             // Build the managed object's properties.
             List<PropertyException> exceptions = new LinkedList<PropertyException>();
@@ -241,7 +248,7 @@
 
         try {
             // Read the entry associated with the managed object.
-            DN dn = LDAPNameBuilder.create(path, profile);
+            DN dn = DNBuilder.create(path, profile);
             ManagedObjectDefinition<? extends C, ? extends S> objectDef = getEntryDefinition(d, dn);
 
             // Make sure we use the correct property definition, the
@@ -250,7 +257,7 @@
             propertyDef = (PropertyDefinition<P>) objectDef.getPropertyDefinition(propertyDef.getName());
 
             String attrID = profile.getAttributeName(objectDef, propertyDef);
-            SearchResultEntry resultEntry = connection.readEntry(dn, Collections.singleton(attrID));
+            SearchResultEntry resultEntry = connection.readEntry(dn, attrID);
             Attribute attribute = resultEntry.getAttribute(attrID);
 
             // Decode the values.
@@ -309,19 +316,14 @@
         }
 
         // Get the search base DN.
-        DN dn = LDAPNameBuilder.create(parent, rd, profile);
+        DN dn = DNBuilder.create(parent, rd, profile);
 
         // Retrieve only those entries which are sub-types of the
         // specified definition.
-        StringBuilder builder = new StringBuilder();
-        builder.append("(objectclass=");
-        builder.append(profile.getObjectClass(d));
-        builder.append(')');
-        String filter = builder.toString();
-
+        Filter filter = Filter.equality("objectClass", profile.getObjectClass(d));
         List<String> children = new ArrayList<String>();
         try {
-            for (DN child : connection.listEntries(dn, filter)) {
+            for (DN child : listEntries(dn, filter)) {
                 children.add(child.rdn().getFirstAVA().getAttributeValue().toString());
             }
         } catch (ErrorResultException e) {
@@ -351,19 +353,14 @@
         }
 
         // Get the search base DN.
-        DN dn = LDAPNameBuilder.create(parent, rd, profile);
+        DN dn = DNBuilder.create(parent, rd, profile);
 
         // Retrieve only those entries which are sub-types of the
         // specified definition.
-        StringBuilder builder = new StringBuilder();
-        builder.append("(objectclass=");
-        builder.append(profile.getObjectClass(d));
-        builder.append(')');
-        String filter = builder.toString();
-
+        Filter filter = Filter.equality("objectClass", profile.getObjectClass(d));
         List<String> children = new ArrayList<String>();
         try {
-            for (DN child : connection.listEntries(dn, filter)) {
+            for (DN child : listEntries(dn, filter)) {
                 children.add(child.rdn().getFirstAVA().getAttributeValue().toString());
             }
         } catch (ErrorResultException e) {
@@ -390,12 +387,12 @@
         }
 
         ManagedObjectPath<?, ?> parent = path.parent();
-        DN dn = LDAPNameBuilder.create(parent, profile);
+        DN dn = DNBuilder.create(parent, profile);
         if (!entryExists(dn)) {
             throw new ManagedObjectNotFoundException();
         }
 
-        dn = LDAPNameBuilder.create(path, profile);
+        dn = DNBuilder.create(path, profile);
         return entryExists(dn);
     }
 
@@ -406,9 +403,9 @@
     protected <C extends ConfigurationClient, S extends Configuration> void deleteManagedObject(
         ManagedObjectPath<C, S> path) throws OperationRejectedException, ErrorResultException {
         // Delete the entry and any subordinate entries.
-        DN dn = LDAPNameBuilder.create(path, profile);
+        DN dn = DNBuilder.create(path, profile);
         try {
-            connection.deleteSubtree(dn);
+            connection.deleteSubtree(dn.toString());
         } catch (ErrorResultException e) {
             if (e.getResult().getResultCode() == ResultCode.UNWILLING_TO_PERFORM) {
                 AbstractManagedObjectDefinition<?, ?> d = path.getManagedObjectDefinition();
@@ -437,7 +434,12 @@
      *             if a problem occurs.
      */
     boolean entryExists(DN dn) throws ErrorResultException {
-        return connection.entryExists(dn);
+        try {
+            connection.readEntry(dn, "1.1");
+            return true;
+        } catch (EntryNotFoundException e) {
+            return false;
+        }
     }
 
     /**
@@ -445,7 +447,7 @@
      *
      * @return Returns the LDAP connection used for interacting with the server.
      */
-    LDAPConnection getLDAPConnection() {
+    Connection getLDAPConnection() {
         return connection;
     }
 
@@ -525,7 +527,7 @@
         getEntryDefinition(AbstractManagedObjectDefinition<C, S> d, DN dn) throws ErrorResultException,
         DefinitionDecodingException {
         // @Checkstyle:on
-        SearchResultEntry searchResultEntry = connection.readEntry(dn, Collections.singleton("objectclass"));
+        SearchResultEntry searchResultEntry = connection.readEntry(dn, "objectclass");
         Attribute objectClassAttr = searchResultEntry.getAttribute("objectclass");
 
         if (objectClassAttr == null) {
@@ -554,4 +556,22 @@
 
         return d.resolveManagedObjectDefinition(resolver);
     }
+
+    private Collection<DN> listEntries(DN dn, Filter filter) throws ErrorResultException {
+        List<DN> names = new LinkedList<DN>();
+        ConnectionEntryReader reader =
+                connection.search(dn.toString(), SearchScope.SINGLE_LEVEL, filter.toString());
+        try {
+            while (reader.hasNext()) {
+                names.add(reader.readEntry().getName());
+            }
+        } catch (ErrorResultIOException e) {
+            throw e.getCause();
+        } catch (SearchResultReferenceIOException e) {
+            // Ignore.
+        } finally {
+            reader.close();
+        }
+        return names;
+    }
 }

--
Gitblit v1.10.0