From cea2f4bd87fdce359d8af0caaa7ca4c26deb1883 Mon Sep 17 00:00:00 2001
From: dugan <dugan@localhost>
Date: Wed, 15 Apr 2009 13:33:37 +0000
Subject: [PATCH] import-ldif does not create inherited objectclass attributes. Issue 3926.

---
 opendj-sdk/opends/src/server/org/opends/server/util/StaticUtils.java                                      |   53 ++++++++++++++++++++++++++
 opendj-sdk/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendAddOperation.java |   30 +-------------
 opendj-sdk/opends/src/server/org/opends/server/util/LDIFReader.java                                       |    5 ++
 3 files changed, 60 insertions(+), 28 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/util/LDIFReader.java b/opendj-sdk/opends/src/server/org/opends/server/util/LDIFReader.java
index e157b49..c73f366 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/util/LDIFReader.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/util/LDIFReader.java
@@ -33,7 +33,7 @@
 import org.opends.server.loggers.debug.DebugTracer;
 import static org.opends.server.loggers.ErrorLogger.logError;
 import static org.opends.messages.UtilityMessages.*;
-import static org.opends.server.util.StaticUtils.toLowerCase;
+import static org.opends.server.util.StaticUtils.*;
 import static org.opends.server.util.Validator.*;
 
 import java.io.BufferedReader;
@@ -323,6 +323,9 @@
           entriesRejected++;
           throw new LDIFException(message, lastEntryLineNumber, true);
         }
+        //Add any superior objectclass(s) missing in an entries
+        //objectclass map.
+        addSuperiorObjectClasses(entry.getObjectClasses());
       }
 
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/util/StaticUtils.java b/opendj-sdk/opends/src/server/org/opends/server/util/StaticUtils.java
index f67d463..6c3e088 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/util/StaticUtils.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/util/StaticUtils.java
@@ -52,6 +52,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -4445,5 +4446,57 @@
     }
     return (char) byteValue;
   }
+
+  /**
+   * Add all of the superior objectclasses to the specified objectclass
+   * map if they don't already exist. Used by add and import-ldif to
+   * add missing superior objectclasses to entries that don't have them.
+   *
+   * @param objectClasses A Map of objectclasses.
+   */
+  public static void addSuperiorObjectClasses(Map<ObjectClass,
+      String> objectClasses) {
+      HashSet<ObjectClass> additionalClasses = null;
+      for (ObjectClass oc : objectClasses.keySet())
+      {
+        ObjectClass superiorClass = oc.getSuperiorClass();
+        if ((superiorClass != null) &&
+            (! objectClasses.containsKey(superiorClass)))
+        {
+          if (additionalClasses == null)
+          {
+            additionalClasses = new HashSet<ObjectClass>();
+          }
+
+          additionalClasses.add(superiorClass);
+        }
+      }
+
+      if (additionalClasses != null)
+      {
+        for (ObjectClass oc : additionalClasses)
+        {
+          addObjectClassChain(oc, objectClasses);
+        }
+      }
+  }
+
+  private static void addObjectClassChain(ObjectClass objectClass,
+      Map<ObjectClass, String> objectClasses)
+  {
+    if (objectClasses != null){
+      if (! objectClasses.containsKey(objectClass))
+      {
+        objectClasses.put(objectClass, objectClass.getNameOrOID());
+      }
+
+      ObjectClass superiorClass = objectClass.getSuperiorClass();
+      if ((superiorClass != null) &&
+          (! objectClasses.containsKey(superiorClass)))
+      {
+        addObjectClassChain(superiorClass, objectClasses);
+      }
+    }
+  }
 }
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendAddOperation.java b/opendj-sdk/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendAddOperation.java
index c81a413..69483c8 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendAddOperation.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendAddOperation.java
@@ -442,33 +442,9 @@
           break addProcessing;
         }
 
-
-        // Check to make sure that all objectclasses have their superior classes
-        // listed in the entry.  If not, then add them.
-        HashSet<ObjectClass> additionalClasses = null;
-        for (ObjectClass oc : objectClasses.keySet())
-        {
-          ObjectClass superiorClass = oc.getSuperiorClass();
-          if ((superiorClass != null) &&
-              (! objectClasses.containsKey(superiorClass)))
-          {
-            if (additionalClasses == null)
-            {
-              additionalClasses = new HashSet<ObjectClass>();
-            }
-
-            additionalClasses.add(superiorClass);
-          }
-        }
-
-        if (additionalClasses != null)
-        {
-          for (ObjectClass oc : additionalClasses)
-          {
-            addObjectClassChain(oc);
-          }
-        }
-
+        //Add any superior objectclass(s) missing in an entries
+        //objectclass map.
+        addSuperiorObjectClasses(objectClasses);
 
         // Create an entry object to encapsulate the set of attributes and
         // objectclasses.

--
Gitblit v1.10.0