mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

neil_a_wilson
21.12.2007 0ebfbbfd2dda7a836b8d25d9473612e8cb8c85c5
Update the way the server normalizes schema element definitions so that they
are more correctly handled and are more forgiving with regard to things like
extra spaces in the definition.

OpenDS Issue Number: 2171
2 files modified
278 ■■■■ changed files
opends/src/server/org/opends/server/types/Schema.java 236 ●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/backends/SchemaBackendTestCase.java 42 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/types/Schema.java
@@ -25,7 +25,6 @@
 *      Portions Copyright 2006-2007 Sun Microsystems, Inc.
 */
package org.opends.server.types;
import org.opends.messages.Message;
@@ -42,6 +41,7 @@
import java.util.TreeSet;
import java.util.concurrent.ConcurrentHashMap;
import org.opends.messages.Message;
import org.opends.server.api.ApproximateMatchingRule;
import org.opends.server.api.AttributeSyntax;
import org.opends.server.api.EqualityMatchingRule;
@@ -50,14 +50,15 @@
import org.opends.server.api.SubstringMatchingRule;
import org.opends.server.core.DirectoryServer;
import org.opends.server.core.SchemaConfigManager;
import org.opends.server.protocols.asn1.ASN1OctetString;
import static org.opends.server.config.ConfigConstants.*;
import static org.opends.server.loggers.debug.DebugLogger.*;
import org.opends.server.loggers.debug.DebugTracer;
import static org.opends.server.loggers.ErrorLogger.*;
import org.opends.server.protocols.asn1.ASN1OctetString;
import org.opends.server.schema.CaseIgnoreEqualityMatchingRule;
import static org.opends.messages.BackendMessages.*;
import static org.opends.messages.CoreMessages.*;
import static org.opends.server.config.ConfigConstants.*;
import static org.opends.server.loggers.debug.DebugLogger.*;
import static org.opends.server.loggers.ErrorLogger.*;
import static org.opends.server.util.ServerConstants.*;
import static org.opends.server.util.StaticUtils.*;
@@ -94,6 +95,10 @@
  // The matching rule that will be used to normalize schema element
  // definitions.
  private EqualityMatchingRule normalizationMatchingRule;
  // The set of subordinate attribute types registered within the
  // server schema.
  private ConcurrentHashMap<AttributeType,List<AttributeType>>
@@ -257,6 +262,7 @@
    nameFormSet         = new LinkedHashSet<AttributeValue>();
    objectClassSet      = new LinkedHashSet<AttributeValue>();
    normalizationMatchingRule = new CaseIgnoreEqualityMatchingRule();
    oldestModificationTime   = System.currentTimeMillis();
    youngestModificationTime = oldestModificationTime;
  }
@@ -398,8 +404,8 @@
      // that would kill performance.
      String valueString = attributeType.getDefinition();
      ASN1OctetString rawValue = new ASN1OctetString(valueString);
      ASN1OctetString normValue =
           new ASN1OctetString(toLowerCase(valueString));
      ByteString normValue = normalizationMatchingRule.normalizeValue(
                                  new ASN1OctetString(valueString));
      attributeTypeSet.add(new AttributeValue(rawValue, normValue));
    }
  }
@@ -435,6 +441,18 @@
      // rather than the attribute type because otherwise it would use
      // a very expensive matching rule (OID first component match)
      // that would kill performance.
      try
      {
        String valueString = attributeType.getDefinition();
        ASN1OctetString rawValue = new ASN1OctetString(valueString);
        ByteString normValue =
             normalizationMatchingRule.normalizeValue(
                  new ASN1OctetString(valueString));
        attributeTypeSet.remove(new AttributeValue(rawValue,
                                                   normValue));
      }
      catch (Exception e)
      {
      String valueString = attributeType.getDefinition();
      ASN1OctetString rawValue = new ASN1OctetString(valueString);
      ASN1OctetString normValue =
@@ -443,6 +461,7 @@
                                                 normValue));
    }
  }
  }
