From 13454daacf26715c14db41291824571d7dcfe678 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.

---
 opends/src/server/org/opends/server/util/StaticUtils.java |   53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 53 insertions(+), 0 deletions(-)

diff --git a/opends/src/server/org/opends/server/util/StaticUtils.java b/opends/src/server/org/opends/server/util/StaticUtils.java
index f67d463..6c3e088 100644
--- a/opends/src/server/org/opends/server/util/StaticUtils.java
+++ b/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);
+      }
+    }
+  }
 }
 

--
Gitblit v1.10.0