提交 c647758c 编写于 作者: A aefimov

8159240: XSOM parser incorrectly processes type names with whitespaces

Reviewed-by: coffeys
上级 b5d84e6a
/*
* Copyright (c) 2017, 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.
*/
/*
* @test
* @bug 8159240
* @summary Check if types and names with whitespaces are collapsed by
* XSOM schema parser
* @compile -XDignore.symbol.file WhitespacesTest.java
* @run testng WhitespacesTest
*
*/
import com.sun.xml.internal.xsom.parser.XSOMParser;
import java.io.File;
import java.nio.file.Paths;
import javax.xml.parsers.SAXParserFactory;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
public class WhitespacesTest {
@Test(dataProvider = "TestSchemaFiles")
public void testWhitespacesCollapse(String schemaFile) throws Exception {
XSOMParser parser = new XSOMParser(SAXParserFactory.newInstance());
XsomErrorHandler eh = new XsomErrorHandler();
parser.setErrorHandler(eh);
parser.parse(getSchemaFile(schemaFile));
if (eh.gotError) {
throw new RuntimeException("XSOM parser encountered error", eh.e);
}
}
// Get location of schema file located in test source directory
private static File getSchemaFile(String filename) {
String testSrc = System.getProperty("test.src", ".");
return Paths.get(testSrc).resolve(filename).toFile();
}
@DataProvider(name = "TestSchemaFiles")
private Object[][] dataTestSchemaFiles() {
return new Object[][] {
{"complexType.xsd"},
{"complexTypeExtension.xsd"},
{"complexTypeRestriction.xsd"},
{"identityConstraint.xsd"},
{"particlesAndAttributes.xsd"},
{"simpleType.xsd"}
};
}
// Test XSOM error handler
private static class XsomErrorHandler implements ErrorHandler {
public boolean gotError = false;
public Exception e = null;
@Override
public void warning(SAXParseException ex) throws SAXException {
System.err.println("XSOM warning:" + ex);
}
@Override
public void error(SAXParseException ex) throws SAXException {
System.err.println("XSOM error:" + ex);
e = ex;
gotError = true;
}
@Override
public void fatalError(SAXParseException ex) throws SAXException {
System.err.println("XSOM fatal error:" + ex);
e = ex;
gotError = true;
}
}
}
<?xml version="1.0"?>
<!-- Test for whitespaces in xs:complexType 'name' and xs:element 'type' attribute -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:hy="http://www.test.com/Service/"
targetNamespace="http://www.test.com/Service/">
<xsd:element name="HelloRequest" type="xsd:string"/>
<xsd:element name="HelloResponse" type="xsd:string"/>
<xsd:complexType name=" info ">
<xsd:sequence>
<xsd:element name="firstname" type="xsd:string"/>
<xsd:element name="lastname" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="usage">
<xsd:all>
<xsd:element name="customerCharacteristics" type="
hy:info
"/>
</xsd:all>
</xsd:complexType>
</xsd:schema>
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Test for whitespaces in xs:complexType -> xs:extension 'base' attribute value -->
<xs:simpleType name="size">
<xs:restriction base="xs:string">
<xs:enumeration value="small" />
<xs:enumeration value="medium" />
<xs:enumeration value="large" />
</xs:restriction>
</xs:simpleType>
<xs:complexType name="jeans">
<xs:simpleContent>
<xs:extension base="size">
<xs:attribute name="sex">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="male" />
<xs:enumeration value="female" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:element name="employee" type=" fullpersoninfo "/>
<xs:complexType name=" personinfo ">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="fullpersoninfo ">
<xs:complexContent>
<xs:extension base=" personinfo">
<xs:sequence>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:hy="http://www.test.com/Service/"
targetNamespace="http://www.test.com/Service/">
<xs:simpleType name=" size ">
<xs:restriction base=" xs:string">
<xs:enumeration value="small" />
<xs:enumeration value="medium" />
<xs:enumeration value="large" />
</xs:restriction>
</xs:simpleType>
<xs:complexType name="jeans">
<xs:simpleContent>
<xs:restriction base=" hy:size">
<xs:attribute name="sex">
<xs:simpleType>
<xs:restriction base=" xs:string ">
<xs:enumeration value="male" />
<xs:enumeration value="female" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:restriction>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="customer ">
<xs:sequence>
<xs:element name=" firstname" type="xs:string"/>
<xs:element name=" lastname " type="xs:string"/>
<xs:element name=" country " type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Norwegian_customer">
<xs:complexContent>
<xs:restriction base=" hy:customer ">
<xs:sequence>
<xs:element name=" firstname" type=" xs:string "/>
<xs:element name="lastname " type="xs:string "/>
<xs:element name="country" type="xs:string " fixed="Norway"/>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:schema>
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Test spaces in xs:key and xs:keyref 'name'
and 'refer' attributes -->
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="referenced">
<xs:complexType>
<xs:attribute name="id" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:key name="aKey ">
<xs:selector xpath="root" />
<xs:field xpath="@id" />
</xs:key>
<xs:keyref name=" aKeyRef " refer=" aKey">
<xs:selector xpath="referenced" />
<xs:field xpath="@id" />
</xs:keyref>
</xs:element>
</xs:schema>
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Test spaces in 'xs:element' 'substitutionGroup' attribute -->
<xs:element name=" name" type="xs:string"/>
<xs:element name="navn" substitutionGroup=" name "/>
<!-- Test spaces in 'xs:element' 'name' and 'ref' attributes -->
<xs:element name=" address ">
<xs:complexType>
<xs:sequence>
<xs:element name="street" type="xs:string"/>
<xs:element name="building" type="xs:string"/>
<xs:element name="apt" type="xs:int"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="personinfo">
<xs:complexType>
<xs:all>
<xs:element name="firstname" type="xs:string"/>
<xs:element ref="address123 "/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:all>
</xs:complexType>
</xs:element>
<!-- Test spaces in xs:attribute 'name', 'type' and 'ref' attributes -->
<xs:simpleType name="typeForAttribute ">
<xs:restriction base=" xs:string">
<xs:pattern value="[A-Z][A-Z]"/>
</xs:restriction>
</xs:simpleType>
<xs:attribute name=" code" type=" typeForAttribute">
</xs:attribute>
<xs:complexType name="TestComplexType">
<xs:attribute ref="code "/>
</xs:complexType>
<!-- Test spaces in xs:attributeGroup 'name' and 'ref' attributes -->
<xs:attributeGroup name="personattr ">
<xs:attribute name="attr1" type="xs:string"/>
<xs:attribute name="attr2" type="xs:integer"/>
</xs:attributeGroup>
<xs:complexType name="person">
<xs:attributeGroup ref=" personattr "/>
</xs:complexType>
<!-- Test spaces in <xs:group> 'name' and 'ref' attributes -->
<xs:group name=" customer">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="secondname" type="xs:string"/>
</xs:sequence>
</xs:group>
<xs:complexType name="orderType">
<xs:group ref="customer "/>
<xs:attribute name="itemId" type="xs:integer"/>
</xs:complexType>
<xs:element name="order" type="orderType"/>
</xs:schema>
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Test spaces in elementDeclBody 'type' attribute -->
<xs:element name="intvalues" type="valuelist "/>
<!-- Test spaces in simpleType 'name' attribute
and in inner <xs:list> 'itemType' attribute -->
<xs:simpleType name=" valuelist ">
<xs:list itemType=" xs:integer "/>
</xs:simpleType>
<!-- Test spaces in <xs:simpleType> -> <xs:restriction> 'base'
attribute -->
<xs:element name="stringWithRestriction" type=" tenSizedString"/>
<xs:simpleType name=" tenSizedString ">
<xs:restriction base=" xs:string ">
<xs:minLength value="10"/>
<xs:maxLength value="10"/>
</xs:restriction>
</xs:simpleType>
<!-- Test spaces in <xs:simpleType> -> <xs:union> 'memberTypes'
attribute -->
<xs:element name="stringAndIntsUnion" type=" stringsAndInts "/>
<xs:simpleType name="stringsAndInts">
<xs:union memberTypes=" xs:integer xs:string
tenSizedString " />
</xs:simpleType>
</xs:schema>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册