This is an automated email from the ASF dual-hosted git repository. rmannibucau pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/bval.git
The following commit(s) were added to refs/heads/master by this push: new 98cd7f9 adding bean validation 3 naming handling for descriptors 98cd7f9 is described below commit 98cd7f9bbf6d497ffaef3973e3a535ab2e648595 Author: Romain Manni-Bucau <rmannibu...@gmail.com> AuthorDate: Fri Apr 30 10:22:15 2021 +0200 adding bean validation 3 naming handling for descriptors --- .../org/apache/bval/jsr/metadata/XmlBuilder.java | 2 +- .../org/apache/bval/jsr/xml/SchemaManager.java | 18 +- .../bval/jsr/xml/ValidationMappingParser.java | 2 + .../org/apache/bval/jsr/xml/ValidationParser.java | 2 + .../src/main/xsd/validation-configuration-3.0.xsd | 108 +++++++ bval-jsr/src/main/xsd/validation-mapping-3.0.xsd | 321 +++++++++++++++++++++ 6 files changed, 444 insertions(+), 9 deletions(-) diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/XmlBuilder.java b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/XmlBuilder.java index 42ce439..51ae673 100644 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/XmlBuilder.java +++ b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/XmlBuilder.java @@ -82,7 +82,7 @@ import org.apache.commons.weaver.privilizer.Privilizing.CallTo; public class XmlBuilder { //@formatter:off public enum Version { - v10("1.0"), v11("1.1"), v20("2.0"); + v10("1.0"), v11("1.1"), v20("2.0"), v30("3.0"); //@formatter:on static Version of(ConstraintMappingsType constraintMappings) { diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/xml/SchemaManager.java b/bval-jsr/src/main/java/org/apache/bval/jsr/xml/SchemaManager.java index 606dd7c..fb0e976 100644 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/xml/SchemaManager.java +++ b/bval-jsr/src/main/java/org/apache/bval/jsr/xml/SchemaManager.java @@ -21,6 +21,8 @@ package org.apache.bval.jsr.xml; import java.net.URL; import java.util.Collections; import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.SortedMap; @@ -59,7 +61,7 @@ import org.xml.sax.helpers.XMLFilterImpl; */ public class SchemaManager { public static class Builder { - private final SortedMap<Key, Lazy<Schema>> data = new TreeMap<>(); + private final Map<Key, Lazy<Schema>> data = new LinkedHashMap<>(); public Builder add(String version, String ns, String resource) { data.put(new Key(version, ns), new Lazy<>(() -> SchemaManager.loadSchema(resource))); @@ -67,7 +69,7 @@ public class SchemaManager { } public SchemaManager build() { - return new SchemaManager(new TreeMap<>(data)); + return new SchemaManager(data); } } @@ -132,7 +134,7 @@ public class SchemaManager { @Override public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { if (getContentHandler() == ch) { - final String version = Objects.toString(atts.getValue("version"), data.firstKey().getVersion()); + final String version = Objects.toString(atts.getValue("version"), data.keySet().iterator().next().getVersion()); final Key schemaKey = new Key(version, uri); Exceptions.raiseUnless(data.containsKey(schemaKey), ValidationException::new, "Unknown validation schema %s", schemaKey); @@ -181,7 +183,7 @@ public class SchemaManager { @Override public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { final Key schemaKey = - new Key(Objects.toString(atts.getValue("version"), data.firstKey().getVersion()), uri); + new Key(Objects.toString(atts.getValue("version"), data.keySet().iterator().next().getVersion()), uri); if (!target.equals(schemaKey) && data.containsKey(schemaKey)) { uri = target.ns; @@ -244,13 +246,13 @@ public class SchemaManager { } private final Key target; - private final SortedMap<Key, Lazy<Schema>> data; + private final Map<Key, Lazy<Schema>> data; private final String description; - private SchemaManager(SortedMap<Key, Lazy<Schema>> data) { + private SchemaManager(Map<Key, Lazy<Schema>> data) { super(); - this.data = Collections.unmodifiableSortedMap(data); - this.target = data.lastKey(); + this.data = Collections.unmodifiableMap(data); + this.target = data.keySet().stream().skip(data.size() - 1).findFirst().orElseThrow(IllegalStateException::new); this.description = target.ns.substring(target.ns.lastIndexOf('/') + 1); } diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationMappingParser.java b/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationMappingParser.java index 298c22d..c9067c4 100644 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationMappingParser.java +++ b/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationMappingParser.java @@ -57,6 +57,8 @@ public class ValidationMappingParser implements MetadataSource { "META-INF/validation-mapping-1.0.xsd") .add(XmlBuilder.Version.v11.getId(), "http://jboss.org/xml/ns/javax/validation/mapping", "META-INF/validation-mapping-1.1.xsd") + .add(XmlBuilder.Version.v30.getId(), "https://jakarta.ee/xml/ns/validation/mapping", + "META-INF/validation-mapping-3.0.xsd") .add(XmlBuilder.Version.v20.getId(), "http://xmlns.jcp.org/xml/ns/validation/mapping", "META-INF/validation-mapping-2.0.xsd") .build(); diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationParser.java b/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationParser.java index 70afc4e..b5615f3 100644 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationParser.java +++ b/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationParser.java @@ -62,6 +62,8 @@ public class ValidationParser { "META-INF/validation-configuration-1.0.xsd") .add(XmlBuilder.Version.v11.getId(), "http://jboss.org/xml/ns/javax/validation/configuration", "META-INF/validation-configuration-1.1.xsd") + .add(XmlBuilder.Version.v30.getId(), "https://jakarta.ee/xml/ns/validation/configuration", + "META-INF/validation-configuration-3.0.xsd") .add(XmlBuilder.Version.v20.getId(), "http://xmlns.jcp.org/xml/ns/validation/configuration", "META-INF/validation-configuration-2.0.xsd") .build(); diff --git a/bval-jsr/src/main/xsd/validation-configuration-3.0.xsd b/bval-jsr/src/main/xsd/validation-configuration-3.0.xsd new file mode 100644 index 0000000..54833a0 --- /dev/null +++ b/bval-jsr/src/main/xsd/validation-configuration-3.0.xsd @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> +<xs:schema attributeFormDefault="unqualified" + elementFormDefault="qualified" + targetNamespace="https://jakarta.ee/xml/ns/validation/configuration" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:config="https://jakarta.ee/xml/ns/validation/configuration" + version="3.0"> + + <xs:annotation> + <xs:documentation><![CDATA[ + This is the XML Schema for the Jakarta Bean Validation configuration file. + The configuration file must be named "META-INF/validation.xml". + + Jakarta Bean Validation configuration files must indicate the Jakarta Bean Validation + XML schema by using the validation namespace: + + https://jakarta.ee/xml/ns/validation/configuration + + and indicate the version of the schema by using the version attribute + as shown below: + + <validation-config + xmlns="https://jakarta.ee/xml/ns/validation/configuration" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation=" + https://jakarta.ee/xml/ns/validation/configuration + https://jakarta.ee/xml/ns/validation/validation-configuration-3.0.xsd" + version="3.0"> + [...] + </validation-config> + ]]> + </xs:documentation> + </xs:annotation> + + <xs:element name="validation-config" type="config:validation-configType"/> + <xs:complexType name="validation-configType"> + <xs:sequence> + <xs:element type="xs:string" name="default-provider" minOccurs="0"/> + <xs:element type="xs:string" name="message-interpolator" minOccurs="0"/> + <xs:element type="xs:string" name="traversable-resolver" minOccurs="0"/> + <xs:element type="xs:string" name="constraint-validator-factory" minOccurs="0"/> + <xs:element type="xs:string" name="parameter-name-provider" minOccurs="0"/> + <xs:element type="xs:string" name="clock-provider" minOccurs="0"/> + <xs:element type="xs:string" name="value-extractor" maxOccurs="unbounded" + minOccurs="0"/> + <xs:element type="config:executable-validationType" name="executable-validation" + minOccurs="0"/> + <xs:element type="xs:string" name="constraint-mapping" maxOccurs="unbounded" + minOccurs="0"/> + <xs:element type="config:propertyType" name="property" maxOccurs="unbounded" + minOccurs="0"/> + </xs:sequence> + <xs:attribute name="version" type="config:versionType" fixed="3.0" use="required"/> + </xs:complexType> + + <xs:complexType name="executable-validationType"> + <xs:sequence> + <xs:element type="config:default-validated-executable-typesType" + name="default-validated-executable-types" minOccurs="0"/> + </xs:sequence> + <xs:attribute name="enabled" use="optional" type="xs:boolean" default="true"/> + </xs:complexType> + <xs:complexType name="default-validated-executable-typesType"> + <xs:sequence> + <xs:element name="executable-type" maxOccurs="unbounded" minOccurs="1"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:enumeration value="NONE"/> + <xs:enumeration value="CONSTRUCTORS"/> + <xs:enumeration value="NON_GETTER_METHODS"/> + <xs:enumeration value="GETTER_METHODS"/> + <xs:enumeration value="ALL"/> + </xs:restriction> + </xs:simpleType> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="propertyType"> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute name="name" use="required" type="xs:string"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + <xs:simpleType name="versionType"> + <xs:restriction base="xs:token"> + <xs:pattern value="[0-9]+(\.[0-9]+)*" /> + </xs:restriction> + </xs:simpleType> +</xs:schema> diff --git a/bval-jsr/src/main/xsd/validation-mapping-3.0.xsd b/bval-jsr/src/main/xsd/validation-mapping-3.0.xsd new file mode 100644 index 0000000..86bfa94 --- /dev/null +++ b/bval-jsr/src/main/xsd/validation-mapping-3.0.xsd @@ -0,0 +1,321 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> +<xs:schema attributeFormDefault="unqualified" + elementFormDefault="qualified" + targetNamespace="https://jakarta.ee/xml/ns/validation/mapping" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:map="https://jakarta.ee/xml/ns/validation/mapping" + version="3.0"> + + <xs:annotation> + <xs:documentation><![CDATA[ + This is the XML Schema for Jakarta Bean Validation constraint mapping files. + + Jakarta Bean Validation constraint mapping files must indicate the Jakarta Bean Validation + XML schema by using the constraint mapping namespace: + + https://jakarta.ee/xml/ns/validation/mapping + + and indicate the version of the schema by using the version attribute + as shown below: + + <constraint-mappings + xmlns="https://jakarta.ee/xml/ns/validation/mapping" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation=" + https://jakarta.ee/xml/ns/validation/mapping + https://jakarta.ee/xml/ns/validation/validation-mapping-3.0.xsd" + version="3.0"> + ... + </constraint-mappings> + ]]> + </xs:documentation> + </xs:annotation> + + <xs:element name="constraint-mappings" type="map:constraint-mappingsType"/> + + <xs:complexType name="payloadType"> + <xs:sequence> + <xs:element type="xs:string" name="value" maxOccurs="unbounded" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + <xs:complexType name="groupsType"> + <xs:sequence> + <xs:element type="xs:string" name="value" maxOccurs="unbounded" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + <xs:complexType name="groupSequenceType"> + <xs:sequence> + <xs:element type="xs:string" name="value" maxOccurs="unbounded" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + <xs:complexType name="groupConversionType"> + <xs:attribute type="xs:string" name="from" use="optional"/> + <xs:attribute type="xs:string" name="to" use="required"/> + </xs:complexType> + <xs:complexType name="constraint-mappingsType"> + <xs:sequence> + <xs:element type="xs:string" name="default-package" minOccurs="0"/> + <xs:element type="map:beanType" + name="bean" + maxOccurs="unbounded" + minOccurs="0"/> + <xs:element type="map:constraint-definitionType" + name="constraint-definition" + maxOccurs="unbounded" + minOccurs="0"/> + </xs:sequence> + <xs:attribute name="version" type="map:versionType" fixed="3.0" use="required"/> + </xs:complexType> + <xs:simpleType name="versionType"> + <xs:restriction base="xs:token"> + <xs:pattern value="[0-9]+(\.[0-9]+)*"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="validated-byType"> + <xs:sequence> + <xs:element type="xs:string" name="value" maxOccurs="unbounded" minOccurs="0"/> + </xs:sequence> + <xs:attribute type="xs:boolean" name="include-existing-validators" use="optional"/> + </xs:complexType> + <xs:complexType name="constraintType"> + <xs:sequence> + <xs:element type="xs:string" name="message" minOccurs="0"/> + <xs:element type="map:groupsType" + name="groups" + minOccurs="0"/> + <xs:element type="map:payloadType" + name="payload" + minOccurs="0"/> + <xs:element type="map:elementType" + name="element" + maxOccurs="unbounded" + minOccurs="0"/> + </xs:sequence> + <xs:attribute type="xs:string" name="annotation" use="required"/> + </xs:complexType> + <xs:complexType name="elementType" mixed="true"> + <xs:sequence> + <xs:element type="xs:string" name="value" maxOccurs="unbounded" minOccurs="0"/> + <xs:element type="map:annotationType" + name="annotation" + maxOccurs="unbounded" + minOccurs="0"/> + </xs:sequence> + <xs:attribute type="xs:string" name="name" use="required"/> + </xs:complexType> + <xs:complexType name="containerElementTypeType"> + <xs:sequence> + <xs:element type="xs:string" name="valid" minOccurs="0" fixed=""/> + <xs:element type="map:groupConversionType" + name="convert-group" + minOccurs="0" + maxOccurs="unbounded"/> + <xs:element type="map:containerElementTypeType" + name="container-element-type" + maxOccurs="unbounded" + minOccurs="0"/> + <xs:element type="map:constraintType" + name="constraint" + maxOccurs="unbounded" + minOccurs="0"/> + </xs:sequence> + <xs:attribute name="type-argument-index" use="optional"> + <xs:simpleType> + <xs:restriction base="xs:int"> + <xs:minInclusive value="0" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:complexType> + <xs:complexType name="classType"> + <xs:sequence> + <xs:element type="map:groupSequenceType" + name="group-sequence" + minOccurs="0"/> + <xs:element type="map:constraintType" + name="constraint" + maxOccurs="unbounded" + minOccurs="0"/> + </xs:sequence> + <xs:attribute type="xs:boolean" name="ignore-annotations" use="optional"/> + </xs:complexType> + <xs:complexType name="beanType"> + <xs:sequence> + <xs:element type="map:classType" + name="class" + minOccurs="0"> + </xs:element> + <xs:element type="map:fieldType" + name="field" + minOccurs="0" + maxOccurs="unbounded"/> + <xs:element type="map:getterType" + name="getter" + minOccurs="0" + maxOccurs="unbounded"/> + <xs:element type="map:constructorType" + name="constructor" + minOccurs="0" + maxOccurs="unbounded"/> + <xs:element type="map:methodType" + name="method" + minOccurs="0" + maxOccurs="unbounded"/> + </xs:sequence> + <xs:attribute type="xs:string" name="class" use="required"/> + <xs:attribute type="xs:boolean" name="ignore-annotations" use="optional" + default="true"/> + </xs:complexType> + <xs:complexType name="annotationType"> + <xs:sequence> + <xs:element type="map:elementType" + name="element" + maxOccurs="unbounded" + minOccurs="0"/> + </xs:sequence> + </xs:complexType> + <xs:complexType name="getterType"> + <xs:sequence> + <xs:element type="xs:string" name="valid" minOccurs="0" fixed=""/> + <xs:element type="map:groupConversionType" + name="convert-group" + minOccurs="0" + maxOccurs="unbounded"/> + <xs:element type="map:containerElementTypeType" + name="container-element-type" + minOccurs="0" + maxOccurs="unbounded"/> + <xs:element type="map:constraintType" + name="constraint" + minOccurs="0" + maxOccurs="unbounded"/> + </xs:sequence> + <xs:attribute type="xs:string" name="name" use="required"/> + <xs:attribute type="xs:boolean" name="ignore-annotations" use="optional"/> + </xs:complexType> + <xs:complexType name="methodType"> + <xs:sequence> + <xs:element type="map:parameterType" + name="parameter" + minOccurs="0" + maxOccurs="unbounded"/> + <xs:element type="map:crossParameterType" + name="cross-parameter" + minOccurs="0" + maxOccurs="1"/> + <xs:element type="map:returnValueType" + name="return-value" + minOccurs="0" + maxOccurs="1"/> + </xs:sequence> + <xs:attribute type="xs:string" name="name" use="required"/> + <xs:attribute type="xs:boolean" name="ignore-annotations" use="optional"/> + </xs:complexType> + <xs:complexType name="constructorType"> + <xs:sequence> + <xs:element type="map:parameterType" + name="parameter" + minOccurs="0" + maxOccurs="unbounded"/> + <xs:element type="map:crossParameterType" + name="cross-parameter" + minOccurs="0" + maxOccurs="1"/> + <xs:element type="map:returnValueType" + name="return-value" + minOccurs="0" + maxOccurs="1"/> + </xs:sequence> + <xs:attribute type="xs:boolean" name="ignore-annotations" use="optional"/> + </xs:complexType> + <xs:complexType name="parameterType"> + <xs:sequence> + <xs:element type="xs:string" name="valid" minOccurs="0" fixed=""/> + <xs:element type="map:groupConversionType" + name="convert-group" + minOccurs="0" + maxOccurs="unbounded"/> + <xs:element type="map:containerElementTypeType" + name="container-element-type" + minOccurs="0" + maxOccurs="unbounded"/> + <xs:element type="map:constraintType" + name="constraint" + minOccurs="0" + maxOccurs="unbounded"/> + </xs:sequence> + <xs:attribute type="xs:string" name="type" use="required"/> + <xs:attribute type="xs:boolean" name="ignore-annotations" use="optional"/> + </xs:complexType> + <xs:complexType name="returnValueType"> + <xs:sequence> + <xs:element type="xs:string" name="valid" minOccurs="0" fixed=""/> + <xs:element type="map:groupConversionType" + name="convert-group" + minOccurs="0" + maxOccurs="unbounded"/> + <xs:element type="map:containerElementTypeType" + name="container-element-type" + minOccurs="0" + maxOccurs="unbounded"/> + <xs:element type="map:constraintType" + name="constraint" + minOccurs="0" + maxOccurs="unbounded"/> + </xs:sequence> + <xs:attribute type="xs:boolean" name="ignore-annotations" use="optional"/> + </xs:complexType> + <xs:complexType name="crossParameterType"> + <xs:sequence> + <xs:element type="map:constraintType" + name="constraint" + minOccurs="0" + maxOccurs="unbounded"/> + </xs:sequence> + <xs:attribute type="xs:boolean" name="ignore-annotations" use="optional"/> + </xs:complexType> + <xs:complexType name="constraint-definitionType"> + <xs:sequence> + <xs:element type="map:validated-byType" + name="validated-by"/> + </xs:sequence> + <xs:attribute type="xs:string" name="annotation" use="required"/> + </xs:complexType> + <xs:complexType name="fieldType"> + <xs:sequence> + <xs:element type="xs:string" name="valid" minOccurs="0" fixed=""/> + <xs:element type="map:groupConversionType" + name="convert-group" + minOccurs="0" + maxOccurs="unbounded"/> + <xs:element type="map:containerElementTypeType" + name="container-element-type" + minOccurs="0" + maxOccurs="unbounded"/> + <xs:element type="map:constraintType" + name="constraint" + minOccurs="0" + maxOccurs="unbounded"/> + </xs:sequence> + <xs:attribute type="xs:string" name="name" use="required"/> + <xs:attribute type="xs:boolean" name="ignore-annotations" use="optional"/> + </xs:complexType> +</xs:schema>