From a1170d5cd63bcf5cc85997f340bd9f8b1acb5221 Mon Sep 17 00:00:00 2001 From: Khaled Noaman <knoaman@apache.org> Date: Fri, 19 Apr 2002 13:33:23 +0000 Subject: [PATCH] Fix for bug 8236. git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@173637 13f79535-47bb-0310-9956-ffa450edef68 --- src/xercesc/internal/XMLScanner.cpp | 3 ++ .../validators/schema/SchemaValidator.cpp | 28 +++++++++++++------ .../validators/schema/SchemaValidator.hpp | 8 ++++++ 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/xercesc/internal/XMLScanner.cpp b/src/xercesc/internal/XMLScanner.cpp index 888e28423..02376626e 100644 --- a/src/xercesc/internal/XMLScanner.cpp +++ b/src/xercesc/internal/XMLScanner.cpp @@ -3283,6 +3283,9 @@ bool XMLScanner::scanStartTagNS(bool& gotData) ); } } + + if (fGrammarType == Grammar::SchemaGrammarType) + ((SchemaElementDecl*)elemDecl)->setXsiComplexTypeInfo(0); } // diff --git a/src/xercesc/validators/schema/SchemaValidator.cpp b/src/xercesc/validators/schema/SchemaValidator.cpp index 871ad48f1..b49ef45a7 100644 --- a/src/xercesc/validators/schema/SchemaValidator.cpp +++ b/src/xercesc/validators/schema/SchemaValidator.cpp @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.9 2002/04/19 13:33:23 knoaman + * Fix for bug 8236. + * * Revision 1.8 2002/04/01 20:17:55 peiyongz * Bug#7551: Exceptions are caught by value, rather than by reference * @@ -194,12 +197,15 @@ SchemaValidator::SchemaValidator(XMLErrorReporter* const errReporter) : , fXsiType(0) , fXsiTypeValidator(0) , fNil(false) + , fTypeStack(0) { + fTypeStack = new ValueStackOf<ComplexTypeInfo*>(8); } SchemaValidator::~SchemaValidator() { delete fXsiType; + delete fTypeStack; } // --------------------------------------------------------------------------- @@ -216,6 +222,8 @@ int SchemaValidator::checkContent (XMLElementDecl* const elemDecl if (!elemDecl) ThrowXML(RuntimeException, XMLExcepts::Val_InvalidElemId); + ((SchemaElementDecl*) elemDecl)->setXsiComplexTypeInfo(fTypeStack->pop()); + // // Get the content spec type of this element. This will tell us what // to do to validate it. @@ -498,6 +506,9 @@ void SchemaValidator::validateAttrValue (const XMLAttDef* attDef void SchemaValidator::validateElement(const XMLElementDecl* elemDef) { + ComplexTypeInfo* elemTypeInfo = ((SchemaElementDecl*)elemDef)->getComplexTypeInfo(); + fTypeStack->push(elemTypeInfo); + if (fXsiType) { // handle "xsi:type" right here unsigned int uri = fXsiType->getURI(); @@ -572,7 +583,8 @@ void SchemaValidator::validateElement(const XMLElementDecl* elemDef) ComplexTypeInfo* destType = ((SchemaElementDecl*)elemDef)->getComplexTypeInfo(); ComplexTypeInfo* tempType = typeInfo; if (destType) { - while (tempType) { + + while (tempType) { if (!XMLString::compareString(tempType->getTypeName(), destType->getTypeName())) break; tempType = tempType->getBaseComplexTypeInfo(); @@ -599,8 +611,12 @@ void SchemaValidator::validateElement(const XMLElementDecl* elemDef) } } - if (!error) + if (!error) { + ((SchemaElementDecl*)elemDef)->setXsiComplexTypeInfo(typeInfo); + fTypeStack->pop(); + fTypeStack->push(typeInfo); + } } else { // typeInfo not found @@ -640,12 +656,8 @@ void SchemaValidator::validateElement(const XMLElementDecl* elemDef) // xsi:type was not specified... // If the corresponding type is abstract, detect an error // - ComplexTypeInfo* typeInfo = ((SchemaElementDecl*)elemDef)->getComplexTypeInfo(); - - if (typeInfo) { - if (typeInfo->getAbstract()) { - emitError(XMLValid::NoUseAbstractType, elemDef->getFullName()); - } + if (elemTypeInfo && elemTypeInfo->getAbstract()) { + emitError(XMLValid::NoUseAbstractType, elemDef->getFullName()); } } diff --git a/src/xercesc/validators/schema/SchemaValidator.hpp b/src/xercesc/validators/schema/SchemaValidator.hpp index 05fe83971..dbb2216df 100644 --- a/src/xercesc/validators/schema/SchemaValidator.hpp +++ b/src/xercesc/validators/schema/SchemaValidator.hpp @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.4 2002/04/19 13:33:23 knoaman + * Fix for bug 8236. + * * Revision 1.3 2002/04/01 15:47:06 knoaman * Move Element Consistency checking (ref to global declarations) to SchemaValidator. * @@ -99,6 +102,7 @@ #include <xercesc/framework/XMLBuffer.hpp> #include <xercesc/framework/XMLValidator.hpp> #include <xercesc/util/RefVectorOf.hpp> +#include <xercesc/util/ValueStackOf.hpp> #include <xercesc/validators/common/GrammarResolver.hpp> #include <xercesc/validators/common/ContentSpecNode.hpp> #include <xercesc/validators/datatype/DatatypeValidator.hpp> @@ -308,6 +312,9 @@ private: // // fSchemaErrorReporter // Report schema process errors + // + // fTypeStack + // Stack of complex type declarations. // ----------------------------------------------------------------------- SchemaGrammar* fSchemaGrammar; GrammarResolver* fGrammarResolver; @@ -319,6 +326,7 @@ private: XMLBuffer fDatatypeBuffer; bool fTrailing; XSDErrorReporter fSchemaErrorReporter; + ValueStackOf<ComplexTypeInfo*>* fTypeStack; }; -- GitLab