BVAL-216 Fix XML Filter to override XML namespace during descriptors parsing
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 fb0e976..268ad1a 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
@@ -25,8 +25,6 @@
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
-import java.util.SortedMap;
-import java.util.TreeMap;
 import java.util.function.Function;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -178,24 +176,35 @@
     }
 
     private class SchemaRewriter extends XMLFilterImpl {
+
         private boolean root = true;
+        private Key rootSchemaKey = null;
 
         @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.keySet().iterator().next().getVersion()), uri);
 
-            if (!target.equals(schemaKey) && data.containsKey(schemaKey)) {
+            // if no version attribute is available, we pick up the first known version (aka 1.1 most likely)
+            // not sure if that is either possible and correct
+            if (root) {
+                rootSchemaKey = new Key(
+                    Objects.toString(atts.getValue("version"), data.keySet().iterator().next().getVersion()),
+                    uri);
+            }
+
+            // no matter what we see now, if the namespace from the root element is different, we override the namespace
+            // the root version attribute gets also overridden for the root element only
+            if (!target.equals(rootSchemaKey)) {
                 uri = target.ns;
                 if (root) {
-                    atts = rewrite(atts);
+                    atts = rewriteVersion(atts);
                     root = false;
                 }
             }
+
             super.startElement(uri, localName, qName, atts);
         }
 
-        private Attributes rewrite(Attributes atts) {
+        private Attributes rewriteVersion(Attributes atts) {
             final AttributesImpl result;
             if (atts instanceof AttributesImpl) {
                 result = (AttributesImpl) atts;
diff --git a/bval-jsr/src/test/java/org/apache/bval/jsr/xml/ValidationParserTest.java b/bval-jsr/src/test/java/org/apache/bval/jsr/xml/ValidationParserTest.java
index c87de80..ae05400 100644
--- a/bval-jsr/src/test/java/org/apache/bval/jsr/xml/ValidationParserTest.java
+++ b/bval-jsr/src/test/java/org/apache/bval/jsr/xml/ValidationParserTest.java
@@ -31,6 +31,7 @@
 import java.util.Enumeration;
 import java.util.Set;
 
+import javax.validation.BootstrapConfiguration;
 import javax.validation.ConstraintViolation;
 import javax.validation.Validation;
 import javax.validation.ValidationException;
@@ -86,19 +87,34 @@
     @Test
     public void testParse() {
         ConfigurationImpl config = new ConfigurationImpl(null, new ApacheValidationProvider());
-        validationParser.processValidationConfig("sample-validation.xml", config);
+        final BootstrapConfiguration configuration =
+            validationParser.processValidationConfig("sample-validation.xml", config);
+        assertEquals("org.apache.bval.jsr.xml.TestMessageInterpolator", configuration.getMessageInterpolatorClassName());
     }
 
     @Test
     public void testParseV11() {
         ConfigurationImpl config = new ConfigurationImpl(null, new ApacheValidationProvider());
-        validationParser.processValidationConfig("sample-validation11.xml", config);
+        final BootstrapConfiguration configuration =
+            validationParser.processValidationConfig("sample-validation11.xml", config);
+        assertEquals("org.apache.bval.jsr.xml.TestMessageInterpolator", configuration.getMessageInterpolatorClassName());
+
     }
 
     @Test
     public void testParseV20() {
         ConfigurationImpl config = new ConfigurationImpl(null, new ApacheValidationProvider());
-        validationParser.processValidationConfig("sample-validation2.xml", config);
+        final BootstrapConfiguration configuration =
+            validationParser.processValidationConfig("sample-validation2.xml", config);
+        assertEquals("org.apache.bval.jsr.xml.TestMessageInterpolator", configuration.getMessageInterpolatorClassName());
+    }
+
+    @Test
+    public void testParseV30() {
+        ConfigurationImpl config = new ConfigurationImpl(null, new ApacheValidationProvider());
+        final BootstrapConfiguration configuration =
+            validationParser.processValidationConfig("sample-validation3.xml", config);
+        assertEquals("org.apache.bval.jsr.xml.TestMessageInterpolator", configuration.getMessageInterpolatorClassName());
     }
 
     @Test
diff --git a/bval-jsr/src/test/resources/sample-validation3.xml b/bval-jsr/src/test/resources/sample-validation3.xml
new file mode 100644
index 0000000..3168023
--- /dev/null
+++ b/bval-jsr/src/test/resources/sample-validation3.xml
@@ -0,0 +1,30 @@
+<?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.
+-->
+<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 validation-configuration-3.0.xsd"
+  version="3.0">
+
+  <default-provider>org.apache.bval.jsr.ApacheValidationProvider</default-provider>
+  <message-interpolator>org.apache.bval.jsr.xml.TestMessageInterpolator</message-interpolator>
+  <traversable-resolver>org.apache.bval.jsr.resolver.SimpleTraversableResolver</traversable-resolver>
+  <constraint-validator-factory>org.apache.bval.jsr.xml.TestConstraintValidatorFactory</constraint-validator-factory>
+  <constraint-mapping>sample-constraints.xml</constraint-mapping>
+  <property name="test-prop">test-prop-value</property>
+</validation-config>