From 0550522c1525631233e9f268792ac19813f21bb4 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Mon, 03 Mar 2014 18:07:13 +0000
Subject: [PATCH] Additional fix for OPENDJ-1361: Matching Rules and Syntaxes have a reference to a schema that can be changed, leading to unexpected behavior
---
opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Syntax.java | 8 +++++++-
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SyntaxTestCase.java | 39 ++++++++++++++++++++++++++++-----------
opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java | 4 +++-
3 files changed, 38 insertions(+), 13 deletions(-)
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java
index ccbf1f2..260aaf1 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java
@@ -2712,7 +2712,8 @@
}
SchemaBuilder addMatchingRule(final MatchingRule rule, final boolean overwrite) {
- assert !rule.isValidated() : "Matching rule has already been validated, it can't be added";
+ Reject.ifTrue(rule.isValidated(),
+ "Matching rule has already been validated, it can't be added");
MatchingRule conflictingRule;
if (numericOID2MatchingRules.containsKey(rule.getOID())) {
conflictingRule = numericOID2MatchingRules.get(rule.getOID());
@@ -2848,6 +2849,7 @@
}
SchemaBuilder addSyntax(final Syntax syntax, final boolean overwrite) {
+ Reject.ifTrue(syntax.isValidated(), "Syntax has already been validated, it can't be added");
Syntax conflictingSyntax;
if (numericOID2Syntaxes.containsKey(syntax.getOID())) {
conflictingSyntax = numericOID2Syntaxes.get(syntax.getOID());
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Syntax.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Syntax.java
index af61d90..bf4c827 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Syntax.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Syntax.java
@@ -201,7 +201,13 @@
Reject.ifNull(oid);
this.oid = oid;
this.schema = schema;
- this.impl = schema.getDefaultSyntax().impl;
+
+ final Syntax defaultSyntax = schema.getDefaultSyntax();
+ this.impl = defaultSyntax.impl;
+ this.approximateMatchingRule = defaultSyntax.getApproximateMatchingRule();
+ this.equalityMatchingRule = defaultSyntax.getEqualityMatchingRule();
+ this.orderingMatchingRule = defaultSyntax.getOrderingMatchingRule();
+ this.substringMatchingRule = defaultSyntax.getSubstringMatchingRule();
}
/**
diff --git a/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SyntaxTestCase.java b/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SyntaxTestCase.java
index 97e26a1..ac0f089 100644
--- a/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SyntaxTestCase.java
+++ b/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SyntaxTestCase.java
@@ -66,24 +66,41 @@
}
/**
- * Creates an empty syntax.
+ * Tests that unrecognized syntaxes are automatically substituted with the
+ * default syntax during building.
*/
- @Test()
- public final void testCreatesEmptySyntax() {
- final SchemaBuilder sb = new SchemaBuilder();
- sb.addSchema(Schema.getCoreSchema(), false);
-
- sb.addSyntax(new Syntax(Schema.getEmptySchema(), "1.2.3.4.5"), false);
-
+ @Test
+ public final void testBuilderSubstitutesUnknownSyntaxWithDefaultSyntax() {
+ final SchemaBuilder sb = new SchemaBuilder(Schema.getCoreSchema());
+ sb.buildSyntax("1.2.3.4.5").addToSchema();
final Schema schema = sb.toSchema();
- assertThat(schema.getWarnings()).isEmpty();
+ assertThat(schema.getWarnings()).hasSize(1);
final Syntax syntax = schema.getSyntax("1.2.3.4.5");
assertThat(syntax).isNotNull();
assertThat(syntax.getDescription()).isEmpty();
- assertThat(syntax.getExtraProperties().get("X-SUBST").get(0)).isEqualTo("1.3.6.1.4.1.1466.115.121.1.40");
assertThat(syntax.getApproximateMatchingRule()).isNull();
assertThat(syntax.getEqualityMatchingRule().getNameOrOID()).isEqualTo("octetStringMatch");
- assertThat(syntax.getOrderingMatchingRule().getNameOrOID()).isEqualTo("octetStringOrderingMatch");
+ assertThat(syntax.getOrderingMatchingRule().getNameOrOID()).isEqualTo(
+ "octetStringOrderingMatch");
+ assertThat(syntax.getSubstringMatchingRule()).isNull();
+ }
+
+ /**
+ * Tests that unrecognized syntaxes are automatically substituted with the
+ * default syntax and matching rule.
+ */
+ @Test()
+ public final void testDefaultSyntaxSubstitution() {
+ final Syntax syntax = Schema.getCoreSchema().getSyntax("1.2.3.4.5");
+ assertThat(syntax).isNotNull();
+ assertThat(syntax.getDescription()).isEmpty();
+ // Dynamically created syntaxes include the X-SUBST extension.
+ assertThat(syntax.getExtraProperties().get("X-SUBST").get(0)).isEqualTo(
+ "1.3.6.1.4.1.1466.115.121.1.40");
+ assertThat(syntax.getApproximateMatchingRule()).isNull();
+ assertThat(syntax.getEqualityMatchingRule().getNameOrOID()).isEqualTo("octetStringMatch");
+ assertThat(syntax.getOrderingMatchingRule().getNameOrOID()).isEqualTo(
+ "octetStringOrderingMatch");
assertThat(syntax.getSubstringMatchingRule()).isNull();
}
--
Gitblit v1.10.0