knoaman 2003/12/17 12:50:36 Modified: c/src/xercesc/framework/psvi XSAttributeUse.cpp XSAttributeUse.hpp c/src/xercesc/internal XSObjectFactory.cpp XSObjectFactory.hpp c/src/xercesc/validators/schema SchemaAttDef.cpp SchemaAttDef.hpp TraverseSchema.cpp XercesAttGroupInfo.hpp Log: PSVI: fix for annotation of attributes in attributeGroup/derived types Revision Changes Path 1.6 +13 -15 xml-xerces/c/src/xercesc/framework/psvi/XSAttributeUse.cpp Index: XSAttributeUse.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/framework/psvi/XSAttributeUse.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- XSAttributeUse.cpp 21 Nov 2003 17:19:30 -0000 1.5 +++ XSAttributeUse.cpp 17 Dec 2003 20:50:34 -0000 1.6 @@ -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 @@ 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 @@ { // 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 1.6 +31 -1 xml-xerces/c/src/xercesc/framework/psvi/XSAttributeUse.hpp Index: XSAttributeUse.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/framework/psvi/XSAttributeUse.hpp,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- XSAttributeUse.hpp 21 Nov 2003 17:19:30 -0000 1.5 +++ XSAttributeUse.hpp 17 Dec 2003 20:50:34 -0000 1.6 @@ -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 @@ 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 @@ // ----------------------------------------------------------------------- // data members // ----------------------------------------------------------------------- - XSAttributeDeclaration* fXSAttributeDeclaration; + bool fRequired; + XSConstants::VALUE_CONSTRAINT fConstraintType; + const XMLCh* fConstraintValue; + XSAttributeDeclaration* fXSAttributeDeclaration; }; inline XSAttributeDeclaration *XSAttributeUse::getAttrDeclaration() const @@ -179,6 +195,20 @@ 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 1.12 +49 -4 xml-xerces/c/src/xercesc/internal/XSObjectFactory.cpp Index: XSObjectFactory.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XSObjectFactory.cpp,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- XSObjectFactory.cpp 17 Dec 2003 19:58:25 -0000 1.11 +++ XSObjectFactory.cpp 17 Dec 2003 20:50:35 -0000 1.12 @@ -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 @@ 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 @@ 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 @@ 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); } } } @@ -951,6 +973,29 @@ } 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 1.5 +9 -0 xml-xerces/c/src/xercesc/internal/XSObjectFactory.hpp Index: XSObjectFactory.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XSObjectFactory.hpp,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- XSObjectFactory.hpp 25 Nov 2003 18:11:54 -0000 1.4 +++ XSObjectFactory.hpp 17 Dec 2003 20:50:35 -0000 1.5 @@ -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. * @@ -253,6 +256,12 @@ DatatypeValidator* const dv , XSModel* const xsModel , XSSimpleTypeDefinition* const xsST + ); + + void processAttUse + ( + SchemaAttDef* const attDef + , XSAttributeUse* const xsAttUse ); // make XSModel our friend 1.11 +9 -0 xml-xerces/c/src/xercesc/validators/schema/SchemaAttDef.cpp Index: SchemaAttDef.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/SchemaAttDef.cpp,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- SchemaAttDef.cpp 25 Nov 2003 18:15:00 -0000 1.10 +++ SchemaAttDef.cpp 17 Dec 2003 20:50:35 -0000 1.11 @@ -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 @@ , fValidity(PSVIDefs::UNKNOWN) , fValidation(PSVIDefs::NONE) , fEnclosingCT(0) + , fBaseAttDecl(0) { } @@ -153,6 +157,7 @@ , fValidity(PSVIDefs::UNKNOWN) , fValidation(PSVIDefs::NONE) , fEnclosingCT(0) + , fBaseAttDecl(0) { fAttName = new (manager) QName(prefix, localPart, uriId, manager); } @@ -175,6 +180,7 @@ , fValidity(PSVIDefs::UNKNOWN) , fValidation(PSVIDefs::NONE) , fEnclosingCT(0) + , fBaseAttDecl(0) { fAttName = new (manager) QName(prefix, localPart, uriId, manager); } @@ -193,6 +199,7 @@ , 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 @@ serEng<<(int)fValidity; serEng<<(int)fValidation; serEng<<fEnclosingCT; + serEng<<fBaseAttDecl; } else { @@ -271,6 +279,7 @@ fValidation = (PSVIDefs::Validation)i; serEng>>fEnclosingCT; + serEng>>fBaseAttDecl; } } 1.10 +31 -1 xml-xerces/c/src/xercesc/validators/schema/SchemaAttDef.hpp Index: SchemaAttDef.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/SchemaAttDef.hpp,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- SchemaAttDef.hpp 24 Nov 2003 05:13:41 -0000 1.9 +++ SchemaAttDef.hpp 17 Dec 2003 20:50:35 -0000 1.10 @@ -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 @@ DatatypeValidator* getDatatypeValidator() const; ValueVectorOf<unsigned int>* getNamespaceList() const; ComplexTypeInfo* getEnclosingCT() const; + const SchemaAttDef* getBaseAttDecl() const; + SchemaAttDef* getBaseAttDecl(); // ----------------------------------------------------------------------- // Setter methods @@ -275,6 +280,8 @@ ); void setDatatypeValidator(DatatypeValidator* newDatatypeValidator); void setAnyDatatypeValidator(DatatypeValidator* newDatatypeValidator); + void setBaseAttDecl(SchemaAttDef* const attDef); + /* * @deprecated */ @@ -327,6 +334,13 @@ // 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 @@ PSVIDefs::Validity fValidity; PSVIDefs::Validation fValidation; ComplexTypeInfo* fEnclosingCT; + SchemaAttDef* fBaseAttDecl; }; @@ -474,6 +489,16 @@ return fEnclosingCT; } +inline SchemaAttDef* SchemaAttDef::getBaseAttDecl() +{ + return fBaseAttDecl; +} + +inline const SchemaAttDef* SchemaAttDef::getBaseAttDecl() const +{ + return fBaseAttDecl; +} + // --------------------------------------------------------------------------- // SchemaAttDef: Setter methods // --------------------------------------------------------------------------- @@ -534,6 +559,11 @@ inline void SchemaAttDef::setEnclosingCT(ComplexTypeInfo* complexTypeInfo) { fEnclosingCT = complexTypeInfo; +} + +inline void SchemaAttDef::setBaseAttDecl(SchemaAttDef* const attDef) +{ + fBaseAttDecl = attDef; } XERCES_CPP_NAMESPACE_END 1.102 +13 -2 xml-xerces/c/src/xercesc/validators/schema/TraverseSchema.cpp Index: TraverseSchema.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/TraverseSchema.cpp,v retrieving revision 1.101 retrieving revision 1.102 diff -u -r1.101 -r1.102 --- TraverseSchema.cpp 17 Dec 2003 00:18:40 -0000 1.101 +++ TraverseSchema.cpp 17 Dec 2003 20:50:35 -0000 1.102 @@ -5543,6 +5543,8 @@ refAttDefType, 0, fGrammarPoolMemoryManager); + attDef->setBaseAttDecl(refAttDef); + if (refAttDefType == XMLAttDef::Fixed) { if (required && !invalidAttUse) { attDef->setDefaultType(XMLAttDef::Required_And_Fixed); @@ -6399,6 +6401,11 @@ newAttDef->setDatatypeValidator(attDef.getDatatypeValidator()); typeInfo->addAttDef(newAttDef); + + if (attDef.getBaseAttDecl()) + newAttDef->setBaseAttDecl(attDef.getBaseAttDecl()); + else + newAttDef->setBaseAttDecl(&attDef); } } } @@ -7069,7 +7076,11 @@ 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); 1.8 +13 -3 xml-xerces/c/src/xercesc/validators/schema/XercesAttGroupInfo.hpp Index: XercesAttGroupInfo.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/XercesAttGroupInfo.hpp,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- XercesAttGroupInfo.hpp 20 Nov 2003 17:06:05 -0000 1.7 +++ XercesAttGroupInfo.hpp 17 Dec 2003 20:50:35 -0000 1.8 @@ -244,7 +244,12 @@ } 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 @@ } 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);
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]