xsobjectfactory.cpp

来自「IBM的解析xml的工具Xerces的源代码」· C++ 代码 · 共 1,121 行 · 第 1/3 页

CPP
1,121
字号
    XSAnnotation* annot = (attDef->getBaseAttDecl())        ? getAnnotationFromModel(xsModel, attDef->getBaseAttDecl())        : getAnnotationFromModel(xsModel, attDef);    XSWildcard* xsWildcard = new (fMemoryManager) XSWildcard    (        attDef        , annot        , 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    );    fDeleteVector->addElement(xsObj);    // process local elements    unsigned int elemCount = groupInfo->elementCount();    for (unsigned int j=0; j<elemCount; j++)    {        SchemaElementDecl* elemDecl = groupInfo->elementAt(j);        if (elemDecl->getEnclosingScope() == groupInfo->getScope())            addOrFind(elemDecl, xsModel);    }    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++)         {            SchemaAttDef* attDef = attGroupInfo->attributeAt(i);            XSAttributeDeclaration* xsAttDecl = 0;            if (attDef->getBaseAttDecl())                xsAttDecl = addOrFind(attDef->getBaseAttDecl(), xsModel);            else                xsAttDecl = addOrFind(attDef, xsModel);            if (xsAttDecl && (attDef->getDefaultType() != XMLAttDef::Prohibited)) // just for sanity            {                XSAttributeUse* attUse = createXSAttributeUse(xsAttDecl, xsModel);                xsAttList->addElement(attUse);                processAttUse(attDef, attUse);            }        }    }        if (attGroupInfo->getCompleteWildCard())        xsWildcard = createXSWildcard(attGroupInfo->getCompleteWildCard(), xsModel);    XSAttributeGroupDefinition* xsObj = new (fMemoryManager) XSAttributeGroupDefinition    (        attGroupInfo        , xsAttList        , xsWildcard        , getAnnotationFromModel(xsModel, attGroupInfo)        , xsModel        , fMemoryManager    );    fDeleteVector->addElement(xsObj);    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++)    {        XSNamespaceItem* nsItem = namespaceItemList->elementAt(i);        if (nsItem->fGrammar)        {            annot = nsItem->fGrammar->getAnnotation(key);            if (annot)                return annot;        }    }    if (xsModel->fParent)        return getAnnotationFromModel(xsModel->fParent, key);    return 0;}void XSObjectFactory::putObjectInMap(void* key, XSObject* const object){     fXercesToXSMap->put(key, object);     fDeleteVector->addElement(object);}void XSObjectFactory::processFacets(DatatypeValidator* const dv,                                    XSModel* const xsModel,                                    XSSimpleTypeDefinition* const xsST){    // NOTE: XSMultiValueFacetList is not owned by XSModel!    // NOTE: XSFacetList is not owned by XSModel!    bool isFixed = false;    int dvFacetsDefined = dv->getFacetsDefined();    int dvFixedFacets = dv->getFixed();    int definedFacets = 0;    int fixedFacets = 0;    XSMultiValueFacetList* xsMultiFacetList = 0;    StringList* patternList = 0;    XSFacetList* xsFacetList = new (fMemoryManager) RefVectorOf<XSFacet>(4, false, fMemoryManager);    if (isMultiValueFacetDefined(dv))        xsMultiFacetList = new (fMemoryManager) RefVectorOf<XSMultiValueFacet>(2, false, fMemoryManager);    if (dvFacetsDefined & DatatypeValidator::FACET_ENUMERATION)    {        RefArrayVectorOf<XMLCh>* enumList = (RefArrayVectorOf<XMLCh>*) dv->getEnumString();        if (dvFixedFacets & DatatypeValidator::FACET_ENUMERATION)        {            isFixed = true;            fixedFacets |= XSSimpleTypeDefinition::FACET_ENUMERATION;        }        XSMultiValueFacet* mvFacet = new (fMemoryManager) XSMultiValueFacet(            XSSimpleTypeDefinition::FACET_ENUMERATION , enumList, isFixed            , getAnnotationFromModel(xsModel, enumList), xsModel, fMemoryManager        );        fDeleteVector->addElement(mvFacet);        xsMultiFacetList->addElement(mvFacet);        definedFacets |= XSSimpleTypeDefinition::FACET_ENUMERATION;    }    if (dv->getFacets())    {        RefHashTableOfEnumerator<KVStringPair> e(dv->getFacets(), false, fMemoryManager);        while (e.hasMoreElements())        {            KVStringPair& pair = e.nextElement();            XMLCh* key = pair.getKey();            XSSimpleTypeDefinition::FACET facetType;            XSAnnotation* annot = getAnnotationFromModel(xsModel, &pair);            if (XMLString::equals(key, SchemaSymbols::fgELT_MAXINCLUSIVE))            {                facetType = XSSimpleTypeDefinition::FACET_MAXINCLUSIVE;                isFixed = ((dvFixedFacets & DatatypeValidator::FACET_MAXINCLUSIVE) != 0);            }            else if (XMLString::equals(key, SchemaSymbols::fgELT_MAXEXCLUSIVE))            {                facetType = XSSimpleTypeDefinition::FACET_MAXEXCLUSIVE;                isFixed = ((dvFixedFacets & DatatypeValidator::FACET_MAXEXCLUSIVE) !=0);            }            else if (XMLString::equals(key, SchemaSymbols::fgELT_MININCLUSIVE))            {                facetType = XSSimpleTypeDefinition::FACET_MININCLUSIVE;                isFixed = ((dvFixedFacets & DatatypeValidator::FACET_MININCLUSIVE) !=0);            }            else if (XMLString::equals(key, SchemaSymbols::fgELT_MINEXCLUSIVE))            {                facetType = XSSimpleTypeDefinition::FACET_MINEXCLUSIVE;                isFixed = ((dvFixedFacets & DatatypeValidator::FACET_MINEXCLUSIVE) != 0);            }            else if (XMLString::equals(key, SchemaSymbols::fgELT_LENGTH))            {                facetType = XSSimpleTypeDefinition::FACET_LENGTH;                isFixed = ((dvFixedFacets & DatatypeValidator::FACET_LENGTH) != 0);            }            else if (XMLString::equals(key, SchemaSymbols::fgELT_MINLENGTH))            {                facetType = XSSimpleTypeDefinition::FACET_MINLENGTH;                isFixed = ((dvFixedFacets & DatatypeValidator::FACET_MINLENGTH) != 0);            }            else if (XMLString::equals(key, SchemaSymbols::fgELT_MAXLENGTH))            {                facetType = XSSimpleTypeDefinition::FACET_MAXLENGTH;                isFixed = ((dvFixedFacets & DatatypeValidator::FACET_MAXLENGTH) != 0);            }            else if (XMLString::equals(key, SchemaSymbols::fgELT_TOTALDIGITS))            {                facetType = XSSimpleTypeDefinition::FACET_TOTALDIGITS;                isFixed = ((dvFixedFacets & DatatypeValidator::FACET_TOTALDIGITS) != 0);            }            else if (XMLString::equals(key, SchemaSymbols::fgELT_FRACTIONDIGITS))            {                facetType = XSSimpleTypeDefinition::FACET_FRACTIONDIGITS;                isFixed = ((dvFixedFacets & DatatypeValidator::FACET_FRACTIONDIGITS) != 0);            }            else if (XMLString::equals(key, SchemaSymbols::fgELT_WHITESPACE))            {                facetType = XSSimpleTypeDefinition::FACET_WHITESPACE;                isFixed = ((dvFixedFacets & DatatypeValidator::FACET_WHITESPACE) != 0);            }            else if (XMLString::equals(key, SchemaSymbols::fgELT_PATTERN))            {                XMLStringTokenizer tokenizer(dv->getPattern(), regexSeparator, fMemoryManager);                patternList = new (fMemoryManager) RefArrayVectorOf<XMLCh>(                    tokenizer.countTokens(), true, fMemoryManager                );                                while (tokenizer.hasMoreTokens())                    patternList->addElement(XMLString::replicate(tokenizer.nextToken(), fMemoryManager));                if (dvFixedFacets & DatatypeValidator::FACET_PATTERN)                {                    isFixed = true;                    fixedFacets |= XSSimpleTypeDefinition::FACET_PATTERN;                }                XSMultiValueFacet* mvFacet = new (fMemoryManager) XSMultiValueFacet(                    XSSimpleTypeDefinition::FACET_PATTERN, patternList                    , isFixed, annot, xsModel, fMemoryManager                );                fDeleteVector->addElement(mvFacet);                xsMultiFacetList->addElement(mvFacet);                definedFacets |= XSSimpleTypeDefinition::FACET_PATTERN;                continue;            }            else            {                // REVISIT: hmm... what about XSSimpleTypeDefinition::FACET_NONE                // don't think I need to create an empty Facet?                continue;            }            XSFacet* xsFacet = new (fMemoryManager) XSFacet(                facetType, pair.getValue(), isFixed, annot, xsModel, fMemoryManager);            fDeleteVector->addElement(xsFacet);            xsFacetList->addElement(xsFacet);            definedFacets |= facetType;            if (isFixed)                 fixedFacets |= facetType;        }    }    // add whistespace facet if missing    if ((definedFacets & XSSimpleTypeDefinition::FACET_WHITESPACE) == 0)    {        XSFacet* xsFacet = new (fMemoryManager) XSFacet(            XSSimpleTypeDefinition::FACET_WHITESPACE            , dv->getWSstring(dv->getWSFacet())            , false, 0, xsModel, fMemoryManager);        fDeleteVector->addElement(xsFacet);        xsFacetList->addElement(xsFacet);        definedFacets |= XSSimpleTypeDefinition::FACET_WHITESPACE;    }    // inherit facets from base    if (xsST->getBaseType() && xsST->getBaseType()->getTypeCategory() == XSTypeDefinition::SIMPLE_TYPE)    {        XSSimpleTypeDefinition* baseST = (XSSimpleTypeDefinition*) xsST->getBaseType();        XSFacetList* baseFacets = baseST->getFacets();        for (unsigned int i=0; i<baseFacets->size(); i++)        {            XSFacet* bFacet = baseFacets->elementAt(i);            if ((definedFacets & bFacet->getFacetKind()) == 0)            {                definedFacets |= bFacet->getFacetKind();                xsFacetList->addElement(bFacet);                if (bFacet->isFixed())                    fixedFacets |= bFacet->getFacetKind();            }        }        if (baseST->getMultiValueFacets())        {            XSMultiValueFacetList* baseMVFacets = baseST->getMultiValueFacets();            for (unsigned int j=0; j<baseMVFacets->size(); j++)            {                XSMultiValueFacet* bFacet = baseMVFacets->elementAt(j);                if ((definedFacets & bFacet->getFacetKind()) == 0)                {                    definedFacets |= bFacet->getFacetKind();                    xsMultiFacetList->addElement(bFacet);                    if (bFacet->isFixed())                        fixedFacets |= bFacet->getFacetKind();                }            }        }    }    xsST->setFacetInfo(definedFacets, fixedFacets, xsFacetList, xsMultiFacetList, patternList);}void XSObjectFactory::processAttUse(SchemaAttDef* const attDef,                                    XSAttributeUse* const xsAttUse){    bool isRequired = false;    XSConstants::VALUE_CONSTRAINT constraintType = XSConstants::VALUE_CONSTRAINT_NONE;        if (attDef->getDefaultType() == XMLAttDef::Default)    {        constraintType = XSConstants::VALUE_CONSTRAINT_DEFAULT;    }    else if ((attDef->getDefaultType() == XMLAttDef::Fixed) ||             (attDef->getDefaultType() == XMLAttDef::Required_And_Fixed))    {        constraintType = XSConstants::VALUE_CONSTRAINT_FIXED;    }    if (attDef->getDefaultType() == XMLAttDef::Required ||        attDef->getDefaultType() == XMLAttDef::Required_And_Fixed)        isRequired = true;    xsAttUse->set(isRequired, constraintType, attDef->getValue());}bool XSObjectFactory::isMultiValueFacetDefined(DatatypeValidator* const dv){    DatatypeValidator* tmpDV = dv;    while (tmpDV)    {        if ((tmpDV->getFacetsDefined() & DatatypeValidator::FACET_PATTERN)        ||  (tmpDV->getFacetsDefined() & DatatypeValidator::FACET_ENUMERATION))            return true;        tmpDV = tmpDV->getBaseValidator();    }    return false;}XERCES_CPP_NAMESPACE_END

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?