From 85811b64468e9b7a876bd352a0299b904a53a3fb Mon Sep 17 00:00:00 2001
From: ludovicp <ludovicp@localhost>
Date: Mon, 31 May 2010 12:16:23 +0000
Subject: [PATCH] Fix for Issue #615. Add support for multiple object-class inheritance. Support added in the schema, core server and tools including Control-Panel

---
 opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteSchemaElementsTask.java |   49 +++++++++++++++++++++++++++++++++++++------------
 1 files changed, 37 insertions(+), 12 deletions(-)

diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteSchemaElementsTask.java b/opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteSchemaElementsTask.java
index 2e27b76..61f3ad0 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteSchemaElementsTask.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteSchemaElementsTask.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008-2009 Sun Microsystems, Inc.
+ *      Copyright 2008-2010 Sun Microsystems, Inc.
  */
 
 package org.opends.guitools.controlpanel.task;
@@ -648,21 +648,27 @@
       }
     }
     boolean hasSuperior = false;
-    ObjectClass newSuperior = ocToDelete.getSuperiorClass();
-    for (ObjectClass oc : providedOcsToDelete)
+    Set<ObjectClass> newSuperiors = new LinkedHashSet<ObjectClass>();
+    for(ObjectClass sup : ocToDelete.getSuperiorClasses())
     {
-      if (ocToDelete.getSuperiorClass().equals(oc))
+      boolean isFound = false;
+      for(ObjectClass oc: providedOcsToDelete)
       {
-        hasSuperior = true;
-        newSuperior = oc.getSuperiorClass();
-        while (newSuperior != null &&
-            providedOcsToDelete.contains(newSuperior))
+        if(sup.equals(oc))
         {
-          newSuperior = newSuperior.getSuperiorClass();
+          hasSuperior = true;
+          isFound = true;
+          newSuperiors.add(getNewSuperior(oc));
+          break;
         }
-        break;
+      }
+      if(!isFound)
+      {
+        //Use the same super if not found in the list.
+        newSuperiors.add(sup);
       }
     }
+
     if (containsAttribute || hasSuperior)
     {
       ArrayList<String> allNames = new ArrayList<String>();
@@ -693,7 +699,7 @@
           allNames,
           ocToDelete.getOID(),
           ocToDelete.getDescription(),
-          newSuperior,
+          newSuperiors,
           required,
           optional,
           ocToDelete.getObjectClassType(),
@@ -709,6 +715,25 @@
   }
 
 
+  private ObjectClass getNewSuperior(ObjectClass currentSup)
+  {
+    if(currentSup.getSuperiorClasses() == null ||
+            currentSup.getSuperiorClasses().isEmpty())
+     {
+       return currentSup;
+     }
+
+     if(providedOcsToDelete.contains(currentSup))
+     {
+      for(ObjectClass o : currentSup.getSuperiorClasses())
+      {
+       return getNewSuperior(o);
+      }
+     }
+     return null;
+  }
+
+
   /**
    * Returns an ordered set of the attributes that must be deleted.
    * @param attrsToDelete the attributes to be deleted.
@@ -828,7 +853,7 @@
     LinkedHashSet<ObjectClass> children = new LinkedHashSet<ObjectClass>();
     for (ObjectClass oc : schema.getObjectClasses().values())
     {
-      if (objectClass.equals(oc.getSuperiorClass()))
+      if (oc.getSuperiorClasses().contains(objectClass))
       {
         children.addAll(getOrderedChildrenToDelete(oc, schema));
         children.add(oc);

--
Gitblit v1.10.0