From a849a42d97109bc9242c50c7abbd9857e865bb5e Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Fri, 24 Jun 2011 14:57:52 +0000
Subject: [PATCH] Fix OPENDJ-205: Add support for rejecting and skipping records to the LDIF readers
---
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldif/AbstractLDIFReader.java | 133 +++++++++++++++++++++++++-------------------
1 files changed, 76 insertions(+), 57 deletions(-)
diff --git a/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldif/AbstractLDIFReader.java b/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldif/AbstractLDIFReader.java
index 4230d08..7b8b0e7 100644
--- a/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldif/AbstractLDIFReader.java
+++ b/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldif/AbstractLDIFReader.java
@@ -47,6 +47,8 @@
import org.forgerock.i18n.LocalizedIllegalArgumentException;
import org.forgerock.opendj.ldap.*;
import org.forgerock.opendj.ldap.schema.Schema;
+import org.forgerock.opendj.ldap.schema.SchemaValidationPolicy;
+import org.forgerock.opendj.ldap.schema.Syntax;
import org.forgerock.opendj.ldap.schema.UnknownSchemaElementException;
import com.forgerock.opendj.util.Base64;
@@ -232,7 +234,7 @@
Schema schema = Schema.getDefaultSchema().asNonStrictSchema();
- boolean validateSchema = false;
+ SchemaValidationPolicy schemaValidationPolicy = SchemaValidationPolicy.ignoreAll();
private final LDIFReaderImpl impl;
@@ -589,7 +591,7 @@
- final void readLDIFRecordAttributeValue(final LDIFRecord record,
+ final boolean readLDIFRecordAttributeValue(final LDIFRecord record,
final String ldifLine, final Entry entry,
final List<LocalizableMessage> schemaErrors) throws DecodeException
{
@@ -606,14 +608,19 @@
{
final LocalizableMessage message = ERR_LDIF_UNKNOWN_ATTRIBUTE_TYPE.get(
record.lineNumber, entry.getName().toString(), attrDescr);
- if (validateSchema)
+ switch (schemaValidationPolicy.checkAttributesAndObjectClasses())
{
+ case REJECT:
schemaErrors.add(message);
- return;
- }
- else
- {
- throw DecodeException.error(message);
+ return false;
+ case WARN:
+ schemaErrors.add(message);
+ return true;
+ default: // Ignore
+ // This should not happen: we should be using a non-strict schema for
+ // this policy.
+ throw new IllegalStateException("Schema is not consistent with policy",
+ e);
}
}
catch (final LocalizedIllegalArgumentException e)
@@ -632,19 +639,29 @@
// known to violate the schema.
if (isAttributeExcluded(attributeDescription))
{
- return;
+ return true;
}
+ final Syntax syntax = attributeDescription.getAttributeType().getSyntax();
+
// Ensure that the binary option is present if required.
- if (!attributeDescription.getAttributeType().getSyntax()
- .isBEREncodingRequired())
+ if (!syntax.isBEREncodingRequired())
{
- if (validateSchema && attributeDescription.containsOption("binary"))
+ if (schemaValidationPolicy.checkAttributeValues().needsChecking()
+ && attributeDescription.containsOption("binary"))
{
final LocalizableMessage message = ERR_LDIF_UNEXPECTED_BINARY_OPTION
.get(record.lineNumber, entry.getName().toString(), attrDescr);
schemaErrors.add(message);
- return;
+ if (schemaValidationPolicy.checkAttributeValues().isReject())
+ {
+ return false;
+ }
+ else
+ {
+ // Skip to next attribute value.
+ return true;
+ }
}
}
else
@@ -652,64 +669,57 @@
attributeDescription = attributeDescription.withOption("binary");
}
+ final boolean checkAttributeValues = schemaValidationPolicy
+ .checkAttributeValues().needsChecking();
+ if (checkAttributeValues)
+ {
+ LocalizableMessageBuilder builder = new LocalizableMessageBuilder();
+ if (!syntax.valueIsAcceptable(value, builder))
+ {
+ schemaErrors.add(builder.toMessage());
+ if (schemaValidationPolicy.checkAttributeValues().isReject())
+ {
+ return false;
+ }
+ }
+ }
+
Attribute attribute = entry.getAttribute(attributeDescription);
if (attribute == null)
{
- if (validateSchema)
- {
- final LocalizableMessageBuilder invalidReason = new LocalizableMessageBuilder();
- if (!attributeDescription.getAttributeType().getSyntax()
- .valueIsAcceptable(value, invalidReason))
- {
- final LocalizableMessage message = WARN_LDIF_MALFORMED_ATTRIBUTE_VALUE
- .get(record.lineNumber, entry.getName().toString(),
- value.toString(), attrDescr, invalidReason);
- schemaErrors.add(message);
- return;
- }
- }
-
attribute = new LinkedAttribute(attributeDescription, value);
entry.addAttribute(attribute);
}
- else
+ else if (checkAttributeValues)
{
- if (validateSchema)
+ if (!attribute.add(value))
{
- final LocalizableMessageBuilder invalidReason = new LocalizableMessageBuilder();
- if (!attributeDescription.getAttributeType().getSyntax()
- .valueIsAcceptable(value, invalidReason))
+ final LocalizableMessage message = WARN_LDIF_DUPLICATE_ATTRIBUTE_VALUE
+ .get(record.lineNumber, entry.getName().toString(), attrDescr,
+ value.toString());
+ schemaErrors.add(message);
+ if (schemaValidationPolicy.checkAttributeValues().isReject())
{
- final LocalizableMessage message = WARN_LDIF_MALFORMED_ATTRIBUTE_VALUE
- .get(record.lineNumber, entry.getName().toString(),
- value.toString(), attrDescr, invalidReason);
- schemaErrors.add(message);
- return;
- }
-
- if (!attribute.add(value) && validateSchema)
- {
- final LocalizableMessage message = WARN_LDIF_DUPLICATE_ATTRIBUTE_VALUE
- .get(record.lineNumber, entry.getName().toString(), attrDescr,
- value.toString());
- schemaErrors.add(message);
- return;
- }
-
- if (validateSchema
- && attributeDescription.getAttributeType().isSingleValue())
- {
- final LocalizableMessage message = ERR_LDIF_MULTI_VALUED_SINGLE_VALUED_ATTRIBUTE
- .get(record.lineNumber, entry.getName().toString(), attrDescr);
- schemaErrors.add(message);
- return;
+ return false;
}
}
- else
+ else if (attributeDescription.getAttributeType().isSingleValue())
{
- attribute.add(value);
+ final LocalizableMessage message = ERR_LDIF_MULTI_VALUED_SINGLE_VALUED_ATTRIBUTE
+ .get(record.lineNumber, entry.getName().toString(), attrDescr);
+ schemaErrors.add(message);
+ if (schemaValidationPolicy.checkAttributeValues().isReject())
+ {
+ return false;
+ }
}
}
+ else
+ {
+ attribute.add(value);
+ }
+
+ return true;
}
@@ -893,6 +903,15 @@
+ final void handleSchemaValidationWarning(final LDIFRecord record,
+ final List<LocalizableMessage> messages) throws DecodeException
+ {
+ rejectedRecordListener.handleSchemaValidationWarning(record.lineNumber,
+ record.ldifLines, messages);
+ }
+
+
+
final void handleSkippedRecord(final LDIFRecord record,
final LocalizableMessage message) throws DecodeException
{
--
Gitblit v1.10.0