diff --git a/src/xercesc/validators/schema/TraverseSchema.cpp b/src/xercesc/validators/schema/TraverseSchema.cpp index 344d1c96e2eb9356a8246bc263b6f15500aae45e..3ee0d5e335da5667f5529d7bea9cbbfa9d676388 100644 --- a/src/xercesc/validators/schema/TraverseSchema.cpp +++ b/src/xercesc/validators/schema/TraverseSchema.cpp @@ -3710,9 +3710,21 @@ void TraverseSchema::traverseSimpleContentDecl(const XMLCh* const typeName, const XMLCh* prefix = getPrefix(baseName); const XMLCh* localPart = getLocalPart(baseName); const XMLCh* uri = resolvePrefixToURI(simpleContent, prefix); - DatatypeValidator* baseValidator = getDatatypeValidator(uri, localPart); - if (baseValidator != 0) { + // check for 'anyType' + if (XMLString::equals(uri, SchemaSymbols::fgURI_SCHEMAFORSCHEMA) + && XMLString::equals(localPart, SchemaSymbols::fgATTVAL_ANYTYPE)) { + + reportSchemaError(simpleContent, XMLUni::fgXMLErrDomain, XMLErrs::InvalidSimpleContentBase, baseName); + throw TraverseSchema::InvalidComplexTypeInfo; + } + + processBaseTypeInfo(simpleContent, baseName, localPart, uri, typeInfo); + + ComplexTypeInfo* baseTypeInfo = typeInfo->getBaseComplexTypeInfo(); + DatatypeValidator* baseValidator = typeInfo->getBaseDatatypeValidator(); + + if (baseValidator != 0 && baseTypeInfo == 0) { // check that the simpleType does not preclude derivation by extension if ((baseValidator->getFinalSet() & SchemaSymbols::XSD_EXTENSION) == typeInfo->getDerivedBy()) { @@ -3722,25 +3734,16 @@ void TraverseSchema::traverseSimpleContentDecl(const XMLCh* const typeName, throw TraverseSchema::InvalidComplexTypeInfo; } - typeInfo->setBaseComplexTypeInfo(0); - typeInfo->setBaseDatatypeValidator(baseValidator); - } - else { - - // check for 'anyType' - if (XMLString::equals(uri, SchemaSymbols::fgURI_SCHEMAFORSCHEMA) - && XMLString::equals(localPart, SchemaSymbols::fgATTVAL_ANYTYPE)) { + //Schema Spec: 5.11: Complex Type Definition Properties Correct: 2 + if (typeInfo->getDerivedBy() == SchemaSymbols::XSD_RESTRICTION) { - reportSchemaError(simpleContent, XMLUni::fgXMLErrDomain, XMLErrs::InvalidSimpleContentBase, baseName); + reportSchemaError(simpleContent, XMLUni::fgXMLErrDomain, XMLErrs::InvalidComplexTypeBase, baseName); throw TraverseSchema::InvalidComplexTypeInfo; } - - processBaseTypeInfo(simpleContent, baseName, localPart, uri, typeInfo); } // check that the base isn't a complex type with complex content // and that derivation method is not included in 'final' - ComplexTypeInfo* baseTypeInfo = typeInfo->getBaseComplexTypeInfo(); bool simpleTypeRequired = false; if (baseTypeInfo) { @@ -3771,15 +3774,8 @@ void TraverseSchema::traverseSimpleContentDecl(const XMLCh* const typeName, // ----------------------------------------------------------------------- if (typeInfo->getDerivedBy() == SchemaSymbols::XSD_RESTRICTION) { - //Schema Spec: 5.11: Complex Type Definition Properties Correct: 2 - if (typeInfo->getBaseDatatypeValidator() != 0) { - - reportSchemaError(simpleContent, XMLUni::fgXMLErrDomain, XMLErrs::InvalidComplexTypeBase, baseName); - throw TraverseSchema::InvalidComplexTypeInfo; - } - else { - typeInfo->setBaseDatatypeValidator(baseTypeInfo->getDatatypeValidator()); - } + if(baseTypeInfo) + typeInfo->setBaseDatatypeValidator(baseTypeInfo->getDatatypeValidator()); if (content != 0) { diff --git a/tests/src/XSTSHarness/regression/XERCESC-697/base.xsd b/tests/src/XSTSHarness/regression/XERCESC-697/base.xsd new file mode 100644 index 0000000000000000000000000000000000000000..b90a2be037881ef06157fa7b1e6f4fa46a6755fe --- /dev/null +++ b/tests/src/XSTSHarness/regression/XERCESC-697/base.xsd @@ -0,0 +1,27 @@ +<?xml version="1.0"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + <xsd:complexType name="AddressType" abstract="true"> + <xsd:simpleContent> + <xsd:extension base="xsd:string"> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + <xsd:complexType name="MyAddressType"> + <xsd:simpleContent> + <xsd:restriction base="AddressType"> + <xsd:enumeration value="BillingAddress"/> + <xsd:enumeration value="DataBackupStorageAddress"/> + <xsd:enumeration value="DuplicateRecordsAddress"/> + <xsd:enumeration value="FurthestTerminalAddress"/> + <xsd:enumeration value="GaragingAddress"/> + <xsd:enumeration value="MailingAddress"/> + <xsd:enumeration value="PointOfDepartureAddress"/> + <xsd:enumeration value="PointOfDestinationAddress"/> + <xsd:enumeration value="PreviousAddress"/> + <xsd:enumeration value="ShippingAddress"/> + <xsd:enumeration value="SoftwareBackupStorageAddress"/> + <xsd:enumeration value="StreetAddress"/> + </xsd:restriction> + </xsd:simpleContent> + </xsd:complexType> +</xsd:schema> \ No newline at end of file diff --git a/tests/src/XSTSHarness/regression/XERCESC-697/redefined.xml b/tests/src/XSTSHarness/regression/XERCESC-697/redefined.xml new file mode 100644 index 0000000000000000000000000000000000000000..746588cc81edb45270676c9dd5915757e8160292 --- /dev/null +++ b/tests/src/XSTSHarness/regression/XERCESC-697/redefined.xml @@ -0,0 +1,2 @@ +<?xml version="1.0"?> +<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="redefined.xsd">StreetAddress</root> diff --git a/tests/src/XSTSHarness/regression/XERCESC-697/redefined.xsd b/tests/src/XSTSHarness/regression/XERCESC-697/redefined.xsd new file mode 100644 index 0000000000000000000000000000000000000000..33ae077fd757b6168dfe1650e5d03c599998fd07 --- /dev/null +++ b/tests/src/XSTSHarness/regression/XERCESC-697/redefined.xsd @@ -0,0 +1,16 @@ +<?xml version="1.0"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + <xsd:redefine schemaLocation="base.xsd"> + <xsd:complexType name="MyAddressType"> + <xsd:simpleContent> + <xsd:restriction base="MyAddressType"> + <xsd:enumeration value="BillingAddress"/> + <xsd:enumeration value="GaragingAddress"/> + <xsd:enumeration value="MailingAddress"/> + <xsd:enumeration value="StreetAddress"/> + </xsd:restriction> + </xsd:simpleContent> + </xsd:complexType> + </xsd:redefine> + <xsd:element name="root" type="MyAddressType"/> +</xsd:schema> \ No newline at end of file diff --git a/tests/src/XSTSHarness/regression/Xerces.testSet b/tests/src/XSTSHarness/regression/Xerces.testSet index cdf11e44e10f96a1d2f09bde2a661b107be3c69c..c7b2a1d4bdab8c9e94598581ca68cae31ca2a869 100644 --- a/tests/src/XSTSHarness/regression/Xerces.testSet +++ b/tests/src/XSTSHarness/regression/Xerces.testSet @@ -86,7 +86,23 @@ <current status="accepted" date="2008-02-13"/> </instanceTest> </testGroup> - <testGroup name="XERCESC-711"> + <testGroup name="XERCESC-697"> + <annotation> + <documentation>Incorrect Schema Validation Failure When Redefining Complex Type with Simple Content</documentation> + </annotation> + <documentationReference xlink:href="https://issues.apache.org/jira/browse/XERCESC-697"/> + <schemaTest name="XERCESC-697"> + <schemaDocument xlink:href="./XERCESC-697/redefined.xsd"/> + <expected validity="valid"/> + <current status="accepted" date="2009-08-10"/> + </schemaTest> + <instanceTest name="XERCESC-697"> + <instanceDocument xlink:href="./XERCESC-697/redefined.xml"/> + <expected validity="valid"/> + <current status="accepted" date="2009-08-10"/> + </instanceTest> + </testGroup> + <testGroup name="XERCESC-711"> <annotation> <documentation>Validator doesn't enforce xsd:key</documentation> </annotation>