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>