From d2ffb3eb61ac14df25d56086bb36b544890bb69e Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Mon, 27 Jun 2011 16:42:54 +0000
Subject: [PATCH] Fix OPENDJ-217: Unpredictable failures during schema validation using SDK

---
 opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java |  116 ++++++++++++++++++++++++++++++----------------------------
 1 files changed, 60 insertions(+), 56 deletions(-)

diff --git a/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java b/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java
index d9613e1..187aaea 100644
--- a/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java
+++ b/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java
@@ -492,6 +492,13 @@
         extraProperties = Collections.unmodifiableMap(extraProperties);
       }
 
+      if (superiorType == null && syntax == null)
+      {
+        final LocalizableMessage msg = WARN_ATTR_SYNTAX_ATTRTYPE_MISSING_SYNTAX_AND_SUPERIOR
+            .get(definition);
+        throw new LocalizedIllegalArgumentException(msg);
+      }
+
       final AttributeType attrType = new AttributeType(oid, names, description,
           isObsolete, superiorType, equalityMatchingRule, orderingMatchingRule,
           substringMatchingRule, approximateMatchingRule, syntax,
@@ -3450,7 +3457,7 @@
     {
       try
       {
-        syntax.validate(warnings, schema);
+        syntax.validate(schema, warnings);
       }
       catch (final SchemaException e)
       {
@@ -3465,7 +3472,7 @@
     {
       try
       {
-        rule.validate(warnings, schema);
+        rule.validate(schema, warnings);
       }
       catch (final SchemaException e)
       {
@@ -3475,34 +3482,30 @@
       }
     }
 
-    for (final AttributeType attribute : numericOID2AttributeTypes.values()
-        .toArray(new AttributeType[numericOID2AttributeTypes.values().size()]))
+    // Attribute types need special processing because they have hierarchical
+    // dependencies.
+    List<AttributeType> invalidAttributeTypes = new LinkedList<AttributeType>();
+    for (final AttributeType attributeType : numericOID2AttributeTypes.values())
     {
-      try
-      {
-        attribute.validate(warnings, schema);
-      }
-      catch (final SchemaException e)
-      {
-        removeAttributeType(attribute);
-        warnings.add(ERR_ATTR_TYPE_VALIDATION_FAIL.get(attribute.toString(),
-            e.getMessageObject()));
-      }
+      attributeType.validate(schema, invalidAttributeTypes, warnings);
     }
 
-    for (final ObjectClass oc : numericOID2ObjectClasses.values().toArray(
-        new ObjectClass[numericOID2ObjectClasses.values().size()]))
+    for (AttributeType attributeType : invalidAttributeTypes)
     {
-      try
-      {
-        oc.validate(warnings, schema);
-      }
-      catch (final SchemaException e)
-      {
-        removeObjectClass(oc);
-        warnings.add(ERR_OC_VALIDATION_FAIL.get(oc.toString(),
-            e.getMessageObject()));
-      }
+      removeAttributeType(attributeType);
+    }
+
+    // Object classes need special processing because they have hierarchical
+    // dependencies.
+    List<ObjectClass> invalidObjectClasses = new LinkedList<ObjectClass>();
+    for (final ObjectClass objectClass : numericOID2ObjectClasses.values())
+    {
+      objectClass.validate(schema, invalidObjectClasses, warnings);
+    }
+
+    for (ObjectClass objectClass : invalidObjectClasses)
+    {
+      removeObjectClass(objectClass);
     }
 
     for (final MatchingRuleUse use : numericOID2MatchingRuleUses.values()
@@ -3511,7 +3514,7 @@
     {
       try
       {
-        use.validate(warnings, schema);
+        use.validate(schema, warnings);
       }
       catch (final SchemaException e)
       {
@@ -3526,7 +3529,7 @@
     {
       try
       {
-        form.validate(warnings, schema);
+        form.validate(schema, warnings);
 
         // build the objectClass2NameForms map
         List<NameForm> forms;
@@ -3559,7 +3562,7 @@
     {
       try
       {
-        rule.validate(warnings, schema);
+        rule.validate(schema, warnings);
       }
       catch (final SchemaException e)
       {
@@ -3569,36 +3572,37 @@
       }
     }
 
-    for (final DITStructureRule rule : id2StructureRules.values().toArray(
-        new DITStructureRule[id2StructureRules.values().size()]))
+    // DIT structure rules need special processing because they have hierarchical
+    // dependencies.
+    List<DITStructureRule> invalidStructureRules = new LinkedList<DITStructureRule>();
+    for (final DITStructureRule rule : id2StructureRules.values())
     {
-      try
-      {
-        rule.validate(warnings, schema);
+      rule.validate(schema, invalidStructureRules, warnings);
+    }
 
-        // build the nameForm2StructureRules map
-        List<DITStructureRule> rules;
-        final String ocOID = rule.getNameForm().getOID();
-        if ((rules = nameForm2StructureRules.get(ocOID)) == null)
-        {
-          nameForm2StructureRules.put(ocOID, Collections.singletonList(rule));
-        }
-        else if (rules.size() == 1)
-        {
-          rules = new ArrayList<DITStructureRule>(rules);
-          rules.add(rule);
-          nameForm2StructureRules.put(ocOID, rules);
-        }
-        else
-        {
-          rules.add(rule);
-        }
-      }
-      catch (final SchemaException e)
+    for (DITStructureRule rule : invalidStructureRules)
+    {
+      removeDITStructureRule(rule);
+    }
+
+    for (final DITStructureRule rule : id2StructureRules.values())
+    {
+      // build the nameForm2StructureRules map
+      List<DITStructureRule> rules;
+      final String ocOID = rule.getNameForm().getOID();
+      if ((rules = nameForm2StructureRules.get(ocOID)) == null)
       {
-        removeDITStructureRule(rule);
-        warnings.add(ERR_DSR_VALIDATION_FAIL.get(rule.toString(),
-            e.getMessageObject()));
+        nameForm2StructureRules.put(ocOID, Collections.singletonList(rule));
+      }
+      else if (rules.size() == 1)
+      {
+        rules = new ArrayList<DITStructureRule>(rules);
+        rules.add(rule);
+        nameForm2StructureRules.put(ocOID, rules);
+      }
+      else
+      {
+        rules.add(rule);
       }
     }
   }

--
Gitblit v1.10.0