@@ -666,8 +685,8 @@
      // that would kill performance.
      String valueString = objectClass.getDefinition();
      ASN1OctetString rawValue = new ASN1OctetString(valueString);
      ASN1OctetString normValue =
           new ASN1OctetString(toLowerCase(valueString));
      ByteString normValue = normalizationMatchingRule.normalizeValue(
                                  new ASN1OctetString(valueString));
      objectClassSet.add(new AttributeValue(rawValue, normValue));
    }
  }
@@ -697,11 +716,25 @@
      // rather than the attribute type because otherwise it would use
      // a very expensive matching rule (OID first component match)
      // that would kill performance.
      try
      {
        String valueString = objectClass.getDefinition();
        ASN1OctetString rawValue = new ASN1OctetString(valueString);
        ByteString normValue =
             normalizationMatchingRule.normalizeValue(
                  new ASN1OctetString(valueString));
        objectClassSet.remove(new AttributeValue(rawValue,
                                                 normValue));
      }
      catch (Exception e)
      {
      String valueString = objectClass.getDefinition();
      ASN1OctetString rawValue = new ASN1OctetString(valueString);
      ASN1OctetString normValue =
           new ASN1OctetString(toLowerCase(valueString));
      objectClassSet.remove(new AttributeValue(rawValue, normValue));
        objectClassSet.remove(new AttributeValue(rawValue,
                                                 normValue));
      }
    }
  }
@@ -813,8 +846,8 @@
      // that would kill performance.
      String valueString = syntax.toString();
      ASN1OctetString rawValue = new ASN1OctetString(valueString);
      ASN1OctetString normValue =
           new ASN1OctetString(toLowerCase(valueString));
      ByteString normValue = normalizationMatchingRule.normalizeValue(
                                  new ASN1OctetString(valueString));
      syntaxSet.add(new AttributeValue(rawValue, normValue));
    }
  }
@@ -838,6 +871,17 @@
      // rather than the attribute type because otherwise it would use
      // a very expensive matching rule (OID first component match)
      // that would kill performance.
      try
      {
        String valueString = syntax.toString();
        ASN1OctetString rawValue = new ASN1OctetString(valueString);
        ByteString normValue =
             normalizationMatchingRule.normalizeValue(
                  new ASN1OctetString(valueString));
        syntaxSet.remove(new AttributeValue(rawValue, normValue));
      }
      catch (Exception e)
      {
      String valueString = syntax.toString();
      ASN1OctetString rawValue = new ASN1OctetString(valueString);
      ASN1OctetString normValue =
@@ -845,6 +889,7 @@
      syntaxSet.remove(new AttributeValue(rawValue, normValue));
    }
  }
  }
@@ -1003,8 +1048,9 @@
        // match) that would kill performance.
        String valueString = matchingRule.toString();
        ASN1OctetString rawValue  = new ASN1OctetString(valueString);
        ASN1OctetString normValue =
             new ASN1OctetString(toLowerCase(valueString));
        ByteString normValue =
             normalizationMatchingRule.normalizeValue(
                  new ASN1OctetString(valueString));
        matchingRuleSet.add(new AttributeValue(rawValue, normValue));
      }
    }
@@ -1059,6 +1105,18 @@
        // rather than the attribute type because otherwise it would
        // use a very expensive matching rule (OID first component
        // match) that would kill performance.
        try
        {
          String valueString = matchingRule.toString();
          ASN1OctetString rawValue = new ASN1OctetString(valueString);
          ByteString normValue =
               normalizationMatchingRule.normalizeValue(
                    new ASN1OctetString(valueString));
          matchingRuleSet.remove(new AttributeValue(rawValue,
                                                    normValue));
        }
        catch (Exception e)
        {
        String valueString = matchingRule.toString();
        ASN1OctetString rawValue  = new ASN1OctetString(valueString);
        ASN1OctetString normValue =
@@ -1068,6 +1126,7 @@
      }
    }
  }
  }
