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]