You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by kn...@apache.org on 2003/11/20 19:21:22 UTC
cvs commit: xml-xerces/c/src/xercesc/framework/psvi PSVIUtil.hpp PSVIUtil.cpp
knoaman 2003/11/20 10:21:22
Added: c/src/xercesc/framework/psvi PSVIUtil.hpp PSVIUtil.cpp
Log:
Initial revision.
Revision Changes Path
1.1 xml-xerces/c/src/xercesc/framework/psvi/PSVIUtil.hpp
Index: PSVIUtil.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 apache\@apache.org.
*
* 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: PSVIUtil.hpp,v $
* Revision 1.1 2003/11/20 18:21:22 knoaman
* Initial revision.
*
*/
#if !defined(PSVIUTIL_HPP)
#define PSVIUTIL_HPP
#include <xercesc/framework/psvi/XSConstants.hpp>
XERCES_CPP_NAMESPACE_BEGIN
class XSObject;
class XSAttributeUse;
class XSAttributeDeclaration;
class XSModel;
class XSElementDeclaration;
class XSComplexTypeDefinition;
class XSWildcard;
class SchemaAttDef;
class SchemaElementDecl;
class DatatypeValidator;
class ContentSpecNode;
class ComplexTypeInfo;
class XSIDCDefinition;
class IdentityConstraint;
/**
* Some useful utility methods.
*/
class XMLPARSER_EXPORT PSVIUtil
{
public:
// Creates a particle that corresponds to the content spec node
static XSParticle* createModelGroupParticle
(
const ContentSpecNode* const node
, XSModel* const xsModel
, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
);
static XSAttributeDeclaration* addOrFind
(
SchemaAttDef* const attDef
, XSModel* const xsModel
, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
);
static XSSimpleTypeDefinition* addOrFind
(
DatatypeValidator* const validator
, XSModel* const xsModel
, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
);
static XSElementDeclaration* addOrFind
(
SchemaElementDecl* const elemDecl
, XSModel* const xsModel
, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
);
static XSComplexTypeDefinition* addOrFind
(
ComplexTypeInfo* const typeInfo
, XSModel* const xsModel
, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
);
static XSIDCDefinition* addOrFind
(
IdentityConstraint* const ic
, XSModel* const xsModel
, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
);
static XSAttributeUse* createXSAttributeUse
(
XSAttributeDeclaration* const xsAttDecl
, XSModel* const xsModel
, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
);
static XSWildcard* createXSWildcard
(
SchemaAttDef* const attDef
, XSModel* const xsModel
, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
);
static XSAnnotation* getAnnotationFromModel
(
XSModel* const xsModel
, const void* const key
);
static XSNamespaceItem* getNamespaceItem
(
const XMLCh* const namespaceKey
, XSModel* const xsModel
);
private:
// -----------------------------------------------------------------------
// Unimplemented constructors and destructor
// -----------------------------------------------------------------------
PSVIUtil();
PSVIUtil(const PSVIUtil&);
PSVIUtil& operator=(const PSVIUtil&);
// -----------------------------------------------------------------------
// Helper methods
// -----------------------------------------------------------------------
// creates a particle corresponding to an element
static XSParticle* createElementParticle
(
const ContentSpecNode* const rootNode
, XSModel* const xsModel
, MemoryManager* const manager
);
// creates a particle corresponding to a wildcard
static XSParticle* createWildcardParticle
(
const ContentSpecNode* const rootNode
, XSModel* const xsModel
, MemoryManager* const manager
);
static XSWildcard* createXSWildcard
(
const ContentSpecNode* const rootNode
, XSModel* const xsModel
, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
);
static void buildAllParticles
(
const ContentSpecNode* const rootNode
, XSParticleList* const particleList
, XSModel* const xsModel
, MemoryManager* const manager
);
static void buildChoiceSequenceParticles
(
const ContentSpecNode* const rootNode
, XSParticleList* const particleList
, XSModel* const xsModel
, MemoryManager* const manager
);
static void putObjectInMap
(
void* key
, XSObject* const object
, XSModel* const xsModel
);
static XSObject* getObjectFromMap
(
void* key
, XSModel* const xsModel
);
};
XERCES_CPP_NAMESPACE_END
#endif
1.1 xml-xerces/c/src/xercesc/framework/psvi/PSVIUtil.cpp
Index: PSVIUtil.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 apache\@apache.org.
*
* 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: PSVIUtil.cpp,v $
* Revision 1.1 2003/11/20 18:21:22 knoaman
* Initial revision.
*
*/
// ---------------------------------------------------------------------------
// Includes
// ---------------------------------------------------------------------------
#include <xercesc/framework/psvi/PSVIUtil.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/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/validators/common/ContentSpecNode.hpp>
#include <xercesc/validators/datatype/DatatypeValidator.hpp>
#include <xercesc/validators/schema/SchemaAttDef.hpp>
#include <xercesc/validators/schema/SchemaGrammar.hpp>
#include <xercesc/validators/schema/identity/IdentityConstraint.hpp>
XERCES_CPP_NAMESPACE_BEGIN
XSParticle* PSVIUtil::createModelGroupParticle(const ContentSpecNode* const rootNode,
XSModel* const xsModel,
MemoryManager* const manager)
{
ContentSpecNode::NodeTypes nodeType = rootNode->getType();
if (nodeType == ContentSpecNode::All
|| nodeType == ContentSpecNode::ModelGroupChoice
|| nodeType == ContentSpecNode::ModelGroupSequence)
{
XSParticle* groupParticle = new (manager) XSParticle(XSParticle::TERM_MODELGROUP, xsModel, manager);
XSParticleList* particleList = new (manager) RefVectorOf<XSParticle> (4, true, manager);
XSAnnotation* annot = getAnnotationFromModel(xsModel, rootNode);
XSModelGroup* modelGroup = 0;
groupParticle->setMinOccurs(rootNode->getMinOccurs());
groupParticle->setMaxOccurs(rootNode->getMaxOccurs());
if (nodeType == ContentSpecNode::All)
{
modelGroup = new (manager) XSModelGroup(XSModelGroup::COMPOSITOR_ALL, particleList, annot, xsModel, manager);
groupParticle->setTerm(modelGroup);
buildAllParticles(rootNode, particleList, xsModel, manager);
}
else
{
if (nodeType == ContentSpecNode::ModelGroupChoice)
modelGroup = new (manager) XSModelGroup(XSModelGroup::COMPOSITOR_CHOICE, particleList, annot, xsModel, manager);
else
modelGroup = new (manager) XSModelGroup(XSModelGroup::COMPOSITOR_SEQUENCE, particleList, annot, xsModel, manager);
groupParticle->setTerm(modelGroup);
buildChoiceSequenceParticles(rootNode->getFirst(), particleList, xsModel, manager);
buildChoiceSequenceParticles(rootNode->getSecond(), particleList, xsModel, manager);
}
return groupParticle;
}
else
return 0;
}
void PSVIUtil::buildAllParticles(const ContentSpecNode* const rootNode,
XSParticleList* const particleList,
XSModel* const xsModel,
MemoryManager* const manager)
{
// 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, manager);
if (rightNode)
buildAllParticles(rightNode, particleList, xsModel, manager);
}
else if (nodeType == ContentSpecNode::Leaf)
{
XSParticle* elemParticle = PSVIUtil::createElementParticle(rootNode, xsModel, manager);
if (elemParticle)
particleList->addElement(elemParticle);
}
}
void PSVIUtil::buildChoiceSequenceParticles(const ContentSpecNode* const rootNode,
XSParticleList* const particleList,
XSModel* const xsModel,
MemoryManager* const manager)
{
if (rootNode)
{
const ContentSpecNode::NodeTypes nodeType = rootNode->getType();
if (nodeType == ContentSpecNode::Sequence)
{
buildChoiceSequenceParticles(rootNode->getFirst(), particleList, xsModel, manager);
buildChoiceSequenceParticles(rootNode->getSecond(), particleList, xsModel, manager);
}
else if (nodeType == ContentSpecNode::Choice)
{
buildChoiceSequenceParticles(rootNode->getFirst(), particleList, xsModel, manager);
buildChoiceSequenceParticles(rootNode->getSecond(), particleList, xsModel, manager);
}
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, manager);
if (wildcardParticle)
particleList->addElement(wildcardParticle);
}
else if (nodeType == ContentSpecNode::Leaf)
{
XSParticle* elemParticle = createElementParticle(rootNode, xsModel, manager);
if (elemParticle)
particleList->addElement(elemParticle);
}
// must be a model group
else
{
XSParticle* xsParticle = createModelGroupParticle(rootNode, xsModel, manager);
if (xsParticle)
particleList->addElement(xsParticle);
}
}
}
XSParticle* PSVIUtil::createElementParticle(const ContentSpecNode* const rootNode,
XSModel* const xsModel,
MemoryManager* const manager)
{
if (rootNode->getElementDecl())
{
XSElementDeclaration* xsElemDecl = addOrFind(
(SchemaElementDecl*) rootNode->getElementDecl(), xsModel, manager
);
if (xsElemDecl)
{
XSParticle* particle = new (manager) XSParticle(XSParticle::TERM_ELEMENT, xsModel, manager);
particle->setTerm(xsElemDecl);
particle->setMaxOccurs(rootNode->getMaxOccurs());
particle->setMinOccurs(rootNode->getMinOccurs());
}
}
return 0;
}
XSParticle* PSVIUtil::createWildcardParticle(const ContentSpecNode* const rootNode,
XSModel* const xsModel,
MemoryManager* const manager)
{
XSWildcard* xsWildcard = createXSWildcard(rootNode, xsModel, manager);
if (xsWildcard)
{
XSParticle* particle = new (manager) XSParticle(XSParticle::TERM_WILDCARD, xsModel, manager);
particle->setTerm(xsWildcard);
particle->setMaxOccurs(rootNode->getMaxOccurs());
particle->setMinOccurs(rootNode->getMinOccurs());
}
return 0;
}
XSAttributeDeclaration* PSVIUtil::addOrFind(SchemaAttDef* const attDef,
XSModel* const xsModel,
MemoryManager* const manager)
{
XSAttributeDeclaration* xsAtt = (XSAttributeDeclaration*) getObjectFromMap(attDef, xsModel);
if (!xsAtt)
{
xsAtt = new (manager) XSAttributeDeclaration(attDef, xsModel, manager);
putObjectInMap(attDef, xsAtt, xsModel);
}
return xsAtt;
}
XSSimpleTypeDefinition* PSVIUtil::addOrFind(DatatypeValidator* const validator,
XSModel* const xsModel,
MemoryManager* const manager)
{
XSSimpleTypeDefinition* xsST = (XSSimpleTypeDefinition*) getObjectFromMap(validator, xsModel);
if (!xsST)
{
xsST = new (manager) XSSimpleTypeDefinition(validator, xsModel, manager);
putObjectInMap(validator, xsST, xsModel);
xsST->construct();
}
return xsST;
}
XSElementDeclaration* PSVIUtil::addOrFind(SchemaElementDecl* const elemDecl,
XSModel* const xsModel,
MemoryManager* const manager)
{
XSElementDeclaration* xsElemDecl = (XSElementDeclaration*) getObjectFromMap(elemDecl, xsModel);
if (!xsElemDecl)
{
xsElemDecl = new (manager) XSElementDeclaration(elemDecl, xsModel, manager);
putObjectInMap(elemDecl, xsElemDecl, xsModel);
xsElemDecl->construct();
}
return xsElemDecl;
}
XSComplexTypeDefinition* PSVIUtil::addOrFind(ComplexTypeInfo* const typeInfo,
XSModel* const xsModel,
MemoryManager* const manager)
{
XSComplexTypeDefinition* xsCT = (XSComplexTypeDefinition*) getObjectFromMap(typeInfo, xsModel);
if (!xsCT)
{
xsCT = new (manager) XSComplexTypeDefinition(typeInfo, xsModel, manager);
putObjectInMap(typeInfo, xsCT, xsModel);
xsCT->construct();
}
return xsCT;
}
XSIDCDefinition* PSVIUtil::addOrFind(IdentityConstraint* const ic,
XSModel* const xsModel,
MemoryManager* const manager)
{
XSIDCDefinition* xsIC = (XSIDCDefinition*) getObjectFromMap(ic, xsModel);
if (!xsIC)
{
xsIC = new (manager) XSIDCDefinition(ic, xsModel, manager);
putObjectInMap(ic, xsIC, xsModel);
}
return xsIC;
}
XSAttributeUse*
PSVIUtil::createXSAttributeUse(XSAttributeDeclaration* const xsAttDecl,
XSModel* const xsModel,
MemoryManager* const manager)
{
XSAttributeUse* attrUse = new (manager) XSAttributeUse(xsAttDecl, xsModel, manager);
xsModel->fDeleteVector->addElement(attrUse);
return attrUse;
}
XSWildcard*
PSVIUtil::createXSWildcard(SchemaAttDef* const attDef,
XSModel* const xsModel,
MemoryManager* const manager)
{
XSWildcard* xsWildcard = new (manager) XSWildcard(attDef, xsModel, manager);
xsModel->fDeleteVector->addElement(xsWildcard);
return xsWildcard;
}
XSWildcard* PSVIUtil::createXSWildcard(const ContentSpecNode* const rootNode,
XSModel* const xsModel,
MemoryManager* const manager)
{
XSWildcard* xsWildcard = new (manager) XSWildcard(rootNode, xsModel, manager);
xsModel->fDeleteVector->addElement(xsWildcard);
return xsWildcard;
}
XSAnnotation* PSVIUtil::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* PSVIUtil::getObjectFromMap(void* key, XSModel* const xsModel)
{
return xsModel->fXercesToXSMap->get(key);
}
void PSVIUtil::putObjectInMap(void* key, XSObject* const object, XSModel* const xsModel)
{
xsModel->fXercesToXSMap->put(key, object);
xsModel->fDeleteVector->addElement(object);
}
XSNamespaceItem* PSVIUtil::getNamespaceItem(const XMLCh* const namespaceKey,
XSModel* const xsModel)
{
return xsModel->fHashNamespace->get(namespaceKey);
}
XERCES_CPP_NAMESPACE_END
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org