You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by kn...@apache.org on 2004/11/25 16:16:04 UTC
cvs commit: xml-xerces/c/src/xercesc/validators/schema SchemaValidator.cpp
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: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org