From 9eaf040da795a6423c60e4ee9398c909a70db07c Mon Sep 17 00:00:00 2001 From: Alberto Massari <amassari@apache.org> Date: Thu, 13 Aug 2009 10:53:54 +0000 Subject: [PATCH] Attributes in the xsi namespace were not whitespace-normalized git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@803839 13f79535-47bb-0310-9956-ffa450edef68 --- src/xercesc/internal/IGXMLScanner2.cpp | 29 ++++++++++++++----- src/xercesc/internal/SGXMLScanner.cpp | 29 ++++++++++++++----- src/xercesc/internal/XSAXMLScanner.cpp | 19 ++++++++---- .../validators/schema/SchemaValidator.cpp | 11 +++++-- .../validators/schema/SchemaValidator.hpp | 2 +- 5 files changed, 65 insertions(+), 25 deletions(-) diff --git a/src/xercesc/internal/IGXMLScanner2.cpp b/src/xercesc/internal/IGXMLScanner2.cpp index 694c482ae..7d2133156 100644 --- a/src/xercesc/internal/IGXMLScanner2.cpp +++ b/src/xercesc/internal/IGXMLScanner2.cpp @@ -271,6 +271,8 @@ IGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs if (fValidate && attrValidator && ValueValidate) { + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(attrValidator, normBuf.getRawBuffer(), normBuf, true); + ValidationContext* const theContext = getValidationContext(); @@ -548,7 +550,7 @@ IGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs if (tempDV && tempDV->getWSFacet() != DatatypeValidator::PRESERVE) { // normalize the attribute according to schema whitespace facet - ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, xsNormalized, fWSNormalizeBuf); + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, xsNormalized, fWSNormalizeBuf, true); xsNormalized = fWSNormalizeBuf.getRawBuffer(); if (fNormalizeData && fValidate) { @@ -590,7 +592,7 @@ IGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs if (tempDV && tempDV->getWSFacet() != DatatypeValidator::PRESERVE) { // normalize the attribute according to schema whitespace facet - ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, xsNormalized, fWSNormalizeBuf); + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, xsNormalized, fWSNormalizeBuf, true); xsNormalized = fWSNormalizeBuf.getRawBuffer(); if (fNormalizeData && fValidate && !skipThisOne) { normBuf.set(xsNormalized); @@ -1716,13 +1718,24 @@ void IGXMLScanner::scanRawAttrListforNameSpaces(XMLSize_t attCount) else if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_NONAMESPACESCHEMALOCATION)) resolveSchemaGrammar(valuePtr, XMLUni::fgZeroLenString); - if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_TYPE)) { - fXsiType.set(valuePtr); - } - else if (XMLString::equals(suffPtr, SchemaSymbols::fgATT_NILL) - && fValidator && fValidator->handlesSchema() - && XMLString::equals(valuePtr, SchemaSymbols::fgATTVAL_TRUE)) { + if( fValidator && fValidator->handlesSchema() ) + { + if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_TYPE)) + { + // normalize the attribute according to schema whitespace facet + DatatypeValidator* tempDV = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_QNAME); + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, valuePtr, fXsiType, true); + } + else if (XMLString::equals(suffPtr, SchemaSymbols::fgATT_NILL)) + { + // normalize the attribute according to schema whitespace facet + XMLBuffer& fXsiNil = fBufMgr.bidOnBuffer(); + DatatypeValidator* tempDV = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_BOOLEAN); + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, valuePtr, fXsiNil, true); + if(XMLString::equals(fXsiNil.getRawBuffer(), SchemaSymbols::fgATTVAL_TRUE)) ((SchemaValidator*)fValidator)->setNillable(true); + fBufMgr.releaseBuffer(fXsiNil); + } } } } diff --git a/src/xercesc/internal/SGXMLScanner.cpp b/src/xercesc/internal/SGXMLScanner.cpp index 0b7070fc4..4155466de 100644 --- a/src/xercesc/internal/SGXMLScanner.cpp +++ b/src/xercesc/internal/SGXMLScanner.cpp @@ -2308,6 +2308,8 @@ SGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs if (fValidate && attrValidator && ValueValidate) { + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(attrValidator, normBuf.getRawBuffer(), normBuf, true); + ValidationContext* const theContext = getValidationContext(); @@ -2551,7 +2553,7 @@ SGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs if (tempDV && tempDV->getWSFacet() != DatatypeValidator::PRESERVE) { // normalize the attribute according to schema whitespace facet - ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, xsNormalized, fWSNormalizeBuf); + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, xsNormalized, fWSNormalizeBuf, true); xsNormalized = fWSNormalizeBuf.getRawBuffer(); if (fNormalizeData && fValidate) { normBuf.set(xsNormalized); @@ -2592,7 +2594,7 @@ SGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs if (tempDV && tempDV->getWSFacet() != DatatypeValidator::PRESERVE) { // normalize the attribute according to schema whitespace facet - ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, xsNormalized, fWSNormalizeBuf); + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, xsNormalized, fWSNormalizeBuf, true); xsNormalized = fWSNormalizeBuf.getRawBuffer(); if (fNormalizeData && fValidate && !skipThisOne) { normBuf.set(xsNormalized); @@ -3602,13 +3604,24 @@ void SGXMLScanner::scanRawAttrListforNameSpaces(XMLSize_t attCount) else if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_NONAMESPACESCHEMALOCATION)) resolveSchemaGrammar(valuePtr, XMLUni::fgZeroLenString); - if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_TYPE)) { - fXsiType.set(valuePtr); - } - else if (XMLString::equals(suffPtr, SchemaSymbols::fgATT_NILL) - && fValidator && fValidator->handlesSchema() - && XMLString::equals(valuePtr, SchemaSymbols::fgATTVAL_TRUE)) { + if( fValidator && fValidator->handlesSchema() ) + { + if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_TYPE)) + { + // normalize the attribute according to schema whitespace facet + DatatypeValidator* tempDV = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_QNAME); + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, valuePtr, fXsiType, true); + } + else if (XMLString::equals(suffPtr, SchemaSymbols::fgATT_NILL)) + { + // normalize the attribute according to schema whitespace facet + XMLBuffer& fXsiNil = fBufMgr.bidOnBuffer(); + DatatypeValidator* tempDV = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_BOOLEAN); + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, valuePtr, fXsiNil, true); + if(XMLString::equals(fXsiNil.getRawBuffer(), SchemaSymbols::fgATTVAL_TRUE)) ((SchemaValidator*)fValidator)->setNillable(true); + fBufMgr.releaseBuffer(fXsiNil); + } } } } diff --git a/src/xercesc/internal/XSAXMLScanner.cpp b/src/xercesc/internal/XSAXMLScanner.cpp index 95fc54dd4..18baf134c 100644 --- a/src/xercesc/internal/XSAXMLScanner.cpp +++ b/src/xercesc/internal/XSAXMLScanner.cpp @@ -661,12 +661,21 @@ void XSAXMLScanner::scanRawAttrListforNameSpaces(XMLSize_t attCount) const XMLCh* valuePtr = curPair->getValue(); const XMLCh* suffPtr = attName.getLocalPart(); - if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_TYPE)) { - fXsiType.set(valuePtr); + if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_TYPE)) + { + // normalize the attribute according to schema whitespace facet + DatatypeValidator* tempDV = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_QNAME); + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, valuePtr, fXsiType, true); } - else if (XMLString::equals(suffPtr, SchemaSymbols::fgATT_NILL) - && XMLString::equals(valuePtr, SchemaSymbols::fgATTVAL_TRUE)) { - ((SchemaValidator*)fValidator)->setNillable(true); + else if (XMLString::equals(suffPtr, SchemaSymbols::fgATT_NILL)) + { + // normalize the attribute according to schema whitespace facet + XMLBuffer& fXsiNil = fBufMgr.bidOnBuffer(); + DatatypeValidator* tempDV = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_BOOLEAN); + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, valuePtr, fXsiNil, true); + if(XMLString::equals(fXsiNil.getRawBuffer(), SchemaSymbols::fgATTVAL_TRUE)) + ((SchemaValidator*)fValidator)->setNillable(true); + fBufMgr.releaseBuffer(fXsiNil); } } } diff --git a/src/xercesc/validators/schema/SchemaValidator.cpp b/src/xercesc/validators/schema/SchemaValidator.cpp index cf8c7b9bf..755168309 100644 --- a/src/xercesc/validators/schema/SchemaValidator.cpp +++ b/src/xercesc/validators/schema/SchemaValidator.cpp @@ -962,16 +962,19 @@ void SchemaValidator::postParseValidation() // contiguous sequences of #x20s are collapsed to a single #x20, // and initial and/or final #x20s are deleted. // -void SchemaValidator::normalizeWhiteSpace(DatatypeValidator* dV, const XMLCh* const value, XMLBuffer& toFill) +void SchemaValidator::normalizeWhiteSpace(DatatypeValidator* dV, const XMLCh* const value, XMLBuffer& toFill, bool bStandalone /*= false*/) { - short wsFacet = dV->getWSFacet(); - toFill.reset(); //empty string if (!*value) return; + if(bStandalone) + fTrailing = fSeenNonWhiteSpace = false; + + short wsFacet = dV->getWSFacet(); + // Loop through the chars of the source value and normalize it // according to the whitespace facet XMLCh nextCh; @@ -1028,6 +1031,8 @@ void SchemaValidator::normalizeWhiteSpace(DatatypeValidator* dV, const XMLCh* co else fTrailing = false; } + if(bStandalone) + fTrailing = fSeenNonWhiteSpace = false; } diff --git a/src/xercesc/validators/schema/SchemaValidator.hpp b/src/xercesc/validators/schema/SchemaValidator.hpp index af8a2ea4f..27df0edea 100644 --- a/src/xercesc/validators/schema/SchemaValidator.hpp +++ b/src/xercesc/validators/schema/SchemaValidator.hpp @@ -109,7 +109,7 @@ public: // ----------------------------------------------------------------------- // Schema Validator methods // ----------------------------------------------------------------------- - void normalizeWhiteSpace(DatatypeValidator* dV, const XMLCh* const value, XMLBuffer& toFill); + void normalizeWhiteSpace(DatatypeValidator* dV, const XMLCh* const value, XMLBuffer& toFill, bool bStandalone = false); // ----------------------------------------------------------------------- // Setter methods -- GitLab