@@ -1181,8 +1240,8 @@
      // that would kill performance.
      String valueString = matchingRule.toString();
      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
      ASN1OctetString normValue =
           new ASN1OctetString(toLowerCase(valueString));
      ByteString normValue = normalizationMatchingRule.normalizeValue(
                                  new ASN1OctetString(valueString));
      matchingRuleSet.add(new AttributeValue(rawValue, normValue));
    }
  }
@@ -1217,11 +1276,25 @@
      // rather than the attribute type because otherwise it would use
      // a very expensive matching rule (OID first component match)
      // that would kill performance.
      try
      {
        String valueString = matchingRule.toString();
        ASN1OctetString rawValue = new ASN1OctetString(valueString);
        ByteString normValue =
             normalizationMatchingRule.normalizeValue(
                  new ASN1OctetString(valueString));
        matchingRuleSet.remove(new AttributeValue(rawValue,
                                                  normValue));
      }
      catch (Exception e)
      {
      String valueString = matchingRule.toString();
      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
      ASN1OctetString normValue =
           new ASN1OctetString(toLowerCase(valueString));
      matchingRuleSet.remove(new AttributeValue(rawValue, normValue));
        matchingRuleSet.remove(new AttributeValue(rawValue,
                                                  normValue));
      }
    }
  }
@@ -1335,8 +1408,8 @@
      // that would kill performance.
      String valueString = matchingRule.toString();
      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
      ASN1OctetString normValue =
           new ASN1OctetString(toLowerCase(valueString));
      ByteString normValue = normalizationMatchingRule.normalizeValue(
                                  new ASN1OctetString(valueString));
      matchingRuleSet.add(new AttributeValue(rawValue, normValue));
    }
  }
@@ -1372,11 +1445,25 @@
      // rather than the attribute type because otherwise it would use
      // a very expensive matching rule (OID first component match)
      // that would kill performance.
      try
      {
        String valueString = matchingRule.toString();
        ASN1OctetString rawValue = new ASN1OctetString(valueString);
        ByteString normValue =
             normalizationMatchingRule.normalizeValue(
                  new ASN1OctetString(valueString));
        matchingRuleSet.remove(new AttributeValue(rawValue,
                                                  normValue));
      }
      catch (Exception e)
      {
      String valueString = matchingRule.toString();
      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
      ASN1OctetString normValue =
           new ASN1OctetString(toLowerCase(valueString));
      matchingRuleSet.remove(new AttributeValue(rawValue, normValue));
        matchingRuleSet.remove(new AttributeValue(rawValue,
                                                  normValue));
      }
    }
  }
@@ -1490,8 +1577,8 @@
      // that would kill performance.
      String valueString = matchingRule.toString();
      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
      ASN1OctetString normValue =
           new ASN1OctetString(toLowerCase(valueString));
      ByteString normValue = normalizationMatchingRule.normalizeValue(
                                  new ASN1OctetString(valueString));
      matchingRuleSet.add(new AttributeValue(rawValue, normValue));
    }
  }
@@ -1526,11 +1613,25 @@
      // rather than the attribute type because otherwise it would use
      // a very expensive matching rule (OID first component match)
      // that would kill performance.
      try
      {
        String valueString = matchingRule.toString();
        ASN1OctetString rawValue = new ASN1OctetString(valueString);
        ByteString normValue =
             normalizationMatchingRule.normalizeValue(
                  new ASN1OctetString(valueString));
        matchingRuleSet.remove(new AttributeValue(rawValue,
                                                  normValue));
      }
      catch (Exception e)
      {
      String valueString = matchingRule.toString();
      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
      ASN1OctetString normValue =
           new ASN1OctetString(toLowerCase(valueString));
      matchingRuleSet.remove(new AttributeValue(rawValue, normValue));
        matchingRuleSet.remove(new AttributeValue(rawValue,
                                                  normValue));
      }
    }
  }
