knoaman     2002/08/26 22:56:19

  Modified:    c/src/xercesc/validators/schema/identity FieldActivator.cpp
                        FieldActivator.hpp IC_Selector.cpp IC_Selector.hpp
                        ValueStoreCache.cpp ValueStoreCache.hpp
                        XPathMatcher.cpp XPathMatcher.hpp
  Log:
  Identity Constraint: handle case of recursive elements.
  
  Revision  Changes    Path
  1.2       +10 -6     
xml-xerces/c/src/xercesc/validators/schema/identity/FieldActivator.cpp
  
  Index: FieldActivator.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/c/src/xercesc/validators/schema/identity/FieldActivator.cpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- FieldActivator.cpp        1 Feb 2002 22:22:50 -0000       1.1
  +++ FieldActivator.cpp        27 Aug 2002 05:56:19 -0000      1.2
  @@ -56,8 +56,11 @@
   
   /*
    * $Log$
  - * Revision 1.1  2002/02/01 22:22:50  peiyongz
  - * Initial revision
  + * Revision 1.2  2002/08/27 05:56:19  knoaman
  + * Identity Constraint: handle case of recursive elements.
  + *
  + * Revision 1.1.1.1  2002/02/01 22:22:50  peiyongz
  + * sane_include
    *
    * Revision 1.1  2001/11/02 14:08:40  knoaman
    * Add support for identity constraints.
  @@ -110,9 +113,9 @@
   // ---------------------------------------------------------------------------
   //  FieldActivator: Operator methods
   // ---------------------------------------------------------------------------
  -XPathMatcher* FieldActivator::activateField(IC_Field* const field) {
  +XPathMatcher* FieldActivator::activateField(IC_Field* const field, const int 
initialDepth) {
   
  -    ValueStore* valueStore = fValueStoreCache->getValueStoreFor(field);
  +    ValueStore* valueStore = fValueStoreCache->getValueStoreFor(field, 
initialDepth);
       XPathMatcher* matcher = field->createMatcher(valueStore);
   
       field->setMayMatch(true);
  @@ -122,22 +125,23 @@
       return matcher;
   }
   
  -void FieldActivator::startValueScopeFor(const IdentityConstraint* const ic) {
  +void FieldActivator::startValueScopeFor(const IdentityConstraint* const ic,
  +                                        const int initialDepth) {
   
       unsigned int fieldCount = ic->getFieldCount();
   
       for(unsigned int i=0; i<fieldCount; i++) {
   
           const IC_Field* field = ic->getFieldAt(i);
  -        ValueStore* valueStore = fValueStoreCache->getValueStoreFor(field);
  +        ValueStore* valueStore = fValueStoreCache->getValueStoreFor(field, 
initialDepth);
   
           valueStore->startValueScope();
       }
   }
   
  -void FieldActivator::endValueScopeFor(const IdentityConstraint* const ic) {
  +void FieldActivator::endValueScopeFor(const IdentityConstraint* const ic, const int 
initialDepth) {
   
  -    ValueStore* valueStore = fValueStoreCache->getValueStoreFor(ic);
  +    ValueStore* valueStore = fValueStoreCache->getValueStoreFor(ic, initialDepth);
   
       valueStore->endValueScope();
   }
  
  
  
  1.2       +4 -4      
xml-xerces/c/src/xercesc/validators/schema/identity/FieldActivator.hpp
  
  Index: FieldActivator.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/c/src/xercesc/validators/schema/identity/FieldActivator.hpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- FieldActivator.hpp        1 Feb 2002 22:22:50 -0000       1.1
  +++ FieldActivator.hpp        27 Aug 2002 05:56:19 -0000      1.2
  @@ -111,18 +111,18 @@
         * method is called when the selector matches in order to initialize 
         * the value store.
         */
  -    void startValueScopeFor(const IdentityConstraint* const ic);
  +    void startValueScopeFor(const IdentityConstraint* const ic, const int 
initialDepth);
   
       /** 
         * Request to activate the specified field. This method returns the
         * matcher for the field.
         */
  -    XPathMatcher* activateField(IC_Field* const field);
  +    XPathMatcher* activateField(IC_Field* const field, const int initialDepth);
   
       /**
         * Ends the value scope for the specified identity constraint.
         */
  -    void endValueScopeFor(const IdentityConstraint* const ic);
  +    void endValueScopeFor(const IdentityConstraint* const ic, const int 
initialDepth);
   
   private:
       // -----------------------------------------------------------------------
  
  
  
  1.2       +11 -6     
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.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- IC_Selector.cpp   1 Feb 2002 22:22:50 -0000       1.1
  +++ IC_Selector.cpp   27 Aug 2002 05:56:19 -0000      1.2
  @@ -56,8 +56,11 @@
   
   /*
    * $Log$
  - * Revision 1.1  2002/02/01 22:22:50  peiyongz
  - * Initial revision
  + * Revision 1.2  2002/08/27 05:56:19  knoaman
  + * Identity Constraint: handle case of recursive elements.
  + *
  + * Revision 1.1.1.1  2002/02/01 22:22:50  peiyongz
  + * sane_include
    *
    * Revision 1.3  2001/11/23 18:35:33  tng
    * Eliminate Warning from AIX xlC 3.6:1540-399: (W) "XMLAttr" is undefined.  The 
delete operator will not call a destructor.
  @@ -84,8 +87,10 @@
   // ---------------------------------------------------------------------------
   SelectorMatcher::SelectorMatcher(XercesXPath* const xpath,
                                    IC_Selector* const selector,
  -                                 FieldActivator* const fieldActivator)
  +                                 FieldActivator* const fieldActivator,
  +                                 const int initialDepth)
       : XPathMatcher(xpath, false, selector->getIdentityConstraint())
  +    , fInitialDepth(initialDepth)
       , fElementDepth(0)
       , fMatchedDepth(-1)
       , fSelector(selector)
  @@ -119,12 +124,12 @@
           int count = ic->getFieldCount();
   
           fMatchedDepth = fElementDepth;
  -        fFieldActivator->startValueScopeFor(ic);
  +        fFieldActivator->startValueScopeFor(ic, fInitialDepth);
   
           for (int i = 0; i < count; i++) {
   
               IC_Field* field = ic->getFieldAt(i);
  -            XPathMatcher* matcher = fFieldActivator->activateField(field);
  +            XPathMatcher* matcher = fFieldActivator->activateField(field, 
fInitialDepth);
   
               matcher->startElement(elemDecl, urlId, elemPrefix, attrList, attrCount);
           }
  @@ -138,7 +143,7 @@
       if (fElementDepth-- == fMatchedDepth) {
   
           fMatchedDepth = -1;
  -        fFieldActivator->endValueScopeFor(fSelector->getIdentityConstraint());
  +        fFieldActivator->endValueScopeFor(fSelector->getIdentityConstraint(), 
fInitialDepth);
       }
   }
   
  @@ -174,9 +179,9 @@
   // ---------------------------------------------------------------------------
   //  IC_Selector: Factory methods
   // ---------------------------------------------------------------------------
  -XPathMatcher* IC_Selector::createMatcher(FieldActivator* const fieldActivator) {
  +XPathMatcher* IC_Selector::createMatcher(FieldActivator* const fieldActivator, 
const int initialDepth) {
   
  -    return new SelectorMatcher(fXPath, this, fieldActivator);
  +    return new SelectorMatcher(fXPath, this, fieldActivator, initialDepth);
   }
   
   /**
  
  
  
  1.2       +6 -3      
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.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- IC_Selector.hpp   1 Feb 2002 22:22:50 -0000       1.1
  +++ IC_Selector.hpp   27 Aug 2002 05:56:19 -0000      1.2
  @@ -98,7 +98,7 @@
        // -----------------------------------------------------------------------
       //  Factory methods
       // -----------------------------------------------------------------------
  -    XPathMatcher* createMatcher(FieldActivator* const fieldActivator);
  +    XPathMatcher* createMatcher(FieldActivator* const fieldActivator, const int 
initialDepth);
   
   private:
       // -----------------------------------------------------------------------
  @@ -123,6 +123,8 @@
       // -----------------------------------------------------------------------
       ~SelectorMatcher() {}
   
  +    int getInitialDepth() const { return fInitialDepth; }
  +
       // -----------------------------------------------------------------------
       //  XMLDocumentHandler methods
       // -----------------------------------------------------------------------
  @@ -139,7 +141,7 @@
       //  Constructors/Destructor
       // -----------------------------------------------------------------------
       SelectorMatcher(XercesXPath* const anXPath, IC_Selector* const selector,
  -                    FieldActivator* const fieldActivator);
  +                    FieldActivator* const fieldActivator, const int initialDepth);
   
       // -----------------------------------------------------------------------
       //  Unimplemented contstructors and operators
  @@ -155,6 +157,7 @@
       // -----------------------------------------------------------------------
       //  Data members
       // -----------------------------------------------------------------------
  +    int             fInitialDepth;
       int             fElementDepth;
       int             fMatchedDepth;
       IC_Selector*    fSelector;
  
  
  
  1.3       +14 -19    
xml-xerces/c/src/xercesc/validators/schema/identity/ValueStoreCache.cpp
  
  Index: ValueStoreCache.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/c/src/xercesc/validators/schema/identity/ValueStoreCache.cpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ValueStoreCache.cpp       26 Aug 2002 23:48:09 -0000      1.2
  +++ ValueStoreCache.cpp       27 Aug 2002 05:56:19 -0000      1.3
  @@ -56,6 +56,9 @@
   
   /*
    * $Log$
  + * Revision 1.3  2002/08/27 05:56:19  knoaman
  + * Identity Constraint: handle case of recursive elements.
  + *
    * Revision 1.2  2002/08/26 23:48:09  knoaman
    * Fix for ValueStore's null pointer.
    *
  @@ -157,11 +160,12 @@
   
       fValueStores = new RefVectorOf<ValueStore>(8);
       fGlobalICMap = new RefHashTableOf<ValueStore>(13, false, new HashPtr());
  -    fIC2ValueStoreMap = new RefHashTableOf<ValueStore>(13, false, new HashPtr());
  +    fIC2ValueStoreMap = new RefHash2KeysTableOf<ValueStore>(13, false, new 
HashPtr());
       fGlobalMapStack = new RefStackOf<RefHashTableOf<ValueStore> >(8);
   }
   
  -void ValueStoreCache::initValueStoresFor(SchemaElementDecl* const elemDecl) {
  +void ValueStoreCache::initValueStoresFor(SchemaElementDecl* const elemDecl,
  +                                         const int initialDepth) {
   
       // initialize value stores for unique fields
       unsigned int icCount = elemDecl->getIdentityConstraintCount();
  @@ -169,38 +173,29 @@
       for (unsigned int i=0; i<icCount; i++) {
   
           IdentityConstraint* ic = elemDecl->getIdentityConstraintAt(i);
  -        ValueStore* valueStore = fIC2ValueStoreMap->get(ic);
  -
  -        if (valueStore && ic->getType() != IdentityConstraint::KEYREF) {
  -            continue;
  -        }
  -
  -        valueStore = new ValueStore(ic, fScanner);
  +        ValueStore* valueStore = valueStore = new ValueStore(ic, fScanner);
           fValueStores->addElement(valueStore);
  -        fIC2ValueStoreMap->put(ic, valueStore);
  +        fIC2ValueStoreMap->put(ic, initialDepth, valueStore);
       }
   }
   
  -void ValueStoreCache::transplant(IdentityConstraint* const ic) {
  +void ValueStoreCache::transplant(IdentityConstraint* const ic, const initialDepth) {
   
       if (ic->getType() == IdentityConstraint::KEYREF) {
           return;
       }
   
  -    ValueStore* newVals = fIC2ValueStoreMap->get(ic);
  +    ValueStore* newVals = fIC2ValueStoreMap->get(ic, initialDepth);
       ValueStore* currVals = fGlobalICMap->get(ic);
   
  -    fIC2ValueStoreMap->removeKey(ic);
  -
       if (currVals) {
           currVals->append(newVals);
       } else {
  -        fGlobalICMap->put(ic, newVals);
  +        ValueStore* valueStore = new ValueStore(ic, fScanner);
  +        fValueStores->addElement(valueStore);
  +        valueStore->append(newVals);
  +        fGlobalICMap->put(ic, valueStore);
       }
  -
  -    ValueStore* valueStore = new ValueStore(ic, fScanner);
  -    fValueStores->addElement(valueStore);
  -    fIC2ValueStoreMap->put(ic, valueStore);
   }
   
   /**
  
  
  
  1.2       +11 -10    
xml-xerces/c/src/xercesc/validators/schema/identity/ValueStoreCache.hpp
  
  Index: ValueStoreCache.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/c/src/xercesc/validators/schema/identity/ValueStoreCache.hpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ValueStoreCache.hpp       1 Feb 2002 22:22:51 -0000       1.1
  +++ ValueStoreCache.hpp       27 Aug 2002 05:56:19 -0000      1.2
  @@ -84,6 +84,7 @@
   // ---------------------------------------------------------------------------
   #include <xercesc/util/RefVectorOf.hpp>
   #include <xercesc/util/RefHashTableOf.hpp>
  +#include <xercesc/util/RefHash2KeysTableOf.hpp>
   #include <xercesc/util/RefStackOf.hpp>
   #include <xercesc/validators/schema/identity/IdentityConstraint.hpp>
   #include <xercesc/validators/schema/identity/IC_Field.hpp>
  @@ -121,14 +122,14 @@
        // -----------------------------------------------------------------------
       //  Initialization methods
       // -----------------------------------------------------------------------
  -    void initValueStoresFor(SchemaElementDecl* const elemDecl);
  +    void initValueStoresFor(SchemaElementDecl* const elemDecl, const int 
initialDepth);
   
   
        // -----------------------------------------------------------------------
       //  Access methods
       // -----------------------------------------------------------------------
  -    ValueStore* getValueStoreFor(const IC_Field* const field);
  -    ValueStore* getValueStoreFor(const IdentityConstraint* const ic);
  +    ValueStore* getValueStoreFor(const IC_Field* const field, const initialDepth);
  +    ValueStore* getValueStoreFor(const IdentityConstraint* const ic, const int 
intialDepth);
       ValueStore* getGlobalValueStoreFor(const IdentityConstraint* const ic);
   
        // -----------------------------------------------------------------------
  @@ -138,7 +139,7 @@
         * with ic and moves them into the global hashtable, if ic is a <unique>
         * or a <key>. If it's a <keyRef>, then we leave it for later.
         */
  -    void transplant(IdentityConstraint* const ic);
  +    void transplant(IdentityConstraint* const ic, const int initialDepth);
   
   private:
       // -----------------------------------------------------------------------
  @@ -158,7 +159,7 @@
       // -----------------------------------------------------------------------
       RefVectorOf<ValueStore>*                 fValueStores;
       RefHashTableOf<ValueStore>*              fGlobalICMap;
  -    RefHashTableOf<ValueStore>*              fIC2ValueStoreMap;
  +    RefHash2KeysTableOf<ValueStore>*         fIC2ValueStoreMap;
       RefStackOf<RefHashTableOf<ValueStore> >* fGlobalMapStack;
       XMLScanner*                              fScanner;
   };
  @@ -175,15 +176,15 @@
   //  ValueStoreCache: Access methods
   // ---------------------------------------------------------------------------
   inline ValueStore*
  -ValueStoreCache::getValueStoreFor(const IC_Field* const field) {
  +ValueStoreCache::getValueStoreFor(const IC_Field* const field, const int 
initialDepth) {
   
  -    return fIC2ValueStoreMap->get(field->getIdentityConstraint());
  +    return fIC2ValueStoreMap->get(field->getIdentityConstraint(), initialDepth);
   }
   
   inline ValueStore*
  -ValueStoreCache::getValueStoreFor(const IdentityConstraint* const ic) {
  +ValueStoreCache::getValueStoreFor(const IdentityConstraint* const ic, const int 
initialDepth) {
   
  -    return fIC2ValueStoreMap->get(ic);
  +    return fIC2ValueStoreMap->get(ic, initialDepth);
   }
   
   inline ValueStore*
  
  
  
  1.3       +13 -0     
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.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- XPathMatcher.cpp  18 Feb 2002 06:26:50 -0000      1.2
  +++ XPathMatcher.cpp  27 Aug 2002 05:56:19 -0000      1.3
  @@ -56,6 +56,9 @@
   
   /*
    * $Log$
  + * Revision 1.3  2002/08/27 05:56:19  knoaman
  + * Identity Constraint: handle case of recursive elements.
  + *
    * Revision 1.2  2002/02/18 06:26:50  jberry
    * Quiet codewarrior compiler warnings
    *
  @@ -78,6 +81,7 @@
   #include <xercesc/validators/schema/SchemaElementDecl.hpp>
   #include <xercesc/validators/schema/SchemaAttDef.hpp>
   #include <xercesc/validators/schema/SchemaSymbols.hpp>
  +#include <xercesc/util/RuntimeException.hpp>
   
   // ---------------------------------------------------------------------------
   //  XPathMatcher: Constructors and Destructor
  @@ -406,6 +410,15 @@
       return;
   }
   
  +
  +// ---------------------------------------------------------------------------
  +//  XPathMatcher: Match methods
  +// ---------------------------------------------------------------------------
  +int XPathMatcher::getInitialDepth() const
  +{
  +    ThrowXML(RuntimeException, XMLExcepts::Regex_NotSupported);
  +    return 0; // to make some compilers happy
  +}
   
   /**
     * End of file XPathMatcher.cpp
  
  
  
  1.2       +2 -1      
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.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XPathMatcher.hpp  1 Feb 2002 22:22:51 -0000       1.1
  +++ XPathMatcher.hpp  27 Aug 2002 05:56:19 -0000      1.2
  @@ -103,6 +103,7 @@
         * Returns true if XPath has been matched.
         */
       bool isMatched();
  +    virtual int getInitialDepth() const;
   
       // -----------------------------------------------------------------------
       //  XMLDocumentHandler methods
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to