diff --git a/src/xercesc/internal/IGXMLScanner2.cpp b/src/xercesc/internal/IGXMLScanner2.cpp index ba2b21d9002dba14f3f9e355b0f5921f21b08dad..9d441eb96431ab2b4c83e07f0c13bfc8ce0ac368 100644 --- a/src/xercesc/internal/IGXMLScanner2.cpp +++ b/src/xercesc/internal/IGXMLScanner2.cpp @@ -384,11 +384,13 @@ IGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs // Save the type for later use attType = attDefForWildCard->getType(); - - - if(fGrammarType == Grammar::SchemaGrammarType) + if(fGrammarType == Grammar::SchemaGrammarType) { ((SchemaElementDecl *)(elemDecl))->updateValidityFromAttribute((SchemaAttDef *)attDef); + DatatypeValidator* tempDV = ((SchemaAttDef*) attDefForWildCard)->getDatatypeValidator(); + if(tempDV && tempDV->getType() == DatatypeValidator::Union) + ((SchemaAttDef*)attDef)->setMembertypeValidator(((UnionDatatypeValidator *)tempDV)->getMemberTypeValidator()); + } } else { normalizeAttValue diff --git a/src/xercesc/internal/SGXMLScanner.cpp b/src/xercesc/internal/SGXMLScanner.cpp index 741c96584f518f9e25c4e4257828f765445e2f83..be64e03e6b89d87eabc1e89024332d13fc5a852f 100644 --- a/src/xercesc/internal/SGXMLScanner.cpp +++ b/src/xercesc/internal/SGXMLScanner.cpp @@ -2190,12 +2190,14 @@ SGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs , elemDecl ); } - // Save the type for later use attType = attDefForWildCard->getType(); ((SchemaElementDecl *)(elemDecl))->updateValidityFromAttribute((SchemaAttDef *)attDef); + DatatypeValidator* tempDV = ((SchemaAttDef*) attDefForWildCard)->getDatatypeValidator(); + if(tempDV && tempDV->getType() == DatatypeValidator::Union) + ((SchemaAttDef*)attDef)->setMembertypeValidator(((UnionDatatypeValidator *)tempDV)->getMemberTypeValidator()); } else { normalizeAttValue diff --git a/src/xercesc/validators/datatype/UnionDatatypeValidator.cpp b/src/xercesc/validators/datatype/UnionDatatypeValidator.cpp index 6e046d8cf65ac8a70f37a44d0540a4c9ab2e9dfe..aab7c162f89c0220f6b6b729e6ebb70d9a13dbf2 100644 --- a/src/xercesc/validators/datatype/UnionDatatypeValidator.cpp +++ b/src/xercesc/validators/datatype/UnionDatatypeValidator.cpp @@ -57,6 +57,9 @@ /* * $Id$ * $Log$ + * Revision 1.8 2003/02/06 13:51:55 gareth + * fixed bug with multiple attributes being validated by the same union type. + * * Revision 1.7 2003/01/29 19:53:35 gareth * we now store information about which validator was used to validate. * @@ -310,7 +313,7 @@ void UnionDatatypeValidator::checkContent(const XMLCh* const content, bool asBas fMemberTypeValidators->elementAt(i)->validate(content); memTypeValid = true; - //set the name of the type actually used to validate the content + //set the validator of the type actually used to validate the content DatatypeValidator *dtv = fMemberTypeValidators->elementAt(i); fValidatedDatatype = dtv; } diff --git a/src/xercesc/validators/datatype/UnionDatatypeValidator.hpp b/src/xercesc/validators/datatype/UnionDatatypeValidator.hpp index 360221068205cf96d8956cfc394fc102e7b39a34..27154a110b42cf4b99443974bf2f379dc260902e 100644 --- a/src/xercesc/validators/datatype/UnionDatatypeValidator.hpp +++ b/src/xercesc/validators/datatype/UnionDatatypeValidator.hpp @@ -57,6 +57,9 @@ /* * $Id$ * $Log$ + * Revision 1.8 2003/02/06 13:51:55 gareth + * fixed bug with multiple attributes being validated by the same union type. + * * Revision 1.7 2003/01/29 19:55:19 gareth * updated to deal with null pointer issue with fValidatedDatatype. * @@ -241,6 +244,13 @@ public: */ bool getMemberTypeAnonymous() const; + + /** + * Returns the member DatatypeValidator used to validate the content the last time validate + * was called + */ + const DatatypeValidator* getMemberTypeValidator() const; + /** * Called inbetween uses of this validator to reset PSVI information */ @@ -398,6 +408,10 @@ inline bool UnionDatatypeValidator::getMemberTypeAnonymous() const { return 0; } +inline const DatatypeValidator* UnionDatatypeValidator::getMemberTypeValidator() const { + return fValidatedDatatype; +} + inline void UnionDatatypeValidator::reset() { fValidatedDatatype = 0; } diff --git a/src/xercesc/validators/schema/SchemaAttDef.cpp b/src/xercesc/validators/schema/SchemaAttDef.cpp index b4a95c7fc897ba401e52c43e746c6a200bcf6e8c..81e7ec39a3ab951e6419c36a9f44a7c0dd399751 100644 --- a/src/xercesc/validators/schema/SchemaAttDef.cpp +++ b/src/xercesc/validators/schema/SchemaAttDef.cpp @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.4 2003/02/06 13:51:55 gareth + * fixed bug with multiple attributes being validated by the same union type. + * * Revision 1.3 2003/01/29 19:47:16 gareth * added DOMTypeInfo and some PSVI methods * @@ -104,6 +107,7 @@ SchemaAttDef::SchemaAttDef() : , fAttName(0) , fDatatypeValidator(0) , fAnyDatatypeValidator(0) + , fMemberTypeValidator(0) , fNamespaceList(0) , fValidity(PSVIDefs::UNKNOWN) , fValidation(PSVIDefs::NONE) @@ -118,6 +122,7 @@ SchemaAttDef::SchemaAttDef( const XMLCh* const prefix XMLAttDef(type, defType) , fElemId(XMLElementDecl::fgInvalidElemId) , fDatatypeValidator(0) + , fMemberTypeValidator(0) , fAnyDatatypeValidator(0) , fNamespaceList(0) , fValidity(PSVIDefs::UNKNOWN) @@ -138,6 +143,7 @@ SchemaAttDef::SchemaAttDef( const XMLCh* const prefix , fElemId(XMLElementDecl::fgInvalidElemId) , fDatatypeValidator(0) , fAnyDatatypeValidator(0) + , fMemberTypeValidator(0) , fNamespaceList(0) , fValidity(PSVIDefs::UNKNOWN) , fValidation(PSVIDefs::NONE) @@ -153,6 +159,7 @@ SchemaAttDef::SchemaAttDef(const SchemaAttDef* other) : , fAttName(0) , fDatatypeValidator(other->fDatatypeValidator) , fAnyDatatypeValidator(other->fAnyDatatypeValidator) + , fMemberTypeValidator(other->fMemberTypeValidator) , fNamespaceList(0) , fValidity(other->fValidity) , fValidation(other->fValidation) diff --git a/src/xercesc/validators/schema/SchemaAttDef.hpp b/src/xercesc/validators/schema/SchemaAttDef.hpp index ca3bd450eb5bfa5ecf515f830c52d2ff83c6c3f9..c1de9d104db7537c36017b6acef55c397d9b9aac 100644 --- a/src/xercesc/validators/schema/SchemaAttDef.hpp +++ b/src/xercesc/validators/schema/SchemaAttDef.hpp @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.4 2003/02/06 13:51:55 gareth + * fixed bug with multiple attributes being validated by the same union type. + * * Revision 1.3 2003/01/29 19:47:16 gareth * added DOMTypeInfo and some PSVI methods * @@ -93,7 +96,6 @@ #include <xercesc/validators/datatype/DatatypeValidator.hpp> #include <xercesc/validators/datatype/UnionDatatypeValidator.hpp> #include <xercesc/validators/schema/PSVIDefs.hpp> - XERCES_CPP_NAMESPACE_BEGIN class DatatypeValidator; @@ -236,6 +238,7 @@ public : ); void setDatatypeValidator(DatatypeValidator* newDatatypeValidator); void setAnyDatatypeValidator(DatatypeValidator* newDatatypeValidator); + void setMembertypeValidator(const DatatypeValidator* newDatatypeValidator); void setNamespaceList(const ValueVectorOf<unsigned int>* const toSet); void resetNamespaceList(); void setValidity(PSVIDefs::Validity valid); @@ -257,9 +260,13 @@ private : // fDatatypeValidator // The DatatypeValidator used to validate this attribute type. // - // fAnyDatatypeValidator + // fAnyDatatypeValidator // Tempory storage for the DatatypeValidator used to validate an any // + // fMemberTypeValidator + // Tempory storage used when the validator being used is of union type. + // This stores the actual member validator used to validate. + // // fNamespaceList // The list of namespace values for a wildcard attribute // @@ -274,6 +281,7 @@ private : QName* fAttName; DatatypeValidator* fDatatypeValidator; DatatypeValidator* fAnyDatatypeValidator; + const DatatypeValidator* fMemberTypeValidator; ValueVectorOf<unsigned int>* fNamespaceList; PSVIDefs::Validity fValidity; PSVIDefs::Validation fValidation; @@ -341,18 +349,14 @@ inline const XMLCh* SchemaAttDef::getTypeUri() const { inline const XMLCh* SchemaAttDef::getMemberTypeName() const { - if(fAnyDatatypeValidator && fAnyDatatypeValidator->getType() == DatatypeValidator::Union) - return ((UnionDatatypeValidator*)fAnyDatatypeValidator)->getMemberTypeName(); - else if(fDatatypeValidator && fDatatypeValidator->getType() == DatatypeValidator::Union) - return ((UnionDatatypeValidator*)fDatatypeValidator)->getMemberTypeName(); + if(fMemberTypeValidator) + return fMemberTypeValidator->getTypeLocalName(); return 0; } inline const XMLCh* SchemaAttDef::getMemberTypeUri() const { - if(fAnyDatatypeValidator && fAnyDatatypeValidator->getType() == DatatypeValidator::Union) - return ((UnionDatatypeValidator*)fAnyDatatypeValidator)->getMemberTypeUri(); - else if(fDatatypeValidator && fDatatypeValidator->getType() == DatatypeValidator::Union) - return ((UnionDatatypeValidator*)fDatatypeValidator)->getMemberTypeUri(); + if(fMemberTypeValidator) + return fMemberTypeValidator->getTypeUri(); return 0; } @@ -369,11 +373,9 @@ inline const XMLCh* SchemaAttDef::getDOMTypeInfoName() const { return SchemaSymbols::fgDT_ANYSIMPLETYPE; if(getTypeAnonymous() || getMemberTypeAnonymous()) return 0; - - if(fDatatypeValidator && fDatatypeValidator->getType() == DatatypeValidator::Union || - fAnyDatatypeValidator && fAnyDatatypeValidator->getType() == DatatypeValidator::Union) { + if(fMemberTypeValidator) return getMemberTypeName(); - } + return getTypeName(); } @@ -382,8 +384,7 @@ inline const XMLCh* SchemaAttDef::getDOMTypeInfoUri() const { return SchemaSymbols::fgURI_SCHEMAFORSCHEMA; if(getTypeAnonymous() || getMemberTypeAnonymous()) return 0; - if(fDatatypeValidator && fDatatypeValidator->getType() == DatatypeValidator::Union || - fAnyDatatypeValidator && fAnyDatatypeValidator->getType() == DatatypeValidator::Union) + if(fMemberTypeValidator) return getMemberTypeUri(); return getTypeUri(); } @@ -398,10 +399,9 @@ inline bool SchemaAttDef::getTypeAnonymous() const { } inline bool SchemaAttDef::getMemberTypeAnonymous() const { - if(fAnyDatatypeValidator && fAnyDatatypeValidator->getType() == DatatypeValidator::Union) - return ((UnionDatatypeValidator*)fAnyDatatypeValidator)->getMemberTypeAnonymous(); - else if(fDatatypeValidator && fDatatypeValidator->getType() == DatatypeValidator::Union) - return ((UnionDatatypeValidator*)fDatatypeValidator)->getMemberTypeAnonymous(); + if(fMemberTypeValidator) + return fMemberTypeValidator->getAnonymous(); + return false; } @@ -436,6 +436,11 @@ inline void SchemaAttDef::setAnyDatatypeValidator(DatatypeValidator* newDatatype fAnyDatatypeValidator = newDatatypeValidator; } +inline void SchemaAttDef::setMembertypeValidator(const DatatypeValidator* newDatatypeValidator) +{ + fMemberTypeValidator = newDatatypeValidator; +} + inline void SchemaAttDef::resetNamespaceList() { if (fNamespaceList && fNamespaceList->size()) { @@ -464,8 +469,8 @@ inline void SchemaAttDef::reset() { ((UnionDatatypeValidator *)fAnyDatatypeValidator)->reset(); else if(fDatatypeValidator && fDatatypeValidator->getType() == DatatypeValidator::Union) ((UnionDatatypeValidator *)fDatatypeValidator)->reset(); - fAnyDatatypeValidator = 0; + fMemberTypeValidator = 0; fValidity = PSVIDefs::UNKNOWN; fValidation = PSVIDefs::NONE; } diff --git a/src/xercesc/validators/schema/SchemaValidator.cpp b/src/xercesc/validators/schema/SchemaValidator.cpp index 4fd55f8778929d433a0b113f2d49bf65194037c5..7883ceb43f483ed744c529279b3dcdd12a416bf6 100644 --- a/src/xercesc/validators/schema/SchemaValidator.cpp +++ b/src/xercesc/validators/schema/SchemaValidator.cpp @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.28 2003/02/06 13:51:55 gareth + * fixed bug with multiple attributes being validated by the same union type. + * * Revision 1.27 2003/01/29 20:01:20 gareth * We now detect when elements/attributes are validated and the result of the validation is stored. * @@ -731,16 +734,17 @@ void SchemaValidator::validateAttrValue (const XMLAttDef* attDef catch (...) { emitError(XMLValid::GenericError); ((SchemaElementDecl *)(elemDecl))->setValidity(PSVIDefs::INVALID); - ((SchemaAttDef *)(attDef))->setValidity(PSVIDefs::INVALID); + ((SchemaAttDef *)attDef)->setValidity(PSVIDefs::INVALID); throw; } } if(!valid) { ((SchemaElementDecl *)(elemDecl))->setValidity(PSVIDefs::INVALID); - ((SchemaAttDef *)(attDef))->setValidity(PSVIDefs::INVALID); + ((SchemaAttDef *)attDef)->setValidity(PSVIDefs::INVALID); } - + else if(attDefDV && attDefDV->getType() == DatatypeValidator::Union) + ((SchemaAttDef *)attDef)->setMembertypeValidator(((UnionDatatypeValidator *)attDefDV)->getMemberTypeValidator()); fTrailing = false;