@@ -1644,8 +1745,8 @@
      // that would kill performance.
      String valueString = matchingRule.toString();
      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
      ASN1OctetString normValue =
           new ASN1OctetString(toLowerCase(valueString));
      ByteString normValue = normalizationMatchingRule.normalizeValue(
                                  new ASN1OctetString(valueString));
      matchingRuleSet.add(new AttributeValue(rawValue, normValue));
    }
  }
@@ -1680,11 +1781,25 @@
      // rather than the attribute type because otherwise it would use
      // a very expensive matching rule (OID first component match)
      // that would kill performance.
      try
      {
        String valueString = matchingRule.toString();
        ASN1OctetString rawValue = new ASN1OctetString(valueString);
        ByteString normValue =
             normalizationMatchingRule.normalizeValue(
                  new ASN1OctetString(valueString));
        matchingRuleSet.remove(new AttributeValue(rawValue,
                                                  normValue));
      }
      catch (Exception e)
      {
      String valueString = matchingRule.toString();
      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
      ASN1OctetString normValue =
           new ASN1OctetString(toLowerCase(valueString));
      matchingRuleSet.remove(new AttributeValue(rawValue, normValue));
        matchingRuleSet.remove(new AttributeValue(rawValue,
                                                  normValue));
      }
    }
  }
@@ -1801,8 +1916,8 @@
      // that would kill performance.
      String valueString = matchingRuleUse.getDefinition();
      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
      ASN1OctetString normValue =
           new ASN1OctetString(toLowerCase(valueString));
      ByteString normValue = normalizationMatchingRule.normalizeValue(
                                  new ASN1OctetString(valueString));
      matchingRuleUseSet.add(new AttributeValue(rawValue, normValue));
    }
  }
@@ -1828,6 +1943,18 @@
      // rather than the attribute type because otherwise it would use
      // a very expensive matching rule (OID first component match)
      // that would kill performance.
      try
      {
        String valueString = matchingRuleUse.getDefinition();
        ASN1OctetString rawValue = new ASN1OctetString(valueString);
        ByteString normValue =
             normalizationMatchingRule.normalizeValue(
                  new ASN1OctetString(valueString));
        matchingRuleUseSet.remove(new AttributeValue(rawValue,
                                                     normValue));
      }
      catch (Exception e)
      {
      String valueString = matchingRuleUse.getDefinition();
      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
      ASN1OctetString normValue =
@@ -1836,6 +1963,7 @@
                                                   normValue));
    }
  }
  }
@@ -1949,8 +2077,8 @@
      // that would kill performance.
      String valueString = ditContentRule.getDefinition();
      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
      ASN1OctetString normValue =
           new ASN1OctetString(toLowerCase(valueString));
      ByteString normValue = normalizationMatchingRule.normalizeValue(
                                  new ASN1OctetString(valueString));
      ditContentRuleSet.add(new AttributeValue(rawValue, normValue));
    }
  }
@@ -1975,6 +2103,18 @@
      // rather than the attribute type because otherwise it would use
      // a very expensive matching rule (OID first component match)
      // that would kill performance.
      try
      {
        String valueString = ditContentRule.getDefinition();
        ASN1OctetString rawValue = new ASN1OctetString(valueString);
        ByteString normValue =
             normalizationMatchingRule.normalizeValue(
                  new ASN1OctetString(valueString));
        ditContentRuleSet.remove(new AttributeValue(rawValue,
                                                    normValue));
      }
      catch (Exception e)
      {
      String valueString = ditContentRule.getDefinition();
      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
      ASN1OctetString normValue =
@@ -1983,6 +2123,7 @@
                                                  normValue));
    }
  }
  }
@@ -2165,8 +2306,8 @@
      // that would kill performance.
      String valueString = ditStructureRule.getDefinition();
      ASN1OctetString rawValue = new ASN1OctetString(valueString);
      ASN1OctetString normValue =
          new ASN1OctetString(toLowerCase(valueString));
      ByteString normValue = normalizationMatchingRule.normalizeValue(
                                  new ASN1OctetString(valueString));
      ditStructureRuleSet.add(new AttributeValue(rawValue,
                                                 normValue));
    }
