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]