You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by pe...@apache.org on 2004/04/13 18:56:59 UTC

cvs commit: xml-xerces/c/src/xercesc/internal IGXMLScanner.cpp IGXMLScanner.hpp IGXMLScanner2.cpp SGXMLScanner.cpp SGXMLScanner.hpp XMLScanner.cpp XMLScanner.hpp

peiyongz    2004/04/13 09:56:59

  Modified:    c/src/xercesc/internal IGXMLScanner.cpp IGXMLScanner.hpp
                        IGXMLScanner2.cpp SGXMLScanner.cpp SGXMLScanner.hpp
                        XMLScanner.cpp XMLScanner.hpp
  Log:
  IdentityConstraintHandler
  
  Revision  Changes    Path
  1.61      +41 -145   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.60
  retrieving revision 1.61
  diff -u -r1.60 -r1.61
  --- IGXMLScanner.cpp	7 Apr 2004 14:15:12 -0000	1.60
  +++ IGXMLScanner.cpp	13 Apr 2004 16:56:58 -0000	1.61
  @@ -81,11 +81,8 @@
   #include <xercesc/validators/DTD/DTDScanner.hpp>
   #include <xercesc/validators/DTD/DTDValidator.hpp>
   #include <xercesc/validators/schema/SchemaValidator.hpp>
  -#include <xercesc/validators/schema/identity/FieldActivator.hpp>
  -#include <xercesc/validators/schema/identity/XPathMatcherStack.hpp>
  -#include <xercesc/validators/schema/identity/ValueStoreCache.hpp>
  +#include <xercesc/validators/schema/identity/IdentityConstraintHandler.hpp>
   #include <xercesc/validators/schema/identity/IC_Selector.hpp>
  -#include <xercesc/validators/schema/identity/ValueStore.hpp>
   #include <xercesc/util/OutOfMemoryException.hpp>
   
   XERCES_CPP_NAMESPACE_BEGIN
  @@ -107,9 +104,7 @@
       , fDTDValidator(0)
       , fSchemaValidator(0)
       , fDTDGrammar(0)
  -    , fMatcherStack(0)
  -    , fValueStoreCache(0)
  -    , fFieldActivator(0)
  +    , fICHandler(0)
       , fLocationPairs(0)
       , fDTDElemNonDeclPool(0)
       , fSchemaElemNonDeclPool(0)
  @@ -159,9 +154,7 @@
       , fDTDValidator(0)
       , fSchemaValidator(0)
       , fDTDGrammar(0)
  -    , fMatcherStack(0)
  -    , fValueStoreCache(0)
  -    , fFieldActivator(0)
  +    , fICHandler(0)
       , fLocationPairs(0)
       , fDTDElemNonDeclPool(0)
       , fSchemaElemNonDeclPool(0)
  @@ -455,8 +448,8 @@
                   // That went ok, so scan for any miscellaneous stuff
                   scanMiscellaneous();
   
  -                if (fValidate)
  -                    fValueStoreCache->endDocument();
  +                if (toCheckIdentityConstraint())
  +                    fICHandler->endDocument();
   
                   if (fDocHandler)
                       fDocHandler->endDocument();
  @@ -571,10 +564,11 @@
       initValidator(fSchemaValidator);
   
       // Create IdentityConstraint info
  -    fMatcherStack = new (fMemoryManager) XPathMatcherStack(fMemoryManager);
  -    fValueStoreCache = new (fMemoryManager) ValueStoreCache(fMemoryManager);
  -    fFieldActivator = new (fMemoryManager) FieldActivator(fValueStoreCache, fMatcherStack, fMemoryManager);
  -    fValueStoreCache->setScanner(this);
  +    /***
  +       todo: to auto sense if grammar has ic or not, probably do it
  +             at reset() or parse()
  +    ***/
  +    fICHandler = new (fMemoryManager) IdentityConstraintHandler(this, fMemoryManager);
   
       // Create schemaLocation pair info
       fLocationPairs = new (fMemoryManager) ValueVectorOf<XMLCh*>(8, fMemoryManager);
  @@ -602,9 +596,7 @@
       delete fRawAttrList;
       delete fDTDValidator;
       delete fSchemaValidator;
  -    delete fFieldActivator;
  -    delete fMatcherStack;
  -    delete fValueStoreCache;
  +    delete fICHandler;
       delete fLocationPairs;
       delete fDTDElemNonDeclPool;
       delete fSchemaElemNonDeclPool;
  @@ -1153,51 +1145,15 @@
               }
   
               // call matchers and de-activate context
  -            int oldCount = fMatcherStack->getMatcherCount();
  -
  -            if (oldCount ||
  -                ((SchemaElementDecl*)topElem->fThisElement)->getIdentityConstraintCount()) {
  -
  -                for (int i = oldCount - 1; i >= 0; i--) {
  -
  -                    XPathMatcher* matcher = fMatcherStack->getMatcherAt(i);
  -                    matcher->endElement(*(topElem->fThisElement), fContent.getRawBuffer());
  -                }
  -
  -                if (fMatcherStack->size() > 0) {
  -                    fMatcherStack->popContext();
  -                }
  -
  -                // handle everything *but* keyref's.
  -                int newCount = fMatcherStack->getMatcherCount();
  -
  -                for (int j = oldCount - 1; j >= newCount; j--) {
  -
  -                    XPathMatcher* matcher = fMatcherStack->getMatcherAt(j);
  -                    IdentityConstraint* ic = matcher->getIdentityConstraint();
  -
  -                    if (ic  && (ic->getType() != IdentityConstraint::KEYREF))
  -                        fValueStoreCache->transplant(ic, matcher->getInitialDepth());
  -                }
  -
  -                // now handle keyref's...
  -                for (int k = oldCount - 1; k >= newCount; k--) {
  -
  -                    XPathMatcher* matcher = fMatcherStack->getMatcherAt(k);
  -                    IdentityConstraint* ic = matcher->getIdentityConstraint();
  -
  -                    if (ic && (ic->getType() == IdentityConstraint::KEYREF)) {
  -
  -                        ValueStore* values = fValueStoreCache->getValueStoreFor(ic, matcher->getInitialDepth());
  -
  -                        if (values) { // nothing to do if nothing matched!
  -                            values->endDcocumentFragment(fValueStoreCache);
  -                        }
  -                    }
  -                }
  -
  -                fValueStoreCache->endElement();
  +            if (toCheckIdentityConstraint())
  +            {
  +                fICHandler->deactivateContext
  +                             (
  +                              (SchemaElementDecl *) topElem->fThisElement
  +                            , fContent.getRawBuffer()
  +                             );                
               }
  +
           }
       }
   
  @@ -2841,28 +2797,19 @@
       attCount = buildAttList(*fRawAttrList, attCount, elemDecl, *fAttrList);
   
       // activate identity constraints
  -    if (fValidate && fGrammar && fGrammarType == Grammar::SchemaGrammarType) {
  -
  -        unsigned int count = ((SchemaElementDecl*) elemDecl)->getIdentityConstraintCount();
  -
  -        if (count || fMatcherStack->getMatcherCount()) {
  -
  -            fValueStoreCache->startElement();
  -            fMatcherStack->pushContext();
  -            fValueStoreCache->initValueStoresFor((SchemaElementDecl*) elemDecl, (int) elemDepth);
  -
  -            for (unsigned int i = 0; i < count; i++) {
  -                activateSelectorFor(((SchemaElementDecl*) elemDecl)->getIdentityConstraintAt(i), (int) elemDepth);
  -            }
  -
  -            // call all active identity constraints
  -            count = fMatcherStack->getMatcherCount();
  -
  -            for (unsigned int j = 0; j < count; j++) {
  -                XPathMatcher* matcher = fMatcherStack->getMatcherAt(j);
  -                matcher->startElement(*elemDecl, uriId, fPrefixBuf.getRawBuffer(), *fAttrList, attCount);
  -            }
  -        }
  +    if (fGrammar  && 
  +        fGrammarType == Grammar::SchemaGrammarType &&
  +        toCheckIdentityConstraint()) 
  +    {
  +        fICHandler->activateIdentityConstraint
  +                        (
  +                          (SchemaElementDecl*) elemDecl
  +                        , (int) elemDepth
  +                        , uriId
  +                        , fPrefixBuf.getRawBuffer()
  +                        , *fAttrList
  +                        , attCount
  +                        );
       }
   
       // Since the element may have default values, call start tag now regardless if it is empty or not
  @@ -2964,50 +2911,15 @@
                   }
   
                   // call matchers and de-activate context
  -                int oldCount = fMatcherStack->getMatcherCount();
  -
  -                if (oldCount || ((SchemaElementDecl*) elemDecl)->getIdentityConstraintCount()) {
  -
  -                    for (int i = oldCount - 1; i >= 0; i--) {
  -
  -                        XPathMatcher* matcher = fMatcherStack->getMatcherAt(i);
  -                        matcher->endElement(*elemDecl, fContent.getRawBuffer());
  -                    }
  -
  -                    if (fMatcherStack->size() > 0) {
  -                        fMatcherStack->popContext();
  -                    }
  -
  -                    // handle everything *but* keyref's.
  -                    int newCount = fMatcherStack->getMatcherCount();
  -
  -                    for (int j = oldCount - 1; j >= newCount; j--) {
  -
  -                        XPathMatcher* matcher = fMatcherStack->getMatcherAt(j);
  -                        IdentityConstraint* ic = matcher->getIdentityConstraint();
  -
  -                        if (ic  && (ic->getType() != IdentityConstraint::KEYREF))
  -                            fValueStoreCache->transplant(ic, matcher->getInitialDepth());
  -                    }
  -
  -                    // now handle keyref's...
  -                    for (int k = oldCount - 1; k >= newCount; k--) {
  -
  -                        XPathMatcher* matcher = fMatcherStack->getMatcherAt(k);
  -                        IdentityConstraint* ic = matcher->getIdentityConstraint();
  -
  -                        if (ic && (ic->getType() == IdentityConstraint::KEYREF)) {
  -
  -                            ValueStore* values = fValueStoreCache->getValueStoreFor(ic, matcher->getInitialDepth());
  -
  -                            if (values) { // nothing to do if nothing matched!
  -                                values->endDcocumentFragment(fValueStoreCache);
  -                            }
  -                        }
  -                    }
  -
  -                    fValueStoreCache->endElement();
  +                if (toCheckIdentityConstraint())
  +                {
  +                    fICHandler->deactivateContext
  +                                   (
  +                                    (SchemaElementDecl *) elemDecl
  +                                  , fContent.getRawBuffer()
  +                                   );                
                   }
  +
               }
           }
   
  @@ -3199,22 +3111,6 @@
       fMemoryManager->deallocate(fElemState); //delete [] fElemState;
       fElemState = newElemState;
       fElemStateSize = newSize;
  -}
  -
  -// ---------------------------------------------------------------------------
  -//  IGXMLScanner: IC activation methos
  -// ---------------------------------------------------------------------------
  -void IGXMLScanner::activateSelectorFor(IdentityConstraint* const ic, const int initialDepth) {
  -
  -    IC_Selector* selector = ic->getSelector();
  -
  -    if (!selector)
  -        return;
  -
  -    XPathMatcher* matcher = selector->createMatcher(fFieldActivator, initialDepth, fMemoryManager);
  -
  -    fMatcherStack->addMatcher(matcher);
  -    matcher->startDocumentFragment();
   }
   
   // ---------------------------------------------------------------------------
  
  
  
  1.20      +22 -30    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.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- IGXMLScanner.hpp	7 Apr 2004 14:14:08 -0000	1.19
  +++ IGXMLScanner.hpp	13 Apr 2004 16:56:58 -0000	1.20
  @@ -56,6 +56,9 @@
   
   /*
    * $Log$
  + * Revision 1.20  2004/04/13 16:56:58  peiyongz
  + * IdentityConstraintHandler
  + *
    * Revision 1.19  2004/04/07 14:14:08  peiyongz
    * make resolveSystemId virutal
    *
  @@ -135,9 +138,7 @@
   class DTDGrammar;
   class DTDValidator;
   class SchemaValidator;
  -class ValueStoreCache;
  -class XPathMatcherStack;
  -class FieldActivator;
  +class IdentityConstraintHandler;
   class IdentityConstraint;
   class ContentLeafNameTypeVector;
   class SchemaAttDef;
  @@ -310,7 +311,7 @@
       // -----------------------------------------------------------------------
       //  IdentityConstraints Activation methods
       // -----------------------------------------------------------------------
  -    void activateSelectorFor(IdentityConstraint* const ic, const int initialDepth);
  +    inline bool toCheckIdentityConstraint()  const;
   
       // -----------------------------------------------------------------------
       //  Grammar preparsing methods
  @@ -347,17 +348,6 @@
       //      Stores an element next state from DFA content model - used for
       //      wildcard validation
       //
  -    //  fMatcherStack
  -    //      Stack of active XPath matchers for identity constraints. All
  -    //      active XPath matchers are notified of startElement, characters
  -    //      and endElement callbacks in order to perform their matches.
  -    //
  -    //  fValueStoreCache
  -    //      Cache of value stores for identity constraint fields.
  -    //
  -    //  fFieldActivator
  -    //      Activates fields within a certain scope when a selector matches
  -    //      its xpath.
       // fDTDElemNonDeclPool
       //      registry of "faulted-in" DTD element decls
       // fSchemaElemNonDeclPool
  @@ -378,21 +368,19 @@
       //      filled when a PSVIHandler is registered
       //
       // -----------------------------------------------------------------------
  -    bool                        fSeeXsi;
  -    Grammar::GrammarType        fGrammarType;
  -    unsigned int                fElemStateSize;
  -    unsigned int*               fElemState;
  -    XMLBuffer                   fContent;
  -    RefVectorOf<KVStringPair>*  fRawAttrList;
  -    DTDValidator*               fDTDValidator;
  -    SchemaValidator*            fSchemaValidator;
  -    DTDGrammar*                 fDTDGrammar;
  -    XPathMatcherStack*          fMatcherStack;
  -    ValueStoreCache*            fValueStoreCache;
  -    FieldActivator*             fFieldActivator;
  -    ValueVectorOf<XMLCh*>*      fLocationPairs;
  -    NameIdPool<DTDElementDecl>* fDTDElemNonDeclPool;
  -    RefHash3KeysIdPool<SchemaElementDecl>* fSchemaElemNonDeclPool;
  +    bool                                    fSeeXsi;
  +    Grammar::GrammarType                    fGrammarType;
  +    unsigned int                            fElemStateSize;
  +    unsigned int*                           fElemState;
  +    XMLBuffer                               fContent;
  +    RefVectorOf<KVStringPair>*              fRawAttrList;
  +    DTDValidator*                           fDTDValidator;
  +    SchemaValidator*                        fSchemaValidator;
  +    DTDGrammar*                             fDTDGrammar;
  +    IdentityConstraintHandler*              fICHandler;
  +    ValueVectorOf<XMLCh*>*                  fLocationPairs;
  +    NameIdPool<DTDElementDecl>*             fDTDElemNonDeclPool;
  +    RefHash3KeysIdPool<SchemaElementDecl>*  fSchemaElemNonDeclPool;
       unsigned int                            fElemCount;
       RefHashTableOf<unsigned int>*           fAttDefRegistry;
       RefHashTableOf<unsigned int>*           fUndeclaredAttrRegistry;
  @@ -409,6 +397,10 @@
       return XMLUni::fgIGXMLScanner;
   }
   
  +inline bool IGXMLScanner::toCheckIdentityConstraint()  const
  +{
  +    return fValidate && fIdentityConstraintChecking && fICHandler;
  +}
   
   XERCES_CPP_NAMESPACE_END
   
  
  
  
  1.60      +10 -9     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.59
  retrieving revision 1.60
  diff -u -r1.59 -r1.60
  --- IGXMLScanner2.cpp	29 Jan 2004 11:46:30 -0000	1.59
  +++ IGXMLScanner2.cpp	13 Apr 2004 16:56:58 -0000	1.60
  @@ -90,9 +90,8 @@
   #include <xercesc/validators/schema/SchemaValidator.hpp>
   #include <xercesc/validators/schema/TraverseSchema.hpp>
   #include <xercesc/validators/schema/SubstitutionGroupComparator.hpp>
  -#include <xercesc/validators/schema/identity/XPathMatcherStack.hpp>
   #include <xercesc/validators/schema/XSDDOMParser.hpp>
  -#include <xercesc/validators/schema/identity/ValueStoreCache.hpp>
  +#include <xercesc/validators/schema/identity/IdentityConstraintHandler.hpp>
   #include <xercesc/util/XMLResourceIdentifier.hpp>
   
   XERCES_CPP_NAMESPACE_BEGIN
  @@ -1252,8 +1251,8 @@
       fRootElemName = 0;
   
       // Reset IdentityConstraints
  -    fValueStoreCache->startDocument();
  -    fMatcherStack->clear();
  +    if (fICHandler)
  +        fICHandler->reset();
   
       //  Reset the element stack, and give it the latest ids for the special
       //  URIs it has to know about.
  @@ -1434,7 +1433,7 @@
                       schemaValidator->setDatatypeBuffer(rawBuf);
   
                       // call all active identity constraints
  -                    if (fMatcherStack->getMatcherCount())
  +                    if (toCheckIdentityConstraint() && fICHandler->getMatcherCount())
                           fContent.append(rawBuf, len);
   
                       if (fDocHandler)
  @@ -1476,7 +1475,7 @@
                       schemaValidator->setDatatypeBuffer(rawBuf);
   
                       // call all active identity constraints
  -                    if (fMatcherStack->getMatcherCount())
  +                    if (toCheckIdentityConstraint() && fICHandler->getMatcherCount())
                           fContent.append(rawBuf, len);
   
                       if (fDocHandler)
  @@ -1503,7 +1502,7 @@
           // call all active identity constraints
           if (fGrammarType == Grammar::SchemaGrammarType) {
   
  -            if (fMatcherStack->getMatcherCount())
  +            if (toCheckIdentityConstraint() && fICHandler->getMatcherCount())
                   fContent.append(toSend.getRawBuffer(), toSend.getLen());
           }
   
  @@ -2520,8 +2519,10 @@
                       }
                   }
   
  -                if (fMatcherStack->getMatcherCount())
  +                // call all active identity constraints
  +                if (toCheckIdentityConstraint() && fICHandler->getMatcherCount())
                       fContent.append(bbCData.getRawBuffer(), bbCData.getLen());
  +
               }
               else {
                   if (fValidate) {
  
  
  
  1.77      +46 -155   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.76
  retrieving revision 1.77
  diff -u -r1.76 -r1.77
  --- SGXMLScanner.cpp	11 Feb 2004 12:43:44 -0000	1.76
  +++ SGXMLScanner.cpp	13 Apr 2004 16:56:58 -0000	1.77
  @@ -81,11 +81,8 @@
   #include <xercesc/validators/schema/TraverseSchema.hpp>
   #include <xercesc/validators/schema/XSDDOMParser.hpp>
   #include <xercesc/validators/schema/SubstitutionGroupComparator.hpp>
  -#include <xercesc/validators/schema/identity/FieldActivator.hpp>
  -#include <xercesc/validators/schema/identity/XPathMatcherStack.hpp>
  -#include <xercesc/validators/schema/identity/ValueStoreCache.hpp>
  +#include <xercesc/validators/schema/identity/IdentityConstraintHandler.hpp>
   #include <xercesc/validators/schema/identity/IC_Selector.hpp>
  -#include <xercesc/validators/schema/identity/ValueStore.hpp>
   #include <xercesc/util/OutOfMemoryException.hpp>
   #include <xercesc/util/XMLResourceIdentifier.hpp>
   #include <xercesc/util/HashPtr.hpp>
  @@ -111,9 +108,7 @@
       , fRawAttrList(0)
       , fSchemaGrammar(0)
       , fSchemaValidator(0)
  -    , fMatcherStack(0)
  -    , fValueStoreCache(0)
  -    , fFieldActivator(0)
  +    , fICHandler(0)
       , fElemNonDeclPool(0)
       , fElemCount(0)
       , fAttDefRegistry(0)
  @@ -166,9 +161,7 @@
       , fRawAttrList(0)
       , fSchemaGrammar(0)
       , fSchemaValidator(0)
  -    , fMatcherStack(0)
  -    , fValueStoreCache(0)
  -    , fFieldActivator(0)
  +    , fICHandler(0)
       , fElemNonDeclPool(0)
       , fElemCount(0)
       , fAttDefRegistry(0)
  @@ -455,8 +448,8 @@
                   // That went ok, so scan for any miscellaneous stuff
                   scanMiscellaneous();
   
  -                if (fValidate)
  -                    fValueStoreCache->endDocument();
  +                if (toCheckIdentityConstraint())
  +                    fICHandler->endDocument();
   
                   if (fDocHandler)
                       fDocHandler->endDocument();
  @@ -1056,52 +1049,17 @@
               if(fPSVIElemContext.fIsSpecified)
                   fPSVIElemContext.fNormalizedValue = ((SchemaElementDecl *)topElem->fThisElement)->getDefaultValue();
           }
  -        // call matchers and de-activate context
  -        int oldCount = fMatcherStack->getMatcherCount();
  -
  -        if (oldCount ||
  -            ((SchemaElementDecl*)topElem->fThisElement)->getIdentityConstraintCount()) {
  -
  -            for (int i = oldCount - 1; i >= 0; i--) {
  -
  -                XPathMatcher* matcher = fMatcherStack->getMatcherAt(i);
  -                matcher->endElement(*(topElem->fThisElement), fContent.getRawBuffer());
  -            }
  -
  -            if (fMatcherStack->size() > 0) {
  -                fMatcherStack->popContext();
  -            }
  -
  -            // handle everything *but* keyref's.
  -            int newCount = fMatcherStack->getMatcherCount();
  -
  -            for (int j = oldCount - 1; j >= newCount; j--) {
  -
  -                XPathMatcher* matcher = fMatcherStack->getMatcherAt(j);
  -                IdentityConstraint* ic = matcher->getIdentityConstraint();
  -
  -                if (ic  && (ic->getType() != IdentityConstraint::KEYREF))
  -                    fValueStoreCache->transplant(ic, matcher->getInitialDepth());
  -            }
  -
  -            // now handle keyref's...
  -            for (int k = oldCount - 1; k >= newCount; k--) {
  -
  -                XPathMatcher* matcher = fMatcherStack->getMatcherAt(k);
  -                IdentityConstraint* ic = matcher->getIdentityConstraint();
  -
  -                if (ic && (ic->getType() == IdentityConstraint::KEYREF)) {
  -
  -                    ValueStore* values = fValueStoreCache->getValueStoreFor(ic, matcher->getInitialDepth());
  -
  -                    if (values) { // nothing to do if nothing matched!
  -                        values->endDcocumentFragment(fValueStoreCache);
  -                    }
  -                }
  -            }
   
  -            fValueStoreCache->endElement();
  +        // call matchers and de-activate context
  +        if (toCheckIdentityConstraint())
  +        {
  +            fICHandler->deactivateContext
  +                        (
  +                         (SchemaElementDecl *) topElem->fThisElement
  +                       , fContent.getRawBuffer()
  +                        );
           }
  +
       }
       if(!isRoot)
           ((SchemaElementDecl *)fElemStack.topElement()->fThisElement)->updateValidityFromElement(topElem->fThisElement, fGrammarType);
  @@ -1752,29 +1710,18 @@
       attCount = buildAttList(*fRawAttrList, attCount, elemDecl, *fAttrList);
   
       // activate identity constraints
  -    if (fValidate) {
  -
  -        unsigned int count = ((SchemaElementDecl*) elemDecl)->getIdentityConstraintCount();
  -
  -        if (count || fMatcherStack->getMatcherCount()) {
  -
  -            fValueStoreCache->startElement();
  -            fMatcherStack->pushContext();
  -            fValueStoreCache->initValueStoresFor((SchemaElementDecl*) elemDecl, (int) elemDepth);
  -
  -            for (unsigned int i = 0; i < count; i++) {
  -                activateSelectorFor(((SchemaElementDecl*) elemDecl)->getIdentityConstraintAt(i), (int) elemDepth);
  -            }
  -
  -            // call all active identity constraints
  -            count = fMatcherStack->getMatcherCount();
  -
  -            for (unsigned int j = 0; j < count; j++) {
  +    if (toCheckIdentityConstraint()) 
  +    {
  +        fICHandler->activateIdentityConstraint
  +                        (
  +                          (SchemaElementDecl*) elemDecl
  +                        , (int) elemDepth
  +                        , uriId
  +                        , fPrefixBuf.getRawBuffer()
  +                        , *fAttrList
  +                        , attCount
  +                        );
   
  -                XPathMatcher* matcher = fMatcherStack->getMatcherAt(j);
  -                matcher->startElement(*elemDecl, uriId, fPrefixBuf.getRawBuffer(), *fAttrList, attCount);
  -            }
  -        }
       }
   
       // Since the element may have default values, call start tag now regardless if it is empty or not
  @@ -1874,49 +1821,15 @@
               }
   
               // call matchers and de-activate context
  -            int oldCount = fMatcherStack->getMatcherCount();
  -            if (oldCount || ((SchemaElementDecl*) elemDecl)->getIdentityConstraintCount()) {
  -
  -                for (int i = oldCount - 1; i >= 0; i--) {
  -
  -                    XPathMatcher* matcher = fMatcherStack->getMatcherAt(i);
  -                    matcher->endElement(*elemDecl, fContent.getRawBuffer());
  -                }
  -
  -                if (fMatcherStack->size() > 0) {
  -                    fMatcherStack->popContext();
  -                }
  -
  -                // handle everything *but* keyref's.
  -                int newCount = fMatcherStack->getMatcherCount();
  -
  -                for (int j = oldCount - 1; j >= newCount; j--) {
  -
  -                    XPathMatcher* matcher = fMatcherStack->getMatcherAt(j);
  -                    IdentityConstraint* ic = matcher->getIdentityConstraint();
  -
  -                    if (ic  && (ic->getType() != IdentityConstraint::KEYREF))
  -                        fValueStoreCache->transplant(ic, matcher->getInitialDepth());
  -                }
  -
  -                // now handle keyref's...
  -                for (int k = oldCount - 1; k >= newCount; k--) {
  -
  -                    XPathMatcher* matcher = fMatcherStack->getMatcherAt(k);
  -                    IdentityConstraint* ic = matcher->getIdentityConstraint();
  -
  -                    if (ic && (ic->getType() == IdentityConstraint::KEYREF)) {
  -
  -                        ValueStore* values = fValueStoreCache->getValueStoreFor(ic, matcher->getInitialDepth());
  -
  -                        if (values) { // nothing to do if nothing matched!
  -                            values->endDcocumentFragment(fValueStoreCache);
  -                        }
  -                    }
  -                }
  -
  -                fValueStoreCache->endElement();
  +            if (toCheckIdentityConstraint())
  +            {
  +                fICHandler->deactivateContext
  +                       (
  +                        (SchemaElementDecl *) elemDecl
  +                      , fContent.getRawBuffer()
  +                       );                
               }
  +
           }
   
           if(!isRoot)
  @@ -2061,27 +1974,6 @@
   }
   
   // ---------------------------------------------------------------------------
  -//  SGXMLScanner: IC activation methos
  -// ---------------------------------------------------------------------------
  -void SGXMLScanner::activateSelectorFor(IdentityConstraint* const ic, const int initialDepth) {
  -
  -    IC_Selector* selector = ic->getSelector();
  -
  -    if (!selector)
  -        return;
  -
  -    XPathMatcher* matcher = selector->createMatcher
  -    (
  -        fFieldActivator
  -        , initialDepth
  -        , fMemoryManager
  -    );
  -
  -    fMatcherStack->addMatcher(matcher);
  -    matcher->startDocumentFragment();
  -}
  -
  -// ---------------------------------------------------------------------------
   //  SGXMLScanner: Grammar preparsing
   // ---------------------------------------------------------------------------
   Grammar* SGXMLScanner::loadGrammar(const   InputSource& src
  @@ -2214,10 +2106,11 @@
       initValidator(fSchemaValidator);
   
       // Create IdentityConstraint info
  -    fMatcherStack = new (fMemoryManager) XPathMatcherStack(fMemoryManager);
  -    fValueStoreCache = new (fMemoryManager) ValueStoreCache(fMemoryManager);
  -    fFieldActivator = new (fMemoryManager) FieldActivator(fValueStoreCache, fMatcherStack, fMemoryManager);
  -    fValueStoreCache->setScanner(this);
  +    /***
  +       todo: to auto sense if grammar has ic or not, probably do it
  +             at reset() or parse()
  +    ***/
  +    fICHandler = new (fMemoryManager) IdentityConstraintHandler(this, fMemoryManager);
   
       //  Add the default entity entries for the character refs that must always
       //  be present.
  @@ -2246,9 +2139,7 @@
       delete fEntityTable;
       delete fRawAttrList;
       delete fSchemaValidator;
  -    delete fFieldActivator;
  -    delete fMatcherStack;
  -    delete fValueStoreCache;
  +    delete fICHandler;
       delete fElemNonDeclPool;
       delete fAttDefRegistry;
       delete fUndeclaredAttrRegistryNS;
  @@ -3311,8 +3202,8 @@
       resetValidationContext();
   
       // Reset IdentityConstraints
  -    fValueStoreCache->startDocument();
  -    fMatcherStack->clear();
  +    if (fICHandler)
  +        fICHandler->reset();
   
       //  Reset the element stack, and give it the latest ids for the special
       //  URIs it has to know about.
  @@ -3483,7 +3374,7 @@
                   ((SchemaValidator*)fValidator)->setDatatypeBuffer(toFill.getRawBuffer());
   
                   // call all active identity constraints
  -                if (fMatcherStack->getMatcherCount())
  +                if (toCheckIdentityConstraint() && fICHandler->getMatcherCount())
                       fContent.append(toFill.getRawBuffer(), toFill.getLen());
   
                   if (fDocHandler)
  @@ -3521,7 +3412,7 @@
                   ((SchemaValidator*)fValidator)->setDatatypeBuffer(toFill.getRawBuffer());
   
                   // call all active identity constraints
  -                if (fMatcherStack->getMatcherCount())
  +                if (toCheckIdentityConstraint() && fICHandler->getMatcherCount())
                       fContent.append(toFill.getRawBuffer(), toFill.getLen());
   
                   if (fDocHandler)
  @@ -3542,7 +3433,7 @@
       else
       {
           // call all active identity constraints
  -        if (fMatcherStack->getMatcherCount())
  +        if (toCheckIdentityConstraint() && fICHandler->getMatcherCount())
               fContent.append(toSend.getRawBuffer(), toSend.getLen());
   
           // Always assume its just char data if not validating
  @@ -4296,7 +4187,7 @@
               }
   
               // call all active identity constraints
  -            if (fMatcherStack->getMatcherCount())
  +            if (toCheckIdentityConstraint() && fICHandler->getMatcherCount())
                   fContent.append(bbCData.getRawBuffer(), bbCData.getLen());
   
               // If we have a doc handler, call it
  
  
  
  1.18      +21 -28    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.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- SGXMLScanner.hpp	7 Apr 2004 14:14:08 -0000	1.17
  +++ SGXMLScanner.hpp	13 Apr 2004 16:56:58 -0000	1.18
  @@ -56,6 +56,9 @@
   
   /*
    * $Log$
  + * Revision 1.18  2004/04/13 16:56:58  peiyongz
  + * IdentityConstraintHandler
  + *
    * Revision 1.17  2004/04/07 14:14:08  peiyongz
    * make resolveSystemId virutal
    *
  @@ -126,9 +129,7 @@
   
   class SchemaGrammar;
   class SchemaValidator;
  -class ValueStoreCache;
  -class XPathMatcherStack;
  -class FieldActivator;
  +class IdentityConstraintHandler;
   class IdentityConstraint;
   class ContentLeafNameTypeVector;
   class SchemaAttDef;
  @@ -297,7 +298,7 @@
       // -----------------------------------------------------------------------
       //  IdentityConstraints Activation methods
       // -----------------------------------------------------------------------
  -    void activateSelectorFor(IdentityConstraint* const ic, const int initialDepth);
  +    inline bool toCheckIdentityConstraint()  const;
   
       // -----------------------------------------------------------------------
       //  Grammar preparsing methods
  @@ -330,17 +331,6 @@
       //      Stores an element next state from DFA content model - used for
       //      wildcard validation
       //
  -    //  fMatcherStack
  -    //      Stack of active XPath matchers for identity constraints. All
  -    //      active XPath matchers are notified of startElement, characters
  -    //      and endElement callbacks in order to perform their matches.
  -    //
  -    //  fValueStoreCache
  -    //      Cache of value stores for identity constraint fields.
  -    //
  -    //  fFieldActivator
  -    //      Activates fields within a certain scope when a selector matches
  -    //      its xpath.
       // fElemNonDeclPool
       //      registry for elements without decls in the grammar
       // fElemCount
  @@ -357,19 +347,17 @@
       //      filled when a PSVIHandler is registered
       //
       // -----------------------------------------------------------------------
  -    bool                        fSeeXsi;
  -    Grammar::GrammarType        fGrammarType;
  -    unsigned int                fElemStateSize;
  -    unsigned int*               fElemState;
  -    XMLBuffer                   fContent;
  -    ValueHashTableOf<XMLCh>*    fEntityTable;
  -    RefVectorOf<KVStringPair>*  fRawAttrList;
  -    SchemaGrammar*              fSchemaGrammar;
  -    SchemaValidator*            fSchemaValidator;
  -    XPathMatcherStack*          fMatcherStack;
  -    ValueStoreCache*            fValueStoreCache;
  -    FieldActivator*             fFieldActivator;
  -    RefHash3KeysIdPool<SchemaElementDecl>* fElemNonDeclPool;
  +    bool                                    fSeeXsi;
  +    Grammar::GrammarType                    fGrammarType;
  +    unsigned int                            fElemStateSize;
  +    unsigned int*                           fElemState;
  +    XMLBuffer                               fContent;
  +    ValueHashTableOf<XMLCh>*                fEntityTable;
  +    RefVectorOf<KVStringPair>*              fRawAttrList;
  +    SchemaGrammar*                          fSchemaGrammar;
  +    SchemaValidator*                        fSchemaValidator;
  +    IdentityConstraintHandler*              fICHandler;
  +    RefHash3KeysIdPool<SchemaElementDecl>*  fElemNonDeclPool;
       unsigned int                            fElemCount;
       RefHashTableOf<unsigned int>*           fAttDefRegistry;
       RefHash2KeysTableOf<unsigned int>*      fUndeclaredAttrRegistryNS;
  @@ -383,6 +371,11 @@
   inline const XMLCh* SGXMLScanner::getName() const
   {
       return XMLUni::fgSGXMLScanner;
  +}
  +
  +inline bool SGXMLScanner::toCheckIdentityConstraint()  const
  +{
  +    return fValidate && fIdentityConstraintChecking && fICHandler;
   }
   
   XERCES_CPP_NAMESPACE_END
  
  
  
  1.64      +4 -1      xml-xerces/c/src/xercesc/internal/XMLScanner.cpp
  
  Index: XMLScanner.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XMLScanner.cpp,v
  retrieving revision 1.63
  retrieving revision 1.64
  diff -u -r1.63 -r1.64
  --- XMLScanner.cpp	7 Apr 2004 14:15:12 -0000	1.63
  +++ XMLScanner.cpp	13 Apr 2004 16:56:58 -0000	1.64
  @@ -175,6 +175,7 @@
       , fValidatorFromUser(false)
       , fDoSchema(false)
       , fSchemaFullChecking(false)
  +    , fIdentityConstraintChecking(true)
       , fToCacheGrammar(false)
       , fUseCachedGrammar(false)
       , fLoadExternalDTD(true)
  @@ -252,6 +253,7 @@
       , fValidatorFromUser(false)
       , fDoSchema(false)
       , fSchemaFullChecking(false)
  +    , fIdentityConstraintChecking(true)
       , fToCacheGrammar(false)
       , fUseCachedGrammar(false)
   	, fLoadExternalDTD(true)
  @@ -698,6 +700,7 @@
       setStandardUriConformant(refScanner->getStandardUriConformant());
       setExitOnFirstFatal(refScanner->getExitOnFirstFatal());
       setValidationConstraintFatal(refScanner->getValidationConstraintFatal());
  +    setIdentityConstraintChecking(refScanner->getIdentityConstraintChecking());
       setValidationSchemaFullChecking(refScanner->getValidationSchemaFullChecking());
       cacheGrammarFromParse(refScanner->isCachingGrammarFromParse());
       useCachedGrammarInParse(refScanner->isUsingCachedGrammarInParse());
  
  
  
  1.34      +25 -0     xml-xerces/c/src/xercesc/internal/XMLScanner.hpp
  
  Index: XMLScanner.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XMLScanner.hpp,v
  retrieving revision 1.33
  retrieving revision 1.34
  diff -u -r1.33 -r1.34
  --- XMLScanner.hpp	7 Apr 2004 14:15:12 -0000	1.33
  +++ XMLScanner.hpp	13 Apr 2004 16:56:58 -0000	1.34
  @@ -56,6 +56,9 @@
   
   /*
    * $Log$
  + * Revision 1.34  2004/04/13 16:56:58  peiyongz
  + * IdentityConstraintHandler
  + *
    * Revision 1.33  2004/04/07 14:15:12  peiyongz
    * allow internalDTD (conditionally) with grammar reusing
    *
  @@ -490,6 +493,7 @@
       ValSchemes getValidationScheme() const;
       bool getDoSchema() const;
       bool getValidationSchemaFullChecking() const;
  +    bool getIdentityConstraintChecking() const;
       const XMLEntityHandler* getEntityHandler() const;
       XMLEntityHandler* getEntityHandler();
       const XMLErrorReporter* getErrorReporter() const;
  @@ -617,6 +621,7 @@
       void setValidator(XMLValidator* const valToAdopt);
       void setDoSchema(const bool doSchema);
       void setValidationSchemaFullChecking(const bool schemaFullChecking);
  +    void setIdentityConstraintChecking(const bool identityConstraintChecking);
       void setHasNoDTD(const bool hasNoDTD);
       void cacheGrammarFromParse(const bool newValue);
       void useCachedGrammarInParse(const bool newValue);
  @@ -797,6 +802,10 @@
       //      This indicates whether we treat validation constraint errors as
       //      fatal errors or not. It defaults to false, but it can be changed.
       //
  +    //  fValidateConstraint
  +    //      This indicates whether we perform identity constraint validation.
  +    //      It defaults to false, but it can be changed.
  +    //
       //  fIDRefList
       //      This is a list of XMLRefInfo objects. This member lets us do all
       //      needed ID-IDREF balancing checks.
  @@ -854,6 +863,11 @@
       //      This flag indicates whether the client code wants full Schema
       //      constraint checking.
       //
  +    //  fIdentityConstraintChecking
  +    //      This flag indicates whether the client code wants Identity
  +    //      Constraint checking, defaulted to true to maintain backward
  +    //      compatibility (to minimize supprise)
  +    //
       //  fAttName
       //  fAttValue
       //  fCDataBuf
  @@ -973,6 +987,7 @@
       bool                        fValidatorFromUser;
       bool                        fDoSchema;
       bool                        fSchemaFullChecking;
  +    bool                        fIdentityConstraintChecking;
       bool                        fToCacheGrammar;
       bool                        fUseCachedGrammar;
       bool                        fLoadExternalDTD;
  @@ -1197,6 +1212,11 @@
       return fSchemaFullChecking;
   }
   
  +inline bool XMLScanner::getIdentityConstraintChecking() const
  +{
  +    return fIdentityConstraintChecking;
  +}
  +
   inline int XMLScanner::getErrorCount()
   {
       return fErrorCount;
  @@ -1387,6 +1407,11 @@
   inline void XMLScanner::setValidationSchemaFullChecking(const bool schemaFullChecking)
   {
       fSchemaFullChecking = schemaFullChecking;
  +}
  +
  +inline void XMLScanner::setIdentityConstraintChecking(const bool identityConstraintChecking)
  +{
  +    fIdentityConstraintChecking = identityConstraintChecking;
   }
   
   inline void XMLScanner::setHasNoDTD(const bool hasNoDTD)
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org