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 + -
显示快捷键?