diff --git a/src/xercesc/validators/schema/SchemaInfo.cpp b/src/xercesc/validators/schema/SchemaInfo.cpp index 02ca32323417193e586e0e4d200e957dab6a841b..e97a884c56b2fee2f5b2c48491f9d97a8f66e434 100644 --- a/src/xercesc/validators/schema/SchemaInfo.cpp +++ b/src/xercesc/validators/schema/SchemaInfo.cpp @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.3 2002/03/19 15:57:12 knoaman + * Fix for bug 7074. + * * Revision 1.2 2002/02/06 22:24:59 knoaman * Use IDOM for schema processing. * @@ -121,6 +124,8 @@ SchemaInfo::SchemaInfo(const unsigned short elemAttrDefaultQualified, , fImportingInfoList(0) , fFailedRedefineList(0) , fImportedNSList(0) + , fRecursingAnonTypes(0) + , fRecursingTypeNames(0) { fImportingInfoList = new RefVectorOf<SchemaInfo>(4, false); } @@ -142,7 +147,13 @@ SchemaInfo::~SchemaInfo() fImportedNSList = 0; delete fFailedRedefineList; - fFailedRedefineList = 0; + fFailedRedefineList = 0; + + delete fRecursingAnonTypes; + fRecursingAnonTypes = 0; + + delete fRecursingTypeNames; + fRecursingTypeNames = 0; } // --------------------------------------------------------------------------- diff --git a/src/xercesc/validators/schema/SchemaInfo.hpp b/src/xercesc/validators/schema/SchemaInfo.hpp index 4d0218ffcba830405b2d5a48a6020b07982122bd..53afc028badd0a34a84c69cfba4e6a76a46b5640 100644 --- a/src/xercesc/validators/schema/SchemaInfo.hpp +++ b/src/xercesc/validators/schema/SchemaInfo.hpp @@ -123,6 +123,8 @@ public: unsigned int getNamespaceScopeLevel() const; unsigned short getElemAttrDefaultQualified() const; RefVectorEnumerator<SchemaInfo> getImportingListEnumerator() const; + ValueVectorOf<const IDOM_Element*>* getRecursingAnonTypes() const; + ValueVectorOf<const XMLCh*>* getRecursingTypeNames() const; // ----------------------------------------------------------------------- // Setter methods @@ -147,6 +149,7 @@ public: void addFailedRedefine(const IDOM_Element* const anElem); bool isImportingNS(const int namespaceURI); void addImportedNS(const int namespaceURI); + void addRecursingType(const IDOM_Element* const elem, const XMLCh* const name); private: // ----------------------------------------------------------------------- @@ -169,6 +172,8 @@ private: RefVectorOf<SchemaInfo>* fImportingInfoList; ValueVectorOf<const IDOM_Element*>* fFailedRedefineList; ValueVectorOf<int>* fImportedNSList; + ValueVectorOf<const IDOM_Element*>* fRecursingAnonTypes; + ValueVectorOf<const XMLCh*>* fRecursingTypeNames; }; // --------------------------------------------------------------------------- @@ -229,6 +234,19 @@ SchemaInfo::getImportingListEnumerator() const { return RefVectorEnumerator<SchemaInfo>(fImportingInfoList); } +inline ValueVectorOf<const IDOM_Element*>* +SchemaInfo::getRecursingAnonTypes() const { + + return fRecursingAnonTypes; +} + + +inline ValueVectorOf<const XMLCh*>* +SchemaInfo::getRecursingTypeNames() const { + + return fRecursingTypeNames; +} + // --------------------------------------------------------------------------- // Setter methods // --------------------------------------------------------------------------- @@ -354,6 +372,17 @@ inline bool SchemaInfo::isImportingNS(const int namespaceURI) { return (fImportedNSList->containsElement(namespaceURI)); } +inline void SchemaInfo::addRecursingType(const IDOM_Element* const elem, + const XMLCh* const name) { + + if (!fRecursingAnonTypes) { + fRecursingAnonTypes = new ValueVectorOf<const IDOM_Element*>(8); + fRecursingTypeNames = new ValueVectorOf<const XMLCh*>(8); + } + + fRecursingAnonTypes->addElement(elem); + fRecursingTypeNames->addElement(name); +} #endif diff --git a/src/xercesc/validators/schema/TraverseSchema.cpp b/src/xercesc/validators/schema/TraverseSchema.cpp index 0df08ccbc8bdfe72eb0cee0ec9c1577a9c3cf07d..cb912096b1513ddc516a9aa221db876c31f9645e 100644 --- a/src/xercesc/validators/schema/TraverseSchema.cpp +++ b/src/xercesc/validators/schema/TraverseSchema.cpp @@ -193,7 +193,6 @@ TraverseSchema::TraverseSchema( IDOM_Element* const schemaRoot , fFinalDefault(0) , fBlockDefault(0) , fScopeCount(0) - , fRecursingElemIndex(0) , fAnonXSTypeCount(0) , fCircularCheckIndex(0) , fTargetNSURIString(0) @@ -233,8 +232,6 @@ TraverseSchema::TraverseSchema( IDOM_Element* const schemaRoot , fIC_NamespaceDepthNS(0) , fParser(0) , fPreprocessedNodes(0) - , fRecursingAnonTypes(0) - , fRecursingTypeNames(0) { try { @@ -1255,6 +1252,9 @@ int TraverseSchema::traverseComplexTypeDecl(const IDOM_Element* const elem, reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::InvalidChildFollowingConplexContent); } } + else if (fCurrentGroupInfo) { + typeInfo->setPreprocessed(true); + } else { // We must have .... // GROUP, ALL, SEQUENCE or CHOICE, followed by optional attributes @@ -1319,8 +1319,7 @@ int TraverseSchema::traverseComplexTypeDecl(const IDOM_Element* const elem, * */ XercesGroupInfo* -TraverseSchema::traverseGroupDecl(const IDOM_Element* const elem, - const bool circularAllowed) { +TraverseSchema::traverseGroupDecl(const IDOM_Element* const elem) { bool topLevel = isTopLevelComponent(elem); const XMLCh* name = getElementAttValue(elem, SchemaSymbols::fgATT_NAME); @@ -1360,7 +1359,7 @@ TraverseSchema::traverseGroupDecl(const IDOM_Element* const elem, return 0; } - return processGroupRef(elem, ref, circularAllowed); + return processGroupRef(elem, ref); } // ------------------------------------------------------------------ @@ -2365,15 +2364,7 @@ QName* TraverseSchema::traverseElementDecl(const IDOM_Element* const elem, bool& if (typeInfo->getPreprocessed()) { const XMLCh* typeInfoName = typeInfo->getTypeName(); - - if (!fRecursingAnonTypes) { - fRecursingAnonTypes = new ValueVectorOf<const IDOM_Element*>(8); - fRecursingTypeNames = new ValueVectorOf<const XMLCh*>(8); - } - - fRecursingAnonTypes->addElement(content); - fRecursingTypeNames->addElement(typeInfoName + XMLString::indexOf(typeInfoName, chComma) + 1); - fRecursingElemIndex++; + fSchemaInfo->addRecursingType(content, typeInfoName + XMLString::indexOf(typeInfoName, chComma) + 1); } } @@ -3624,6 +3615,9 @@ void TraverseSchema::traverseComplexContentDecl(const XMLCh* const typeName, } } + if (fCurrentGroupInfo) // defer processing until later + throw TraverseSchema::RecursingElement; + // ----------------------------------------------------------------------- // Process the content of the derivation // ----------------------------------------------------------------------- @@ -4298,16 +4292,20 @@ void TraverseSchema::processChildren(const IDOM_Element* const root) { } // for each child node // Handle recursing elements - if any - if (fRecursingElemIndex) { + ValueVectorOf<const IDOM_Element*>* recursingAnonTypes = fSchemaInfo->getRecursingAnonTypes(); + + if (recursingAnonTypes) { - for (int i=0; i < fRecursingElemIndex; i++) { - traverseComplexTypeDecl(fRecursingAnonTypes->elementAt(i), - fRecursingTypeNames->elementAt(i)); + ValueVectorOf<const XMLCh*>* recursingTypeNames = fSchemaInfo->getRecursingTypeNames(); + unsigned int recurseSize = recursingAnonTypes->size(); + + for (unsigned int i=0; i < recurseSize; i++) { + traverseComplexTypeDecl(recursingAnonTypes->elementAt(i), + recursingTypeNames->elementAt(i)); } - fRecursingAnonTypes->removeAllElements(); - fRecursingTypeNames->removeAllElements(); - fRecursingElemIndex = 0; + recursingAnonTypes->removeAllElements(); + recursingTypeNames->removeAllElements(); } } @@ -4885,8 +4883,6 @@ TraverseSchema::getElementComplexTypeInfo(const XMLCh* const typeStr, typeInfo = fComplexTypeRegistry->get(fBuffer.getRawBuffer()); } - int saveRecursingIndex = fRecursingElemIndex; - if (!typeInfo) { if (XMLString::compareString(typeURI, SchemaSymbols::fgURI_SCHEMAFORSCHEMA) != 0 || @@ -4902,27 +4898,8 @@ TraverseSchema::getElementComplexTypeInfo(const XMLCh* const typeStr, } } - // restore schema information, if necessary - if (saveInfo != fSchemaInfo) { - - if (infoType == SchemaInfo::IMPORT) { - - int i = fRecursingElemIndex - 1; - - for (; i >= saveRecursingIndex; i--) { - - const IDOM_Element* elem = fRecursingAnonTypes->elementAt(i); - const XMLCh* typeName = fRecursingTypeNames->elementAt(i); - - fRecursingAnonTypes->removeElementAt(i); - fRecursingTypeNames->removeElementAt(i); - fRecursingElemIndex--; - traverseComplexTypeDecl(elem, typeName); - } - } - - restoreSchemaInfo(saveInfo, infoType); - } + // restore schema information + restoreSchemaInfo(saveInfo, infoType); return typeInfo; } @@ -5566,7 +5543,7 @@ void TraverseSchema::processComplexContent(const XMLCh* const typeName, if (!XMLString::compareString(childName, SchemaSymbols::fgELT_GROUP)) { - XercesGroupInfo* grpInfo = traverseGroupDecl(childElem, true); + XercesGroupInfo* grpInfo = traverseGroupDecl(childElem); if (grpInfo) { @@ -6556,8 +6533,7 @@ void TraverseSchema::checkEnumerationRequiredNotation(const XMLCh* const name, } XercesGroupInfo* TraverseSchema::processGroupRef(const IDOM_Element* const elem, - const XMLCh* const refName, - const bool circularAllowed) { + const XMLCh* const refName) { if (XUtil::getFirstChildElement(elem) != 0) { reportSchemaError(XMLUni::fgValidityDomain, XMLValid::NoContentForRef, SchemaSymbols::fgELT_GROUP); @@ -6575,13 +6551,8 @@ XercesGroupInfo* TraverseSchema::processGroupRef(const IDOM_Element* const elem, if (fCurrentGroupStack->containsElement(nameIndex)) { - if (circularAllowed) { - throw TraverseSchema::RecursingElement; - } - else { - reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::NoCircularDefinition, localPart); - return 0; - } + reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::NoCircularDefinition, localPart); + return 0; } XercesGroupInfo* groupInfo = 0; @@ -6637,7 +6608,6 @@ XercesGroupInfo* TraverseSchema::processGroupRef(const IDOM_Element* const elem, if (groupElem != 0) { - int saveRecursingIndex = fRecursingElemIndex; groupInfo = traverseGroupDecl(groupElem); if (groupInfo && fCurrentGroupInfo @@ -6645,30 +6615,8 @@ XercesGroupInfo* TraverseSchema::processGroupRef(const IDOM_Element* const elem, copyGroupElements(groupInfo, fCurrentGroupInfo, 0); } - // restore schema information, if necessary - if (saveInfo != fSchemaInfo) { - - if (infoType == SchemaInfo::IMPORT) { - - // -------------------------------------------------- - // Handle recursing elements - // -------------------------------------------------- - int i = fRecursingElemIndex - 1; - - for (; i >= saveRecursingIndex; i--) { - - const IDOM_Element* elem = fRecursingAnonTypes->elementAt(i); - const XMLCh* typeName = fRecursingTypeNames->elementAt(i); - - fRecursingAnonTypes->removeElementAt(i); - fRecursingTypeNames->removeElementAt(i); - fRecursingElemIndex--; - traverseComplexTypeDecl(elem, typeName); - } - } - - restoreSchemaInfo(saveInfo, infoType); - } + // restore schema information + restoreSchemaInfo(saveInfo, infoType); return groupInfo; } @@ -8787,8 +8735,6 @@ void TraverseSchema::cleanUp() { delete fIC_NamespaceDepthNS; delete fIC_NodeListNS; delete fPreprocessedNodes; - delete fRecursingTypeNames; - delete fRecursingAnonTypes; delete fParser; } diff --git a/src/xercesc/validators/schema/TraverseSchema.hpp b/src/xercesc/validators/schema/TraverseSchema.hpp index bb8907df4fc9e20a93c97b5dab00d102fb1fb5ee..d51c17e3093985fcdfef7ceace14c98417524cd5 100644 --- a/src/xercesc/validators/schema/TraverseSchema.hpp +++ b/src/xercesc/validators/schema/TraverseSchema.hpp @@ -206,8 +206,7 @@ private: const int modelGroupType); ContentSpecNode* traverseAny(const IDOM_Element* const anyDecl); ContentSpecNode* traverseAll(const IDOM_Element* const allElem); - XercesGroupInfo* traverseGroupDecl(const IDOM_Element* const childElem, - const bool circularAllowed = false); + XercesGroupInfo* traverseGroupDecl(const IDOM_Element* const childElem); XercesAttGroupInfo* traverseAttributeGroupDecl(const IDOM_Element* const elem, ComplexTypeInfo* const typeInfo); XercesAttGroupInfo* traverseAttributeGroupDeclNS(const XMLCh* const uriStr, @@ -353,8 +352,7 @@ private: * Process a 'ref' on a group */ XercesGroupInfo* processGroupRef(const IDOM_Element* const elem, - const XMLCh* const refName, - const bool circularAllowed); + const XMLCh* const refName); /** * Process a 'ref' on a attributeGroup @@ -786,7 +784,6 @@ private: int fFinalDefault; int fBlockDefault; int fScopeCount; - int fRecursingElemIndex; unsigned int fAnonXSTypeCount; unsigned int fCircularCheckIndex; const XMLCh* fTargetNSURIString; @@ -828,8 +825,6 @@ private: RefHashTableOf<ValueVectorOf<unsigned int> >* fIC_NamespaceDepthNS; IDOMParser* fParser; RefHashTableOf<SchemaInfo>* fPreprocessedNodes; - ValueVectorOf<const IDOM_Element*>* fRecursingAnonTypes; - ValueVectorOf<const XMLCh*>* fRecursingTypeNames; friend class GeneralAttributeCheck; };