From 7a48c327a34c8f6ba655d4803601d7d71d683eb0 Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Fri, 01 Jul 2016 12:53:43 +0000
Subject: [PATCH] OPENDJ-2956 Issue warnings during schema validation of a matching rule use if it references obsolete elements
---
opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/MatchingRuleUse.java | 14 ++++++++++----
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/MatchingRuleTestCase.java | 10 +++++++---
opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java | 20 --------------------
opendj-core/src/main/resources/com/forgerock/opendj/ldap/core.properties | 4 ++++
opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java | 2 +-
5 files changed, 22 insertions(+), 28 deletions(-)
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/MatchingRuleUse.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/MatchingRuleUse.java
index eb965f9..059ea99 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/MatchingRuleUse.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/MatchingRuleUse.java
@@ -17,9 +17,7 @@
package org.forgerock.opendj.ldap.schema;
import static java.util.Arrays.*;
-
import static org.forgerock.opendj.ldap.schema.SchemaUtils.*;
-
import static com.forgerock.opendj.ldap.CoreMessages.*;
import java.util.Collection;
@@ -464,7 +462,7 @@
}
}
- void validate(final Schema schema) throws SchemaException {
+ void validate(final Schema schema, final List<LocalizableMessage> warnings) throws SchemaException {
try {
matchingRule = schema.getMatchingRule(oid);
} catch (final UnknownSchemaElementException e) {
@@ -474,16 +472,24 @@
ERR_ATTR_SYNTAX_MRUSE_UNKNOWN_MATCHING_RULE1.get(getNameOrOID(), oid);
throw new SchemaException(message, e);
}
+ if (!isObsolete() && matchingRule.isObsolete()) {
+ warnings.add(WARN_MATCHING_RULE_USE_HAS_OBSOLETE_MATCHING_RULE.get(getNameOrOID(), oid));
+ }
attributes = new HashSet<>(attributeOIDs.size());
for (final String attribute : attributeOIDs) {
+ AttributeType attributeType;
try {
- attributes.add(schema.getAttributeType(attribute));
+ attributeType = schema.getAttributeType(attribute);
+ attributes.add(attributeType);
} catch (final UnknownSchemaElementException e) {
final LocalizableMessage message =
ERR_ATTR_SYNTAX_MRUSE_UNKNOWN_ATTR1.get(getNameOrOID(), attribute);
throw new SchemaException(message, e);
}
+ if (!isObsolete() && attributeType.isObsolete()) {
+ warnings.add(WARN_MATCHING_RULE_USE_HAS_OBSOLETE_ATTR.get(getNameOrOID(), attribute));
+ }
}
attributes = Collections.unmodifiableSet(attributes);
}
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 1fc632e..8654199 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
@@ -2704,7 +2704,7 @@
for (final MatchingRuleUse use : numericOID2MatchingRuleUses.values().toArray(
new MatchingRuleUse[numericOID2MatchingRuleUses.values().size()])) {
try {
- use.validate(schema);
+ use.validate(schema, warnings);
} catch (final SchemaException e) {
removeMatchingRuleUse(use);
warnings.add(ERR_MRU_VALIDATION_FAIL.get(use.toString(), e.getMessageObject()));
diff --git a/opendj-core/src/main/resources/com/forgerock/opendj/ldap/core.properties b/opendj-core/src/main/resources/com/forgerock/opendj/ldap/core.properties
index 89c7d84..2711ef2 100644
--- a/opendj-core/src/main/resources/com/forgerock/opendj/ldap/core.properties
+++ b/opendj-core/src/main/resources/com/forgerock/opendj/ldap/core.properties
@@ -1653,6 +1653,10 @@
name form "%s" which is marked as OBSOLETE in the schema
WARN_DIT_SR_HAS_OBSOLETE_SUPERIOR_RULE=The DIT structure rule "%s" specifies the \
superior rule "%s" which is marked as OBSOLETE in the schema
+WARN_MATCHING_RULE_USE_HAS_OBSOLETE_MATCHING_RULE=The matching rule use "%s" \
+ specifies the matching rule "%s" which is marked as OBSOLETE in the schema
+WARN_MATCHING_RULE_USE_HAS_OBSOLETE_ATTR=The matching rule use "%s" specifies the \
+ attribute type "%s" which is marked as OBSOLETE in the schema
# Labels for generated documentation
DOC_LOCALE_TAG=Code tag: %s
DOC_LOCALE_OID=Collation order object identifier: %s
diff --git a/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/MatchingRuleTestCase.java b/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/MatchingRuleTestCase.java
index 5e7829e..30b3b2e 100644
--- a/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/MatchingRuleTestCase.java
+++ b/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/MatchingRuleTestCase.java
@@ -11,11 +11,11 @@
* Header, with the fields enclosed by brackets [] replaced by your own identifying
* information: "Portions Copyright [year] [name of copyright owner]".
*
- * Copyright 2013-2015 ForgeRock AS.
+ * Copyright 2013-2016 ForgeRock AS.
*/
package org.forgerock.opendj.ldap.schema;
-import static org.fest.assertions.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThat;
import static org.forgerock.opendj.ldap.schema.SchemaConstants.EMR_AUTH_PASSWORD_EXACT_DESCRIPTION;
import static org.forgerock.opendj.ldap.schema.SchemaConstants.EMR_AUTH_PASSWORD_EXACT_NAME;
import static org.forgerock.opendj.ldap.schema.SchemaConstants.EMR_AUTH_PASSWORD_EXACT_OID;
@@ -27,6 +27,7 @@
import java.util.Map;
import java.util.TreeMap;
+import org.forgerock.i18n.LocalizableMessage;
import org.testng.annotations.Test;
/**
@@ -472,7 +473,10 @@
sb.addMatchingRule(definition, true);
Schema schema = sb.toSchema();
- assertThat(schema.getWarnings()).isEmpty();
+ // MR is OBSOLETE so expect warnings in the schema about this
+ for (LocalizableMessage warning : schema.getWarnings()) {
+ assertThat(warning.toString()).contains("OBSOLETE");
+ }
assertThat(schema.getMatchingRules()).isNotEmpty();
final MatchingRule mr = schema.getMatchingRule("objectIdentifierMatch");
assertThat(mr.getOID()).isEqualTo("2.5.13.0");
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java
index 9576fd0..07d1692 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java
@@ -67,7 +67,6 @@
import org.forgerock.opendj.ldap.schema.CoreSchema;
import org.forgerock.opendj.ldap.schema.DITContentRule;
import org.forgerock.opendj.ldap.schema.DITStructureRule;
-import org.forgerock.opendj.ldap.schema.MatchingRule;
import org.forgerock.opendj.ldap.schema.MatchingRuleUse;
import org.forgerock.opendj.ldap.schema.NameForm;
import org.forgerock.opendj.ldap.schema.ObjectClass;
@@ -1830,25 +1829,6 @@
}
}
- // Obsolete matching rule and attribute types are not checked by the SDK
- MatchingRule matchingRule = matchingRuleUse.getMatchingRule();
- if (matchingRule.isObsolete())
- {
- LocalizableMessage message = ERR_SCHEMA_MODIFY_MRU_OBSOLETE_MR.get(
- matchingRuleUse.getNameOrOID(), matchingRule.getNameOrOID());
- throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, message);
- }
-
- for (AttributeType at : matchingRuleUse.getAttributes())
- {
- if (at.isObsolete())
- {
- LocalizableMessage message = ERR_SCHEMA_MODIFY_MRU_OBSOLETE_ATTR.get(
- matchingRuleUse.getNameOrOID(), matchingRule.getNameOrOID());
- throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, message);
- }
- }
-
// If there is no existing matching rule use, then we're adding a new one.
// Otherwise, we're replacing an existing matching rule use.
if (existingMRU == null)
--
Gitblit v1.10.0