knoaman 2003/11/21 09:11:24 Added: c/src/xercesc/internal XSObjectFactory.hpp XSObjectFactory.cpp Log: Initial revision Revision Changes Path 1.1 xml-xerces/c/src/xercesc/internal/XSObjectFactory.hpp Index: XSObjectFactory.hpp =================================================================== /* * The Apache Software License, Version 1.1 * * Copyright (c) 2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Xerces" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation, and was * originally based on software copyright (c) 2001, International * Business Machines, Inc., http://www.ibm.com . For more information * on the Apache Software Foundation, please see * <http://www.apache.org/>. */ /* * $Log: XSObjectFactory.hpp,v $ * Revision 1.1 2003/11/21 17:11:24 knoaman * Initial revision * */ #if !defined(XSOBJECTFACTORY_HPP) #define XSOBJECTFACTORY_HPP #include <xercesc/framework/psvi/XSConstants.hpp> #include <xercesc/util/RefHashTableOf.hpp> XERCES_CPP_NAMESPACE_BEGIN class XSObject; class XSAttributeUse; class XSAttributeDeclaration; class XSModel; class XSElementDeclaration; class XSSimpleTypeDefinition; class XSComplexTypeDefinition; class XSModelGroupDefinition; class XSAttributeGroupDefinition; class XSWildcard; class XSParticle; class XSAnnotation; class XSNamespaceItem; class XSNotationDeclaration; class SchemaAttDef; class SchemaElementDecl; class DatatypeValidator; class ContentSpecNode; class ComplexTypeInfo; class XercesGroupInfo; class XercesAttGroupInfo; class XSIDCDefinition; class IdentityConstraint; class XMLNotationDecl; /** * Factory class to create various XSObject(s) * Used by XSModel */ class XMLPARSER_EXPORT XSObjectFactory { public: // ----------------------------------------------------------------------- // Constructors and Destructor // ----------------------------------------------------------------------- XSObjectFactory(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager); ~XSObjectFactory(); private: // ----------------------------------------------------------------------- // Unimplemented constructors and destructor // ----------------------------------------------------------------------- XSObjectFactory(const XSObjectFactory&); XSObjectFactory& operator=(const XSObjectFactory&); // ----------------------------------------------------------------------- // factory methods // ----------------------------------------------------------------------- XSParticle* createModelGroupParticle ( const ContentSpecNode* const node , XSModel* const xsModel ); XSAttributeDeclaration* addOrFind ( SchemaAttDef* const attDef , XSModel* const xsModel ); XSSimpleTypeDefinition* addOrFind ( DatatypeValidator* const validator , XSModel* const xsModel ); XSElementDeclaration* addOrFind ( SchemaElementDecl* const elemDecl , XSModel* const xsModel ); XSComplexTypeDefinition* addOrFind ( ComplexTypeInfo* const typeInfo , XSModel* const xsModel ); XSIDCDefinition* addOrFind ( IdentityConstraint* const ic , XSModel* const xsModel ); XSNotationDeclaration* addOrFind ( XMLNotationDecl* const notDecl , XSModel* const xsModel ); XSAttributeUse* createXSAttributeUse ( XSAttributeDeclaration* const xsAttDecl , XSModel* const xsModel ); XSWildcard* createXSWildcard ( SchemaAttDef* const attDef , XSModel* const xsModel ); XSWildcard* createXSWildcard ( const ContentSpecNode* const rootNode , XSModel* const xsModel ); XSModelGroupDefinition* createXSModelGroupDefinition ( XercesGroupInfo* const groupInfo , XSModel* const xsModel ); XSAttributeGroupDefinition* createXSAttGroupDefinition ( XercesAttGroupInfo* const attGroupInfo , XSModel* const xsModel ); // ----------------------------------------------------------------------- // Helper methods // ----------------------------------------------------------------------- // creates a particle corresponding to an element XSParticle* createElementParticle ( const ContentSpecNode* const rootNode , XSModel* const xsModel ); // creates a particle corresponding to a wildcard XSParticle* createWildcardParticle ( const ContentSpecNode* const rootNode , XSModel* const xsModel ); XSAnnotation* getAnnotationFromModel ( XSModel* const xsModel , const void* const key ); void buildAllParticles ( const ContentSpecNode* const rootNode , XSParticleList* const particleList , XSModel* const xsModel ); void buildChoiceSequenceParticles ( const ContentSpecNode* const rootNode , XSParticleList* const particleList , XSModel* const xsModel ); void putObjectInMap ( void* key , XSObject* const object , XSModel* const xsModel ); XSObject* getObjectFromMap ( void* key , XSModel* const xsModel ); // make XSModel our friend friend class XSModel; // ----------------------------------------------------------------------- // Private Data Members // // fMemoryManager // The memory manager used to create various XSObject(s). // ----------------------------------------------------------------------- MemoryManager* fMemoryManager; RefHashTableOf<XSObject>* fXercesToXSMap; RefVectorOf<XSObject>* fDeleteVector; }; XERCES_CPP_NAMESPACE_END #endif 1.1 xml-xerces/c/src/xercesc/internal/XSObjectFactory.cpp Index: XSObjectFactory.cpp =================================================================== /* * The Apache Software License, Version 1.1 * * Copyright (c) 2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Xerces" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation, and was * originally based on software copyright (c) 2001, International * Business Machines, Inc., http://www.ibm.com . For more information * on the Apache Software Foundation, please see * <http://www.apache.org/>. */ /* * $Log: XSObjectFactory.cpp,v $ * Revision 1.1 2003/11/21 17:11:24 knoaman * Initial revision * */ // --------------------------------------------------------------------------- // Includes // --------------------------------------------------------------------------- #include <xercesc/internal/XSObjectFactory.hpp> #include <xercesc/framework/psvi/XSModel.hpp> #include <xercesc/framework/psvi/XSParticle.hpp> #include <xercesc/framework/psvi/XSModelGroup.hpp> #include <xercesc/framework/psvi/XSElementDeclaration.hpp> #include <xercesc/framework/psvi/XSComplexTypeDefinition.hpp> #include <xercesc/framework/psvi/XSSimpleTypeDefinition.hpp> #include <xercesc/framework/psvi/XSModelGroupDefinition.hpp> #include <xercesc/framework/psvi/XSAttributeGroupDefinition.hpp> #include <xercesc/framework/psvi/XSWildcard.hpp> #include <xercesc/framework/psvi/XSNamespaceItem.hpp> #include <xercesc/framework/psvi/XSIDCDefinition.hpp> #include <xercesc/framework/psvi/XSAttributeUse.hpp> #include <xercesc/framework/psvi/XSAttributeDeclaration.hpp> #include <xercesc/framework/psvi/XSNotationDeclaration.hpp> #include <xercesc/validators/common/ContentSpecNode.hpp> #include <xercesc/validators/datatype/DatatypeValidator.hpp> #include <xercesc/validators/schema/SchemaAttDefList.hpp> #include <xercesc/validators/schema/SchemaGrammar.hpp> #include <xercesc/validators/schema/XercesGroupInfo.hpp> #include <xercesc/validators/schema/XercesAttGroupInfo.hpp> #include <xercesc/validators/schema/identity/IdentityConstraint.hpp> #include <xercesc/validators/schema/identity/IC_KeyRef.hpp> #include <xercesc/validators/schema/identity/XercesXPath.hpp> #include <xercesc/util/HashPtr.hpp> XERCES_CPP_NAMESPACE_BEGIN // --------------------------------------------------------------------------- // XSObjectFactory: Constructors and Destructor // --------------------------------------------------------------------------- XSObjectFactory::XSObjectFactory(MemoryManager* const manager) : fMemoryManager(manager) , fXercesToXSMap(0) , fDeleteVector(0) { fDeleteVector = new (manager) RefVectorOf<XSObject>(20, true, manager); fXercesToXSMap = new (manager) RefHashTableOf<XSObject> ( 109, false, new (manager) HashPtr(), manager); } XSObjectFactory::~XSObjectFactory() { delete fXercesToXSMap; delete fDeleteVector; } // --------------------------------------------------------------------------- // XSObjectFactory: factory methods // --------------------------------------------------------------------------- XSParticle* XSObjectFactory::createModelGroupParticle(const ContentSpecNode* const rootNode, XSModel* const xsModel) { ContentSpecNode::NodeTypes nodeType = rootNode->getType(); if (nodeType == ContentSpecNode::All || nodeType == ContentSpecNode::ModelGroupChoice || nodeType == ContentSpecNode::ModelGroupSequence) { XSParticleList* particleList = new (fMemoryManager) RefVectorOf<XSParticle> (4, true, fMemoryManager); XSAnnotation* annot = getAnnotationFromModel(xsModel, rootNode); XSModelGroup* modelGroup = 0; if (nodeType == ContentSpecNode::All) { modelGroup = new (fMemoryManager) XSModelGroup(XSModelGroup::COMPOSITOR_ALL, particleList, annot, xsModel, fMemoryManager); buildAllParticles(rootNode, particleList, xsModel); } else { if (nodeType == ContentSpecNode::ModelGroupChoice) modelGroup = new (fMemoryManager) XSModelGroup(XSModelGroup::COMPOSITOR_CHOICE, particleList, annot, xsModel, fMemoryManager); else modelGroup = new (fMemoryManager) XSModelGroup(XSModelGroup::COMPOSITOR_SEQUENCE, particleList, annot, xsModel, fMemoryManager); buildChoiceSequenceParticles(rootNode->getFirst(), particleList, xsModel); buildChoiceSequenceParticles(rootNode->getSecond(), particleList, xsModel); } XSParticle* groupParticle = new (fMemoryManager) XSParticle ( XSParticle::TERM_MODELGROUP , xsModel , modelGroup , rootNode->getMinOccurs() , rootNode->getMaxOccurs() , fMemoryManager ); return groupParticle; } else return 0; } void XSObjectFactory::buildAllParticles(const ContentSpecNode* const rootNode, XSParticleList* const particleList, XSModel* const xsModel) { // Get the type of spec node our current node is const ContentSpecNode::NodeTypes nodeType = rootNode->getType(); if (nodeType == ContentSpecNode::All) { const ContentSpecNode* rightNode = rootNode->getSecond(); buildAllParticles(rootNode->getFirst(), particleList, xsModel); if (rightNode) buildAllParticles(rightNode, particleList, xsModel); } else if (nodeType == ContentSpecNode::Leaf) { XSParticle* elemParticle = createElementParticle(rootNode, xsModel); if (elemParticle) particleList->addElement(elemParticle); } } void XSObjectFactory::buildChoiceSequenceParticles(const ContentSpecNode* const rootNode, XSParticleList* const particleList, XSModel* const xsModel) { if (rootNode) { const ContentSpecNode::NodeTypes nodeType = rootNode->getType(); if (nodeType == ContentSpecNode::Sequence) { buildChoiceSequenceParticles(rootNode->getFirst(), particleList, xsModel); buildChoiceSequenceParticles(rootNode->getSecond(), particleList, xsModel); } else if (nodeType == ContentSpecNode::Choice) { buildChoiceSequenceParticles(rootNode->getFirst(), particleList, xsModel); buildChoiceSequenceParticles(rootNode->getSecond(), particleList, xsModel); } else if ((nodeType & 0x0f) == ContentSpecNode::Any || (nodeType & 0x0f) == ContentSpecNode::Any_Other || (nodeType & 0x0f) == ContentSpecNode::Any_NS || nodeType == ContentSpecNode::Any_NS_Choice) { XSParticle* wildcardParticle = createWildcardParticle(rootNode, xsModel); if (wildcardParticle) particleList->addElement(wildcardParticle); } else if (nodeType == ContentSpecNode::Leaf) { XSParticle* elemParticle = createElementParticle(rootNode, xsModel); if (elemParticle) particleList->addElement(elemParticle); } // must be a model group else { XSParticle* xsParticle = createModelGroupParticle(rootNode, xsModel); if (xsParticle) particleList->addElement(xsParticle); } } } XSParticle* XSObjectFactory::createElementParticle(const ContentSpecNode* const rootNode, XSModel* const xsModel) { if (rootNode->getElementDecl()) { XSElementDeclaration* xsElemDecl = addOrFind( (SchemaElementDecl*) rootNode->getElementDecl(), xsModel); if (xsElemDecl) { XSParticle* particle = new (fMemoryManager) XSParticle ( XSParticle::TERM_ELEMENT , xsModel , xsElemDecl , rootNode->getMinOccurs() , rootNode->getMaxOccurs() , fMemoryManager ); return particle; } } return 0; } XSParticle* XSObjectFactory::createWildcardParticle(const ContentSpecNode* const rootNode, XSModel* const xsModel) { XSWildcard* xsWildcard = createXSWildcard(rootNode, xsModel); if (xsWildcard) { XSParticle* particle = new (fMemoryManager) XSParticle ( XSParticle::TERM_WILDCARD , xsModel , xsWildcard , rootNode->getMinOccurs() , rootNode->getMaxOccurs() , fMemoryManager ); return particle; } return 0; } XSAttributeDeclaration* XSObjectFactory::addOrFind(SchemaAttDef* const attDef, XSModel* const xsModel) { XSAttributeDeclaration* xsObj = (XSAttributeDeclaration*) getObjectFromMap(attDef, xsModel); if (!xsObj) { XSSimpleTypeDefinition* xsType = 0; if (attDef->getDatatypeValidator()) xsType = addOrFind(attDef->getDatatypeValidator(), xsModel); xsObj = new (fMemoryManager) XSAttributeDeclaration ( attDef , xsType , getAnnotationFromModel(xsModel, attDef) , xsModel , fMemoryManager ); putObjectInMap(attDef, xsObj, xsModel); } return xsObj; } XSSimpleTypeDefinition* XSObjectFactory::addOrFind(DatatypeValidator* const validator, XSModel* const xsModel) { XSSimpleTypeDefinition* xsObj = (XSSimpleTypeDefinition*) getObjectFromMap(validator, xsModel); if (!xsObj) { //REVISIT } return xsObj; } XSElementDeclaration* XSObjectFactory::addOrFind(SchemaElementDecl* const elemDecl, XSModel* const xsModel) { XSElementDeclaration* xsObj = (XSElementDeclaration*) getObjectFromMap(elemDecl, xsModel); if (!xsObj) { XSElementDeclaration* xsSubElem = 0; XSTypeDefinition* xsType = 0; XSNamedMap<XSIDCDefinition>* icMap = 0; if (elemDecl->getSubstitutionGroupElem()) xsSubElem = addOrFind(elemDecl->getSubstitutionGroupElem(), xsModel); if (elemDecl->getComplexTypeInfo()) xsType = addOrFind(elemDecl->getComplexTypeInfo(), xsModel); else if (elemDecl->getDatatypeValidator()) xsType = addOrFind(elemDecl->getDatatypeValidator(), xsModel); unsigned int count = elemDecl->getIdentityConstraintCount(); if (count) { //REVISIT: size of hash table.... icMap = new (fMemoryManager) XSNamedMap<XSIDCDefinition> ( count , 29 , xsModel->getURIStringPool() , false , fMemoryManager ); for (unsigned int i = 0; i < count; i++) { XSIDCDefinition* icDef = addOrFind ( elemDecl->getIdentityConstraintAt(i) , xsModel ); if (icDef) { icMap->addElement ( icDef , icDef->getName() , icDef->getNamespace() ); } } } xsObj = new (fMemoryManager) XSElementDeclaration ( elemDecl , xsType , xsSubElem , getAnnotationFromModel(xsModel, elemDecl) , icMap , xsModel , fMemoryManager ); putObjectInMap(elemDecl, xsObj, xsModel); } return xsObj; } XSComplexTypeDefinition* XSObjectFactory::addOrFind(ComplexTypeInfo* const typeInfo, XSModel* const xsModel) { XSComplexTypeDefinition* xsObj = (XSComplexTypeDefinition*) getObjectFromMap(typeInfo, xsModel); if (!xsObj) { XSWildcard* xsWildcard = 0; XSSimpleTypeDefinition* xsSimpleType = 0; XSAttributeUseList* xsAttList = 0; XSTypeDefinition* xsBaseType = 0; XSParticle* xsParticle = 0; if (typeInfo->getAttWildCard()) xsWildcard = createXSWildcard(typeInfo->getAttWildCard(), xsModel); if ((typeInfo->getContentType() == SchemaElementDecl::Simple) && (typeInfo->getDatatypeValidator())) xsSimpleType = addOrFind(typeInfo->getDatatypeValidator(), xsModel); if (typeInfo->hasAttDefs()) { SchemaAttDefList& attDefList = (SchemaAttDefList&) typeInfo->getAttDefList(); unsigned int attCount = attDefList.getAttDefCount(); xsAttList = new (fMemoryManager) RefVectorOf<XSAttributeUse>(attCount, false, fMemoryManager); for(unsigned int i=0; i<attCount; i++) { SchemaAttDef& attDef = (SchemaAttDef&) attDefList.getAttDef(i); XSAttributeDeclaration* xsAttDecl = addOrFind(&attDef, xsModel); XSAttributeUse* attUse = createXSAttributeUse(xsAttDecl, xsModel); xsAttList->addElement(attUse); } } // compute fBase if (typeInfo->getBaseComplexTypeInfo()) xsBaseType = addOrFind(typeInfo->getBaseComplexTypeInfo(), xsModel); else if (typeInfo->getBaseDatatypeValidator()) xsBaseType = addOrFind(typeInfo->getBaseDatatypeValidator(), xsModel); // compute particle ContentSpecNode* contentSpec = typeInfo->getContentSpec(); if (contentSpec) xsParticle = createModelGroupParticle(contentSpec, xsModel); xsObj = new (fMemoryManager) XSComplexTypeDefinition ( typeInfo , xsWildcard , xsSimpleType , xsAttList , xsBaseType , xsParticle , getAnnotationFromModel(xsModel, typeInfo) , xsModel , fMemoryManager ); putObjectInMap(typeInfo, xsObj, xsModel); // REVISIT // process elements } return xsObj; } XSIDCDefinition* XSObjectFactory::addOrFind(IdentityConstraint* const ic, XSModel* const xsModel) { XSIDCDefinition* xsObj = (XSIDCDefinition*) getObjectFromMap(ic, xsModel); if (!xsObj) { XSIDCDefinition* keyIC = 0; StringList* stringList = 0; unsigned int fieldCount = ic->getFieldCount(); if (fieldCount) { stringList = new (fMemoryManager) RefArrayVectorOf<XMLCh>( fieldCount, true, fMemoryManager); for(unsigned int i=0; i<fieldCount; i++) { XMLCh* expr = XMLString::replicate ( ic->getFieldAt(i)->getXPath()->getExpression() , fMemoryManager ); stringList->addElement(expr); } } if (ic->getType() == IdentityConstraint::KEYREF) keyIC = addOrFind(((IC_KeyRef*) ic)->getKey(), xsModel); xsObj= new (fMemoryManager) XSIDCDefinition ( ic , keyIC , getAnnotationFromModel(xsModel, ic) , stringList , xsModel , fMemoryManager ); putObjectInMap(ic, xsObj, xsModel); } return xsObj; } XSNotationDeclaration* XSObjectFactory::addOrFind(XMLNotationDecl* const notDecl, XSModel* const xsModel) { XSNotationDeclaration* xsObj = (XSNotationDeclaration*) getObjectFromMap(notDecl, xsModel); if (!xsObj) { xsObj = new (fMemoryManager) XSNotationDeclaration ( notDecl , getAnnotationFromModel(xsModel, notDecl) , xsModel , fMemoryManager ); putObjectInMap(notDecl, xsObj, xsModel); } return xsObj; } XSAttributeUse* XSObjectFactory::createXSAttributeUse(XSAttributeDeclaration* const xsAttDecl, XSModel* const xsModel) { XSAttributeUse* attrUse = new (fMemoryManager) XSAttributeUse(xsAttDecl, xsModel, fMemoryManager); fDeleteVector->addElement(attrUse); return attrUse; } XSWildcard* XSObjectFactory::createXSWildcard(SchemaAttDef* const attDef, XSModel* const xsModel) { XSWildcard* xsWildcard = new (fMemoryManager) XSWildcard ( attDef , getAnnotationFromModel(xsModel, attDef) , xsModel , fMemoryManager ); fDeleteVector->addElement(xsWildcard); return xsWildcard; } XSWildcard* XSObjectFactory::createXSWildcard(const ContentSpecNode* const rootNode, XSModel* const xsModel) { XSWildcard* xsWildcard = new (fMemoryManager) XSWildcard ( rootNode , getAnnotationFromModel(xsModel, rootNode) , xsModel , fMemoryManager ); fDeleteVector->addElement(xsWildcard); return xsWildcard; } XSModelGroupDefinition* XSObjectFactory::createXSModelGroupDefinition(XercesGroupInfo* const groupInfo, XSModel* const xsModel) { XSParticle* particle = createModelGroupParticle( groupInfo->getContentSpec(), xsModel); XSModelGroupDefinition* xsObj = new (fMemoryManager) XSModelGroupDefinition ( groupInfo , particle , getAnnotationFromModel(xsModel, groupInfo) , xsModel , fMemoryManager ); return xsObj; } XSAttributeGroupDefinition* XSObjectFactory::createXSAttGroupDefinition(XercesAttGroupInfo* const attGroupInfo, XSModel* const xsModel) { XSAttributeUseList* xsAttList = 0; XSWildcard* xsWildcard = 0; unsigned int attCount = attGroupInfo->attributeCount(); if (attCount) { xsAttList = new (fMemoryManager) RefVectorOf<XSAttributeUse>(attCount, false, fMemoryManager); for (unsigned int i=0; i < attCount; i++) { XSAttributeDeclaration* xsAttDecl = addOrFind(attGroupInfo->attributeAt(i), xsModel); if (xsAttDecl) // just for sanity { XSAttributeUse* attUse = createXSAttributeUse(xsAttDecl, xsModel); xsAttList->addElement(attUse); } } } if (attGroupInfo->getCompleteWildCard()) xsWildcard = createXSWildcard(attGroupInfo->getCompleteWildCard(), xsModel); XSAttributeGroupDefinition* xsObj = new (fMemoryManager) XSAttributeGroupDefinition ( attGroupInfo , xsAttList , xsWildcard , getAnnotationFromModel(xsModel, attGroupInfo) , xsModel , fMemoryManager ); return xsObj; } XSAnnotation* XSObjectFactory::getAnnotationFromModel(XSModel* const xsModel, const void* const key) { XSNamespaceItemList* namespaceItemList = xsModel->getNamespaceItems(); XSAnnotation* annot = 0; for (unsigned int i=0; i<namespaceItemList->size(); i++) { annot = namespaceItemList->elementAt(i)->getSchemaGrammar()->getAnnotation(key); if (annot) break; } return annot; } XSObject* XSObjectFactory::getObjectFromMap(void* key, XSModel* const xsModel) { return fXercesToXSMap->get(key); } void XSObjectFactory::putObjectInMap(void* key, XSObject* const object, XSModel* const xsModel) { fXercesToXSMap->put(key, object); fDeleteVector->addElement(object); } XERCES_CPP_NAMESPACE_END
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]