8068376: Validator fails valid XML files due to String == in XSD validator code
Reviewed-by: lancea
This commit is contained in:
parent
c1a479ad67
commit
136cfdb1e3
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
@ -30,6 +30,7 @@ import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* To store and validate information about substitutionGroup
|
||||
@ -38,7 +39,7 @@ import java.util.Map;
|
||||
*
|
||||
* @author Sandy Gao, IBM
|
||||
*
|
||||
* @LastModified: Nov 2017
|
||||
* @LastModified: July 2019
|
||||
*/
|
||||
public class SubstitutionGroupHandler {
|
||||
|
||||
@ -57,8 +58,8 @@ public class SubstitutionGroupHandler {
|
||||
// 3.9.4 Element Sequence Locally Valid (Particle) 2.3.3
|
||||
// check whether one element decl matches an element with the given qname
|
||||
public XSElementDecl getMatchingElemDecl(QName element, XSElementDecl exemplar) {
|
||||
if (element.localpart == exemplar.fName &&
|
||||
element.uri == exemplar.fTargetNamespace) {
|
||||
if (Objects.equals(element.localpart, exemplar.fName) &&
|
||||
Objects.equals(element.uri, exemplar.fTargetNamespace)) {
|
||||
return exemplar;
|
||||
}
|
||||
|
||||
|
@ -25,19 +25,27 @@ package validation;
|
||||
|
||||
|
||||
import java.io.File;
|
||||
import java.net.URL;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import javax.xml.XMLConstants;
|
||||
import javax.xml.parsers.SAXParserFactory;
|
||||
import javax.xml.stream.XMLInputFactory;
|
||||
import javax.xml.stream.XMLStreamReader;
|
||||
import javax.xml.stream.events.XMLEvent;
|
||||
import javax.xml.transform.Source;
|
||||
import javax.xml.transform.sax.SAXSource;
|
||||
import javax.xml.transform.stream.StreamSource;
|
||||
import javax.xml.validation.Schema;
|
||||
import javax.xml.validation.SchemaFactory;
|
||||
import javax.xml.validation.Validator;
|
||||
import org.testng.annotations.DataProvider;
|
||||
|
||||
import org.testng.annotations.Listeners;
|
||||
import org.testng.annotations.Test;
|
||||
import org.xml.sax.Attributes;
|
||||
import org.xml.sax.InputSource;
|
||||
import org.xml.sax.SAXException;
|
||||
import org.xml.sax.SAXParseException;
|
||||
import org.xml.sax.XMLFilter;
|
||||
import org.xml.sax.helpers.XMLFilterImpl;
|
||||
|
||||
/*
|
||||
* @test
|
||||
@ -106,6 +114,50 @@ public class ValidationTest {
|
||||
validate(xsd, xml);
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 8068376
|
||||
* Verifies that validation performs normally with externally provided string
|
||||
* parameters.
|
||||
* @throws Exception if the test fails
|
||||
*/
|
||||
@Test
|
||||
public void testJDK8068376() throws Exception {
|
||||
|
||||
String xsdFile = getClass().getResource(FILE_PATH + "JDK8068376.xsd").getFile();
|
||||
String xmlFile = getClass().getResource(FILE_PATH + "JDK8068376.xml").getFile();
|
||||
String targetNamespace = getTargetNamespace(xsdFile);
|
||||
|
||||
XMLFilter namespaceFilter = new XMLFilterImpl(SAXParserFactory.newDefaultNSInstance().newSAXParser().getXMLReader()) {
|
||||
@Override
|
||||
public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
|
||||
uri = targetNamespace; // overwriting the uri with our own choice
|
||||
super.startElement(uri, localName, qName, atts);
|
||||
}
|
||||
};
|
||||
|
||||
Source xmlSource = new SAXSource(namespaceFilter, new InputSource(xmlFile));
|
||||
Source schemaSource = new StreamSource(xsdFile);
|
||||
validate(schemaSource, xmlSource);
|
||||
|
||||
}
|
||||
|
||||
private static String getTargetNamespace(String xsdFile) throws Exception {
|
||||
XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(new FileInputStream(xsdFile));
|
||||
while (reader.hasNext()) {
|
||||
int event = reader.next();
|
||||
|
||||
// Get the root element's "targetNamespace" attribute
|
||||
if (event == XMLEvent.START_ELEMENT) {
|
||||
// validation fails before patch
|
||||
String value = reader.getAttributeValue(null, "targetNamespace"); // fails validation
|
||||
// validation passes due to a reference comparison in the original code
|
||||
// String value = "mynamespace";
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private void validate(String xsd, String xml) throws Exception {
|
||||
final SchemaFactory schemaFactory = SchemaFactory.newInstance(
|
||||
XMLConstants.W3C_XML_SCHEMA_NS_URI);
|
||||
@ -116,4 +168,12 @@ public class ValidationTest {
|
||||
new File(getClass().getResource(FILE_PATH + xml).getFile())));
|
||||
}
|
||||
|
||||
private void validate(Source xsd, Source xml) throws Exception {
|
||||
final SchemaFactory schemaFactory = SchemaFactory.newInstance(
|
||||
XMLConstants.W3C_XML_SCHEMA_NS_URI);
|
||||
final Schema schema = schemaFactory.newSchema(xsd);
|
||||
final Validator validator = schema.newValidator();
|
||||
validator.validate(xml);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -0,0 +1 @@
|
||||
<root><childtag></childtag></root>
|
@ -0,0 +1,11 @@
|
||||
<xs:schema xmlns="mynamespace" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="mynamespace" elementFormDefault="qualified">
|
||||
<xs:element name="root">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="childtag" minOccurs="0" maxOccurs="1">
|
||||
<xs:complexType></xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:schema>
|
Loading…
x
Reference in New Issue
Block a user