@@ -2195,6 +2336,18 @@
      // rather than the attribute type because otherwise it would use
      // a very expensive matching rule (OID first component match)
      // that would kill performance.
      try
      {
        String valueString = ditStructureRule.getDefinition();
        ASN1OctetString rawValue = new ASN1OctetString(valueString);
        ByteString normValue =
             normalizationMatchingRule.normalizeValue(
                  new ASN1OctetString(valueString));
        ditStructureRuleSet.remove(new AttributeValue(rawValue,
                                                      normValue));
      }
      catch (Exception e)
      {
      String valueString = ditStructureRule.getDefinition();
      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
      ASN1OctetString normValue =
@@ -2203,6 +2356,7 @@
                                                    normValue));
    }
  }
  }
@@ -2394,8 +2548,8 @@
      // that would kill performance.
      String valueString = nameForm.getDefinition();
      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
      ASN1OctetString normValue =
           new ASN1OctetString(toLowerCase(valueString));
      ByteString normValue = normalizationMatchingRule.normalizeValue(
                                  new ASN1OctetString(valueString));
      nameFormSet.add(new AttributeValue(rawValue, normValue));
    }
  }
@@ -2424,6 +2578,17 @@
      // rather than the attribute type because otherwise it would use
      // a very expensive matching rule (OID first component match)
      // that would kill performance.
      try
      {
        String valueString = nameForm.getDefinition();
        ASN1OctetString rawValue = new ASN1OctetString(valueString);
        ByteString normValue =
             normalizationMatchingRule.normalizeValue(
                  new ASN1OctetString(valueString));
        nameFormSet.remove(new AttributeValue(rawValue, normValue));
      }
      catch (Exception e)
      {
      String valueString = nameForm.getDefinition();
      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
      ASN1OctetString normValue =
@@ -2431,6 +2596,7 @@
      nameFormSet.remove(new AttributeValue(rawValue, normValue));
    }
  }
  }
opends/tests/unit-tests-testng/src/server/org/opends/server/backends/SchemaBackendTestCase.java
@@ -5330,6 +5330,48 @@
  /**
   * Tests the ability to properly handle adding and removing a schema
   * definition in which the definition has extra spaces.  This was added as a
   * test case for issue #2171.
   *
   * @throws  Exception  If an unexpected problem occurs.
   */
  @Test()
  public void testAddAndDeleteDefinitionWithExtraSpaces()
         throws Exception
  {
    int resultCode = TestCaseUtils.applyModifications(
      "dn: cn=schema",
      "changetype: modify",
      "add: objectClasses",
      "objectClasses: ( testaddanddeletedefinitionwithextraspaces-oid",
      "  NAME 'testAddAndDeleteDefinitionWithExtraSpaces'  SUP person",
      "  MAY ( street $ c) X-ORIGIN 'user defined' )");
    assertEquals(resultCode, 0);
    assertNotNull(DirectoryServer.getObjectClass(
                       "testaddanddeletedefinitionwithextraspaces"));
    assertNotNull(DirectoryServer.getObjectClass(
                       "testaddanddeletedefinitionwithextraspaces-oid"));
    resultCode = TestCaseUtils.applyModifications(
      "dn: cn=schema",
      "changetype: modify",
      "delete: objectClasses",
      "objectClasses: ( testaddanddeletedefinitionwithextraspaces-oid",
      "  NAME 'testAddAndDeleteDefinitionWithExtraSpaces'  SUP person",
      "  MAY ( street $ c) X-ORIGIN 'user defined' )");
    assertEquals(resultCode, 0);
    assertNull(DirectoryServer.getObjectClass(
                    "testaddanddeletedefinitionwithextraspaces"));
    assertNull(DirectoryServer.getObjectClass(
                    "testaddanddeletedefinitionwithextraspaces-oid"));
  }
  /**
   * Tests the {@code exportLDIF} method with a valid configuration.
   *
   * @throws  Exception  If an unexpected problem occurs.