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