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]