peiyongz    2003/07/31 10:08:39

  Modified:    c/src/xercesc/validators/common GrammarResolver.cpp
                        GrammarResolver.hpp
  Log:
  Grammar embed grammar description
  fGrammarFromPool introduced
  
  Revision  Changes    Path
  1.15      +78 -60    xml-xerces/c/src/xercesc/validators/common/GrammarResolver.cpp
  
  Index: GrammarResolver.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/common/GrammarResolver.cpp,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- GrammarResolver.cpp       25 Jun 2003 22:38:40 -0000      1.14
  +++ GrammarResolver.cpp       31 Jul 2003 17:08:39 -0000      1.15
  @@ -57,6 +57,10 @@
   
   /*
    * $Log$
  + * Revision 1.15  2003/07/31 17:08:39  peiyongz
  + * Grammar embed grammar description
  + * fGrammarFromPool introduced
  + *
    * Revision 1.14  2003/06/25 22:38:40  peiyongz
    * remove old getGrammar()
    *
  @@ -136,12 +140,18 @@
   ,fGrammarPoolFromExternalApplication(true)
   ,fStringPool(109, manager)
   ,fGrammarBucket(0)
  +,fGrammarFromPool(0)
   ,fDataTypeReg(0)
   ,fMemoryManager(manager)
   ,fGrammarPool(gramPool)
   {
   
  -    fGrammarBucket = new (manager) RefHashTableOf<GrammarEntry>(29, true,  manager);
  +    fGrammarBucket = new (manager) RefHashTableOf<Grammar>(29, true,  manager);
  +
  +    /***
  +     * Grammars in this set are not owned
  +     */    
  +    fGrammarFromPool = new (manager) RefHashTableOf<Grammar>(29, false,  manager);
   
       if (!gramPool)
       {
  @@ -159,6 +169,7 @@
   GrammarResolver::~GrammarResolver()
   {  
       delete fGrammarBucket;
  +    delete fGrammarFromPool;
   
       if (fDataTypeReg)
         delete fDataTypeReg;
  @@ -191,9 +202,7 @@
       }
       else {
   
  -        XMLSchemaDescription* gramDesc = 
fGrammarPool->createSchemaDescription(uriStr);
  -        Janitor<XMLSchemaDescription> janName(gramDesc);
  -        Grammar* grammar = getGrammar(gramDesc);
  +        Grammar* grammar = getGrammar(uriStr);
   
           if (grammar && grammar->getGrammarType() == Grammar::SchemaGrammarType) {
   
  @@ -210,29 +219,74 @@
       return dv;
   }
   
  +Grammar* GrammarResolver::getGrammar( const XMLCh* const namespaceKey)
  +{
  +    if (!namespaceKey)
  +        return 0;
  +
  +    Grammar* grammar = fGrammarBucket->get(namespaceKey);
  +
  +    if (grammar)
  +        return grammar;
  +
  +    if (fUseCachedGrammar)
  +    {
  +        grammar = fGrammarFromPool->get(namespaceKey);
  +        if (grammar)
  +        {
  +            return grammar;
  +        }
  +        else
  +        {
  +            XMLSchemaDescription* gramDesc = 
fGrammarPool->createSchemaDescription(namespaceKey);
  +            Janitor<XMLGrammarDescription> janName(gramDesc);
  +            grammar = fGrammarPool->retrieveGrammar(gramDesc);
  +            if (grammar)
  +            {
  +                fGrammarFromPool->put((void*) 
grammar->getGrammarDescription()->getGrammarKey(), grammar);
  +            }
  +            return grammar;
  +        }
  +    }
  +
  +    return 0;
  +}
  +
   Grammar* GrammarResolver::getGrammar( XMLGrammarDescription* const gramDesc)
   {
       if (!gramDesc)
           return 0;
   
  -    GrammarEntry* gramEntry = fGrammarBucket->get(gramDesc->getGrammarKey());
  +    Grammar* grammar = fGrammarBucket->get(gramDesc->getGrammarKey());
   
  -    if (gramEntry)
  -        return gramEntry->getGrammar();
  +    if (grammar)
  +        return grammar;
   
  -    /***
  -     * if not found locally, try grammarPool if necessary
  -     */
       if (fUseCachedGrammar)
  -        return fGrammarPool->retrieveGrammar(gramDesc);
  +    {
  +        grammar = fGrammarFromPool->get(gramDesc->getGrammarKey());
  +        if (grammar)
  +        {
  +            return grammar;
  +        }
  +        else
  +        {
  +            grammar = fGrammarPool->retrieveGrammar(gramDesc);
  +            if (grammar)
  +            {
  +                fGrammarFromPool->put((void*) 
grammar->getGrammarDescription()->getGrammarKey(), grammar);
  +            }
  +            return grammar;
  +        }
  +    }
   
       return 0;
   }
   
  -RefHashTableOfEnumerator<GrammarEntry>
  +RefHashTableOfEnumerator<Grammar>
   GrammarResolver::getGrammarEnumerator() const
   {
  -    return RefHashTableOfEnumerator<GrammarEntry>(fGrammarBucket);
  +    return RefHashTableOfEnumerator<Grammar>(fGrammarBucket);
   }
   
   bool GrammarResolver::containsNameSpace( const XMLCh* const nameSpaceKey )
  @@ -240,25 +294,21 @@
      return fGrammarBucket->containsKey( nameSpaceKey );
   }
   
  -void GrammarResolver::putGrammar(XMLGrammarDescription* const gramDesc, Grammar* 
const grammarToAdopt)
  +void GrammarResolver::putGrammar(Grammar* const grammarToAdopt)
   {
  -    if (!gramDesc || !grammarToAdopt)
  +    if (!grammarToAdopt)
           return;
   
       /***
        * the grammar will be either in the grammarpool, or in the grammarbucket
        */
       if (fCacheGrammar)
  -       fGrammarPool->cacheGrammar(gramDesc, grammarToAdopt);
  +    {
  +       fGrammarPool->cacheGrammar(grammarToAdopt);
  +    }
       else
       {
  -        /***
  -         * The grammarEntry in the GrammarBucket can use the parser's memory,
  -         * since itself won't go into the GrammarPool while its contained 
  -         * GrammarDescription and Grammar will.
  -         */
  -        GrammarEntry *theEntry = new (fMemoryManager) GrammarEntry(gramDesc, 
grammarToAdopt);
  -        fGrammarBucket->put( (void*) gramDesc->getGrammarKey(), theEntry );
  +        fGrammarBucket->put( (void*) 
grammarToAdopt->getGrammarDescription()->getGrammarKey(), grammarToAdopt );
       }
   
   }
  @@ -279,7 +329,7 @@
   void GrammarResolver::cacheGrammars()
   {
   
  -    RefHashTableOfEnumerator<GrammarEntry> grammarEnum(fGrammarBucket);
  +    RefHashTableOfEnumerator<Grammar> grammarEnum(fGrammarBucket);
       ValueVectorOf<XMLCh*> keys(8, fMemoryManager);
       unsigned int keyCount = 0;
   
  @@ -295,21 +345,12 @@
       for (unsigned int i = 0; i < keyCount; i++) 
       {
           XMLCh* grammarKey = keys.elementAt(i);    
  -        GrammarEntry* theEntry = fGrammarBucket->orphanKey(grammarKey);
  -
  -        /***
  -         * Destroy the grammarEntry but retain the grammar/description
  -         */
  -        XMLGrammarDescription* description = theEntry->getDescription();
  -        Grammar*               grammar     = theEntry->getGrammar();
  -        theEntry->nullGrammar();
  -        theEntry->nullDescription();
  -        delete theEntry;
  +        Grammar* grammar = fGrammarBucket->orphanKey(grammarKey);
   
           /***
            * It is up to the GrammarPool implementation to handle duplicated grammar
            */
  -        fGrammarPool->cacheGrammar(description, grammar);
  +        fGrammarPool->cacheGrammar(grammar);
       }
   
   }
  @@ -325,39 +366,17 @@
       fGrammarBucket->setAdoptElements(!fCacheGrammar);
   }
   
  -Grammar* GrammarResolver::orphanGrammar(XMLGrammarDescription* const gramDesc)
  +Grammar* GrammarResolver::orphanGrammar(const XMLCh* const nameSpaceKey)
   {
  -    if (!gramDesc)
  -        return 0;
  -
       if (fCacheGrammar)
       {
  -        return fGrammarPool->orphanGrammar(gramDesc);
  +        return fGrammarPool->orphanGrammar(nameSpaceKey);
       }
       else
       {
  -        GrammarEntry* theEntry = 
fGrammarBucket->orphanKey(gramDesc->getGrammarKey());
  -        if (theEntry)
  -        {
  -            Grammar* aGrammar = theEntry->getGrammar();
  -            theEntry->nullGrammar();
  -            delete theEntry;
  -            return aGrammar;
  -        }
  -        else
  -        {
  -            return 0;
  -        }
  -
  +        return fGrammarBucket->orphanKey(nameSpaceKey);
       }
  -}
   
  -XMLGrammarDescription* GrammarResolver::getGrammarDescription(const XMLCh* const 
nameSpaceKey)
  -{
  -    if (XMLString::equals(XMLUni::fgDTDEntityString, nameSpaceKey))
  -        return (XMLGrammarDescription*) 
fGrammarPool->createDTDDescription(nameSpaceKey);
  -    else 
  -        return (XMLGrammarDescription*) 
fGrammarPool->createSchemaDescription(nameSpaceKey);
   }
   
   XERCES_CPP_NAMESPACE_END
  
  
  
  1.13      +21 -18    xml-xerces/c/src/xercesc/validators/common/GrammarResolver.hpp
  
  Index: GrammarResolver.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/common/GrammarResolver.hpp,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- GrammarResolver.hpp       10 Jul 2003 19:49:08 -0000      1.12
  +++ GrammarResolver.hpp       31 Jul 2003 17:08:39 -0000      1.13
  @@ -67,14 +67,11 @@
   #include <xercesc/util/StringPool.hpp>
   #include <xercesc/validators/common/Grammar.hpp>
   
  -
   XERCES_CPP_NAMESPACE_BEGIN
   
  -
   class DatatypeValidator;
   class DatatypeValidatorFactory;
   class XMLGrammarDescription;
  -class GrammarEntry;
   
   /**
    * This class embodies the representation of a Grammar pool Resolver.
  @@ -118,17 +115,25 @@
       /**
        * Retrieve the grammar that is associated with the specified namespace key
        *
  -     * @param  gramDesc   Namespace key into Grammar pool
  -     * @return Grammar abstraction associated with the NameSpace key.
  +     * @param  gramDesc   grammar description for the grammar
  +     * @return Grammar abstraction associated with the grammar description
        */
       Grammar* getGrammar( XMLGrammarDescription* const gramDesc ) ;
   
       /**
  +     * Retrieve the grammar that is associated with the specified namespace key
  +     *
  +     * @param  namespaceKey   Namespace key into Grammar pool
  +     * @return Grammar abstraction associated with the NameSpace key.
  +     */
  +    Grammar* getGrammar( const XMLCh* const namespaceKey ) ;
  +
  +    /**
        * Get an enumeration of Grammar in the Grammar pool
        *
        * @return enumeration of Grammar in Grammar pool
        */
  -    RefHashTableOfEnumerator<GrammarEntry> getGrammarEnumerator() const;
  +    RefHashTableOfEnumerator<Grammar> getGrammarEnumerator() const;
   
   
       /**
  @@ -175,20 +180,18 @@
        * Add the Grammar with Namespace Key associated to the Grammar Pool.
        * The Grammar will be owned by the Grammar Pool.
        *
  -     * @param  gramDesc        Key to associate with Grammar abstraction
        * @param  grammarToAdopt  Grammar abstraction used by validator.
        */
  -    void putGrammar(XMLGrammarDescription* const gramDesc
  -                  , Grammar* const               grammarToAdopt );
  +    void putGrammar(Grammar* const               grammarToAdopt );
   
       /**
        * Returns the Grammar with Namespace Key associated from the Grammar Pool
        * The Key entry is removed from the table (grammar is not deleted if
        * adopted - now owned by caller).
        *
  -     * @param  gramDesc    Key to associate with Grammar abstraction
  +     * @param  nameSpaceKey    Key to associate with Grammar abstraction
        */
  -    Grammar* orphanGrammar(XMLGrammarDescription* const gramDesc);
  +    Grammar* orphanGrammar(const XMLCh* const nameSpaceKey);
   
       /**
        * Cache the grammars in fGrammarBucket to fCachedGrammarRegistry.
  @@ -207,18 +210,17 @@
   
   private:
   
  -    XMLGrammarDescription* getGrammarDescription(const XMLCh* const);
  -
       // -----------------------------------------------------------------------
       //  Private data members
       //
       //  fStringPool            The string pool used by TraverseSchema to store
       //                         element/attribute names and prefixes.
       //
  -    //  fGrammarBucket       The parsed Grammar Pool, if no caching option.
  +    //  fGrammarBucket         The parsed Grammar Pool, if no caching option.
  +    //
  +    //  fGrammarFromPool       Referenced Grammar Set, not owned
       //
  -    //  fCachedGrammarRegistry The cached Grammar Pool.  It represents a
  -    //                         mapping between Namespace and a Grammar
  +    //  fGrammarPool           The Grammar Set either plugged or created. 
       //
       //  fDataTypeReg           DatatypeValidatorFactory registery
       //
  @@ -229,7 +231,8 @@
       bool                       fUseCachedGrammar;
       bool                       fGrammarPoolFromExternalApplication;
       XMLStringPool              fStringPool;
  -    RefHashTableOf<GrammarEntry>*   fGrammarBucket;
  +    RefHashTableOf<Grammar>*   fGrammarBucket;
  +    RefHashTableOf<Grammar>*   fGrammarFromPool;
       DatatypeValidatorFactory*  fDataTypeReg;
       MemoryManager*             fMemoryManager;
       XMLGrammarPool*            fGrammarPool;
  
  
  

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

Reply via email to