adding bean validation 3 naming handling for descriptors
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 @@
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 @@
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 @@
*/
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 SchemaManager build() {
- return new SchemaManager(new TreeMap<>(data));
+ return new SchemaManager(data);
}
}
@@ -132,7 +134,7 @@
@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 @@
@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 @@
}
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 @@
"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 @@
"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>