8220818: Validator does not find missing match for keyref error

Reviewed-by: lancea
This commit is contained in:
Joe Wang 2019-05-01 14:35:28 -07:00
parent f69d3532e5
commit 05a9f3541b
9 changed files with 257 additions and 3 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2006, 2017, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2006, 2019, Oracle and/or its affiliates. All rights reserved.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
@ -111,7 +111,7 @@ import jdk.xml.internal.JdkXmlUtils;
* @author Elena Litani IBM
* @author Andy Clark IBM
* @author Neeraj Bajaj, Sun Microsystems, inc.
* @LastModified: Nov 2017
* @LastModified: Apr 2019
*/
public class XMLSchemaValidator
implements XMLComponent, XMLDocumentFilter, FieldActivator, RevalidationHandler, XSElementDeclHelper {
@ -2429,7 +2429,7 @@ public class XMLSchemaValidator
fValueStoreCache.getValueStoreFor(id, selMatcher.getInitialDepth());
// nothing to do if nothing matched, or if not all
// fields are present.
if (values != null && values.fValuesCount == values.fFieldCount)
if (values != null && values.fHasValue)
values.endDocumentFragment();
}
}
@ -3718,6 +3718,7 @@ public class XMLSchemaValidator
/** Current data value count. */
protected int fValuesCount;
protected boolean fHasValue = false;
/** global data */
public final Vector<Object> fValues = new Vector<>();
@ -3885,6 +3886,7 @@ public class XMLSchemaValidator
}
else {
fValuesCount++;
fHasValue = true;
}
fLocalValues[i] = actualValue;
fLocalValueTypes[i] = valueType;

View File

@ -0,0 +1,93 @@
/*
* Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package validation;
import java.io.File;
import java.net.URL;
import javax.xml.XMLConstants;
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.SAXParseException;
/*
* @test
* @bug 8220818
* @library /javax/xml/jaxp/libs /javax/xml/jaxp/unittest
* @run testng/othervm validation.ValidationTest
* @summary Runs validations with schemas and sources
*/
@Listeners({jaxp.library.FilePolicy.class})
public class ValidationTest {
static final String FILE_PATH = "files/";
/*
DataProvider: valid xml
*/
@DataProvider(name = "valid")
Object[][] getValid() {
return new Object[][]{
{"JDK8220818a.xsd", "JDK8220818a_Valid.xml"},
{"JDK8220818a.xsd", "JDK8220818a_Valid1.xml"},
{"JDK8220818b.xsd", "JDK8220818b_Valid.xml"},
};
}
/*
DataProvider: invalid xml
*/
@DataProvider(name = "invalid")
Object[][] getInvalid() {
return new Object[][]{
{"JDK8220818a.xsd", "JDK8220818a_Invalid.xml"},
{"JDK8220818b.xsd", "JDK8220818b_Invalid.xml"},
};
}
@Test(dataProvider = "invalid", expectedExceptions = SAXParseException.class)
public void testValidateRefType(String xsd, String xml) throws Exception {
validate(xsd, xml);
}
@Test(dataProvider = "valid")
public void testValidateRefType1(String xsd, String xml) throws Exception {
validate(xsd, xml);
}
private void validate(String xsd, String xml) throws Exception {
final SchemaFactory schemaFactory = SchemaFactory.newInstance(
XMLConstants.W3C_XML_SCHEMA_NS_URI);
final Schema schema = schemaFactory.newSchema(
new File(getClass().getResource(FILE_PATH + xsd).getFile()));
final Validator validator = schema.newValidator();
validator.validate(new StreamSource(
new File(getClass().getResource(FILE_PATH + xml).getFile())));
}
}

View File

@ -0,0 +1,23 @@
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="key" type="xs:string" minOccurs="0">
<xs:key name="key">
<xs:selector xpath="."/>
<xs:field xpath="."/>
</xs:key>
</xs:element>
<xs:element name="keyref">
<xs:complexType>
<xs:attribute name="att" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:keyref name="keyref" refer="key">
<xs:selector xpath="keyref"/>
<xs:field xpath="@att"/>
</xs:keyref>
</xs:element>
</xs:schema>

