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/ui/BrowseSchemaPanel.java |   77 +++++++++++++++++++++++++-------------
 1 files changed, 50 insertions(+), 27 deletions(-)

diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/BrowseSchemaPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/BrowseSchemaPanel.java
index d19b798..3c485d9 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/BrowseSchemaPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/BrowseSchemaPanel.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.ui;
@@ -1492,14 +1492,7 @@
         mustAdd = false;
         for (ObjectClass o : lastSchema.getObjectClasses().values())
         {
-          boolean isChild = false;
-          ObjectClass parent = o.getSuperiorClass();
-          while (!isChild && (parent != null))
-          {
-            isChild = parent == oc;
-            parent = parent.getSuperiorClass();
-          }
-          if (isChild)
+          if (isDescendant(oc, o))
           {
             mustAdd = mustAddObjectClassName(o, f);
             if (mustAdd)
@@ -1511,13 +1504,7 @@
       }
       else if (PARENT_CLASS.equals(filterType))
       {
-        mustAdd = false;
-        ObjectClass parentClass = oc.getSuperiorClass();
-        while (!mustAdd && (parentClass != null))
-        {
-          mustAdd = mustAddObjectClassName(parentClass, f);
-          parentClass = parentClass.getSuperiorClass();
-        }
+        mustAdd = mustAddParentObjectClassName(oc, f);
       }
       else
       {
@@ -1527,6 +1514,50 @@
     return mustAdd;
   }
 
+  private boolean mustAddParentObjectClassName(ObjectClass oc, String f)
+  {
+    boolean mustAdd = false;
+    Set<ObjectClass> parents = oc.getSuperiorClasses();
+    for (ObjectClass parent : parents)
+    {
+      if (mustAddObjectClassName(parent, f) ||
+          mustAddParentObjectClassName(parent, f))
+      {
+        mustAdd = true;
+        break;
+      }
+    }
+    return mustAdd;
+  }
+
+  /**
+   * Finds out if a class is descendant of another class using equality of
+   * pointers.
+   * @param ocParent the parent object class.
+   * @param oChild the (potentially) descendant object class.
+   * @return {@code true} if the class is a descendant of the parent class
+   * and {@code false} otherwise.
+   */
+  private boolean isDescendant(ObjectClass ocParent, ObjectClass oChild)
+  {
+    Set<ObjectClass> superiors = oChild.getSuperiorClasses();
+    if (superiors == null || superiors.isEmpty())
+    {
+      return false;
+    }
+    else
+    {
+      for (ObjectClass o : oChild.getSuperiorClasses())
+      {
+        if (ocParent == o || isDescendant(ocParent, o))
+        {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
   /**
    * Check whether the provided matching rule must be added or not.
    * @param matchingRule the matching rule.
@@ -1759,17 +1790,9 @@
       int index = -1;
       for (int i=0; i<lOrderedOcs.size(); i++)
       {
-        ObjectClass parent = lOrderedOcs.get(i).getSuperiorClass();
-        while ((parent != null) && (index == -1))
+        if (lOrderedOcs.get(i).isDescendantOf(oc))
         {
-          if (parent.equals(oc))
-          {
-            index = i+1;
-          }
-          else
-          {
-            parent = parent.getSuperiorClass();
-          }
+          index = i+1;
         }
       }
       if (index == -1)
@@ -1830,7 +1853,7 @@
     {
       for (ObjectClass o : schema.getObjectClasses().values())
       {
-        if (objectClass.equals(o.getSuperiorClass()))
+        if (o.getSuperiorClasses().contains(objectClass))
         {
           childClasses.add(o);
         }

--
Gitblit v1.10.0