neilg 2003/12/14 13:09:26
Modified: c/src/xercesc/internal DGXMLScanner.cpp IGXMLScanner.cpp
IGXMLScanner2.cpp SGXMLScanner.cpp
Log:
implement XMLDocumentHandler::elementTypeInfo callback
Revision Changes Path
1.34 +4 -0 xml-xerces/c/src/xercesc/internal/DGXMLScanner.cpp
Index: DGXMLScanner.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/DGXMLScanner.cpp,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -r1.33 -r1.34
--- DGXMLScanner.cpp 10 Dec 2003 05:14:42 -0000 1.33
+++ DGXMLScanner.cpp 14 Dec 2003 21:09:26 -0000 1.34
@@ -758,6 +758,8 @@
? topElem->fThisElement->getElementName()->getPrefix()
: XMLUni::fgZeroLenString
);
+ // pass back type name information
+ fDocHandler->elementTypeInfo(XMLUni::fgZeroLenString,
XMLUni::fgZeroLenString);
}
// If this was the root, then done with content
@@ -1591,6 +1593,8 @@
, (fDoNamespaces) ? elemDecl->getElementName()->getPrefix()
: XMLUni::fgZeroLenString
);
+ // pass back type name information
+ fDocHandler->elementTypeInfo(XMLUni::fgZeroLenString,
XMLUni::fgZeroLenString);
}
// Pop the element stack back off since it'll never be used now
1.46 +125 -22 xml-xerces/c/src/xercesc/internal/IGXMLScanner.cpp
Index: IGXMLScanner.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/IGXMLScanner.cpp,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -r1.45 -r1.46
--- IGXMLScanner.cpp 10 Dec 2003 05:14:42 -0000 1.45
+++ IGXMLScanner.cpp 14 Dec 2003 21:09:26 -0000 1.46
@@ -1020,6 +1020,8 @@
XMLElementDecl* tempElement = topElem->fThisElement;
if (fDoNamespaces && fGrammarType == Grammar::SchemaGrammarType) {
+ // reset error occurred
+ fPSVIElemContext.fErrorOccurred = fErrorStack->pop();
const XMLCh* rawNameBuf = fQNameBuf.getRawBuffer();
if ((topUri != uriId) || (!XMLString::equals(tempElement->getBaseName(),
&rawNameBuf[prefixColonPos + 1])))
{
@@ -1058,16 +1060,19 @@
);
}
- if (fPSVIHandler && fGrammarType == Grammar::SchemaGrammarType)
+ if (fGrammarType == Grammar::SchemaGrammarType)
{
if (fValidate && topElem->fThisElement->isDeclared())
{
fPSVIElemContext.fCurrentDV = ((SchemaValidator*)
fValidator)->getCurrentDatatypeValidator();
fPSVIElemContext.fCurrentTypeInfo = ((SchemaValidator*)
fValidator)->getCurrentTypeInfo();
- fPSVIElemContext.fNormalizedValue = ((SchemaValidator*)
fValidator)->getNormalizedValue();
+ if(fPSVIHandler)
+ {
+ fPSVIElemContext.fNormalizedValue = ((SchemaValidator*)
fValidator)->getNormalizedValue();
- if (XMLString::equals(fPSVIElemContext.fNormalizedValue,
XMLUni::fgZeroLenString))
- fPSVIElemContext.fNormalizedValue = 0;
+ if (XMLString::equals(fPSVIElemContext.fNormalizedValue,
XMLUni::fgZeroLenString))
+ fPSVIElemContext.fNormalizedValue = 0;
+ }
}
else
{
@@ -1125,14 +1130,14 @@
if (fGrammarType == Grammar::SchemaGrammarType) {
+ if (((SchemaValidator*) fValidator)->getErrorOccurred())
+ fPSVIElemContext.fErrorOccurred = true;
+ else if (fPSVIElemContext.fCurrentDV &&
fPSVIElemContext.fCurrentDV->getType() == DatatypeValidator::Union)
+ psviMemberType = fValidationContext->getValidatingMemberType();
if (fPSVIHandler)
{
fPSVIElemContext.fIsSpecified = ((SchemaValidator*)
fValidator)->getIsElemSpecified();
- if (((SchemaValidator*) fValidator)->getErrorOccurred())
- fPSVIElemContext.fErrorOccurred = true;
- else if (fPSVIElemContext.fCurrentDV &&
fPSVIElemContext.fCurrentDV->getType() == DatatypeValidator::Union)
- psviMemberType =
fValidationContext->getValidatingMemberType();
}
// call matchers and de-activate context
@@ -1209,14 +1214,60 @@
, isRoot
, fPrefixBuf.getRawBuffer()
);
+ // pass information about type info:
+ if(fGrammarType == Grammar::SchemaGrammarType)
+ {
+ const XMLCh *typeName = SchemaSymbols::fgATTVAL_ANYTYPE;
+ const XMLCh *typeURI = SchemaSymbols::fgURI_SCHEMAFORSCHEMA;
+ if(!fPSVIElemContext.fErrorOccurred)
+ {
+ if(fPSVIElemContext.fCurrentTypeInfo != 0)
+ {
+ if(fPSVIElemContext.fCurrentTypeInfo->getAnonymous())
+ typeName = XMLUni::fgZeroLenString;
+ else
+ typeName =
fPSVIElemContext.fCurrentTypeInfo->getTypeLocalName();
+ typeURI = fPSVIElemContext.fCurrentTypeInfo->getTypeUri();
+ }
+ else
+ {
+ DatatypeValidator *actualDV =
(psviMemberType)?psviMemberType:fPSVIElemContext.fCurrentDV;
+ if(actualDV)
+ {
+ if(actualDV->getAnonymous())
+ typeName = XMLUni::fgZeroLenString;
+ else
+ typeName = actualDV->getTypeLocalName();
+ typeURI = actualDV->getTypeUri();
+ }
+ }
+ }
+ else
+ {
+ // idiosyncratically, if there's an
+ // error but this element was simpleType-validated,
+ // the tests demand anySimpleType be returned
+ if(fPSVIElemContext.fCurrentDV)
+ typeName = SchemaSymbols::fgDT_ANYSIMPLETYPE;
+ }
+ fDocHandler->elementTypeInfo(typeName, typeURI);
+ }
+ else
+ {
+ fDocHandler->elementTypeInfo(XMLUni::fgZeroLenString,
XMLUni::fgZeroLenString);
+ }
}
// reset xsi:type ComplexTypeInfo
if (fGrammarType == Grammar::SchemaGrammarType) {
((SchemaElementDecl*)topElem->fThisElement)->reset();
if (!isRoot)
+ {
((SchemaElementDecl*)(fElemStack.topElement()->fThisElement))->
setXsiComplexTypeInfo(((SchemaValidator*)fValidator)->getCurrentTypeInfo());
+ // update error information
+ fErrorStack->push(fErrorStack->pop() ||
fPSVIElemContext.fErrorOccurred);
+ }
}
// If this was the root, then done with content
@@ -2544,6 +2595,9 @@
}
}
+ // this info needed for DOMTypeInfo
+ fPSVIElemContext.fErrorOccurred = false;
+
// We do something different here according to whether we found the
// element or not.
if (wasAdded)
@@ -2570,6 +2624,7 @@
{
((SchemaElementDecl
*)(elemDecl))->setValidationAttempted(PSVIDefs::FULL);
((SchemaElementDecl *)(elemDecl))->setValidity(PSVIDefs::INVALID);\
+ fPSVIElemContext.fErrorOccurred = true;
}
}
}
@@ -2588,6 +2643,7 @@
if(fGrammarType == Grammar::SchemaGrammarType) {
((SchemaElementDecl
*)(elemDecl))->setValidity(PSVIDefs::INVALID);
((SchemaElementDecl
*)(elemDecl))->setValidationAttempted(PSVIDefs::FULL);
+ fPSVIElemContext.fErrorOccurred = true;
}
}
@@ -2631,10 +2687,8 @@
if (fGrammarType == Grammar::SchemaGrammarType && fPSVIHandler)
{
- fErrorStack->push(fPSVIElemContext.fErrorOccurred);
- fPSVIElemContext.fErrorOccurred = false;
- fPSVIElemContext.fElemDepth++;
+ fPSVIElemContext.fElemDepth++;
if (elemDecl->isDeclared())
{
fPSVIElemContext.fNoneValidationDepth = fPSVIElemContext.fElemDepth;
@@ -2643,8 +2697,12 @@
{
fPSVIElemContext.fFullValidationDepth = fPSVIElemContext.fElemDepth;
+ /******
+ * While we report an error for historical reasons, this should
+ * actually result in lax assessment - NG.
if (isRoot && fValidate)
fPSVIElemContext.fErrorOccurred = true;
+ *****/
}
}
@@ -2652,7 +2710,7 @@
if (fValidate)
{
fValidator->validateElement(elemDecl);
- if (fPSVIHandler && fValidator->handlesSchema())
+ if (fValidator->handlesSchema())
{
if (((SchemaValidator*) fValidator)->getErrorOccurred())
fPSVIElemContext.fErrorOccurred = true;
@@ -2813,16 +2871,20 @@
fElemStack.popTop();
// reset current type info
- if (fPSVIHandler && fGrammarType == Grammar::SchemaGrammarType)
+ DatatypeValidator* psviMemberType = 0;
+ if (fGrammarType == Grammar::SchemaGrammarType)
{
if (fValidate && elemDecl->isDeclared())
{
fPSVIElemContext.fCurrentDV = ((SchemaValidator*)
fValidator)->getCurrentDatatypeValidator();
fPSVIElemContext.fCurrentTypeInfo = ((SchemaValidator*)
fValidator)->getCurrentTypeInfo();
- fPSVIElemContext.fNormalizedValue = ((SchemaValidator*)
fValidator)->getNormalizedValue();
+ if(fPSVIHandler)
+ {
+ fPSVIElemContext.fNormalizedValue = ((SchemaValidator*)
fValidator)->getNormalizedValue();
- if (XMLString::equals(fPSVIElemContext.fNormalizedValue,
XMLUni::fgZeroLenString))
- fPSVIElemContext.fNormalizedValue = 0;
+ if (XMLString::equals(fPSVIElemContext.fNormalizedValue,
XMLUni::fgZeroLenString))
+ fPSVIElemContext.fNormalizedValue = 0;
+ }
}
else
{
@@ -2832,7 +2894,6 @@
}
}
- DatatypeValidator* psviMemberType = 0;
// If validating, then insure that its legal to have no content
if (fValidate)
{
@@ -2854,9 +2915,10 @@
fPSVIElemContext.fErrorOccurred = true;
((SchemaElementDecl
*)(elemDecl))->setValidity(PSVIDefs::INVALID);
}
- else if (fPSVIHandler)
+ else
{
- fPSVIElemContext.fIsSpecified = ((SchemaValidator*)
fValidator)->getIsElemSpecified();
+ if (fPSVIHandler)
+ fPSVIElemContext.fIsSpecified = ((SchemaValidator*)
fValidator)->getIsElemSpecified();
// note that if we're empty, won't be a current DV
if (fPSVIElemContext.fCurrentDV &&
fPSVIElemContext.fCurrentDV->getType() == DatatypeValidator::Union)
psviMemberType =
fValidationContext->getValidatingMemberType();
@@ -2931,6 +2993,48 @@
, isRoot
, fPrefixBuf.getRawBuffer()
);
+ // pass information about type info:
+ if(fGrammarType == Grammar::SchemaGrammarType)
+ {
+ const XMLCh *typeName = SchemaSymbols::fgATTVAL_ANYTYPE;
+ const XMLCh *typeURI = SchemaSymbols::fgURI_SCHEMAFORSCHEMA;
+ if(!fPSVIElemContext.fErrorOccurred)
+ {
+ if(fPSVIElemContext.fCurrentTypeInfo != 0)
+ {
+ if(fPSVIElemContext.fCurrentTypeInfo->getAnonymous())
+ typeName = XMLUni::fgZeroLenString;
+ else
+ typeName =
fPSVIElemContext.fCurrentTypeInfo->getTypeLocalName();
+ typeURI = fPSVIElemContext.fCurrentTypeInfo->getTypeUri();
+ }
+ else
+ {
+ DatatypeValidator *actualDV =
(psviMemberType)?psviMemberType:fPSVIElemContext.fCurrentDV;
+ if(actualDV)
+ {
+ if(actualDV->getAnonymous())
+ typeName = XMLUni::fgZeroLenString;
+ else
+ typeName = actualDV->getTypeLocalName();
+ typeURI = actualDV->getTypeUri();
+ }
+ }
+ }
+ else
+ {
+ // idiosyncratically, if there's an
+ // error but this element was simpleType-validated,
+ // the tests demand anySimpleType be returned
+ if(fPSVIElemContext.fCurrentDV)
+ typeName = SchemaSymbols::fgDT_ANYSIMPLETYPE;
+ }
+ fDocHandler->elementTypeInfo(typeName, typeURI);
+ }
+ else
+ {
+ fDocHandler->elementTypeInfo(XMLUni::fgZeroLenString,
XMLUni::fgZeroLenString);
+ }
}
// reset xsi:type ComplexTypeInfo
@@ -2970,6 +3074,8 @@
fValidate = fElemStack.getValidationFlag();
}
}
+ else // not empty
+ fErrorStack->push(fPSVIElemContext.fErrorOccurred);
return true;
}
@@ -3408,9 +3514,6 @@
// decrease element depth
fPSVIElemContext.fElemDepth--;
- // reset error occurred
- fPSVIElemContext.fErrorOccurred =
- fPSVIElemContext.fErrorOccurred && fErrorStack->pop();
}
void IGXMLScanner::resetPSVIElemContext()
1.51 +35 -27 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.50
retrieving revision 1.51
diff -u -r1.50 -r1.51
--- IGXMLScanner2.cpp 8 Dec 2003 00:11:26 -0000 1.50
+++ IGXMLScanner2.cpp 14 Dec 2003 21:09:26 -0000 1.51
@@ -270,10 +270,10 @@
);
if(fGrammarType == Grammar::SchemaGrammarType) {
((SchemaAttDef
*)(attDef))->setValidity(PSVIDefs::INVALID);
+ fPSVIElemContext.fErrorOccurred = true;
if (getPSVIHandler())
{
attrValid = PSVIItem::VALIDITY_INVALID;
- fPSVIElemContext.fErrorOccurred = true;
}
}
}
@@ -292,10 +292,10 @@
);
if(fGrammarType == Grammar::SchemaGrammarType) {
((SchemaAttDef
*)(attDef))->setValidity(PSVIDefs::INVALID);
+ fPSVIElemContext.fErrorOccurred = true;
if (getPSVIHandler())
{
attrValid = PSVIItem::VALIDITY_INVALID;
- fPSVIElemContext.fErrorOccurred = true;
}
}
}
@@ -390,7 +390,7 @@
((SchemaAttDef *)(attDef))->setValidity(PSVIDefs::VALID);
((SchemaAttDef *)(attDef))->setValidationAttempted(PSVIDefs::FULL);
}
- if(getPSVIHandler() && fGrammarType == Grammar::SchemaGrammarType )
+ if(fGrammarType == Grammar::SchemaGrammarType )
{
// if we've found either an attDef or an attDefForWildCard,
// then we're doing full validation and it may still be valid.
@@ -398,18 +398,24 @@
{
if(!laxThisOne && !skipThisOne)
{
- attrValid = PSVIItem::VALIDITY_INVALID;
fPSVIElemContext.fErrorOccurred = true;
- }
- else if(laxThisOne)
+ }
+ if(getPSVIHandler())
{
- attrValid = PSVIItem::VALIDITY_NOTKNOWN;
- attrAssessed = PSVIItem::VALIDATION_PARTIAL;
- }
- else
- {
- attrValid = PSVIItem::VALIDITY_NOTKNOWN;
- attrAssessed = PSVIItem::VALIDATION_NONE;
+ if(!laxThisOne && !skipThisOne)
+ {
+ attrValid = PSVIItem::VALIDITY_INVALID;
+ }
+ else if(laxThisOne)
+ {
+ attrValid = PSVIItem::VALIDITY_NOTKNOWN;
+ attrAssessed = PSVIItem::VALIDATION_PARTIAL;
+ }
+ else
+ {
+ attrValid = PSVIItem::VALIDITY_NOTKNOWN;
+ attrAssessed = PSVIItem::VALIDATION_NONE;
+ }
}
}
}
@@ -487,10 +493,11 @@
, elemDecl
);
attrValidator =
((SchemaValidator*)fValidator)->getMostRecentAttrValidator();
- if(getPSVIHandler() && ((SchemaValidator
*)fValidator)->getErrorOccurred())
+ if(((SchemaValidator *)fValidator)->getErrorOccurred())
{
fPSVIElemContext.fErrorOccurred = true;
- attrValid = PSVIItem::VALIDITY_INVALID;
+ if(getPSVIHandler())
+ attrValid = PSVIItem::VALIDITY_INVALID;
}
}
else // no decl; default DOMTypeInfo to anySimpleType
@@ -546,9 +553,12 @@
if(fGrammarType == Grammar::SchemaGrammarType)
{
attrValidator =
((SchemaValidator*)fValidator)->getMostRecentAttrValidator();
- if (getPSVIHandler()
- && ((SchemaValidator
*)fValidator)->getErrorOccurred())
- attrValid = PSVIItem::VALIDITY_INVALID;
+ if(((SchemaValidator *)fValidator)->getErrorOccurred())
+ {
+ fPSVIElemContext.fErrorOccurred = true;
+ if (getPSVIHandler())
+ attrValid = PSVIItem::VALIDITY_INVALID;
+ }
}
}
else if(fGrammarType == Grammar::SchemaGrammarType)
@@ -889,6 +899,7 @@
{
((SchemaAttDef *)(curDef))->setValidity(PSVIDefs::INVALID);
((SchemaElementDecl
*)elemDecl)->updateValidityFromAttribute((SchemaAttDef *)curDef);
+ fPSVIElemContext.fErrorOccurred = true;
if (getPSVIHandler())
{
QName *attQName = ((SchemaAttDef
*)curDef)->getAttName();
@@ -899,7 +910,6 @@
fURIStringPool->getValueForId(attQName->getURI())
);
prohibitedAttr->updateValidity(PSVIItem::VALIDITY_INVALID);
- fPSVIElemContext.fErrorOccurred = true;
}
}
}
@@ -1248,16 +1258,14 @@
fSeeXsi = false;
// Reset PSVI context
- if (fPSVIHandler)
- {
- if (!fPSVIElement)
- fPSVIElement = new (fMemoryManager) PSVIElement(fMemoryManager);
+ // note that we always need this around for DOMTypeInfo
+ if (!fPSVIElement)
+ fPSVIElement = new (fMemoryManager) PSVIElement(fMemoryManager);
- if (!fErrorStack)
- fErrorStack = new (fMemoryManager) ValueStackOf<bool>(8,
fMemoryManager);
+ if (!fErrorStack)
+ fErrorStack = new (fMemoryManager) ValueStackOf<bool>(8, fMemoryManager);
- resetPSVIElemContext();
- }
+ resetPSVIElemContext();
// Reset the validators
fDTDValidator->reset();
1.65 +142 -56 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.64
retrieving revision 1.65
diff -u -r1.64 -r1.65
--- SGXMLScanner.cpp 10 Dec 2003 05:14:42 -0000 1.64
+++ SGXMLScanner.cpp 14 Dec 2003 21:09:26 -0000 1.65
@@ -941,6 +941,9 @@
XMLElementDecl* tempElement = topElem->fThisElement;
const XMLCh* rawNameBuf = fQNameBuf.getRawBuffer();
+ // reset error occurred
+ fPSVIElemContext.fErrorOccurred = fErrorStack->pop();
+
if ((topUri != uriId) ||
(!XMLString::equals(tempElement->getBaseName(), &rawNameBuf[prefixColonPos
+ 1])))
{
@@ -968,24 +971,24 @@
);
}
- if (fPSVIHandler)
+ if (fValidate && topElem->fThisElement->isDeclared())
{
- if (fValidate && topElem->fThisElement->isDeclared())
+ fPSVIElemContext.fCurrentDV = ((SchemaValidator*)
fValidator)->getCurrentDatatypeValidator();
+ fPSVIElemContext.fCurrentTypeInfo = ((SchemaValidator*)
fValidator)->getCurrentTypeInfo();
+ if (fPSVIHandler)
{
- fPSVIElemContext.fCurrentDV = ((SchemaValidator*)
fValidator)->getCurrentDatatypeValidator();
- fPSVIElemContext.fCurrentTypeInfo = ((SchemaValidator*)
fValidator)->getCurrentTypeInfo();
fPSVIElemContext.fNormalizedValue = ((SchemaValidator*)
fValidator)->getNormalizedValue();
if (XMLString::equals(fPSVIElemContext.fNormalizedValue,
XMLUni::fgZeroLenString))
fPSVIElemContext.fNormalizedValue = 0;
}
- else
- {
- fPSVIElemContext.fCurrentDV = 0;
- fPSVIElemContext.fCurrentTypeInfo = 0;
- fPSVIElemContext.fNormalizedValue = 0;
- }
+ }
+ else
+ {
+ fPSVIElemContext.fCurrentDV = 0;
+ fPSVIElemContext.fCurrentTypeInfo = 0;
+ fPSVIElemContext.fNormalizedValue = 0;
}
// If validation is enabled, then lets pass him the list of children and
@@ -1036,14 +1039,12 @@
}
// update PSVI info
+ if (((SchemaValidator*) fValidator)->getErrorOccurred())
+ fPSVIElemContext.fErrorOccurred = true;
+ else if (fPSVIElemContext.fCurrentDV &&
fPSVIElemContext.fCurrentDV->getType() == DatatypeValidator::Union)
+ psviMemberType = fValidationContext->getValidatingMemberType();
if (fPSVIHandler)
- {
fPSVIElemContext.fIsSpecified = ((SchemaValidator*)
fValidator)->getIsElemSpecified();
- if (((SchemaValidator*) fValidator)->getErrorOccurred())
- fPSVIElemContext.fErrorOccurred = true;
- else if (fPSVIElemContext.fCurrentDV &&
fPSVIElemContext.fCurrentDV->getType() == DatatypeValidator::Union)
- psviMemberType = fValidationContext->getValidatingMemberType();
- }
// call matchers and de-activate context
int oldCount = fMatcherStack->getMatcherCount();
@@ -1116,13 +1117,52 @@
, isRoot
, fPrefixBuf.getRawBuffer()
);
+ // pass information about type info:
+ const XMLCh *typeName = SchemaSymbols::fgATTVAL_ANYTYPE;
+ const XMLCh *typeURI = SchemaSymbols::fgURI_SCHEMAFORSCHEMA;
+ if(!fPSVIElemContext.fErrorOccurred)
+ {
+ if(fPSVIElemContext.fCurrentTypeInfo != 0)
+ {
+ if(fPSVIElemContext.fCurrentTypeInfo->getAnonymous())
+ typeName = XMLUni::fgZeroLenString;
+ else
+ typeName =
fPSVIElemContext.fCurrentTypeInfo->getTypeLocalName();
+ typeURI = fPSVIElemContext.fCurrentTypeInfo->getTypeUri();
+ }
+ else
+ {
+ DatatypeValidator *actualDV =
(psviMemberType)?psviMemberType:fPSVIElemContext.fCurrentDV;
+ if(actualDV)
+ {
+ if(actualDV->getAnonymous())
+ typeName = XMLUni::fgZeroLenString;
+ else
+ typeName = actualDV->getTypeLocalName();
+ typeURI = actualDV->getTypeUri();
+ }
+ }
+ }
+ else
+ {
+ // idiosyncratically, if there's an
+ // error but this element was simpleType-validated,
+ // the tests demand anySimpleType be returned
+ if(fPSVIElemContext.fCurrentDV)
+ typeName = SchemaSymbols::fgDT_ANYSIMPLETYPE;
+ }
+ fDocHandler->elementTypeInfo(typeName, typeURI);
}
// reset xsi:type ComplexTypeInfo
((SchemaElementDecl*)topElem->fThisElement)->reset();
if (!isRoot)
+ {
((SchemaElementDecl*)(fElemStack.topElement()->fThisElement))->
setXsiComplexTypeInfo(((SchemaValidator*)fValidator)->getCurrentTypeInfo());
+ // update error information
+ fErrorStack->push(fErrorStack->pop() || fPSVIElemContext.fErrorOccurred);
+ }
// If this was the root, then done with content
gotData = !isRoot;
@@ -1508,6 +1548,8 @@
}
}
+ // this info needed for DOMTypeInfo
+ fPSVIElemContext.fErrorOccurred = false;
// We do something different here according to whether we found the
// element or not.
@@ -1534,6 +1576,7 @@
, elemDecl->getFullName()
);
((SchemaElementDecl *)(elemDecl))->setValidity(PSVIDefs::INVALID);
+ fPSVIElemContext.fErrorOccurred = true;
}
}
else
@@ -1550,6 +1593,7 @@
if(elemDecl->getCreateReason() == XMLElementDecl::NoReason) {
((SchemaElementDecl *)(elemDecl))->setValidity(PSVIDefs::INVALID);
((SchemaElementDecl
*)(elemDecl))->setValidationAttempted(PSVIDefs::FULL);
+ fPSVIElemContext.fErrorOccurred = true;
}
if (laxThisOne) {
fValidate = false;
@@ -1589,8 +1633,6 @@
if (fPSVIHandler)
{
- fErrorStack->push(fPSVIElemContext.fErrorOccurred);
- fPSVIElemContext.fErrorOccurred = false;
fPSVIElemContext.fElemDepth++;
if (elemDecl->isDeclared())
@@ -1601,8 +1643,12 @@
{
fPSVIElemContext.fFullValidationDepth = fPSVIElemContext.fElemDepth;
+ /******
+ * While we report an error for historical reasons, this should
+ * actually result in lax assessment - NG.
if (isRoot && fValidate)
fPSVIElemContext.fErrorOccurred = true;
+ ******/
}
}
@@ -1610,11 +1656,8 @@
if (fValidate)
{
fValidator->validateElement(elemDecl);
- if (fPSVIHandler)
- {
- if (((SchemaValidator*) fValidator)->getErrorOccurred())
- fPSVIElemContext.fErrorOccurred = true;
- }
+ if (((SchemaValidator*) fValidator)->getErrorOccurred())
+ fPSVIElemContext.fErrorOccurred = true;
}
ComplexTypeInfo* typeinfo = (fValidate)
@@ -1757,16 +1800,20 @@
fElemStack.popTop();
// reset current type info
- if (fPSVIHandler && fGrammarType == Grammar::SchemaGrammarType)
+ DatatypeValidator* psviMemberType = 0;
+ if (fGrammarType == Grammar::SchemaGrammarType)
{
if (fValidate && elemDecl->isDeclared())
{
fPSVIElemContext.fCurrentDV = ((SchemaValidator*)
fValidator)->getCurrentDatatypeValidator();
fPSVIElemContext.fCurrentTypeInfo = ((SchemaValidator*)
fValidator)->getCurrentTypeInfo();
- fPSVIElemContext.fNormalizedValue = ((SchemaValidator*)
fValidator)->getNormalizedValue();
+ if(fPSVIHandler)
+ {
+ fPSVIElemContext.fNormalizedValue = ((SchemaValidator*)
fValidator)->getNormalizedValue();
- if (XMLString::equals(fPSVIElemContext.fNormalizedValue,
XMLUni::fgZeroLenString))
- fPSVIElemContext.fNormalizedValue = 0;
+ if (XMLString::equals(fPSVIElemContext.fNormalizedValue,
XMLUni::fgZeroLenString))
+ fPSVIElemContext.fNormalizedValue = 0;
+ }
}
else
{
@@ -1777,7 +1824,6 @@
}
// If validating, then insure that its legal to have no content
- DatatypeValidator* psviMemberType = 0;
if (fValidate)
{
const int res = fValidator->checkContent(elemDecl, 0, 0);
@@ -1794,13 +1840,15 @@
((SchemaElementDecl *)(elemDecl))->setValidity(PSVIDefs::INVALID);
}
- if (fPSVIHandler)
+ if (((SchemaValidator*) fValidator)->getErrorOccurred())
+ fPSVIElemContext.fErrorOccurred = true;
+ // note that if we're empty, won't be a current DV
+ else
{
- if (((SchemaValidator*) fValidator)->getErrorOccurred())
- fPSVIElemContext.fErrorOccurred = true;
- // note that if we're empty, won't be a current DV
- else if (fPSVIElemContext.fCurrentDV &&
fPSVIElemContext.fCurrentDV->getType() == DatatypeValidator::Union)
- psviMemberType =
fValidationContext->getValidatingMemberType();
+ if (fPSVIHandler)
+ fPSVIElemContext.fIsSpecified = ((SchemaValidator*)
fValidator)->getIsElemSpecified();
+ if (fPSVIElemContext.fCurrentDV &&
fPSVIElemContext.fCurrentDV->getType() == DatatypeValidator::Union)
+ psviMemberType = fValidationContext->getValidatingMemberType();
}
// call matchers and de-activate context
@@ -1870,6 +1918,41 @@
, isRoot
, fPrefixBuf.getRawBuffer()
);
+ // pass information about type info:
+ const XMLCh *typeName = SchemaSymbols::fgATTVAL_ANYTYPE;
+ const XMLCh *typeURI = SchemaSymbols::fgURI_SCHEMAFORSCHEMA;
+ if(!fPSVIElemContext.fErrorOccurred)
+ {
+ if(fPSVIElemContext.fCurrentTypeInfo != 0)
+ {
+ if(fPSVIElemContext.fCurrentTypeInfo->getAnonymous())
+ typeName = XMLUni::fgZeroLenString;
+ else
+ typeName =
fPSVIElemContext.fCurrentTypeInfo->getTypeLocalName();
+ typeURI = fPSVIElemContext.fCurrentTypeInfo->getTypeUri();
+ }
+ else
+ {
+ DatatypeValidator *actualDV =
(psviMemberType)?psviMemberType:fPSVIElemContext.fCurrentDV;
+ if(actualDV)
+ {
+ if(actualDV->getAnonymous())
+ typeName = XMLUni::fgZeroLenString;
+ else
+ typeName = actualDV->getTypeLocalName();
+ typeURI = actualDV->getTypeUri();
+ }
+ }
+ }
+ else
+ {
+ // idiosyncratically, if there's an
+ // error but this element was simpleType-validated,
+ // the tests demand anySimpleType be returned
+ if(fPSVIElemContext.fCurrentDV)
+ typeName = SchemaSymbols::fgDT_ANYSIMPLETYPE;
+ }
+ fDocHandler->elementTypeInfo(typeName, typeURI);
}
// reset xsi:type ComplexTypeInfo
@@ -1892,6 +1975,8 @@
fValidate = fElemStack.getValidationFlag();
}
}
+ else // not empty
+ fErrorStack->push(fPSVIElemContext.fErrorOccurred);
return true;
}
@@ -2329,10 +2414,10 @@
, attDef->getFullName()
);
((SchemaAttDef
*)(attDef))->setValidity(PSVIDefs::INVALID);
+ fPSVIElemContext.fErrorOccurred = true;
if (getPSVIHandler())
{
attrValid = PSVIItem::VALIDITY_INVALID;
- fPSVIElemContext.fErrorOccurred = true;
}
}
}
@@ -2348,10 +2433,10 @@
, attDef->getFullName()
);
((SchemaAttDef
*)(attDef))->setValidity(PSVIDefs::INVALID);
+ fPSVIElemContext.fErrorOccurred = true;
if (getPSVIHandler())
{
attrValid = PSVIItem::VALIDITY_INVALID;
- fPSVIElemContext.fErrorOccurred = true;
}
}
}
@@ -2420,16 +2505,19 @@
((SchemaAttDef *)(attDef))->setValidationAttempted(PSVIDefs::FULL);
}
- if(getPSVIHandler())
+ // if we've found either an attDef or an attDefForWildCard,
+ // then we're doing full validation and it may still be valid.
+ if(!attDef && !attDefForWildCard)
{
- // if we've found either an attDef or an attDefForWildCard,
- // then we're doing full validation and it may still be valid.
- if(!attDef && !attDefForWildCard)
+ if(!laxThisOne && !skipThisOne)
+ {
+ fPSVIElemContext.fErrorOccurred = true;
+ }
+ if(getPSVIHandler())
{
if(!laxThisOne && !skipThisOne)
{
attrValid = PSVIItem::VALIDITY_INVALID;
- fPSVIElemContext.fErrorOccurred = true;
}
else if(laxThisOne)
{
@@ -2516,10 +2604,11 @@
, elemDecl
);
attrValidator = ((SchemaValidator
*)fValidator)->getMostRecentAttrValidator();
- if(getPSVIHandler() && ((SchemaValidator
*)fValidator)->getErrorOccurred())
+ if(((SchemaValidator *)fValidator)->getErrorOccurred())
{
- attrValid = PSVIItem::VALIDITY_INVALID;
fPSVIElemContext.fErrorOccurred = true;
+ if(getPSVIHandler())
+ attrValid = PSVIItem::VALIDITY_INVALID;
}
}
else // no decl; default DOMTypeInfo to anySimpleType
@@ -2571,10 +2660,11 @@
, elemDecl
);
attrValidator = ((SchemaValidator
*)fValidator)->getMostRecentAttrValidator();
- if(getPSVIHandler() && ((SchemaValidator
*)fValidator)->getErrorOccurred())
+ if(((SchemaValidator *)fValidator)->getErrorOccurred())
{
- attrValid = PSVIItem::VALIDITY_INVALID;
fPSVIElemContext.fErrorOccurred = true;
+ if(getPSVIHandler())
+ attrValid = PSVIItem::VALIDITY_INVALID;
}
}
else
@@ -2867,6 +2957,7 @@
, curDef->getFullName()
);
((SchemaAttDef *)curDef)->setValidity(PSVIDefs::INVALID);
+ fPSVIElemContext.fErrorOccurred = true;
if (getPSVIHandler())
{
QName *attQName = ((SchemaAttDef *)curDef)->getAttName();
@@ -3209,16 +3300,14 @@
fDoSchema = true;
// Reset PSVI context
- if (fPSVIHandler)
- {
- if (!fPSVIElement)
- fPSVIElement = new (fMemoryManager) PSVIElement(fMemoryManager);
+ // Note that we always need this around for DOMTypeInfo
+ if (!fPSVIElement)
+ fPSVIElement = new (fMemoryManager) PSVIElement(fMemoryManager);
- if (!fErrorStack)
- fErrorStack = new (fMemoryManager) ValueStackOf<bool>(8,
fMemoryManager);
+ if (!fErrorStack)
+ fErrorStack = new (fMemoryManager) ValueStackOf<bool>(8, fMemoryManager);
- resetPSVIElemContext();
- }
+ resetPSVIElemContext();
// Reset the validators
fSchemaValidator->reset();
@@ -4833,9 +4922,6 @@
// decrease element depth
fPSVIElemContext.fElemDepth--;
- // reset error occurred
- fPSVIElemContext.fErrorOccurred =
- fPSVIElemContext.fErrorOccurred && fErrorStack->pop();
}
void SGXMLScanner::resetPSVIElemContext()
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]