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>