This is an automated email from the ASF dual-hosted git repository.

jlmonteiro 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 46f8f0a  BVAL-216 Fix XML Filter to override XML namespace during 
descriptors parsing
46f8f0a is described below

commit 46f8f0a6b5ccf0d228f38d275428bae13ff2ef73
Author: Jean-Louis Monteiro <[email protected]>
AuthorDate: Wed Apr 6 21:49:38 2022 +0200

    BVAL-216 Fix XML Filter to override XML namespace during descriptors parsing
---
 .../org/apache/bval/jsr/xml/SchemaManager.java     | 23 ++++++++++++-----
 .../apache/bval/jsr/xml/ValidationParserTest.java  | 22 +++++++++++++---
 bval-jsr/src/test/resources/sample-validation3.xml | 30 ++++++++++++++++++++++
 3 files changed, 65 insertions(+), 10 deletions(-)

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.LinkedHashMap;
 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 @@ public class SchemaManager {
     }
 
     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.net.URL;
 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 @@ public class ValidationParserTest implements 
ApacheValidatorConfiguration.Proper
     @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>

Reply via email to