From 0ebfbbfd2dda7a836b8d25d9473612e8cb8c85c5 Mon Sep 17 00:00:00 2001
From: neil_a_wilson <neil_a_wilson@localhost>
Date: Fri, 21 Sep 2007 00:12:01 +0000
Subject: [PATCH] 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/src/server/org/opends/server/types/Schema.java | 360 +++++++++++++++++++++++++++++++++++++-------------
opends/tests/unit-tests-testng/src/server/org/opends/server/backends/SchemaBackendTestCase.java | 42 ++++++
2 files changed, 305 insertions(+), 97 deletions(-)
diff --git a/opends/src/server/org/opends/server/types/Schema.java b/opends/src/server/org/opends/server/types/Schema.java
index a5415da..7e6391a 100644
--- a/opends/src/server/org/opends/server/types/Schema.java
+++ b/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,8 +262,9 @@
nameFormSet = new LinkedHashSet<AttributeValue>();
objectClassSet = new LinkedHashSet<AttributeValue>();
- oldestModificationTime = System.currentTimeMillis();
- youngestModificationTime = oldestModificationTime;
+ 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,12 +441,25 @@
// rather than the attribute type because otherwise it would use
// a very expensive matching rule (OID first component match)
// that would kill performance.
- String valueString = attributeType.getDefinition();
- ASN1OctetString rawValue = new ASN1OctetString(valueString);
- ASN1OctetString normValue =
- new ASN1OctetString(toLowerCase(valueString));
- attributeTypeSet.remove(new AttributeValue(rawValue,
- normValue));
+ 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 =
+ new ASN1OctetString(toLowerCase(valueString));
+ attributeTypeSet.remove(new AttributeValue(rawValue,
+ 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.
- String valueString = objectClass.getDefinition();
- ASN1OctetString rawValue = new ASN1OctetString(valueString);
- ASN1OctetString normValue =
- new ASN1OctetString(toLowerCase(valueString));
- objectClassSet.remove(new AttributeValue(rawValue, normValue));
+ 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));
+ }
}
}
@@ -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,11 +871,23 @@
// rather than the attribute type because otherwise it would use
// a very expensive matching rule (OID first component match)
// that would kill performance.
- String valueString = syntax.toString();
- ASN1OctetString rawValue = new ASN1OctetString(valueString);
- ASN1OctetString normValue =
- new ASN1OctetString(toLowerCase(valueString));
- syntaxSet.remove(new AttributeValue(rawValue, normValue));
+ 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 =
+ new ASN1OctetString(toLowerCase(valueString));
+ 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,12 +1105,25 @@
// rather than the attribute type because otherwise it would
// use a very expensive matching rule (OID first component
// match) that would kill performance.
- String valueString = matchingRule.toString();
- ASN1OctetString rawValue = new ASN1OctetString(valueString);
- ASN1OctetString normValue =
- new ASN1OctetString(toLowerCase(valueString));
- matchingRuleSet.remove(new AttributeValue(rawValue,
- normValue));
+ 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));
+ }
}
}
}
@@ -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.
- String valueString = matchingRule.toString();
- ASN1OctetString rawValue = new ASN1OctetString(valueString);
- ASN1OctetString normValue =
- new ASN1OctetString(toLowerCase(valueString));
- matchingRuleSet.remove(new AttributeValue(rawValue, normValue));
+ 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));
+ }
}
}
@@ -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.
- String valueString = matchingRule.toString();
- ASN1OctetString rawValue = new ASN1OctetString(valueString);
- ASN1OctetString normValue =
- new ASN1OctetString(toLowerCase(valueString));
- matchingRuleSet.remove(new AttributeValue(rawValue, normValue));
+ 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));
+ }
}
}
@@ -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.
- String valueString = matchingRule.toString();
- ASN1OctetString rawValue = new ASN1OctetString(valueString);
- ASN1OctetString normValue =
- new ASN1OctetString(toLowerCase(valueString));
- matchingRuleSet.remove(new AttributeValue(rawValue, normValue));
+ 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));
+ }
}
}
@@ -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.
- String valueString = matchingRule.toString();
- ASN1OctetString rawValue = new ASN1OctetString(valueString);
- ASN1OctetString normValue =
- new ASN1OctetString(toLowerCase(valueString));
- matchingRuleSet.remove(new AttributeValue(rawValue, normValue));
+ 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));
+ }
}
}
@@ -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,12 +1943,25 @@
// rather than the attribute type because otherwise it would use
// a very expensive matching rule (OID first component match)
// that would kill performance.
- String valueString = matchingRuleUse.getDefinition();
- ASN1OctetString rawValue = new ASN1OctetString(valueString);
- ASN1OctetString normValue =
- new ASN1OctetString(toLowerCase(valueString));
- matchingRuleUseSet.remove(new AttributeValue(rawValue,
- normValue));
+ 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 =
+ new ASN1OctetString(toLowerCase(valueString));
+ matchingRuleUseSet.remove(new AttributeValue(rawValue,
+ 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,12 +2103,25 @@
// rather than the attribute type because otherwise it would use
// a very expensive matching rule (OID first component match)
// that would kill performance.
- String valueString = ditContentRule.getDefinition();
- ASN1OctetString rawValue = new ASN1OctetString(valueString);
- ASN1OctetString normValue =
- new ASN1OctetString(toLowerCase(valueString));
- ditContentRuleSet.remove(new AttributeValue(rawValue,
- normValue));
+ 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 =
+ new ASN1OctetString(toLowerCase(valueString));
+ ditContentRuleSet.remove(new AttributeValue(rawValue,
+ 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,12 +2336,25 @@
// rather than the attribute type because otherwise it would use
// a very expensive matching rule (OID first component match)
// that would kill performance.
- String valueString = ditStructureRule.getDefinition();
- ASN1OctetString rawValue = new ASN1OctetString(valueString);
- ASN1OctetString normValue =
- new ASN1OctetString(toLowerCase(valueString));
- ditStructureRuleSet.remove(new AttributeValue(rawValue,
- normValue));
+ 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 =
+ new ASN1OctetString(toLowerCase(valueString));
+ ditStructureRuleSet.remove(new AttributeValue(rawValue,
+ 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,11 +2578,23 @@
// rather than the attribute type because otherwise it would use
// a very expensive matching rule (OID first component match)
// that would kill performance.
- String valueString = nameForm.getDefinition();
- ASN1OctetString rawValue = new ASN1OctetString(valueString);
- ASN1OctetString normValue =
- new ASN1OctetString(toLowerCase(valueString));
- nameFormSet.remove(new AttributeValue(rawValue, normValue));
+ 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 =
+ new ASN1OctetString(toLowerCase(valueString));
+ nameFormSet.remove(new AttributeValue(rawValue, normValue));
+ }
}
}
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/SchemaBackendTestCase.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/SchemaBackendTestCase.java
index d6ed54e..9c7db9c 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/SchemaBackendTestCase.java
+++ b/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.
--
Gitblit v1.10.0