inline void SchemaInfo::addRecursingType(const DOMElement* const elem, const XMLCh* const name) { if (!fRecursingAnonTypes) { fRecursingAnonTypes = new ValueVectorOf<const DOMElement*>(8); fRecursingTypeNames = new ValueVectorOf<const XMLCh*>(8); } fRecursingAnonTypes->addElement(elem); fRecursingTypeNames->addElement(name); }
inline void SchemaInfo::addFailedRedefine(const DOMElement* const anElem) { if (!fFailedRedefineList) { fFailedRedefineList = new ValueVectorOf<const DOMElement*>(4); } fFailedRedefineList->addElement(anElem); }
inline void SchemaInfo::addImportedNS(const int namespaceURI) { if (!fImportedNSList) { fImportedNSList = new ValueVectorOf<int>(4); } if (!fImportedNSList->containsElement(namespaceURI)) fImportedNSList->addElement(namespaceURI); }
// --------------------------------------------------------------------------- // MixedContentModel: Private helper methods // --------------------------------------------------------------------------- void MixedContentModel::buildChildList( ContentSpecNode* const curNode , ValueVectorOf<QName*>& toFill , ValueVectorOf<ContentSpecNode::NodeTypes>& toType) { // Get the type of spec node our current node is const ContentSpecNode::NodeTypes curType = curNode->getType(); // If its a leaf, then store its id in the target list if ((curType == ContentSpecNode::Leaf) || (curType == ContentSpecNode::Any) || (curType == ContentSpecNode::Any_Other) || (curType == ContentSpecNode::Any_NS) ) { toFill.addElement(curNode->getElement()); toType.addElement(curType); return; } // Get both the child node pointers ContentSpecNode* leftNode = curNode->getFirst(); ContentSpecNode* rightNode = curNode->getSecond(); // And recurse according to the type of node if (((curType & 0x0f) == ContentSpecNode::Choice) || ((curType & 0x0f) == ContentSpecNode::Sequence)) { // Recurse on the left and right nodes buildChildList(leftNode, toFill, toType); // The last node of a choice or sequence has a null right if (rightNode) buildChildList(rightNode, toFill, toType); } else if ((curType == ContentSpecNode::OneOrMore) || (curType == ContentSpecNode::ZeroOrOne) || (curType == ContentSpecNode::ZeroOrMore)) { // Just do the left node on this one buildChildList(leftNode, toFill, toType); } }
// --------------------------------------------------------------------------- // AllContentModel: Private helper methods // --------------------------------------------------------------------------- void AllContentModel::buildChildList(ContentSpecNode* const curNode , ValueVectorOf<QName*>& toFill , ValueVectorOf<bool>& toOptional) { // Get the type of spec node our current node is const ContentSpecNode::NodeTypes curType = curNode->getType(); if (curType == ContentSpecNode::All) { // Get both the child node pointers ContentSpecNode* leftNode = curNode->getFirst(); ContentSpecNode* rightNode = curNode->getSecond(); // Recurse on the left and right nodes buildChildList(leftNode, toFill, toOptional); buildChildList(rightNode, toFill, toOptional); } else if (curType == ContentSpecNode::Leaf) { // At leaf, add the element to list of elements permitted in the all toFill.addElement(curNode->getElement()); toOptional.addElement(false); fNumRequired++; } else if (curType == ContentSpecNode::ZeroOrOne) { // At ZERO_OR_ONE node, subtree must be an element // that was specified with minOccurs=0, maxOccurs=1 ContentSpecNode* leftNode = curNode->getFirst(); if (leftNode->getType() != ContentSpecNode::Leaf) ThrowXMLwithMemMgr(RuntimeException, XMLExcepts::CM_UnknownCMSpecType, fMemoryManager); toFill.addElement(leftNode->getElement()); toOptional.addElement(true); } else ThrowXMLwithMemMgr(RuntimeException, XMLExcepts::CM_UnknownCMSpecType, fMemoryManager); }
DOMElement* SchemaInfo::getTopLevelComponent(const unsigned short compCategory, const XMLCh* const compName, const XMLCh* const name) { if (compCategory >= C_Count) return 0; DOMElement* child = XUtil::getFirstChildElement(fSchemaRootElement); if (!child) return 0; ValueVectorOf<DOMElement*>* compList = fTopLevelComponents[compCategory]; if (fTopLevelComponents[compCategory] == 0) { compList= new (fMemoryManager) ValueVectorOf<DOMElement*>(16, fMemoryManager); fTopLevelComponents[compCategory] = compList; } else { unsigned int listLen = compList->size(); for (unsigned int i= 0; i < listLen; i++) { child = compList->elementAt(i); if (XMLString::equals(child->getAttribute(SchemaSymbols::fgATT_NAME), name)) return child; } } DOMElement* redefParent = (DOMElement*) child->getParentNode(); // Parent is not "redefine" if (!XMLString::equals(redefParent->getLocalName(),SchemaSymbols::fgELT_REDEFINE)) redefParent = 0; while (child != 0) { if (XMLString::equals(child->getLocalName(), compName)) { compList->addElement(child); if (XMLString::equals(child->getAttribute(SchemaSymbols::fgATT_NAME), name)) return child; } else if (XMLString::equals(child->getLocalName(),SchemaSymbols::fgELT_REDEFINE) && (!fFailedRedefineList || !fFailedRedefineList->containsElement(child))) { // if redefine DOMElement* redefineChild = XUtil::getFirstChildElement(child); while (redefineChild != 0) { if ((!fFailedRedefineList || !fFailedRedefineList->containsElement(redefineChild)) && XMLString::equals(redefineChild->getLocalName(), compName)) { compList->addElement(redefineChild); if (XMLString::equals(redefineChild->getAttribute(SchemaSymbols::fgATT_NAME), name)) return redefineChild; } redefineChild = XUtil::getNextSiblingElement(redefineChild); } } child = XUtil::getNextSiblingElement(child); if (child == 0 && redefParent) { child = XUtil::getNextSiblingElement(redefParent); redefParent = 0; } } return child; }