knoaman     2004/11/25 07:16:04

  Modified:    c/src/xercesc/validators/schema SchemaValidator.cpp
  Log:
  PSVI: fix for getIsSchemaSpecified on empty elements with default values.
  
  Revision  Changes    Path
  1.59      +102 -85   
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.58
  retrieving revision 1.59
  diff -u -r1.58 -r1.59
  --- SchemaValidator.cpp       30 Sep 2004 13:14:28 -0000      1.58
  +++ SchemaValidator.cpp       25 Nov 2004 15:16:04 -0000      1.59
  @@ -16,6 +16,9 @@
   
   /*
    * $Log$
  + * Revision 1.59  2004/11/25 15:16:04  knoaman
  + * PSVI: fix for getIsSchemaSpecified on empty elements with default values.
  + *
    * Revision 1.58  2004/09/30 13:14:28  amassari
    * Fix jira#1280 - Borland leaks memory if break or continue are used inside 
a catch block
    *
  @@ -418,114 +421,128 @@
               emitError(XMLValid::SimpleTypeHasChild, elemDecl->getFullName());
               fErrorOccurred = true;
           }
  -        else if (fCurrentDatatypeValidator)
  +        else
           {
               XMLCh* value = fDatatypeBuffer.getRawBuffer();
               XMLCh* elemDefaultValue = ((SchemaElementDecl*) 
elemDecl)->getDefaultValue();
   
  -            if (fNil)
  -            {
  -                if ((!XMLString::equals(value, XMLUni::fgZeroLenString))
  -                    || elemDefaultValue)
  -                {
  -                    emitError(XMLValid::NilAttrNotEmpty, 
elemDecl->getFullName());
  -                    fErrorOccurred = true;
  -                }
  -            }
  -            else
  +                     if (fCurrentDatatypeValidator)
               {
  -                DatatypeValidator::ValidatorType eleDefDVType = 
fCurrentDatatypeValidator->getType();
  -                if (eleDefDVType == DatatypeValidator::NOTATION)
  +                if (fNil)
                   {
  -                    // if notation, need to bind URI to notation first
  -                    if (!fNotationBuf)
  -                        fNotationBuf = new (fMemoryManager) XMLBuffer(1023, 
fMemoryManager);
  -
  -                    //  Make sure that this value maps to one of the
  -                    //  notation values in the enumList parameter. We don't 
have to
  -                    //  look it up in the notation pool (if a notation) 
because we
  -                    //  will look up the enumerated values themselves. If 
they are in
  -                    //  the notation pool (after the Grammar is parsed), 
then obviously
  -                    //  this value will be legal since it matches one of 
them.
  -                    int colonPos = -1;
  -                    unsigned int uriId = getScanner()->resolveQName(value, 
*fNotationBuf, ElemStack::Mode_Element, colonPos);
  -                    fNotationBuf->set(getScanner()->getURIText(uriId));
  -                    fNotationBuf->append(chColon);
  -                    fNotationBuf->append(&value[colonPos + 1]);
  -                    value = fNotationBuf->getRawBuffer();
  +                    if ((!XMLString::equals(value, XMLUni::fgZeroLenString))
  +                        || elemDefaultValue)
  +                    {
  +                        emitError(XMLValid::NilAttrNotEmpty, 
elemDecl->getFullName());
  +                        fErrorOccurred = true;
  +                    }
                   }
  -
  -                if (elemDefaultValue)
  +                else
                   {
  -                    if (XMLString::equals(value, XMLUni::fgZeroLenString))
  +                    DatatypeValidator::ValidatorType eleDefDVType = 
fCurrentDatatypeValidator->getType();
  +                    if (eleDefDVType == DatatypeValidator::NOTATION)
                       {
  -                        fElemIsSpecified = true;
  -                        // if this element didn't specified any value
  -                        // use default value
  -                        if (getScanner()->getDocHandler())
  -                            
getScanner()->getDocHandler()->docCharacters(elemDefaultValue, 
XMLString::stringLen(elemDefaultValue), false);
  -
  -                        // Normally for default value, it has been validated 
already during TraverseSchema
  -                        // But if there was a xsi:type and this validator is 
fXsiTypeValidator,
  -                        // need to validate again
  -                        // we determine this if the current content dataype 
validator
  -                        // is neither the one in the element nor the one in 
the current
  -                        // complex type (if any)
  -                        if ((fCurrentDatatypeValidator != 
((SchemaElementDecl*)elemDecl)->getDatatypeValidator())
  -                            && (!fTypeStack->peek() || 
(fCurrentDatatypeValidator != fTypeStack->peek()->getDatatypeValidator())))
  -                            value = elemDefaultValue;
  -                        else
  -                            value = 0;
  +                        // if notation, need to bind URI to notation first
  +                        if (!fNotationBuf)
  +                            fNotationBuf = new (fMemoryManager) 
XMLBuffer(1023, fMemoryManager);
  +
  +                        //  Make sure that this value maps to one of the
  +                        //  notation values in the enumList parameter. We 
don't have to
  +                        //  look it up in the notation pool (if a notation) 
because we
  +                        //  will look up the enumerated values themselves. 
If they are in
  +                        //  the notation pool (after the Grammar is parsed), 
then obviously
  +                        //  this value will be legal since it matches one of 
them.
  +                        int colonPos = -1;
  +                        unsigned int uriId = 
getScanner()->resolveQName(value, *fNotationBuf, ElemStack::Mode_Element, 
colonPos);
  +                        fNotationBuf->set(getScanner()->getURIText(uriId));
  +                        fNotationBuf->append(chColon);
  +                        fNotationBuf->append(&value[colonPos + 1]);
  +                        value = fNotationBuf->getRawBuffer();
                       }
  -                    else
  +
  +                    if (elemDefaultValue)
                       {
  -                        // 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 (XMLString::equals(value, 
XMLUni::fgZeroLenString))
  +                        {
  +                            fElemIsSpecified = true;
  +                            // if this element didn't specified any value
  +                            // use default value
  +                            if (getScanner()->getDocHandler())
  +                                
getScanner()->getDocHandler()->docCharacters(elemDefaultValue, 
XMLString::stringLen(elemDefaultValue), false);
  +
  +                            // Normally for default value, it has been 
validated already during TraverseSchema
  +                            // But if there was a xsi:type and this 
validator is fXsiTypeValidator,
  +                            // need to validate again
  +                            // we determine this if the current content 
dataype validator
  +                            // is neither the one in the element nor the one 
in the current
  +                            // complex type (if any)
  +                            if ((fCurrentDatatypeValidator != 
((SchemaElementDecl*)elemDecl)->getDatatypeValidator())
  +                                && (!fTypeStack->peek() || 
(fCurrentDatatypeValidator != fTypeStack->peek()->getDatatypeValidator())))
  +                                value = elemDefaultValue;
  +                            else
  +                                value = 0;
  +                        }
  +                        else
                           {
  -                            if (fCurrentDatatypeValidator->compare(value, 
elemDefaultValue, fMemoryManager) != 0 )
  +                            // 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)
                               {
  -                                
emitError(XMLValid::FixedDifferentFromActual, elemDecl->getFullName());
  -                                fErrorOccurred = true;
  +                                if 
(fCurrentDatatypeValidator->compare(value, elemDefaultValue, fMemoryManager) != 
0 )
  +                                {
  +                                    
emitError(XMLValid::FixedDifferentFromActual, elemDecl->getFullName());
  +                                    fErrorOccurred = true;
  +                                }
                               }
                           }
                       }
  -                }
  -                else
  -                {
  -                    // no default value, then check nillable
  -                    if (XMLString::equals(value, XMLUni::fgZeroLenString)
  -                        && (((SchemaElementDecl*)elemDecl)->getMiscFlags() & 
SchemaSymbols::XSD_NILLABLE) != 0)
  -                            value = 0;
  -                }
  -
  -                if ((!fErrorOccurred) && value)
  -                {
  -                    try
  -                    {
  -                        fCurrentDatatypeValidator->validate(value, 
getScanner()->getValidationContext(), fMemoryManager);
  -                    }
  -                    catch (XMLException& idve)
  +                    else
                       {
  -                        emitError (XMLValid::DatatypeError, idve.getType(), 
idve.getMessage());
  -                        fErrorOccurred = true;
  +                        // no default value, then check nillable
  +                        if (XMLString::equals(value, XMLUni::fgZeroLenString)
  +                            && 
(((SchemaElementDecl*)elemDecl)->getMiscFlags() & SchemaSymbols::XSD_NILLABLE) 
!= 0)
  +                                value = 0;
                       }
  -                    catch(const OutOfMemoryException&)
  +
  +                    if ((!fErrorOccurred) && value)
                       {
  -                        throw;
  +                        try {
  +                            fCurrentDatatypeValidator->validate(value, 
getScanner()->getValidationContext(), fMemoryManager);
  +                        }
  +                        catch (XMLException& idve)
  +                        {
  +                            emitError (XMLValid::DatatypeError, 
idve.getType(), idve.getMessage());
  +                            fErrorOccurred = true;
  +                        }
  +                        catch(const OutOfMemoryException&) {
  +                            throw;
  +                        }
  +                        catch (...)
  +                        {
  +                            emitError(XMLValid::GenericError);
  +                            throw;
  +                        }
                       }
  -                    catch (...)
  -                    {
  -                        emitError(XMLValid::GenericError);
  -                        throw;
  +                }
  +            }
  +            else if (modelType == SchemaElementDecl::Simple)
  +            {
  +                emitError(XMLValid::NoDatatypeValidatorForSimpleType, 
elemDecl->getFullName());
  +                fErrorOccurred = true;
  +            }
  +            // modelType is any
  +            else if (elemDefaultValue)
  +            {
  +                if (XMLString::equals(value, XMLUni::fgZeroLenString))
  +                {
  +                    fElemIsSpecified = true;
  +                    // if this element didn't specified any value
  +                    // use default value
  +                    if (getScanner()->getDocHandler()) {
  +                        
getScanner()->getDocHandler()->docCharacters(elemDefaultValue, 
XMLString::stringLen(elemDefaultValue), false);
                       }
                   }
               }
  -        }
  -        else if (modelType == SchemaElementDecl::Simple)
  -        {
  -            emitError(XMLValid::NoDatatypeValidatorForSimpleType, 
elemDecl->getFullName());
  -            fErrorOccurred = true;
           }
       }
       else
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to