knoaman 2003/02/26 11:30:11 Modified: c/src/xercesc/internal IGXMLScanner2.cpp SGXMLScanner.cpp c/src/xercesc/validators/schema TraverseSchema.cpp TraverseSchema.hpp Log: [Bug 17425] Schema using cyclic import fails validation. Revision Changes Path 1.15 +2 -2 xml-xerces/c/src/xercesc/internal/IGXMLScanner2.cpp Index: IGXMLScanner2.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/IGXMLScanner2.cpp,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- IGXMLScanner2.cpp 6 Feb 2003 13:51:54 -0000 1.14 +++ IGXMLScanner2.cpp 26 Feb 2003 19:30:10 -0000 1.15 @@ -1378,7 +1378,7 @@ { const XMLCh* newUri = root->getAttribute(SchemaSymbols::fgATT_TARGETNAMESPACE); if (!XMLString::equals(newUri, uri)) { - if (fValidate) { + if (fValidate || fValScheme == Val_Auto) { fValidator->emitError(XMLValid::WrongTargetNamespace, loc, uri); } 1.19 +2 -2 xml-xerces/c/src/xercesc/internal/SGXMLScanner.cpp Index: SGXMLScanner.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/SGXMLScanner.cpp,v retrieving revision 1.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- SGXMLScanner.cpp 6 Feb 2003 13:51:54 -0000 1.18 +++ SGXMLScanner.cpp 26 Feb 2003 19:30:10 -0000 1.19 @@ -3124,7 +3124,7 @@ { const XMLCh* newUri = root->getAttribute(SchemaSymbols::fgATT_TARGETNAMESPACE); if (!XMLString::equals(newUri, uri)) { - if (fValidate) { + if (fValidate || fValScheme == Val_Auto) { fValidator->emitError(XMLValid::WrongTargetNamespace, loc, uri); } 1.61 +68 -35 xml-xerces/c/src/xercesc/validators/schema/TraverseSchema.cpp Index: TraverseSchema.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/TraverseSchema.cpp,v retrieving revision 1.60 retrieving revision 1.61 diff -u -r1.60 -r1.61 --- TraverseSchema.cpp 27 Jan 2003 16:59:49 -0000 1.60 +++ TraverseSchema.cpp 26 Feb 2003 19:30:10 -0000 1.61 @@ -2005,48 +2005,25 @@ attType = XMLAttDef::Notation; } else { - attType = XMLAttDef::Simple; - - if (dv == 0 && (!typeURI || !*typeURI)) { - - DOMElement* topLevelType = fSchemaInfo->getTopLevelComponent(SchemaInfo::C_SimpleType, - SchemaSymbols::fgELT_SIMPLETYPE, localPart, &fSchemaInfo); - - if (topLevelType) { - dv = traverseSimpleTypeDecl(topLevelType); - } - else { - reportSchemaError(elem, XMLUni::fgXMLErrDomain, XMLErrs::AttributeSimpleTypeNotFound, - typeURI, localPart, name); - } - } } } else { //isn't of the schema for schemas namespace... - // check if the type is from the same Schema - dv = getDatatypeValidator(typeURI, localPart); - - if (dv == 0 && XMLString::equals(typeURI, fTargetNSURIString)) { - - DOMElement* topLevelType = fSchemaInfo->getTopLevelComponent(SchemaInfo::C_SimpleType, - SchemaSymbols::fgELT_SIMPLETYPE, localPart, &fSchemaInfo); - - if (topLevelType) { - dv = traverseSimpleTypeDecl(topLevelType); - } - else { - reportSchemaError(elem, XMLUni::fgXMLErrDomain, XMLErrs::AttributeSimpleTypeNotFound, - typeURI, localPart, name); - } - } - + dv = getAttrDatatypeValidatorNS(elem, localPart, typeURI); attType = XMLAttDef::Simple; } if (!dv) { - reportSchemaError(elem, XMLUni::fgXMLErrDomain, XMLErrs::TypeNotFound, typeURI, localPart); + reportSchemaError + ( + elem + , XMLUni::fgXMLErrDomain + , XMLErrs::AttributeSimpleTypeNotFound + , typeURI + , localPart + , name + ); } } @@ -4793,7 +4770,6 @@ if (!XMLString::equals(typeURI, SchemaSymbols::fgURI_SCHEMAFORSCHEMA) || XMLString::equals(fTargetNSURIString, SchemaSymbols::fgURI_SCHEMAFORSCHEMA)) { - SchemaInfo* saveInfo = fSchemaInfo; DOMElement* typeElem = fSchemaInfo->getTopLevelComponent(SchemaInfo::C_SimpleType, SchemaSymbols::fgELT_SIMPLETYPE, localPart, &fSchemaInfo); @@ -4817,6 +4793,63 @@ return dv; } + +DatatypeValidator* +TraverseSchema::getAttrDatatypeValidatorNS(const DOMElement* const elem, + const XMLCh* localPart, + const XMLCh* typeURI) +{ + DatatypeValidator* dv = getDatatypeValidator(typeURI, localPart); + SchemaInfo::ListType infoType = SchemaInfo::INCLUDE; + SchemaInfo* saveInfo = fSchemaInfo; + int saveScope = fCurrentScope; + + if (!XMLString::equals(typeURI, fTargetNSURIString) + && (typeURI && *typeURI)) { + + // Make sure that we have an explicit import statement. + // Clause 4 of Schema Representation Constraint: + // http://www.w3.org/TR/xmlschema-1/#src-resolve + unsigned int uriId = fURIStringPool->addOrFind(typeURI); + + if (!fSchemaInfo->isImportingNS(uriId)) { + + reportSchemaError(elem, XMLUni::fgXMLErrDomain, XMLErrs::InvalidNSReference, typeURI); + return 0; + } + + if (!dv) { + SchemaInfo* impInfo = fSchemaInfo->getImportInfo(uriId); + + if (!impInfo || impInfo->getProcessed()) + return 0; + + infoType = SchemaInfo::IMPORT; + restoreSchemaInfo(impInfo, infoType); + } + } + + if (!dv) { + + DOMElement* typeElem = fSchemaInfo->getTopLevelComponent + ( + SchemaInfo::C_SimpleType + , SchemaSymbols::fgELT_SIMPLETYPE + , localPart + , &fSchemaInfo + ); + + if (typeElem) + dv = traverseSimpleTypeDecl(typeElem); + + // restore schema information, if necessary + if (saveInfo != fSchemaInfo) { + restoreSchemaInfo(saveInfo, infoType, saveScope); + } + } + + return dv; +} ComplexTypeInfo* TraverseSchema::getElementComplexTypeInfo(const DOMElement* const elem, 1.22 +6 -1 xml-xerces/c/src/xercesc/validators/schema/TraverseSchema.hpp Index: TraverseSchema.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/TraverseSchema.hpp,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- TraverseSchema.hpp 15 Jan 2003 15:32:15 -0000 1.21 +++ TraverseSchema.hpp 26 Feb 2003 19:30:11 -0000 1.22 @@ -492,6 +492,11 @@ const XMLCh* const uriStr, const XMLCh* const localPart); + DatatypeValidator* + getAttrDatatypeValidatorNS(const DOMElement* const elem, + const XMLCh* localPart, + const XMLCh* typeURI); + /** * Returns true if a DOM Element is an attribute or attribute group */
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]