You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by ga...@apache.org on 2003/01/29 21:01:21 UTC

cvs commit: xml-xerces/c/src/xercesc/validators/schema SchemaValidator.cpp

gareth      2003/01/29 12:01:21

  Modified:    c/src/xercesc/validators/schema SchemaValidator.cpp
  Log:
  We now detect when elements/attributes are validated and the result of the validation is stored.
  
  Revision  Changes    Path
  1.27      +98 -18    xml-xerces/c/src/xercesc/validators/schema/SchemaValidator.cpp
  
  Index: SchemaValidator.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/SchemaValidator.cpp,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- SchemaValidator.cpp	20 Jan 2003 19:04:48 -0000	1.26
  +++ SchemaValidator.cpp	29 Jan 2003 20:01:20 -0000	1.27
  @@ -56,6 +56,9 @@
   
   /*
    * $Log$
  + * Revision 1.27  2003/01/29 20:01:20  gareth
  + * We now detect when elements/attributes are validated and the result of the validation is stored.
  + *
    * Revision 1.26  2003/01/20 19:04:48  knoaman
    * Fix for particle derivation checking.
    *
  @@ -273,6 +276,8 @@
                                    , QName** const         children
                                    , const unsigned int    childCount)
   {
  +    bool valid = true;
  +
       //
       //  Look up the element id in our element decl pool. This will get us
       //  the element decl in our own way of looking at them.
  @@ -294,8 +299,9 @@
           //  We can do this one here. It cannot have any children. If it does
           //  we return 0 as the index of the first bad child.
           //
  -        if (childCount)
  +        if (childCount) {
               return 0;
  +        }
       }
       else if ((modelType == SchemaElementDecl::Mixed_Simple)
            ||  (modelType == SchemaElementDecl::Mixed_Complex)
  @@ -307,8 +313,11 @@
           // character or element information item [children].
           //
           if (fNil) {
  -            if (childCount > 0 || !XMLString::equals(fDatatypeBuffer.getRawBuffer(), XMLUni::fgZeroLenString))
  +            if (childCount > 0 || !XMLString::equals(fDatatypeBuffer.getRawBuffer(), XMLUni::fgZeroLenString)) {
                   emitError(XMLValid::NilAttrNotEmpty, elemDecl->getFullName());
  +                ((SchemaElementDecl *)(elemDecl))->setValidity(PSVIDefs::INVALID);
  +                valid = false;
  +            }
   
           }
           else {
  @@ -325,6 +334,11 @@
                                                         , fGrammarResolver
                                                         , getScanner()->getURIStringPool());
               }
  +
  +            if(result != -1) {
  +                ((SchemaElementDecl *)(elemDecl))->setValidity(PSVIDefs::INVALID);
  +            }
  +
               return result;
           }
       }
  @@ -333,8 +347,10 @@
           // Normally for SchemaElementDecl::Any, We pass no judgement on it and anything goes
           // but if there is a fXsiTypeValidator, we need to use it for validation
   
  +
           if (modelType == SchemaElementDecl::Simple && childCount > 0) {
               emitError(XMLValid::SimpleTypeHasChild, elemDecl->getFullName());
  +            valid = false;
           } else {
               try {
                   DatatypeValidator* fCurrentDV = 0;
  @@ -350,8 +366,10 @@
                       fXsiTypeValidator = 0;
                   }
                   if (!fCurrentDV) {
  -                    if (modelType == SchemaElementDecl::Simple)
  +                    if (modelType == SchemaElementDecl::Simple) {
                           emitError(XMLValid::NoDatatypeValidatorForSimpleType, elemDecl->getFullName());
  +                        valid = false;
  +                    }
                   } else {
                       XMLCh* value = fDatatypeBuffer.getRawBuffer();
                       XMLCh* elemDefaultValue = ((SchemaElementDecl*) elemDecl)->getDefaultValue();
  @@ -445,9 +463,10 @@
                           // a default value was specified
   
                           // if nillable, it's an error to have default value
  -                        if (fNil)
  +                        if (fNil) {
                               emitError(XMLValid::NilAttrNotEmpty, elemDecl->getFullName());
  -
  +                            valid = false;
  +                        }
                           if (XMLString::equals(value, XMLUni::fgZeroLenString)) {
                               // if this element didn't specified any value
                               // use default value
  @@ -465,13 +484,17 @@
                               // this element has specified some value
                               // if the flag is FIXED, then this value must be same as default value
                               if ((((SchemaElementDecl*)elemDecl)->getMiscFlags() & SchemaSymbols::XSD_FIXED) != 0) {
  -                                if (fCurrentDV->compare(value, elemDefaultValue) != 0 )
  +                                if (fCurrentDV->compare(value, elemDefaultValue) != 0 ) {
                                       emitError(XMLValid::FixedDifferentFromActual, elemDecl->getFullName());
  +                                    valid = false;
  +                                }
                               }
   
                               // if nillable, it's an error to have value
  -                            if (fNil)
  +                            if (fNil) {
                                   emitError(XMLValid::NilAttrNotEmpty, elemDecl->getFullName());
  +                                valid = false;
  +                            }
                               else
                                   fCurrentDV->validate(value);
                           }
  @@ -484,6 +507,7 @@
                           }
                           else if (fNil) {
                               emitError(XMLValid::NilAttrNotEmpty, elemDecl->getFullName());
  +                            valid = false;
                           }
                           else
                               fCurrentDV->validate(value);
  @@ -492,8 +516,10 @@
               }
               catch (XMLException& idve) {
                   emitError (XMLValid::DatatypeError, idve.getType(), idve.getMessage());
  +                valid = false;
               }
               catch (...) {
  +                ((SchemaElementDecl *)(elemDecl))->setValidity(PSVIDefs::INVALID);
                   emitError(XMLValid::GenericError);
                   throw;
               }
  @@ -508,6 +534,10 @@
       fNil = false;
       fTrailing=false;
   
  +    if(!valid) {
  +        ((SchemaElementDecl *)(elemDecl))->setValidity(PSVIDefs::INVALID);
  +    }
  +       
       // Went ok, so return success
       return -1;
   }
  @@ -553,6 +583,7 @@
                                          , bool                  preValidation
                                          , const XMLElementDecl* elemDecl)
   {
  +
       //
       //  Get quick refs to lot of the stuff in the passed objects in
       //  order to simplify the code below, which will reference them very
  @@ -561,6 +592,7 @@
       XMLAttDef::AttTypes            type      = attDef->getType();
       const XMLAttDef::DefAttTypes   defType   = attDef->getDefaultType();
       const XMLCh* const             fullName  = attDef->getFullName();
  +    bool valid = true;
   
       //
       //  If the default type is fixed, then make sure the passed value maps
  @@ -573,20 +605,25 @@
       if ((defType == XMLAttDef::Fixed || defType == XMLAttDef::Required_And_Fixed) && !preValidation)
       {
           const XMLCh* const valueText = attDef->getValue();
  -        if (!XMLString::equals(attrValue, valueText))
  +        if (!XMLString::equals(attrValue, valueText)) {
               emitError(XMLValid::NotSameAsFixedValue, fullName, attrValue, valueText);
  +            valid = false;
  +        }
       }
   
       // An empty string cannot be valid for non_CDATA any of the other types
       if (!attrValue[0] && type != XMLAttDef::Simple)
       {
           emitError(XMLValid::InvalidEmptyAttValue, fullName);
  +        ((SchemaElementDecl *)(elemDecl))->setValidity(PSVIDefs::INVALID);
  +        ((SchemaAttDef *)(attDef))->setValidity(PSVIDefs::INVALID);
           return;
       }
   
       DatatypeValidator* attDefDV = ((SchemaAttDef*) attDef)->getDatatypeValidator();
       if (!attDefDV) {
           emitError(XMLValid::NoDatatypeValidatorForAttribute, fullName);
  +        valid = false;
       }
       else {
           try {
  @@ -673,28 +710,40 @@
               }
               else {
                   if (thisIsAnId) {
  -                    if (fSeenId)
  +                    if (fSeenId) {
                           emitError
                           (
                               XMLValid::MultipleIdAttrs
                               , elemDecl->getFullName()
                           );
  +                        valid = false;
  +                    }
                       else
                           fSeenId = true;
                   }
                   attDefDV->validate(attrValue);
               }
  -
           }
           catch (XMLException& idve) {
  -                emitError (XMLValid::DatatypeError, idve.getType(), idve.getMessage());
  +            valid = false;
  +            emitError (XMLValid::DatatypeError, idve.getType(), idve.getMessage());       
           }
           catch (...) {
               emitError(XMLValid::GenericError);
  +            ((SchemaElementDecl *)(elemDecl))->setValidity(PSVIDefs::INVALID);
  +            ((SchemaAttDef *)(attDef))->setValidity(PSVIDefs::INVALID);
               throw;
           }
       }
  +
  +    if(!valid) {
  +        ((SchemaElementDecl *)(elemDecl))->setValidity(PSVIDefs::INVALID);
  +        ((SchemaAttDef *)(attDef))->setValidity(PSVIDefs::INVALID);
  +    }
  +    
       fTrailing = false;
  +
  +
   }
   
   void SchemaValidator::validateElement(const   XMLElementDecl*  elemDef)
  @@ -702,6 +751,8 @@
       ComplexTypeInfo* elemTypeInfo = ((SchemaElementDecl*)elemDef)->getComplexTypeInfo();
       fTypeStack->push(elemTypeInfo);
   
  +    bool valid = true;
  +
       if (fXsiType) {
           // handle "xsi:type" right here
           unsigned int uri = fXsiType->getURI();
  @@ -711,6 +762,7 @@
               uri != XMLElementDecl::fgPCDataElemId &&
               uri != XMLContentModel::gEpsilonFakeId &&
               uri != XMLContentModel::gEOCFakeId) {
  +
               // retrieve Grammar for the uri
               const XMLCh* uriStr = getScanner()->getURIText(uri);
               SchemaGrammar* sGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(uriStr);
  @@ -722,21 +774,29 @@
   
                       fXsiTypeValidator = fGrammarResolver->getDatatypeValidator(uriStr, localPart);
   
  -                    if (!fXsiTypeValidator)
  +                    if (!fXsiTypeValidator) {
                           emitError(XMLValid::BadXsiType, fXsiType->getRawName());
  +                        valid = false;
  +                    }
                       else {
  +                        ((SchemaElementDecl*)elemDef)->setXsiSimpleTypeInfo(fXsiTypeValidator);
  +
                           DatatypeValidator* ancestorValidator = ((SchemaElementDecl*)elemDef)->getDatatypeValidator();
                           if (ancestorValidator && !ancestorValidator->isSubstitutableBy(fXsiTypeValidator)) {
                               // the type is not derived from ancestor
                               emitError(XMLValid::NonDerivedXsiType, fXsiType->getRawName(), elemDef->getFullName());
  +                            valid = false;
                           }
                           else {
                               // the type is derived from ancestor
  -                            if (((SchemaElementDecl*)elemDef)->getBlockSet() == SchemaSymbols::XSD_RESTRICTION)
  +                            if (((SchemaElementDecl*)elemDef)->getBlockSet() == SchemaSymbols::XSD_RESTRICTION) {
                                   emitError(XMLValid::NoSubforBlock, fXsiType->getRawName(), elemDef->getFullName());
  +                                valid = false;
  +                            }
                               if (elemDef->hasAttDefs()) {
                                   // if we have an attribute but xsi:type's type is simple, we have a problem...
                                   emitError(XMLValid::NonDerivedXsiType, fXsiType->getRawName(), elemDef->getFullName());
  +                                valid = false;
                               }
                           }
                       }
  @@ -744,18 +804,23 @@
                   else {
                       // Grammar not found
                       emitError(XMLValid::GrammarNotFound, uriStr);
  +                    valid = false;
                   }
               }
               else if (sGrammar->getGrammarType() != Grammar::SchemaGrammarType) {
                   emitError(XMLValid::GrammarNotFound, uriStr);
  +                valid = false;
               }
               else {
                   // retrieve complexType registry and DatatypeValidator registry
                   RefHashTableOf<ComplexTypeInfo>* complexTypeRegistry = sGrammar->getComplexTypeRegistry();
   
  -                if (!complexTypeRegistry)
  +                if (!complexTypeRegistry) {
                       emitError(XMLValid::BadXsiType, fXsiType->getRawName());
  +                    valid = false;
  +                }
                   else {
  +
                       // retrieve the typeInfo specified in xsi:type
                       XMLBuffer aBuffer;
                       aBuffer.set(uriStr);
  @@ -775,7 +840,6 @@
                           ComplexTypeInfo* destType = ((SchemaElementDecl*)elemDef)->getComplexTypeInfo();
                           ComplexTypeInfo* tempType = typeInfo;
                           if (destType) {
  -
                               while (tempType) {
                                   if (XMLString::equals(tempType->getTypeName(), destType->getTypeName()))
                                       break;
  @@ -804,31 +868,40 @@
                           }
   
                           if (!error) {
  -
                               ((SchemaElementDecl*)elemDef)->setXsiComplexTypeInfo(typeInfo);
                               fTypeStack->pop();
                               fTypeStack->push(typeInfo);
                           }
  +                        valid = !error;
                       }
                       else {
                           // typeInfo not found
                           fXsiTypeValidator = fGrammarResolver->getDatatypeValidator(uriStr, localPart);
   
  -                        if (!fXsiTypeValidator)
  +                        if (!fXsiTypeValidator) {
                               emitError(XMLValid::BadXsiType, fXsiType->getRawName());
  +                            valid = false;
  +                        }
                           else {
  +
  +                            ((SchemaElementDecl*)elemDef)->setXsiSimpleTypeInfo(fXsiTypeValidator);
                               DatatypeValidator* ancestorValidator = ((SchemaElementDecl*)elemDef)->getDatatypeValidator();
                               if (ancestorValidator && !ancestorValidator->isSubstitutableBy(fXsiTypeValidator)) {
                                   // the type is not derived from ancestor
                                   emitError(XMLValid::NonDerivedXsiType, fXsiType->getRawName(), elemDef->getFullName());
  +                                valid = false;
                               }
                               else {
                                   // the type is derived from ancestor
  -                                if (((SchemaElementDecl*)elemDef)->getBlockSet() == SchemaSymbols::XSD_RESTRICTION)
  +                                if (((SchemaElementDecl*)elemDef)->getBlockSet() == SchemaSymbols::XSD_RESTRICTION) {
                                       emitError(XMLValid::NoSubforBlock, fXsiType->getRawName(), elemDef->getFullName());
  +                                    valid = false;
  +                                    
  +                                }
                                   if (elemDef->hasAttDefs()) {
                                       // if we have an attribute but xsi:type's type is simple, we have a problem...
                                       emitError(XMLValid::NonDerivedXsiType, fXsiType->getRawName(), elemDef->getFullName());
  +                                    valid = false;
                                   }
                               }
   
  @@ -847,6 +920,7 @@
           //
           if (elemTypeInfo && elemTypeInfo->getAbstract()) {
               emitError(XMLValid::NoUseAbstractType, elemDef->getFullName());
  +            valid = false;
           }
       }
   
  @@ -856,6 +930,7 @@
       int miscFlags = ((SchemaElementDecl*)elemDef)->getMiscFlags();
       if ((miscFlags & SchemaSymbols::XSD_ABSTRACT) != 0) {
           emitError(XMLValid::NoDirectUseAbstractElement, elemDef->getFullName());
  +        valid = false;
       }
   
       //
  @@ -864,11 +939,16 @@
       if (fNil && (miscFlags & SchemaSymbols::XSD_NILLABLE) == 0 ) {
           fNil = false;
           emitError(XMLValid::NillNotAllowed, elemDef->getFullName());
  +        valid = false;
       }
   
       fDatatypeBuffer.reset();
       fTrailing = false;
       fSeenId = false;
  +
  +    if(!valid) {
  +        ((SchemaElementDecl *)(elemDef))->setValidity(PSVIDefs::INVALID);    
  +    }
   }
   
   void SchemaValidator::preContentValidation(bool reuseGrammar,
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org