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]