8068376: Validator fails valid XML files due to String == in XSD validator code

Reviewed-by: lancea
This commit is contained in:
Joe Wang 2019-07-26 17:15:17 +00:00
parent c1a479ad67
commit 136cfdb1e3
4 changed files with 80 additions and 7 deletions

View File

@ -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;
}

View File

@ -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);
}
}

View File

@ -0,0 +1 @@
<root><childtag></childtag></root>

View File

@ -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>