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