diff --git a/src/xercesc/framework/psvi/XSAttributeUse.cpp b/src/xercesc/framework/psvi/XSAttributeUse.cpp index e7a9ab9b5fbf81de0b42978b19b2599cbe7904a9..0346bdf3d382cc78531b43052d9b93462caa4dba 100644 --- a/src/xercesc/framework/psvi/XSAttributeUse.cpp +++ b/src/xercesc/framework/psvi/XSAttributeUse.cpp @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.6 2003/12/17 20:50:34 knoaman + * PSVI: fix for annotation of attributes in attributeGroup/derived types + * * Revision 1.5 2003/11/21 17:19:30 knoaman * PSVI update. * @@ -77,7 +80,6 @@ */ #include <xercesc/framework/psvi/XSAttributeUse.hpp> -#include <xercesc/framework/psvi/XSAttributeDeclaration.hpp> XERCES_CPP_NAMESPACE_BEGIN @@ -88,6 +90,9 @@ XSAttributeUse::XSAttributeUse(XSAttributeDeclaration* const xsAttDecl, XSModel* const xsModel, MemoryManager* const manager) : XSObject(XSConstants::ATTRIBUTE_USE, xsModel, manager) + , fRequired(false) + , fConstraintType(XSConstants::VC_NONE) + , fConstraintValue(0) , fXSAttributeDeclaration(xsAttDecl) { } @@ -97,25 +102,18 @@ XSAttributeUse::~XSAttributeUse() { // don't delete fXSAttributeDeclaration - deleted by XSModel } -// XSAttributeUse methods // --------------------------------------------------------------------------- -// XSAttributeUse: access methods +// XSAttributeUse: helper methods // --------------------------------------------------------------------------- -bool XSAttributeUse::getRequired() const -{ - return fXSAttributeDeclaration->getRequired(); -} - -XSConstants::VALUE_CONSTRAINT XSAttributeUse::getConstraintType() const -{ - return fXSAttributeDeclaration->getConstraintType(); -} - -const XMLCh *XSAttributeUse::getConstraintValue() +void XSAttributeUse::set(const bool isRequired, + XSConstants::VALUE_CONSTRAINT constraintType, + const XMLCh* const constraintValue) { - return fXSAttributeDeclaration->getConstraintValue(); + fRequired = isRequired; + fConstraintType = constraintType; + fConstraintValue = constraintValue; } XERCES_CPP_NAMESPACE_END diff --git a/src/xercesc/framework/psvi/XSAttributeUse.hpp b/src/xercesc/framework/psvi/XSAttributeUse.hpp index 1b6ee04f2adc9ec00de8c9da5a732456f704352c..6cf7ddc8ee7ecf377597ffb75255ca6697dc39ab 100644 --- a/src/xercesc/framework/psvi/XSAttributeUse.hpp +++ b/src/xercesc/framework/psvi/XSAttributeUse.hpp @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.6 2003/12/17 20:50:34 knoaman + * PSVI: fix for annotation of attributes in attributeGroup/derived types + * * Revision 1.5 2003/11/21 17:19:30 knoaman * PSVI update. * @@ -160,6 +163,16 @@ public: private: + // set data + void set + ( + const bool isRequired + , XSConstants::VALUE_CONSTRAINT constraintType + , const XMLCh* const constraintValue + ); + + friend class XSObjectFactory; + // ----------------------------------------------------------------------- // Unimplemented constructors and operators // ----------------------------------------------------------------------- @@ -171,7 +184,10 @@ protected: // ----------------------------------------------------------------------- // data members // ----------------------------------------------------------------------- - XSAttributeDeclaration* fXSAttributeDeclaration; + bool fRequired; + XSConstants::VALUE_CONSTRAINT fConstraintType; + const XMLCh* fConstraintValue; + XSAttributeDeclaration* fXSAttributeDeclaration; }; inline XSAttributeDeclaration *XSAttributeUse::getAttrDeclaration() const @@ -179,6 +195,20 @@ inline XSAttributeDeclaration *XSAttributeUse::getAttrDeclaration() const return fXSAttributeDeclaration; } +inline bool XSAttributeUse::getRequired() const +{ + return fRequired; +} + +inline XSConstants::VALUE_CONSTRAINT XSAttributeUse::getConstraintType() const +{ + return fConstraintType; +} + +const inline XMLCh *XSAttributeUse::getConstraintValue() +{ + return fConstraintValue; +} XERCES_CPP_NAMESPACE_END diff --git a/src/xercesc/internal/XSObjectFactory.cpp b/src/xercesc/internal/XSObjectFactory.cpp index cb44934adf2a149eb60d3fddd63b669f11ebfe65..cd682b1edafcde1774a1110e3360f827c6d01876 100644 --- a/src/xercesc/internal/XSObjectFactory.cpp +++ b/src/xercesc/internal/XSObjectFactory.cpp @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.12 2003/12/17 20:50:35 knoaman + * PSVI: fix for annotation of attributes in attributeGroup/derived types + * * Revision 1.11 2003/12/17 19:58:25 knoaman * Check for NULL when building XSParticle * @@ -580,10 +583,17 @@ XSObjectFactory::addOrFind(ComplexTypeInfo* const typeInfo, SchemaAttDefList& attDefList = (SchemaAttDefList&) typeInfo->getAttDefList(); for(unsigned int i=0; i<attCount; i++) { + XSAttributeDeclaration* xsAttDecl = 0; SchemaAttDef& attDef = (SchemaAttDef&) attDefList.getAttDef(i); - XSAttributeDeclaration* xsAttDecl = addOrFind(&attDef, xsModel); + + if (attDef.getBaseAttDecl()) + xsAttDecl = addOrFind(attDef.getBaseAttDecl(), xsModel); + else + xsAttDecl = addOrFind(&attDef, xsModel); + XSAttributeUse* attUse = createXSAttributeUse(xsAttDecl, xsModel); xsAttList->addElement(attUse); + processAttUse(&attDef, attUse); } } @@ -678,10 +688,14 @@ XSWildcard* XSObjectFactory::createXSWildcard(SchemaAttDef* const attDef, XSModel* const xsModel) { + XSAnnotation* annot = (attDef->getBaseAttDecl()) + ? getAnnotationFromModel(xsModel, attDef->getBaseAttDecl()) + : getAnnotationFromModel(xsModel, attDef); + XSWildcard* xsWildcard = new (fMemoryManager) XSWildcard ( attDef - , getAnnotationFromModel(xsModel, attDef) + , annot , xsModel , fMemoryManager ); @@ -750,11 +764,19 @@ XSObjectFactory::createXSAttGroupDefinition(XercesAttGroupInfo* const attGroupIn xsAttList = new (fMemoryManager) RefVectorOf<XSAttributeUse>(attCount, false, fMemoryManager); for (unsigned int i=0; i < attCount; i++) { - XSAttributeDeclaration* xsAttDecl = addOrFind(attGroupInfo->attributeAt(i), xsModel); + SchemaAttDef* attDef = attGroupInfo->attributeAt(i); + XSAttributeDeclaration* xsAttDecl = 0; + + if (attDef->getBaseAttDecl()) + xsAttDecl = addOrFind(attDef->getBaseAttDecl(), xsModel); + else + xsAttDecl = addOrFind(attDef, xsModel); + if (xsAttDecl) // just for sanity { - XSAttributeUse* attUse = createXSAttributeUse(xsAttDecl, xsModel); + XSAttributeUse* attUse = createXSAttributeUse(xsAttDecl, xsModel); xsAttList->addElement(attUse); + processAttUse(attDef, attUse); } } } @@ -953,4 +975,27 @@ void XSObjectFactory::processFacets(DatatypeValidator* const dv, xsST->setFacetInfo(definedFacets, fixedFacets, xsFacetList, xsMultiFacetList, patternList); } +void XSObjectFactory::processAttUse(SchemaAttDef* const attDef, + XSAttributeUse* const xsAttUse) +{ + bool isRequired = false; + XSConstants::VALUE_CONSTRAINT constraintType = XSConstants::VC_NONE; + + if (attDef->getDefaultType() & XMLAttDef::Default) + { + constraintType = XSConstants::VC_DEFAULT; + } + else if (attDef->getDefaultType() & XMLAttDef::Fixed || + attDef->getDefaultType() & XMLAttDef::Required_And_Fixed) + { + constraintType = XSConstants::VC_FIXED; + } + + if (attDef->getDefaultType() == XMLAttDef::Required || + attDef->getDefaultType() == XMLAttDef::Required_And_Fixed) + isRequired = true; + + xsAttUse->set(isRequired, constraintType, attDef->getValue()); +} + XERCES_CPP_NAMESPACE_END diff --git a/src/xercesc/internal/XSObjectFactory.hpp b/src/xercesc/internal/XSObjectFactory.hpp index f1488550e0d208b6431b7231e3e73b34f961d49c..26da5a003718ae3cc4909f07ae296c85a422d133 100644 --- a/src/xercesc/internal/XSObjectFactory.hpp +++ b/src/xercesc/internal/XSObjectFactory.hpp @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.5 2003/12/17 20:50:35 knoaman + * PSVI: fix for annotation of attributes in attributeGroup/derived types + * * Revision 1.4 2003/11/25 18:11:54 knoaman * Make XSObjectFactory inherit from XMemory. Thanks to David Cargill. * @@ -255,6 +258,12 @@ private: , XSSimpleTypeDefinition* const xsST ); + void processAttUse + ( + SchemaAttDef* const attDef + , XSAttributeUse* const xsAttUse + ); + // make XSModel our friend friend class XSModel; diff --git a/src/xercesc/validators/schema/SchemaAttDef.cpp b/src/xercesc/validators/schema/SchemaAttDef.cpp index cbbbd136f4a6157c8abbccf368d240a787163abc..e6b4eaa817fc92891eecd0c536ddb3e0ffe2b824 100644 --- a/src/xercesc/validators/schema/SchemaAttDef.cpp +++ b/src/xercesc/validators/schema/SchemaAttDef.cpp @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.11 2003/12/17 20:50:35 knoaman + * PSVI: fix for annotation of attributes in attributeGroup/derived types + * * Revision 1.10 2003/11/25 18:15:00 knoaman * Serialize enclosing complex type. Thanks to David Cargill. * @@ -135,6 +138,7 @@ SchemaAttDef::SchemaAttDef(MemoryManager* const manager) : , fValidity(PSVIDefs::UNKNOWN) , fValidation(PSVIDefs::NONE) , fEnclosingCT(0) + , fBaseAttDecl(0) { } @@ -153,6 +157,7 @@ SchemaAttDef::SchemaAttDef( const XMLCh* const prefix , fValidity(PSVIDefs::UNKNOWN) , fValidation(PSVIDefs::NONE) , fEnclosingCT(0) + , fBaseAttDecl(0) { fAttName = new (manager) QName(prefix, localPart, uriId, manager); } @@ -175,6 +180,7 @@ SchemaAttDef::SchemaAttDef( const XMLCh* const prefix , fValidity(PSVIDefs::UNKNOWN) , fValidation(PSVIDefs::NONE) , fEnclosingCT(0) + , fBaseAttDecl(0) { fAttName = new (manager) QName(prefix, localPart, uriId, manager); } @@ -193,6 +199,7 @@ SchemaAttDef::SchemaAttDef(const SchemaAttDef* other) : , fValidity(other->fValidity) , fValidation(other->fValidation) , fEnclosingCT(other->fEnclosingCT) + , fBaseAttDecl(other->fBaseAttDecl) { QName* otherName = other->getAttName(); fAttName = new (getMemoryManager()) QName(otherName->getPrefix(), @@ -248,6 +255,7 @@ void SchemaAttDef::serialize(XSerializeEngine& serEng) serEng<<(int)fValidity; serEng<<(int)fValidation; serEng<<fEnclosingCT; + serEng<<fBaseAttDecl; } else { @@ -271,6 +279,7 @@ void SchemaAttDef::serialize(XSerializeEngine& serEng) fValidation = (PSVIDefs::Validation)i; serEng>>fEnclosingCT; + serEng>>fBaseAttDecl; } } diff --git a/src/xercesc/validators/schema/SchemaAttDef.hpp b/src/xercesc/validators/schema/SchemaAttDef.hpp index d4f552fa0575be2c9ff070eee411d1801a29e6de..b4d82990d3840588e929946f27355a5788e5f8a6 100644 --- a/src/xercesc/validators/schema/SchemaAttDef.hpp +++ b/src/xercesc/validators/schema/SchemaAttDef.hpp @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.10 2003/12/17 20:50:35 knoaman + * PSVI: fix for annotation of attributes in attributeGroup/derived types + * * Revision 1.9 2003/11/24 05:13:41 neilg * update method documentation * @@ -262,6 +265,8 @@ public : DatatypeValidator* getDatatypeValidator() const; ValueVectorOf<unsigned int>* getNamespaceList() const; ComplexTypeInfo* getEnclosingCT() const; + const SchemaAttDef* getBaseAttDecl() const; + SchemaAttDef* getBaseAttDecl(); // ----------------------------------------------------------------------- // Setter methods @@ -275,6 +280,8 @@ public : ); void setDatatypeValidator(DatatypeValidator* newDatatypeValidator); void setAnyDatatypeValidator(DatatypeValidator* newDatatypeValidator); + void setBaseAttDecl(SchemaAttDef* const attDef); + /* * @deprecated */ @@ -327,6 +334,13 @@ private : // fValidation // The type of validation that happened to this attr // + // fBaseAttDecl + // The base attribute declaration that this attribute is based on + // NOTE: we do not have a notion of attribute use, so in the case + // of ref'd attributes and inherited attributes, we make a copy + // of the actual attribute declaration. The fBaseAttDecl stores that + // declaration, and will be helpful when we build the XSModel (i.e + // easy access the XSAnnotation object). // ----------------------------------------------------------------------- unsigned int fElemId; QName* fAttName; @@ -337,6 +351,7 @@ private : PSVIDefs::Validity fValidity; PSVIDefs::Validation fValidation; ComplexTypeInfo* fEnclosingCT; + SchemaAttDef* fBaseAttDecl; }; @@ -474,6 +489,16 @@ inline ComplexTypeInfo* SchemaAttDef::getEnclosingCT() const return fEnclosingCT; } +inline SchemaAttDef* SchemaAttDef::getBaseAttDecl() +{ + return fBaseAttDecl; +} + +inline const SchemaAttDef* SchemaAttDef::getBaseAttDecl() const +{ + return fBaseAttDecl; +} + // --------------------------------------------------------------------------- // SchemaAttDef: Setter methods // --------------------------------------------------------------------------- @@ -536,6 +561,11 @@ inline void SchemaAttDef::setEnclosingCT(ComplexTypeInfo* complexTypeInfo) fEnclosingCT = complexTypeInfo; } +inline void SchemaAttDef::setBaseAttDecl(SchemaAttDef* const attDef) +{ + fBaseAttDecl = attDef; +} + XERCES_CPP_NAMESPACE_END #endif diff --git a/src/xercesc/validators/schema/TraverseSchema.cpp b/src/xercesc/validators/schema/TraverseSchema.cpp index 606846c9f6ba8910befbb87536f96bb239f36df0..84ef5d643981822185620614d77d0cf93ca90d04 100644 --- a/src/xercesc/validators/schema/TraverseSchema.cpp +++ b/src/xercesc/validators/schema/TraverseSchema.cpp @@ -5543,6 +5543,8 @@ void TraverseSchema::processAttributeDeclRef(const DOMElement* const elem, refAttDefType, 0, fGrammarPoolMemoryManager); + attDef->setBaseAttDecl(refAttDef); + if (refAttDefType == XMLAttDef::Fixed) { if (required && !invalidAttUse) { attDef->setDefaultType(XMLAttDef::Required_And_Fixed); @@ -6399,6 +6401,11 @@ void TraverseSchema::processAttributes(const DOMElement* const elem, newAttDef->setDatatypeValidator(attDef.getDatatypeValidator()); typeInfo->addAttDef(newAttDef); + + if (attDef.getBaseAttDecl()) + newAttDef->setBaseAttDecl(attDef.getBaseAttDecl()); + else + newAttDef->setBaseAttDecl(&attDef); } } } @@ -7069,7 +7076,11 @@ void TraverseSchema::copyAttGroupAttributes(const DOMElement* const elem, typeInfo->setAttWithTypeId(true); } - typeInfo->addAttDef(new (fGrammarPoolMemoryManager) SchemaAttDef(attDef)); + SchemaAttDef* clonedAttDef = new (fGrammarPoolMemoryManager) SchemaAttDef(attDef); + typeInfo->addAttDef(clonedAttDef); + + if (!clonedAttDef->getBaseAttDecl()) + clonedAttDef->setBaseAttDecl(attDef); if (toAttGroup) { toAttGroup->addAttDef(attDef, true); diff --git a/src/xercesc/validators/schema/XercesAttGroupInfo.hpp b/src/xercesc/validators/schema/XercesAttGroupInfo.hpp index 838694b20037a42ebf71c1420bca38a24e0f1e0e..ff96bd560133ba1d8fdabbb3ac7652ce1e65a984 100644 --- a/src/xercesc/validators/schema/XercesAttGroupInfo.hpp +++ b/src/xercesc/validators/schema/XercesAttGroupInfo.hpp @@ -244,7 +244,12 @@ inline void XercesAttGroupInfo::addAttDef(SchemaAttDef* const toAdd, } if (toClone) { - fAttributes->addElement(new (fMemoryManager) SchemaAttDef(toAdd)); + SchemaAttDef* clonedAttDef = new (fMemoryManager) SchemaAttDef(toAdd); + + if (!clonedAttDef->getBaseAttDecl()) + clonedAttDef->setBaseAttDecl(toAdd); + + fAttributes->addElement(clonedAttDef); } else { fAttributes->addElement(toAdd); @@ -259,7 +264,12 @@ inline void XercesAttGroupInfo::addAnyAttDef(SchemaAttDef* const toAdd, } if (toClone) { - fAnyAttributes->addElement(new (fMemoryManager) SchemaAttDef(toAdd)); + SchemaAttDef* clonedAttDef = new (fMemoryManager) SchemaAttDef(toAdd); + + if (!clonedAttDef->getBaseAttDecl()) + clonedAttDef->setBaseAttDecl(toAdd); + + fAnyAttributes->addElement(clonedAttDef); } else { fAnyAttributes->addElement(toAdd);