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]

Reply via email to