From 62481f34014630323c452cb845aceea12affc2ac Mon Sep 17 00:00:00 2001 From: Alberto Massari <amassari@apache.org> Date: Tue, 28 Sep 2010 18:33:53 +0000 Subject: [PATCH] Normalize the attribute values before collapsing whitespace, or the special characters used to signal the usage of an entity reference inside an attribute value will remain in the value of xsi:type and xsi:nill (XERCESC-1945) git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@1002312 13f79535-47bb-0310-9956-ffa450edef68 --- src/xercesc/internal/IGXMLScanner2.cpp | 11 +++++++---- src/xercesc/internal/SGXMLScanner.cpp | 11 +++++++---- .../XSTSHarness/regression/XERCESC-1945/test.xml | 7 +++++++ .../XSTSHarness/regression/XERCESC-1945/test.xsd | 9 +++++++++ tests/src/XSTSHarness/regression/Xerces.testSet | 16 ++++++++++++++++ 5 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 tests/src/XSTSHarness/regression/XERCESC-1945/test.xml create mode 100644 tests/src/XSTSHarness/regression/XERCESC-1945/test.xsd diff --git a/src/xercesc/internal/IGXMLScanner2.cpp b/src/xercesc/internal/IGXMLScanner2.cpp index 29cb7b7ca..cdd931be1 100644 --- a/src/xercesc/internal/IGXMLScanner2.cpp +++ b/src/xercesc/internal/IGXMLScanner2.cpp @@ -1697,7 +1697,8 @@ void IGXMLScanner::scanRawAttrListforNameSpaces(XMLSize_t attCount) // normalize the attribute according to schema whitespace facet DatatypeValidator* tempDV = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_QNAME); - ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, valuePtr, fXsiType, true); + normalizeAttRawValue(SchemaSymbols::fgXSI_TYPE, valuePtr, fXsiType); + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, fXsiType.getRawBuffer(), fXsiType, true); if (!fXsiType.isEmpty()) { int colonPos = -1; unsigned int uriId = resolveQName ( @@ -1712,16 +1713,18 @@ void IGXMLScanner::scanRawAttrListforNameSpaces(XMLSize_t attCount) else if (XMLString::equals(suffPtr, SchemaSymbols::fgATT_NILL)) { // normalize the attribute according to schema whitespace facet - XMLBuffer& fXsiNil = fBufMgr.bidOnBuffer(); + XMLBufBid bbXsi(&fBufMgr); + XMLBuffer& fXsiNil = bbXsi.getBuffer(); + DatatypeValidator* tempDV = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_BOOLEAN); - ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, valuePtr, fXsiNil, true); + normalizeAttRawValue(SchemaSymbols::fgATT_NILL, valuePtr, fXsiNil); + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, fXsiNil.getRawBuffer(), fXsiNil, true); if(XMLString::equals(fXsiNil.getRawBuffer(), SchemaSymbols::fgATTVAL_TRUE)) ((SchemaValidator*)fValidator)->setNillable(true); else if(XMLString::equals(fXsiNil.getRawBuffer(), SchemaSymbols::fgATTVAL_FALSE)) ((SchemaValidator*)fValidator)->setNillable(false); else emitError(XMLErrs::InvalidAttValue, fXsiNil.getRawBuffer(), valuePtr); - fBufMgr.releaseBuffer(fXsiNil); } } } diff --git a/src/xercesc/internal/SGXMLScanner.cpp b/src/xercesc/internal/SGXMLScanner.cpp index f16414e8e..35c089b6e 100644 --- a/src/xercesc/internal/SGXMLScanner.cpp +++ b/src/xercesc/internal/SGXMLScanner.cpp @@ -3524,7 +3524,8 @@ void SGXMLScanner::scanRawAttrListforNameSpaces(XMLSize_t attCount) // normalize the attribute according to schema whitespace facet DatatypeValidator* tempDV = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_QNAME); - ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, valuePtr, fXsiType, true); + normalizeAttRawValue(SchemaSymbols::fgXSI_TYPE, valuePtr, fXsiType); + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, fXsiType.getRawBuffer(), fXsiType, true); if (!fXsiType.isEmpty()) { int colonPos = -1; unsigned int uriId = resolveQName ( @@ -3539,16 +3540,18 @@ void SGXMLScanner::scanRawAttrListforNameSpaces(XMLSize_t attCount) else if (XMLString::equals(suffPtr, SchemaSymbols::fgATT_NILL)) { // normalize the attribute according to schema whitespace facet - XMLBuffer& fXsiNil = fBufMgr.bidOnBuffer(); + XMLBufBid bbXsi(&fBufMgr); + XMLBuffer& fXsiNil = bbXsi.getBuffer(); + DatatypeValidator* tempDV = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_BOOLEAN); - ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, valuePtr, fXsiNil, true); + normalizeAttRawValue(SchemaSymbols::fgATT_NILL, valuePtr, fXsiNil); + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, fXsiNil.getRawBuffer(), fXsiNil, true); if(XMLString::equals(fXsiNil.getRawBuffer(), SchemaSymbols::fgATTVAL_TRUE)) ((SchemaValidator*)fValidator)->setNillable(true); else if(XMLString::equals(fXsiNil.getRawBuffer(), SchemaSymbols::fgATTVAL_FALSE)) ((SchemaValidator*)fValidator)->setNillable(false); else emitError(XMLErrs::InvalidAttValue, fXsiNil.getRawBuffer(), valuePtr); - fBufMgr.releaseBuffer(fXsiNil); } } } diff --git a/tests/src/XSTSHarness/regression/XERCESC-1945/test.xml b/tests/src/XSTSHarness/regression/XERCESC-1945/test.xml new file mode 100644 index 000000000..df5e3ff94 --- /dev/null +++ b/tests/src/XSTSHarness/regression/XERCESC-1945/test.xml @@ -0,0 +1,7 @@ +<?xml version="1.0"?> +<p xsi:type=" 	Person " + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="test.xsd"> + <name>John Doe</name> +</p> + diff --git a/tests/src/XSTSHarness/regression/XERCESC-1945/test.xsd b/tests/src/XSTSHarness/regression/XERCESC-1945/test.xsd new file mode 100644 index 000000000..24b5b5578 --- /dev/null +++ b/tests/src/XSTSHarness/regression/XERCESC-1945/test.xsd @@ -0,0 +1,9 @@ +<?xml version="1.0"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + <xsd:complexType name="Person"> + <xsd:sequence> + <xsd:element name="name"/> + </xsd:sequence> + </xsd:complexType> +</xsd:schema> + diff --git a/tests/src/XSTSHarness/regression/Xerces.testSet b/tests/src/XSTSHarness/regression/Xerces.testSet index beb9616a9..88e468082 100644 --- a/tests/src/XSTSHarness/regression/Xerces.testSet +++ b/tests/src/XSTSHarness/regression/Xerces.testSet @@ -826,4 +826,20 @@ <current status="accepted" date="2010-08-09"/> </instanceTest> </testGroup> + <testGroup name="XERCESC-1945"> + <annotation> + <documentation>Whitespace in xsi:type</documentation> + </annotation> + <documentationReference xlink:href="https://issues.apache.org/jira/browse/XERCESC-1945"/> + <schemaTest name="XERCESC-1945-1"> + <schemaDocument xlink:href="./XERCESC-1945/test.xsd"/> + <expected validity="valid"/> + <current status="accepted" date="2010-09-28"/> + </schemaTest> + <instanceTest name="XERCESC-1945-2"> + <instanceDocument xlink:href="./XERCESC-1945/test.xml"/> + <expected validity="valid"/> + <current status="accepted" date="2010-09-28"/> + </instanceTest> + </testGroup> </testSet> -- GitLab