knoaman 2003/01/13 08:30:19 Modified: c/src/xercesc/internal IGXMLScanner.cpp IGXMLScanner.hpp IGXMLScanner2.cpp SGXMLScanner.cpp SGXMLScanner.hpp c/src/xercesc/validators/schema/identity IC_Field.cpp IC_Selector.cpp IC_Selector.hpp XPathMatcher.cpp XPathMatcher.hpp Log: [Bug 14469] Validator doesn't enforce xsd:key. Revision Changes Path 1.5 +8 -21 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.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- IGXMLScanner.cpp 9 Jan 2003 22:33:32 -0000 1.4 +++ IGXMLScanner.cpp 13 Jan 2003 16:30:16 -0000 1.5 @@ -1025,7 +1025,7 @@ for (int i = oldCount - 1; i >= 0; i--) { XPathMatcher* matcher = fMatcherStack->getMatcherAt(i); - matcher->endElement(*(topElem->fThisElement)); + matcher->endElement(*(topElem->fThisElement), fContent.getRawBuffer()); } if (fMatcherStack->size() > 0) { @@ -1040,14 +1040,8 @@ XPathMatcher* matcher = fMatcherStack->getMatcherAt(j); IdentityConstraint* ic = matcher->getIdentityConstraint(); - if (ic && (ic->getType() != IdentityConstraint::KEYREF)) { - - matcher->endDocumentFragment(); + if (ic && (ic->getType() != IdentityConstraint::KEYREF)) fValueStoreCache->transplant(ic, matcher->getInitialDepth()); - } - else if (!ic) { - matcher->endDocumentFragment(); - } } // now handle keyref's... @@ -1063,8 +1057,6 @@ if (values) { // nothing to do if nothing matched! values->endDcocumentFragment(fValueStoreCache); } - - matcher->endDocumentFragment(); } } @@ -1928,6 +1920,9 @@ // ever be false if this is the root and its empty. gotData = true; + // Reset element content buffer + fContent.reset(); + // The current position is after the open bracket, so we need to read in // in the element name. if (!fReaderMgr.getName(fQNameBuf)) @@ -2437,7 +2432,7 @@ for (int i = oldCount - 1; i >= 0; i--) { XPathMatcher* matcher = fMatcherStack->getMatcherAt(i); - matcher->endElement(*elemDecl); + matcher->endElement(*elemDecl, fContent.getRawBuffer()); } if (fMatcherStack->size() > 0) { @@ -2452,14 +2447,8 @@ XPathMatcher* matcher = fMatcherStack->getMatcherAt(j); IdentityConstraint* ic = matcher->getIdentityConstraint(); - if (ic && (ic->getType() != IdentityConstraint::KEYREF)) { - - matcher->endDocumentFragment(); + if (ic && (ic->getType() != IdentityConstraint::KEYREF)) fValueStoreCache->transplant(ic, matcher->getInitialDepth()); - } - else if (!ic) { - matcher->endDocumentFragment(); - } } // now handle keyref's... @@ -2475,8 +2464,6 @@ if (values) { // nothing to do if nothing matched! values->endDcocumentFragment(fValueStoreCache); } - - matcher->endDocumentFragment(); } } 1.2 +5 -1 xml-xerces/c/src/xercesc/internal/IGXMLScanner.hpp Index: IGXMLScanner.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/IGXMLScanner.hpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- IGXMLScanner.hpp 4 Dec 2002 02:05:25 -0000 1.1 +++ IGXMLScanner.hpp 13 Jan 2003 16:30:18 -0000 1.2 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.2 2003/01/13 16:30:18 knoaman + * [Bug 14469] Validator doesn't enforce xsd:key. + * * Revision 1.1 2002/12/04 02:05:25 knoaman * Initial checkin. * @@ -292,6 +295,7 @@ unsigned int fElemStateSize; unsigned int* fElemState; ElemStack fElemStack; + XMLBuffer fContent; RefVectorOf<KVStringPair>* fRawAttrList; DTDValidator* fDTDValidator; SchemaValidator* fSchemaValidator; 1.8 +9 -22 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.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- IGXMLScanner2.cpp 6 Jan 2003 19:44:57 -0000 1.7 +++ IGXMLScanner2.cpp 13 Jan 2003 16:30:18 -0000 1.8 @@ -965,11 +965,8 @@ ((SchemaValidator*) fValidator)->setDatatypeBuffer(toFill.getRawBuffer()); // call all active identity constraints - unsigned int count = fMatcherStack->getMatcherCount(); - - for (unsigned int i = 0; i < count; i++) { - fMatcherStack->getMatcherAt(i)->docCharacters(toFill.getRawBuffer(), toFill.getLen()); - } + if (fMatcherStack->getMatcherCount()) + fContent.append(toFill.getRawBuffer(), toFill.getLen()); if (fDocHandler) fDocHandler->docCharacters(toFill.getRawBuffer(), toFill.getLen(), false); @@ -1010,11 +1007,8 @@ ((SchemaValidator*) fValidator)->setDatatypeBuffer(toFill.getRawBuffer()); // call all active identity constraints - unsigned int count = fMatcherStack->getMatcherCount(); - - for (unsigned int i = 0; i < count; i++) { - fMatcherStack->getMatcherAt(i)->docCharacters(toFill.getRawBuffer(), toFill.getLen()); - } + if (fMatcherStack->getMatcherCount()) + fContent.append(toFill.getRawBuffer(), toFill.getLen()); if (fDocHandler) fDocHandler->docCharacters(toFill.getRawBuffer(), toFill.getLen(), false); @@ -1031,11 +1025,8 @@ // call all active identity constraints if (fGrammarType == Grammar::SchemaGrammarType) { - unsigned int count = fMatcherStack->getMatcherCount(); - - for (unsigned int i = 0; i < count; i++) { - fMatcherStack->getMatcherAt(i)->docCharacters(toSend.getRawBuffer(), toSend.getLen()); - } + if (fMatcherStack->getMatcherCount()) + fContent.append(toSend.getRawBuffer(), toSend.getLen()); } // Always assume its just char data if not validating @@ -1953,12 +1944,8 @@ { if (fGrammarType == Grammar::SchemaGrammarType) { - // call all active identity constraints - unsigned int count = fMatcherStack->getMatcherCount(); - - for (unsigned int i = 0; i < count; i++) { - fMatcherStack->getMatcherAt(i)->docCharacters(bbCData.getRawBuffer(), bbCData.getLen()); - } + if (fMatcherStack->getMatcherCount()) + fContent.append(bbCData.getRawBuffer(), bbCData.getLen()); } // If we have a doc handler, call it 1.10 +16 -41 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.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- SGXMLScanner.cpp 9 Jan 2003 22:33:32 -0000 1.9 +++ SGXMLScanner.cpp 13 Jan 2003 16:30:18 -0000 1.10 @@ -971,7 +971,7 @@ for (int i = oldCount - 1; i >= 0; i--) { XPathMatcher* matcher = fMatcherStack->getMatcherAt(i); - matcher->endElement(*(topElem->fThisElement)); + matcher->endElement(*(topElem->fThisElement), fContent.getRawBuffer()); } if (fMatcherStack->size() > 0) { @@ -986,14 +986,8 @@ XPathMatcher* matcher = fMatcherStack->getMatcherAt(j); IdentityConstraint* ic = matcher->getIdentityConstraint(); - if (ic && (ic->getType() != IdentityConstraint::KEYREF)) { - - matcher->endDocumentFragment(); + if (ic && (ic->getType() != IdentityConstraint::KEYREF)) fValueStoreCache->transplant(ic, matcher->getInitialDepth()); - } - else if (!ic) { - matcher->endDocumentFragment(); - } } // now handle keyref's... @@ -1009,8 +1003,6 @@ if (values) { // nothing to do if nothing matched! values->endDcocumentFragment(fValueStoreCache); } - - matcher->endDocumentFragment(); } } @@ -1082,6 +1074,9 @@ // ever be false if this is the root and its empty. gotData = true; + // Reset element content + fContent.reset(); + // The current position is after the open bracket, so we need to read in // in the element name. if (!fReaderMgr.getName(fQNameBuf)) @@ -1546,7 +1541,7 @@ for (int i = oldCount - 1; i >= 0; i--) { XPathMatcher* matcher = fMatcherStack->getMatcherAt(i); - matcher->endElement(*elemDecl); + matcher->endElement(*elemDecl, fContent.getRawBuffer()); } if (fMatcherStack->size() > 0) { @@ -1561,14 +1556,8 @@ XPathMatcher* matcher = fMatcherStack->getMatcherAt(j); IdentityConstraint* ic = matcher->getIdentityConstraint(); - if (ic && (ic->getType() != IdentityConstraint::KEYREF)) { - - matcher->endDocumentFragment(); + if (ic && (ic->getType() != IdentityConstraint::KEYREF)) fValueStoreCache->transplant(ic, matcher->getInitialDepth()); - } - else if (!ic) { - matcher->endDocumentFragment(); - } } // now handle keyref's... @@ -1584,8 +1573,6 @@ if (values) { // nothing to do if nothing matched! values->endDcocumentFragment(fValueStoreCache); } - - matcher->endDocumentFragment(); } } @@ -2699,11 +2686,8 @@ ((SchemaValidator*) fValidator)->setDatatypeBuffer(toFill.getRawBuffer()); // call all active identity constraints - unsigned int count = fMatcherStack->getMatcherCount(); - - for (unsigned int i = 0; i < count; i++) { - fMatcherStack->getMatcherAt(i)->docCharacters(toFill.getRawBuffer(), toFill.getLen()); - } + if (fMatcherStack->getMatcherCount()) + fContent.append(toFill.getRawBuffer(), toFill.getLen()); if (fDocHandler) fDocHandler->docCharacters(toFill.getRawBuffer(), toFill.getLen(), false); @@ -2736,11 +2720,8 @@ ((SchemaValidator*) fValidator)->setDatatypeBuffer(toFill.getRawBuffer()); // call all active identity constraints - unsigned int count = fMatcherStack->getMatcherCount(); - - for (unsigned int i = 0; i < count; i++) { - fMatcherStack->getMatcherAt(i)->docCharacters(toFill.getRawBuffer(), toFill.getLen()); - } + if (fMatcherStack->getMatcherCount()) + fContent.append(toFill.getRawBuffer(), toFill.getLen()); if (fDocHandler) fDocHandler->docCharacters(toFill.getRawBuffer(), toFill.getLen(), false); @@ -2754,11 +2735,8 @@ else { // call all active identity constraints - unsigned int count = fMatcherStack->getMatcherCount(); - - for (unsigned int i = 0; i < count; i++) { - fMatcherStack->getMatcherAt(i)->docCharacters(toSend.getRawBuffer(), toSend.getLen()); - } + if (fMatcherStack->getMatcherCount()) + fContent.append(toSend.getRawBuffer(), toSend.getLen()); // Always assume its just char data if not validating if (fDocHandler) @@ -3439,11 +3417,8 @@ emitError(XMLErrs::Expected2ndSurrogateChar); // call all active identity constraints - unsigned int count = fMatcherStack->getMatcherCount(); - - for (unsigned int i = 0; i < count; i++) { - fMatcherStack->getMatcherAt(i)->docCharacters(bbCData.getRawBuffer(), bbCData.getLen()); - } + if (fMatcherStack->getMatcherCount()) + fContent.append(bbCData.getRawBuffer(), bbCData.getLen()); // If we have a doc handler, call it if (fDocHandler) 1.2 +5 -1 xml-xerces/c/src/xercesc/internal/SGXMLScanner.hpp Index: SGXMLScanner.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/SGXMLScanner.hpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- SGXMLScanner.hpp 5 Dec 2002 16:19:27 -0000 1.1 +++ SGXMLScanner.hpp 13 Jan 2003 16:30:18 -0000 1.2 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.2 2003/01/13 16:30:18 knoaman + * [Bug 14469] Validator doesn't enforce xsd:key. + * * Revision 1.1 2002/12/05 16:19:27 knoaman * Initial check-in. * @@ -286,6 +289,7 @@ unsigned int fElemStateSize; unsigned int* fElemState; ElemStack fElemStack; + XMLBuffer fContent; ValueHashTableOf<XMLCh>* fEntityTable; RefVectorOf<KVStringPair>* fRawAttrList; SchemaGrammar* fSchemaGrammar; 1.3 +4 -1 xml-xerces/c/src/xercesc/validators/schema/identity/IC_Field.cpp Index: IC_Field.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/identity/IC_Field.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- IC_Field.cpp 4 Nov 2002 14:47:41 -0000 1.2 +++ IC_Field.cpp 13 Jan 2003 16:30:19 -0000 1.3 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.3 2003/01/13 16:30:19 knoaman + * [Bug 14469] Validator doesn't enforce xsd:key. + * * Revision 1.2 2002/11/04 14:47:41 tng * C++ Namespace Support. * @@ -84,7 +87,7 @@ // --------------------------------------------------------------------------- FieldMatcher::FieldMatcher(XercesXPath* const xpath, IC_Field* const aField, ValueStore* const valueStore) - : XPathMatcher(xpath, true, 0) + : XPathMatcher(xpath, 0) , fField(aField) , fValueStore(valueStore) { 1.4 +11 -7 xml-xerces/c/src/xercesc/validators/schema/identity/IC_Selector.cpp Index: IC_Selector.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/identity/IC_Selector.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- IC_Selector.cpp 4 Nov 2002 14:47:41 -0000 1.3 +++ IC_Selector.cpp 13 Jan 2003 16:30:19 -0000 1.4 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.4 2003/01/13 16:30:19 knoaman + * [Bug 14469] Validator doesn't enforce xsd:key. + * * Revision 1.3 2002/11/04 14:47:41 tng * C++ Namespace Support. * @@ -94,7 +97,7 @@ IC_Selector* const selector, FieldActivator* const fieldActivator, const int initialDepth) - : XPathMatcher(xpath, false, selector->getIdentityConstraint()) + : XPathMatcher(xpath, selector->getIdentityConstraint()) , fInitialDepth(initialDepth) , fElementDepth(0) , fMatchedDepth(-1) @@ -123,7 +126,9 @@ fElementDepth++; // activate the fields, if selector is matched - if (fMatchedDepth == -1 && isMatched()) { + int matched = isMatched(); + if ((fMatchedDepth == -1 && ((matched & XP_MATCHED) == XP_MATCHED)) + || ((matched & XP_MATCHED_D) == XP_MATCHED_D)) { IdentityConstraint* ic = fSelector->getIdentityConstraint(); int count = ic->getFieldCount(); @@ -133,17 +138,16 @@ for (int i = 0; i < count; i++) { - IC_Field* field = ic->getFieldAt(i); - XPathMatcher* matcher = fFieldActivator->activateField(field, fInitialDepth); - + XPathMatcher* matcher = fFieldActivator->activateField(ic->getFieldAt(i), fInitialDepth); matcher->startElement(elemDecl, urlId, elemPrefix, attrList, attrCount); } } } -void SelectorMatcher::endElement(const XMLElementDecl& elemDecl) { +void SelectorMatcher::endElement(const XMLElementDecl& elemDecl, + const XMLCh* const elemContent) { - XPathMatcher::endElement(elemDecl); + XPathMatcher::endElement(elemDecl, elemContent); if (fElementDepth-- == fMatchedDepth) { 1.4 +3 -2 xml-xerces/c/src/xercesc/validators/schema/identity/IC_Selector.hpp Index: IC_Selector.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/identity/IC_Selector.hpp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- IC_Selector.hpp 4 Nov 2002 14:47:41 -0000 1.3 +++ IC_Selector.hpp 13 Jan 2003 16:30:19 -0000 1.4 @@ -136,7 +136,8 @@ const XMLCh* const elemPrefix, const RefVectorOf<XMLAttr>& attrList, const unsigned int attrCount); - void endElement(const XMLElementDecl& elemDecl); + void endElement(const XMLElementDecl& elemDecl, + const XMLCh* const elemContent); private: // ----------------------------------------------------------------------- 1.5 +42 -79 xml-xerces/c/src/xercesc/validators/schema/identity/XPathMatcher.cpp Index: XPathMatcher.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/identity/XPathMatcher.cpp,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- XPathMatcher.cpp 4 Nov 2002 14:47:41 -0000 1.4 +++ XPathMatcher.cpp 13 Jan 2003 16:30:19 -0000 1.5 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.5 2003/01/13 16:30:19 knoaman + * [Bug 14469] Validator doesn't enforce xsd:key. + * * Revision 1.4 2002/11/04 14:47:41 tng * C++ Namespace Support. * @@ -92,16 +95,13 @@ // XPathMatcher: Constructors and Destructor // --------------------------------------------------------------------------- XPathMatcher::XPathMatcher(XercesXPath* const xpath) - : fShouldBufferContent(false) - , fBufferContent(false) - , fLocationPathSize(0) + : fLocationPathSize(0) , fMatched(0) , fNoMatchDepth(0) , fCurrentStep(0) , fStepIndexes(0) , fLocationPaths(0) , fIdentityConstraint(0) - , fMatchedBuffer(128) { try { init(xpath); @@ -115,16 +115,14 @@ XPathMatcher::XPathMatcher(XercesXPath* const xpath, - const bool shouldBufferContent, IdentityConstraint* const ic) - : fShouldBufferContent(shouldBufferContent) - , fLocationPathSize(0) + : fLocationPathSize(0) , fMatched(0) , fNoMatchDepth(0) , fCurrentStep(0) + , fStepIndexes(0) , fLocationPaths(0) , fIdentityConstraint(ic) - , fMatchedBuffer(0) { try { init(xpath); @@ -157,7 +155,7 @@ fStepIndexes = new RefVectorOf<ValueStackOf<int> >(fLocationPathSize); fCurrentStep = new int[fLocationPathSize]; fNoMatchDepth = new int[fLocationPathSize]; - fMatched = new bool[fLocationPathSize]; + fMatched = new int[fLocationPathSize]; for(unsigned int i=0; i < fLocationPathSize; i++) { fStepIndexes->addElement(new ValueStackOf<int>(8)); @@ -166,30 +164,18 @@ } } -void XPathMatcher::clear() { - - fBufferContent = false; - fMatchedBuffer.reset(); - - for(int i = 0; i < (int) fLocationPathSize; i++) - fMatched[i] = false; - -} // --------------------------------------------------------------------------- // XPathMatcher: XMLDocumentHandler methods // --------------------------------------------------------------------------- void XPathMatcher::startDocumentFragment() { - // reset state - clear(); - for(unsigned int i = 0; i < fLocationPathSize; i++) { fStepIndexes->elementAt(i)->removeAllElements(); fCurrentStep[i] = 0; fNoMatchDepth[i] = 0; - fMatched[i] = false; + fMatched[i] = 0; } } @@ -206,11 +192,15 @@ fStepIndexes->elementAt(i)->push(startStep); // try next xpath, if not matching - if (fMatched[i] || fNoMatchDepth[i] > 0) { + if ((fMatched[i] & XP_MATCHED_D) == XP_MATCHED || fNoMatchDepth[i] > 0) { fNoMatchDepth[i]++; continue; } + if((fMatched[i] & XP_MATCHED_D) == XP_MATCHED_D) { + fMatched[i] = XP_MATCHED_DP; + } + // consume self::node() steps XercesLocationPath* locPath = fLocationPaths->elementAt(i); int stepSize = locPath->getStepSize(); @@ -222,14 +212,7 @@ if (fCurrentStep[i] == stepSize) { - fMatched[i] = true; - int j=0; - - for(; j<i && !fMatched[j]; j++) ; - - if(j==i) - fBufferContent = fShouldBufferContent; - + fMatched[i] = XP_MATCHED; continue; } @@ -244,6 +227,7 @@ fCurrentStep[i]++; } + bool sawDescendant = fCurrentStep[i] > descendantStep; if (fCurrentStep[i] == stepSize) { fNoMatchDepth[i]++; @@ -279,13 +263,14 @@ if (fCurrentStep[i] == stepSize) { - fMatched[i] = true; - int j=0; + if (sawDescendant) { - for(; j<i && !fMatched[j]; j++) ; - - if(j==i) - fBufferContent = fShouldBufferContent; + fCurrentStep[i] = descendantStep; + fMatched[i] = XP_MATCHED_D; + } + else { + fMatched[i] = XP_MATCHED; + } continue; } @@ -309,10 +294,10 @@ if (fCurrentStep[i] == stepSize) { - fMatched[i] = true; + fMatched[i] = XP_MATCHED_A; int j=0; - for(; j<i && !fMatched[j]; j++) ; + for(; j<i && ((fMatched[j] & XP_MATCHED) != XP_MATCHED); j++) ; if(j == i) { @@ -326,7 +311,7 @@ } } - if (!fMatched[i]) { + if ((fMatched[i] & XP_MATCHED) != XP_MATCHED) { if(fCurrentStep[i] > descendantStep) { @@ -340,24 +325,14 @@ } } -void XPathMatcher::docCharacters(const XMLCh* const chars, - const unsigned int length) { - - // collect match content - // so long as one of our paths is matching, store the content - for(int i=0; i < (int) fLocationPathSize; i++) { - - if (fBufferContent && fNoMatchDepth[i] == 0) { - fMatchedBuffer.append(chars, length); - break; - } - } -} - -void XPathMatcher::endElement(const XMLElementDecl& elemDecl) { +void XPathMatcher::endElement(const XMLElementDecl& elemDecl, + const XMLCh* const elemContent) { for(int i = 0; i < (int) fLocationPathSize; i++) { + // go back a step + fCurrentStep[i] = fStepIndexes->elementAt(i)->pop(); + // don't do anything, if not matching if (fNoMatchDepth[i] > 0) { fNoMatchDepth[i]--; @@ -366,47 +341,35 @@ else { int j=0; + for(; j<i && ((fMatched[j] & XP_MATCHED) != XP_MATCHED); j++) ; - for(; j<i && !fMatched[j]; j++) ; - - if (j < i) + if (j < i || (fMatched[j] == 0) + || ((fMatched[j] & XP_MATCHED_A) == XP_MATCHED_A)) continue; - if (fBufferContent) { - - DatatypeValidator* dv = ((SchemaElementDecl*) &elemDecl)->getDatatypeValidator(); - bool isNillable = (((SchemaElementDecl *) &elemDecl)->getMiscFlags() & SchemaSymbols::NILLABLE) != 0; + DatatypeValidator* dv = ((SchemaElementDecl*) &elemDecl)->getDatatypeValidator(); + bool isNillable = (((SchemaElementDecl *) &elemDecl)->getMiscFlags() & SchemaSymbols::NILLABLE) != 0; - fBufferContent = false; - matched(fMatchedBuffer.getRawBuffer(), dv, isNillable); - } - - clear(); + matched(elemContent, dv, isNillable); + fMatched[i] = 0; } - - // go back a step - fCurrentStep[i] = fStepIndexes->elementAt(i)->pop(); } } -void XPathMatcher::endDocumentFragment() { - - clear(); -} - // --------------------------------------------------------------------------- // XPathMatcher: Match methods // --------------------------------------------------------------------------- -bool XPathMatcher::isMatched() { +int XPathMatcher::isMatched() { // xpath has been matched if any one of the members of the union have matched. for (int i=0; i < (int) fLocationPathSize; i++) { - if (fMatched[i]) - return true; + if (((fMatched[i] & XP_MATCHED) == XP_MATCHED) + && ((fMatched[i] & XP_MATCHED_DP) != XP_MATCHED_DP)) + return fMatched[i]; } - return false; + return 0; } void XPathMatcher::matched(const XMLCh* const content, 1.4 +17 -23 xml-xerces/c/src/xercesc/validators/schema/identity/XPathMatcher.hpp Index: XPathMatcher.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/identity/XPathMatcher.hpp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- XPathMatcher.hpp 4 Nov 2002 14:47:41 -0000 1.3 +++ XPathMatcher.hpp 13 Jan 2003 16:30:19 -0000 1.4 @@ -89,7 +89,7 @@ // Constructors/Destructor // ----------------------------------------------------------------------- XPathMatcher(XercesXPath* const xpath); - XPathMatcher(XercesXPath* const xpath, const bool shouldBufferContent, + XPathMatcher(XercesXPath* const xpath, IdentityConstraint* const ic); virtual ~XPathMatcher(); @@ -104,23 +104,32 @@ /** * Returns true if XPath has been matched. */ - bool isMatched(); + int isMatched(); virtual int getInitialDepth() const; // ----------------------------------------------------------------------- // XMLDocumentHandler methods // ----------------------------------------------------------------------- virtual void startDocumentFragment(); - virtual void endDocumentFragment(); virtual void startElement(const XMLElementDecl& elemDecl, const unsigned int urlId, const XMLCh* const elemPrefix, const RefVectorOf<XMLAttr>& attrList, const unsigned int attrCount); - virtual void endElement(const XMLElementDecl& elemDecl); - virtual void docCharacters(const XMLCh* const chars, const unsigned int length); + virtual void endElement(const XMLElementDecl& elemDecl, + const XMLCh* const elemContent); protected: + + enum + { + XP_MATCHED = 1 // matched any way + , XP_MATCHED_A = 3 // matched on the attribute axis + , XP_MATCHED_D = 5 // matched on the descendant-or-self axixs + , XP_MATCHED_DP = 13 // matched some previous (ancestor) node on the + // descendant-or-self-axis, but not this node + }; + // ----------------------------------------------------------------------- // Match methods // ----------------------------------------------------------------------- @@ -133,26 +142,16 @@ DatatypeValidator* const dv, const bool isNil); private: + // ----------------------------------------------------------------------- // Helper methods // ----------------------------------------------------------------------- void init(XercesXPath* const xpath); void cleanUp(); - /** - * Clears the match values. - */ - void clear(); - // ----------------------------------------------------------------------- // Data members // - // fShouldBufferContent - // Application preference to buffer content or not. - // - // fBufferContent - // True, if we should buffer character content at this time. - // // fMatched // Indicates whether XPath has been matched or not // @@ -174,19 +173,14 @@ // The identity constraint we're the matcher for. Only used for // selectors. // - // fMatchedBuffer - // To hold match text. // ----------------------------------------------------------------------- - bool fShouldBufferContent; - bool fBufferContent; unsigned int fLocationPathSize; - bool* fMatched; + int* fMatched; int* fNoMatchDepth; int* fCurrentStep; RefVectorOf<ValueStackOf<int> >* fStepIndexes; RefVectorOf<XercesLocationPath>* fLocationPaths; IdentityConstraint* fIdentityConstraint; - XMLBuffer fMatchedBuffer; }; // ---------------------------------------------------------------------------
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]