diff --git a/src/xercesc/internal/IGXMLScanner2.cpp b/src/xercesc/internal/IGXMLScanner2.cpp index 8866856744a543b1666f81d869d362029674dbcd..880afc0806097d055653c45be975b4c483f11c03 100644 --- a/src/xercesc/internal/IGXMLScanner2.cpp +++ b/src/xercesc/internal/IGXMLScanner2.cpp @@ -141,7 +141,7 @@ IGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs return 0; // PSVI handling - if(fGrammarType == Grammar::SchemaGrammarType && getPSVIHandler()) + if(getPSVIHandler() && fGrammarType == Grammar::SchemaGrammarType ) fPSVIAttrList->reset(); PSVIItem::VALIDITY_STATE attrValid = PSVIItem::VALIDITY_VALID; PSVIItem::ASSESSMENT_TYPE attrAssessed = PSVIItem::VALIDATION_FULL; @@ -271,7 +271,7 @@ IGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs ); if(fGrammarType == Grammar::SchemaGrammarType) { ((SchemaAttDef *)(attDef))->setValidity(PSVIDefs::INVALID); - if (getPSVIHandler()) + if(getPSVIHandler() ) { attrValid = PSVIItem::VALIDITY_INVALID; } @@ -292,7 +292,7 @@ IGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs ); if(fGrammarType == Grammar::SchemaGrammarType) { ((SchemaAttDef *)(attDef))->setValidity(PSVIDefs::INVALID); - if (getPSVIHandler()) + if(getPSVIHandler() ) { attrValid = PSVIItem::VALIDITY_INVALID; } @@ -387,7 +387,7 @@ IGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs ((SchemaAttDef *)(attDef))->setValidity(PSVIDefs::VALID); ((SchemaAttDef *)(attDef))->setValidationAttempted(PSVIDefs::FULL); } - if(getPSVIHandler()) + if(getPSVIHandler() && fGrammarType == Grammar::SchemaGrammarType ) { // if we've found either an attDef or an attDefForWildCard, // then we're doing full validation and it may still be valid. @@ -534,7 +534,8 @@ IGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs , elemDecl ); attrValidator = ((SchemaValidator*)fValidator)->getMostRecentAttrValidator(); - if(getPSVIHandler() && ((SchemaValidator *)fValidator)->getErrorOccurred()) + if(getPSVIHandler() && fGrammarType == Grammar::SchemaGrammarType + && ((SchemaValidator *)fValidator)->getErrorOccurred()) attrValid = PSVIItem::VALIDITY_INVALID; } else if(fGrammarType == Grammar::SchemaGrammarType) @@ -559,7 +560,7 @@ IGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs } // now fill in the PSVIAttributes entry for this attribute: - if(getPSVIHandler()) + if(getPSVIHandler() && fGrammarType == Grammar::SchemaGrammarType) { SchemaAttDef *actualAttDef = 0; if(attDef) @@ -617,7 +618,7 @@ IGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs if((uriId == fXMLNSNamespaceId) || XMLString::equals(getURIText(uriId), SchemaSymbols::fgURI_XSI)) attrValidator = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_ANYURI); - if(getPSVIHandler()) + if(getPSVIHandler() && fGrammarType == Grammar::SchemaGrammarType) { PSVIAttribute *toFill = fPSVIAttrList->getPSVIAttributeToFill(); XSSimpleTypeDefinition *validatingType = (attrValidator) @@ -803,7 +804,7 @@ IGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs // Indicate it was not explicitly specified and bump count curAtt->setSpecified(false); retCount++; - if(getPSVIHandler()) + if(getPSVIHandler() && fGrammarType == Grammar::SchemaGrammarType) { PSVIAttribute *defAttrToFill = fPSVIAttrList->getPSVIAttributeToFill(); XSAttributeDeclaration *defAttrDecl = (XSAttributeDeclaration *)fModel->getXSObject((void *)curDef); @@ -964,11 +965,9 @@ bool IGXMLScanner::normalizeAttValue( const XMLAttDef* const attDef fValidator->emitError(XMLValid::NoAttNormForStandalone, attName); if(fGrammarType == Grammar::SchemaGrammarType && attDef) { ((SchemaAttDef *)(attDef))->setValidity(PSVIDefs::INVALID); - if (getPSVIHandler()) - { - // REVISIT: - // PSVIAttribute->setValidity(PSVIItem::VALIDITY_INVALID); - } + // note that schema attributes won't be + // subject to this constraint (standalone only relates + // to DTD's) } } @@ -1011,11 +1010,7 @@ bool IGXMLScanner::normalizeAttValue( const XMLAttDef* const attDef fValidator->emitError(XMLValid::NoAttNormForStandalone, attName); if(fGrammarType == Grammar::SchemaGrammarType && attDef) { ((SchemaAttDef *)(attDef))->setValidity(PSVIDefs::INVALID); - if (getPSVIHandler()) - { - // REVISIT: - // PSVIAttribute->setValidity(PSVIItem::VALIDITY_INVALID); - } + // only relates to DTD attributes } } } @@ -1830,6 +1825,9 @@ void IGXMLScanner::resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* con fValidator->setGrammar(fGrammar); } } + // fModel may need updating: + if(getPSVIHandler() && fGrammarType == Grammar::SchemaGrammarType) + fModel = fGrammarResolver->getXSModel(); } InputSource* IGXMLScanner::resolveSystemId(const XMLCh* const sysId) @@ -1976,6 +1974,8 @@ Grammar* IGXMLScanner::loadXMLSchemaGrammar(const InputSource& src, if (toCache) { fGrammarResolver->cacheGrammars(); } + if(getPSVIHandler()) + fModel = fGrammarResolver->getXSModel(); return grammar; } @@ -2280,11 +2280,7 @@ bool IGXMLScanner::scanAttValue( const XMLAttDef* const attDef if(fGrammarType == Grammar::SchemaGrammarType) { ((SchemaAttDef *)attDef)->setValidity(PSVIDefs::INVALID); - if (getPSVIHandler()) - { - // REVISIT: - // PSVIAttribute->setValidity(PSVIItem::VALIDITY_INVALID); - } + // only relates to DTD validation } } nextCh = chSpace; diff --git a/src/xercesc/internal/SGXMLScanner.cpp b/src/xercesc/internal/SGXMLScanner.cpp index 66ee4b8b8dc31d8c24e313f61f4586e8e0b045b5..0d459c3525a15470718e7b15d8db24262f07ba54 100644 --- a/src/xercesc/internal/SGXMLScanner.cpp +++ b/src/xercesc/internal/SGXMLScanner.cpp @@ -3656,6 +3656,10 @@ void SGXMLScanner::resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* con fValidator->setGrammar(fGrammar); } } + // update fModel; rely on the grammar resolver to do this + // efficiently + if(getPSVIHandler()) + fModel = fGrammarResolver->getXSModel(); } InputSource* SGXMLScanner::resolveSystemId(const XMLCh* const sysId) @@ -3795,6 +3799,9 @@ Grammar* SGXMLScanner::loadXMLSchemaGrammar(const InputSource& src, fGrammarResolver->cacheGrammars(); } + if(getPSVIHandler()) + fModel = fGrammarResolver->getXSModel(); + return grammar; } }