View File

@ -0,0 +1,3 @@
<root>
<keyref att="xyz"/>
</root>

View File

@ -0,0 +1,4 @@
<root>
<key>xyz</key>
<keyref att="xyz"/>
</root>

View File

@ -0,0 +1,3 @@
<root>
<keyref/>
</root>

View File

@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:example="http://www.example.org/root"
xmlns="http://www.example.org/root"
targetNamespace="http://www.example.org/root"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="Root">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element ref="Object" />
</xs:choice>
</xs:complexType>
<xs:key name="name_key">
<xs:selector xpath=".//example:Object" />
<xs:field xpath="@name" />
</xs:key>
<xs:keyref name="Collectiontype_defined" refer="name_key">
<xs:selector xpath=".//example:CollectionMember" />
<xs:field xpath="@type" />
</xs:keyref>
</xs:element>
<xs:element name="Members">
<xs:complexType>
<xs:group ref="example:memberTypes" minOccurs="0"
maxOccurs="unbounded" />
</xs:complexType>
</xs:element>
<xs:element name="Object">
<xs:complexType>
<xs:sequence>
<xs:element ref="Members" minOccurs="0" />
</xs:sequence>
<xs:attributeGroup ref="example:typedMemberAttributes" />
<xs:attributeGroup ref="example:namedMemberAttributes" />
</xs:complexType>
<xs:unique name="ObjectElementNameUniqueness">
<xs:selector xpath="example:Members/*" />
<xs:field xpath="@name" />
</xs:unique>
</xs:element>
<xs:element name="Collection">
<xs:complexType>
<xs:sequence>
<xs:element ref="CollectionMembers" />
</xs:sequence>
<xs:attributeGroup ref="example:namedMemberAttributes" />
</xs:complexType>
</xs:element>
<xs:element name="CollectionMembers">
<xs:complexType>
<xs:sequence>
<xs:element ref="CollectionMember" minOccurs="2"
maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="CollectionMember">
<xs:complexType>
<xs:sequence>
<xs:element ref="Members" minOccurs="0"
maxOccurs="unbounded" />
</xs:sequence>
<xs:attributeGroup ref="example:typedMemberAttributes" />
<xs:attributeGroup ref="example:namedMemberAttributes" />
</xs:complexType>
</xs:element>
<xs:element name="String">
<xs:complexType>
<xs:attributeGroup ref="example:namedMemberAttributes" />
</xs:complexType>
</xs:element>
<xs:group name="memberTypes">
<xs:choice>
<xs:element ref="String" />
<xs:element ref="Collection" />
</xs:choice>
</xs:group>
<xs:attributeGroup name="namedMemberAttributes">
<xs:attribute name="name" type="xs:Name" use="required" />
</xs:attributeGroup>
<xs:attributeGroup name="typedMemberAttributes">
<xs:attribute name="type" type="xs:Name" />
</xs:attributeGroup>
</xs:schema>

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Root xmlns="http://www.example.org/root">
<Object name="object2">
<Members>
<Collection name="Collection1">
<CollectionMembers>
<CollectionMember name="Collectionmember1" type="object1" />
<CollectionMember name="Collectionmember2" >
<Members>
<String name="string1" />
</Members>
</CollectionMember>
</CollectionMembers>
</Collection>
</Members>
</Object>
</Root>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Root xmlns="http://www.example.org/root">
<Object name="object1">
<Members>
<String name="string1" />
</Members>
</Object>
<Object name="object2">
<Members>
<Collection name="Collection1">
<CollectionMembers>
<CollectionMember name="Collectionmember1" type="object1" />
<CollectionMember name="Collectionmember2" >
<Members>
<String name="string1" />
</Members>
</CollectionMember>
</CollectionMembers>
</Collection>
</Members>
</Object>
</Root>