From 18fc2b43a7ae080ae7f4e02844dbf576030773aa Mon Sep 17 00:00:00 2001 From: BezrukovM Date: Wed, 7 Mar 2018 01:15:31 +0300 Subject: [PATCH] fixed metadata extension logic --- .../axl/AXLExtensionSchemaDefinition.java | 2 +- .../axl/AXLExtensionSchemasContainer.java | 27 +++++-- .../verapdf/model/impl/axl/AXLXMPPackage.java | 63 ++++++++++------ .../tools/xmp/SchemasDefinitionCreator.java | 71 ++++++++++++++++--- .../model/tools/xmp/ValidatorsContainer.java | 9 +++ .../tools/xmp/ValidatorsContainerCreator.java | 35 ++------- 6 files changed, 141 insertions(+), 66 deletions(-) diff --git a/core/src/main/java/org/verapdf/model/impl/axl/AXLExtensionSchemaDefinition.java b/core/src/main/java/org/verapdf/model/impl/axl/AXLExtensionSchemaDefinition.java index 0f92cd8d2..11653ff49 100644 --- a/core/src/main/java/org/verapdf/model/impl/axl/AXLExtensionSchemaDefinition.java +++ b/core/src/main/java/org/verapdf/model/impl/axl/AXLExtensionSchemaDefinition.java @@ -42,7 +42,7 @@ public class AXLExtensionSchemaDefinition extends AXLExtensionSchemaObject imple public static final String EXTENSION_SCHEMA_PROPERTIES = "ExtensionSchemaProperties"; public static final String EXTENSION_SCHEMA_VALUE_TYPES = "ExtensionSchemaValueTypes"; - private static final String NAMESPACE_URI = "namespaceURI"; + public static final String NAMESPACE_URI = "namespaceURI"; private static final String PREFIX = "prefix"; private static final String PROPERTY = "property"; private static final String SCHEMA = "schema"; diff --git a/core/src/main/java/org/verapdf/model/impl/axl/AXLExtensionSchemasContainer.java b/core/src/main/java/org/verapdf/model/impl/axl/AXLExtensionSchemasContainer.java index a02652231..4ddbc20b6 100644 --- a/core/src/main/java/org/verapdf/model/impl/axl/AXLExtensionSchemasContainer.java +++ b/core/src/main/java/org/verapdf/model/impl/axl/AXLExtensionSchemasContainer.java @@ -20,16 +20,20 @@ */ package org.verapdf.model.impl.axl; +import com.adobe.xmp.XMPConst; import com.adobe.xmp.impl.VeraPDFXMPNode; import com.adobe.xmp.options.PropertyOptions; import org.verapdf.model.baselayer.Object; +import org.verapdf.model.tools.xmp.SchemasDefinition; import org.verapdf.model.tools.xmp.ValidatorsContainer; +import org.verapdf.model.tools.xmp.ValidatorsContainerCreator; import org.verapdf.model.xmplayer.ExtensionSchemasContainer; import org.verapdf.pdfa.flavours.PDFAFlavour; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; /** * @author Maksim Bezrukov @@ -41,11 +45,11 @@ public class AXLExtensionSchemasContainer extends AXLXMPObject implements Extens public static final String EXTENSION_SCHEMA_DEFINITIONS = "ExtensionSchemaDefinitions"; protected VeraPDFXMPNode xmpNode; - protected final ValidatorsContainer containerForPDFA_1; - protected final ValidatorsContainer containerForPDFA_2_3; + protected final Map containerForPDFA_1; + protected final Map containerForPDFA_2_3; protected final PDFAFlavour flavour; - public AXLExtensionSchemasContainer(VeraPDFXMPNode xmpNode, ValidatorsContainer containerForPDFA_1, ValidatorsContainer containerForPDFA_2_3, PDFAFlavour flavour) { + public AXLExtensionSchemasContainer(VeraPDFXMPNode xmpNode, Map containerForPDFA_1, Map containerForPDFA_2_3, PDFAFlavour flavour) { super(EXTENSION_SCHEMAS_CONTAINER); this.xmpNode = xmpNode; this.containerForPDFA_1 = containerForPDFA_1; @@ -71,7 +75,22 @@ private List getExtensionSchemaDefinitions() { if (this.xmpNode != null && this.xmpNode.getOptions().isArray()) { List res = new ArrayList<>(); for (VeraPDFXMPNode node : this.xmpNode.getChildren()) { - res.add(new AXLExtensionSchemaDefinition(node, this.containerForPDFA_1, this.containerForPDFA_2_3, this.flavour)); + ValidatorsContainer containerForPDFA_1 = ValidatorsContainerCreator.EMPTY_VALIDATORS_CONTAINER; + ValidatorsContainer containerForPDFA_2_3 = ValidatorsContainerCreator.EMPTY_VALIDATORS_CONTAINER; + for (VeraPDFXMPNode child : node.getChildren()) { + if (XMPConst.NS_PDFA_SCHEMA.equals(child.getNamespaceURI()) && AXLExtensionSchemaDefinition.NAMESPACE_URI.equals(child.getName())) { + String namespace = child.getValue(); + SchemasDefinition schemasDefinitionForPDFA_1 = this.containerForPDFA_1.get(namespace); + if (schemasDefinitionForPDFA_1 != null) { + containerForPDFA_1 = schemasDefinitionForPDFA_1.getValidatorsContainer(); + } + SchemasDefinition schemasDefinitionForPDFA_2_3 = this.containerForPDFA_2_3.get(namespace); + if (schemasDefinitionForPDFA_2_3 != null) { + containerForPDFA_2_3 = schemasDefinitionForPDFA_2_3.getValidatorsContainer(); + } + } + } + res.add(new AXLExtensionSchemaDefinition(node, containerForPDFA_1, containerForPDFA_2_3, this.flavour)); } return Collections.unmodifiableList(res); } diff --git a/core/src/main/java/org/verapdf/model/impl/axl/AXLXMPPackage.java b/core/src/main/java/org/verapdf/model/impl/axl/AXLXMPPackage.java index a3d091c84..01a667ff5 100644 --- a/core/src/main/java/org/verapdf/model/impl/axl/AXLXMPPackage.java +++ b/core/src/main/java/org/verapdf/model/impl/axl/AXLXMPPackage.java @@ -32,6 +32,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -56,9 +57,9 @@ public class AXLXMPPackage extends AXLXMPObject implements XMPPackage { private final boolean isMainMetadata; private final PDFAFlavour flavour; private final boolean isClosedChoiceCheck; - private SchemasDefinition mainPackageSchemasDefinition; - private SchemasDefinition currentSchemasDefinitionPDFA_1; - private SchemasDefinition currentSchemasDefinitionPDFA_2_3; + private Map mainPackageSchemasDefinition; + private Map currentSchemasDefinitionPDFA_1; + private Map currentSchemasDefinitionPDFA_2_3; public AXLXMPPackage(VeraPDFMeta xmpMetadata, boolean isSerializationValid, boolean isClosedChoiceCheck, @@ -111,9 +112,8 @@ private List getExtensionSchemasContainers() { && this.xmpMetadata.getExtensionSchemasNode() != null) { List res = new ArrayList<>(1); res.add(new AXLExtensionSchemasContainer(this.getXmpMetadata() - .getExtensionSchemasNode(), getCurrentSchemasDefinitionPDFA_1() - .getValidatorsContainer(), - getCurrentSchemasDefinitionPDFA_2_3().getValidatorsContainer(), + .getExtensionSchemasNode(), getCurrentSchemasDefinitionPDFA_1(), + getCurrentSchemasDefinitionPDFA_2_3(), this.flavour)); return Collections.unmodifiableList(res); } @@ -135,20 +135,21 @@ protected List getXMPProperties() { } private AXLXMPProperty createProperty(VeraPDFXMPNode node) { - if (XMPConst.NS_XMP_MM.equals(node.getNamespaceURI()) + String namespaceURI = node.getNamespaceURI(); + if (XMPConst.NS_XMP_MM.equals(namespaceURI) && "History".equals(node.getName())) { return new AXLXMPMMHistoryProperty(node, this.isMainMetadata, - this.isClosedChoiceCheck, this - .getMainPackageSchemasDefinition(), this - .getCurrentSchemasDefinitionPDFA_1(), this - .getCurrentSchemasDefinitionPDFA_2_3(), + this.isClosedChoiceCheck, + this.getMainPackageSchemasDefinitionForNS(namespaceURI), + this.getCurrentSchemasDefinitionPDFA_1ForNS(namespaceURI), + this.getCurrentSchemasDefinitionPDFA_2_3ForNS(namespaceURI), this.flavour); } return new AXLXMPProperty(node, this.isMainMetadata, - this.isClosedChoiceCheck, this - .getMainPackageSchemasDefinition(), this - .getCurrentSchemasDefinitionPDFA_1(), this - .getCurrentSchemasDefinitionPDFA_2_3(), + this.isClosedChoiceCheck, + this.getMainPackageSchemasDefinitionForNS(namespaceURI), + this.getCurrentSchemasDefinitionPDFA_1ForNS(namespaceURI), + this.getCurrentSchemasDefinitionPDFA_2_3ForNS(namespaceURI), this.flavour); } @@ -193,14 +194,14 @@ private String getAttributeByRegexp(String regexp) { return null; } - protected SchemasDefinition getMainPackageSchemasDefinition() { + protected Map getMainPackageSchemasDefinition() { if (this.mainPackageSchemasDefinition == null) { this.mainPackageSchemasDefinition = SchemasDefinitionCreator.EMPTY_SCHEMAS_DEFINITION; } return this.mainPackageSchemasDefinition; } - protected SchemasDefinition getCurrentSchemasDefinitionPDFA_1() { + protected Map getCurrentSchemasDefinitionPDFA_1() { if (this.currentSchemasDefinitionPDFA_1 == null) { if (this.xmpMetadata != null && this.xmpMetadata.getExtensionSchemasNode() != null) { @@ -215,18 +216,38 @@ protected SchemasDefinition getCurrentSchemasDefinitionPDFA_1() { return this.currentSchemasDefinitionPDFA_1; } - protected SchemasDefinition getCurrentSchemasDefinitionPDFA_2_3() { + protected Map getCurrentSchemasDefinitionPDFA_2_3() { if (this.currentSchemasDefinitionPDFA_2_3 == null) { if (this.xmpMetadata != null && this.xmpMetadata.getExtensionSchemasNode() != null) { - this.currentSchemasDefinitionPDFA_2_3 = SchemasDefinitionCreator - .createExtendedSchemasDefinitionForPDFA_2_3( + this.currentSchemasDefinitionPDFA_2_3 = isMainMetadata ? + SchemasDefinitionCreator.createExtendedSchemasDefinitionForPDFA_2_3( this.xmpMetadata.getExtensionSchemasNode(), - this.isClosedChoiceCheck); + this.isClosedChoiceCheck) : + SchemasDefinitionCreator.extendSchemasDefinitionForPDFA_2_3( + getMainPackageSchemasDefinition(), + this.xmpMetadata.getExtensionSchemasNode(), + this.isClosedChoiceCheck + ); } else { this.currentSchemasDefinitionPDFA_2_3 = SchemasDefinitionCreator.EMPTY_SCHEMAS_DEFINITION; } } return this.currentSchemasDefinitionPDFA_2_3; } + + protected SchemasDefinition getMainPackageSchemasDefinitionForNS(String nameSpace) { + SchemasDefinition schemasDefinition = getMainPackageSchemasDefinition().get(nameSpace); + return schemasDefinition == null ? SchemasDefinitionCreator.EMPTY_SCHEMA_DEFINITION : schemasDefinition; + } + + protected SchemasDefinition getCurrentSchemasDefinitionPDFA_1ForNS(String nameSpace) { + SchemasDefinition schemasDefinition = getCurrentSchemasDefinitionPDFA_1().get(nameSpace); + return schemasDefinition == null ? SchemasDefinitionCreator.EMPTY_SCHEMA_DEFINITION : schemasDefinition; + } + + protected SchemasDefinition getCurrentSchemasDefinitionPDFA_2_3ForNS(String nameSpace) { + SchemasDefinition schemasDefinition = getCurrentSchemasDefinitionPDFA_2_3().get(nameSpace); + return schemasDefinition == null ? SchemasDefinitionCreator.EMPTY_SCHEMA_DEFINITION : schemasDefinition; + } } diff --git a/core/src/main/java/org/verapdf/model/tools/xmp/SchemasDefinitionCreator.java b/core/src/main/java/org/verapdf/model/tools/xmp/SchemasDefinitionCreator.java index 75c78357b..41c761430 100644 --- a/core/src/main/java/org/verapdf/model/tools/xmp/SchemasDefinitionCreator.java +++ b/core/src/main/java/org/verapdf/model/tools/xmp/SchemasDefinitionCreator.java @@ -23,7 +23,10 @@ import com.adobe.xmp.XMPConst; import com.adobe.xmp.impl.VeraPDFXMPNode; +import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.regex.Pattern; /** @@ -31,7 +34,8 @@ */ public class SchemasDefinitionCreator { - public static final SchemasDefinition EMPTY_SCHEMAS_DEFINITION = new SchemasDefinition(); + public static final Map EMPTY_SCHEMAS_DEFINITION = Collections.emptyMap(); + public static final SchemasDefinition EMPTY_SCHEMA_DEFINITION = new SchemasDefinition(); private static SchemasDefinition PREDEFINED_SCHEMA_DEFINITION_WITHOUT_CLOSED_CHOICE_FOR_PDFA_1 = null; private static SchemasDefinition PREDEFINED_SCHEMA_DEFINITION_WITHOUT_CLOSED_CHOICE_FOR_PDFA_2_3 = null; private static SchemasDefinition PREDEFINED_SCHEMA_DEFINITION_WITH_CLOSED_CHOICE_FOR_PDFA_1 = null; @@ -79,8 +83,9 @@ public static SchemasDefinition getPredefinedSchemaDefinitionForPDFA_2_3(boolean * @param schemas extension schemas container node * @return created Schemas Definition object */ - public static SchemasDefinition createExtendedSchemasDefinitionForPDFA_1(VeraPDFXMPNode schemas, boolean isClosedFieldsCheck) { - return createExtendedSchemasDefinition(schemas, true, isClosedFieldsCheck); + public static Map createExtendedSchemasDefinitionForPDFA_1(VeraPDFXMPNode schemas, + boolean isClosedFieldsCheck) { + return createExtendedSchemasDefinition(Collections.emptyMap(), schemas, true, isClosedFieldsCheck); } /** @@ -89,30 +94,58 @@ public static SchemasDefinition createExtendedSchemasDefinitionForPDFA_1(VeraPDF * @param schemas extension schemas container node * @return created Schemas Definition object */ - public static SchemasDefinition createExtendedSchemasDefinitionForPDFA_2_3(VeraPDFXMPNode schemas, boolean isClosedFieldsCheck) { - return createExtendedSchemasDefinition(schemas, false, isClosedFieldsCheck); + public static Map createExtendedSchemasDefinitionForPDFA_2_3(VeraPDFXMPNode schemas, + boolean isClosedFieldsCheck) { + return extendSchemasDefinitionForPDFA_2_3(Collections.emptyMap(), schemas, isClosedFieldsCheck); } - private static SchemasDefinition createExtendedSchemasDefinition(VeraPDFXMPNode schemas, boolean isPDFA_1, boolean isClosedFieldsCheck) { + /** + * Extends already created extended schemas definitions object valid for PDF/A-2 or for PDF/A-3 without properties + * This method doesn't require PDF/A-1 analog because extended schemas extensions aren't allowed in PDF/A-1 + * + * @param extendedSchemas extended schemas for extension + * @param schemas extension schemas container node + * @return created Schemas Definition object + */ + public static Map extendSchemasDefinitionForPDFA_2_3(Map extendedSchemas, + VeraPDFXMPNode schemas, + boolean isClosedFieldsCheck) { + if (extendedSchemas == null) { + throw new IllegalArgumentException("Nothing to extend"); + } + return createExtendedSchemasDefinition(extendedSchemas, schemas, false, isClosedFieldsCheck); + } + + private static Map createExtendedSchemasDefinition(Map extendedSchema, + VeraPDFXMPNode schemas, + boolean isPDFA_1, + boolean isClosedFieldsCheck) { if (schemas == null) { return EMPTY_SCHEMAS_DEFINITION; } if (!(XMPConst.NS_PDFA_EXTENSION.equals(schemas.getNamespaceURI()) && "schemas".equals(schemas.getName()) && schemas.getOptions().isArray())) { return EMPTY_SCHEMAS_DEFINITION; } - ValidatorsContainer typeContainer = isPDFA_1 ? ValidatorsContainerCreator.createExtendedValidatorsContainerForPDFA_1(schemas, isClosedFieldsCheck) : - ValidatorsContainerCreator.createExtendedValidatorsContainerForPDFA_2_3(schemas, isClosedFieldsCheck); - SchemasDefinition res = new SchemasDefinition(typeContainer); + Map valueType = new HashMap<>(extendedSchema.size()); + for (Map.Entry entry : extendedSchema.entrySet()) { + valueType.put(entry.getKey(), entry.getValue().getValidatorsContainer()); + } + Map res = new HashMap<>(); List schemasNodes = schemas.getChildren(); for (VeraPDFXMPNode node : schemasNodes) { - registerAllPropertiesFromExtensionSchemaNode(node, res); + registerAllPropertiesFromExtensionSchemaNode(node, res, valueType, isPDFA_1, isClosedFieldsCheck); } return res; } - private static void registerAllPropertiesFromExtensionSchemaNode(VeraPDFXMPNode schema, SchemasDefinition schemasDefinition) { + private static void registerAllPropertiesFromExtensionSchemaNode(VeraPDFXMPNode schema, + Map schemasMap, + Map oldValidators, + boolean isPDFA_1, + boolean isClosedFieldsCheck) { List schemaChildren = schema.getChildren(); VeraPDFXMPNode propertyNode = null; + VeraPDFXMPNode valueTypeNode = null; String namespaceURI = null; for (VeraPDFXMPNode child : schemaChildren) { if (XMPConst.NS_PDFA_SCHEMA.equals(child.getNamespaceURI())) { @@ -122,6 +155,11 @@ private static void registerAllPropertiesFromExtensionSchemaNode(VeraPDFXMPNode propertyNode = child; } break; + case "valueType": + if (child.getOptions().isArray()) { + valueTypeNode = child; + } + break; case "namespaceURI": namespaceURI = child.getValue(); break; @@ -131,7 +169,18 @@ private static void registerAllPropertiesFromExtensionSchemaNode(VeraPDFXMPNode } } if (namespaceURI != null && propertyNode != null) { + ValidatorsContainer validatorsContainer = oldValidators.get(namespaceURI); + ValidatorsContainer currentContainer; + if (validatorsContainer == null) { + currentContainer = isPDFA_1 ? ValidatorsContainerCreator.createValidatorsContainerPredefinedForPDFA_1(isClosedFieldsCheck) : + ValidatorsContainerCreator.createValidatorsContainerPredefinedForPDFA_2_3(isClosedFieldsCheck); + } else { + currentContainer = new ValidatorsContainer(validatorsContainer); + } + ValidatorsContainerCreator.extendValidatorsContainer(currentContainer, valueTypeNode); + SchemasDefinition schemasDefinition = new SchemasDefinition(currentContainer); registerAllPropertiesFromPropertyArrayNode(namespaceURI, propertyNode, schemasDefinition); + schemasMap.put(namespaceURI, schemasDefinition); } } diff --git a/core/src/main/java/org/verapdf/model/tools/xmp/ValidatorsContainer.java b/core/src/main/java/org/verapdf/model/tools/xmp/ValidatorsContainer.java index c465097a0..a81993454 100644 --- a/core/src/main/java/org/verapdf/model/tools/xmp/ValidatorsContainer.java +++ b/core/src/main/java/org/verapdf/model/tools/xmp/ValidatorsContainer.java @@ -54,6 +54,15 @@ public class ValidatorsContainer { } } + /** + * Creates new copy of validators container + * @param validatorsContainer to copy + */ + ValidatorsContainer(ValidatorsContainer validatorsContainer) { + this.validators = new HashMap<>(validatorsContainer.validators); + this.arrayValidators = new HashMap<>(validatorsContainer.arrayValidators); + } + boolean registerSimpleValidator(String typeName, Pattern pattern) { if (pattern == null) { throw new IllegalArgumentException("Argument pattern can not be null"); diff --git a/core/src/main/java/org/verapdf/model/tools/xmp/ValidatorsContainerCreator.java b/core/src/main/java/org/verapdf/model/tools/xmp/ValidatorsContainerCreator.java index 1cf8ecd43..73de52bde 100644 --- a/core/src/main/java/org/verapdf/model/tools/xmp/ValidatorsContainerCreator.java +++ b/core/src/main/java/org/verapdf/model/tools/xmp/ValidatorsContainerCreator.java @@ -34,6 +34,7 @@ */ public class ValidatorsContainerCreator { + public static ValidatorsContainer EMPTY_VALIDATORS_CONTAINER = new ValidatorsContainer(); private static ValidatorsContainer PREDEFINED_CONTAINER_WITHOUT_CLOSED_CHOICE_FOR_PDFA_1 = null; private static ValidatorsContainer PREDEFINED_CONTAINER_WITHOUT_CLOSED_CHOICE_FOR_PDFA_2_3 = null; private static ValidatorsContainer PREDEFINED_CONTAINER_WITH_CLOSED_CHOICE_FOR_PDFA_1 = null; @@ -65,7 +66,7 @@ static ValidatorsContainer getPredefinedContainerForPDFA_2_3(boolean isClosedFie return PREDEFINED_CONTAINER_WITHOUT_CLOSED_CHOICE_FOR_PDFA_2_3; } - private static ValidatorsContainer createValidatorsContainerPredefinedForPDFA_1(boolean isClosedFieldsCheck) { + static ValidatorsContainer createValidatorsContainerPredefinedForPDFA_1(boolean isClosedFieldsCheck) { ValidatorsContainer container = createBasicValidatorsContainer(isClosedFieldsCheck); container.registerSimpleValidator(XMPConstants.GPS_COORDINATE, Pattern.compile("^\\d{2},\\d{2}[,\\.]\\d{2}[NSEW]$")); //Locale strong validation requires next regexp for XMP2004: "^([a-zA-Z]{1,8})((-[a-zA-Z]{1,8})*)$" @@ -73,7 +74,7 @@ private static ValidatorsContainer createValidatorsContainerPredefinedForPDFA_1( return container; } - private static ValidatorsContainer createValidatorsContainerPredefinedForPDFA_2_3(boolean isClosedFieldsCheck) { + static ValidatorsContainer createValidatorsContainerPredefinedForPDFA_2_3(boolean isClosedFieldsCheck) { ValidatorsContainer container = createBasicValidatorsContainer(isClosedFieldsCheck); container.registerSimpleValidator(XMPConstants.GPS_COORDINATE, Pattern.compile("^\\d{1,3},\\d{1,2}(,\\d{1,2}|\\.\\d+)[NSEW]$")); //Locale strong validation requires next regexp for XMP2005: "^([a-zA-Z]{1,8})((-[a-zA-Z0-9]{1,8})*)$" @@ -146,37 +147,13 @@ private static ValidatorsContainer createBasicValidatorsContainer(boolean isClos return container; } - static ValidatorsContainer createExtendedValidatorsContainerForPDFA_1(VeraPDFXMPNode extensionContainer, boolean isClosedFieldsCheck) { - ValidatorsContainer container = createValidatorsContainerPredefinedForPDFA_1(isClosedFieldsCheck); - return createExtendedValidatorsContainer(extensionContainer, container); - } - - static ValidatorsContainer createExtendedValidatorsContainerForPDFA_2_3(VeraPDFXMPNode extensionContainer, boolean isClosedFieldsCheck) { - ValidatorsContainer container = createValidatorsContainerPredefinedForPDFA_2_3(isClosedFieldsCheck); - return createExtendedValidatorsContainer(extensionContainer, container); - } - - private static ValidatorsContainer createExtendedValidatorsContainer(VeraPDFXMPNode schemasDefinitions, ValidatorsContainer container) { - List schemas = schemasDefinitions.getChildren(); - for (VeraPDFXMPNode node : schemas) { - registerAllTypesFromExtensionSchemaNode(node, container); + static ValidatorsContainer extendValidatorsContainer(ValidatorsContainer container, VeraPDFXMPNode valueTypeContainer) { + if (valueTypeContainer != null) { + registerAllTypesFromValueTypeArrayNode(valueTypeContainer, container); } return container; } - private static void registerAllTypesFromExtensionSchemaNode(VeraPDFXMPNode schema, ValidatorsContainer container) { - List schemaChildren = schema.getChildren(); - for (int i = schemaChildren.size() - 1; i >= 0; --i) { - VeraPDFXMPNode child = schemaChildren.get(i); - if (XMPConst.NS_PDFA_SCHEMA.equals(child.getNamespaceURI()) && "valueType".equals(child.getName())) { - if (child.getOptions().isArray()) { - registerAllTypesFromValueTypeArrayNode(child, container); - } - break; - } - } - } - private static void registerAllTypesFromValueTypeArrayNode(VeraPDFXMPNode valueTypes, ValidatorsContainer container) { List children = valueTypes.getChildren(); for (VeraPDFXMPNode node : children) {