From 06b6b6761b2e87aa06c95aaddeb60ed5900fef8d Mon Sep 17 00:00:00 2001
From: PeiYong Zhang <peiyongz@apache.org>
Date: Thu, 31 Jul 2003 17:08:39 +0000
Subject: [PATCH] Grammar embed grammar description fGrammarFromPool introduced

git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@175132 13f79535-47bb-0310-9956-ffa450edef68
---
 .../validators/common/GrammarResolver.cpp     | 139 ++++++++++--------
 .../validators/common/GrammarResolver.hpp     |  37 ++---
 2 files changed, 99 insertions(+), 77 deletions(-)

diff --git a/src/xercesc/validators/common/GrammarResolver.cpp b/src/xercesc/validators/common/GrammarResolver.cpp
index 12a9a9e3a..45e24cda1 100644
--- a/src/xercesc/validators/common/GrammarResolver.cpp
+++ b/src/xercesc/validators/common/GrammarResolver.cpp
@@ -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 @@ GrammarResolver::GrammarResolver(XMLGrammarPool* const gramPool
 ,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(XMLGrammarPool* const gramPool
 GrammarResolver::~GrammarResolver()
 {  
     delete fGrammarBucket;
+    delete fGrammarFromPool;
 
     if (fDataTypeReg)
       delete fDataTypeReg;
@@ -191,9 +202,7 @@ GrammarResolver::getDatatypeValidator(const XMLCh* const uriStr,
     }
     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 @@ GrammarResolver::getDatatypeValidator(const XMLCh* const uriStr,
     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 @@ bool GrammarResolver::containsNameSpace( const XMLCh* const nameSpaceKey )
    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::resetCachedGrammar()
 void GrammarResolver::cacheGrammars()
 {
 
-    RefHashTableOfEnumerator<GrammarEntry> grammarEnum(fGrammarBucket);
+    RefHashTableOfEnumerator<Grammar> grammarEnum(fGrammarBucket);
     ValueVectorOf<XMLCh*> keys(8, fMemoryManager);
     unsigned int keyCount = 0;
 
@@ -295,21 +345,12 @@ void GrammarResolver::cacheGrammars()
     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 @@ void GrammarResolver::cacheGrammarFromParse(const bool aValue)
     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
diff --git a/src/xercesc/validators/common/GrammarResolver.hpp b/src/xercesc/validators/common/GrammarResolver.hpp
index 944849acd..43c13ce6d 100644
--- a/src/xercesc/validators/common/GrammarResolver.hpp
+++ b/src/xercesc/validators/common/GrammarResolver.hpp
@@ -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 @@ public:
     /**
      * 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 @@ public:
      * 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 @@ public:
 
 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 @@ private:
     bool                       fUseCachedGrammar;
     bool                       fGrammarPoolFromExternalApplication;
     XMLStringPool              fStringPool;
-    RefHashTableOf<GrammarEntry>*   fGrammarBucket;
+    RefHashTableOf<Grammar>*   fGrammarBucket;
+    RefHashTableOf<Grammar>*   fGrammarFromPool;
     DatatypeValidatorFactory*  fDataTypeReg;
     MemoryManager*             fMemoryManager;
     XMLGrammarPool*            fGrammarPool;
-- 
GitLab