peiyongz 2003/06/20 11:58:45
Modified: c/src/xercesc/validators/common GrammarResolver.cpp
GrammarResolver.hpp
Log:
Stateless Grammar Pool :: Part I
Revision Changes Path
1.9 +153 -61 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.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- GrammarResolver.cpp 18 May 2003 14:02:06 -0000 1.8
+++ GrammarResolver.cpp 20 Jun 2003 18:58:45 -0000 1.9
@@ -57,6 +57,9 @@
/*
* $Log$
+ * Revision 1.9 2003/06/20 18:58:45 peiyongz
+ * Stateless Grammar Pool :: Part I
+ *
* Revision 1.8 2003/05/18 14:02:06 knoaman
* Memory manager implementation: pass per instance manager.
*
@@ -99,33 +102,57 @@
*/
#include <xercesc/validators/common/GrammarResolver.hpp>
-#include <xercesc/framework/XMLBuffer.hpp>
#include <xercesc/validators/schema/SchemaSymbols.hpp>
#include <xercesc/validators/schema/SchemaGrammar.hpp>
+#include <xercesc/validators/schema/XMLSchemaDescriptionImpl.hpp>
+#include <xercesc/validators/DTD/XMLDTDDescriptionImpl.hpp>
+
+#include <xercesc/internal/XMLGrammarPoolImpl.hpp>
XERCES_CPP_NAMESPACE_BEGIN
// ---------------------------------------------------------------------------
// GrammarResolver: Constructor and Destructor
// ---------------------------------------------------------------------------
-GrammarResolver::GrammarResolver(MemoryManager* const manager) :
- fCacheGrammar(false)
- , fUseCachedGrammar(false)
- , fStringPool(109, manager)
- , fGrammarRegistry(0)
- , fCachedGrammarRegistry(0)
- , fDataTypeReg(0)
- , fMemoryManager(manager)
+GrammarResolver::GrammarResolver(XMLGrammarPool* const gramPool
+ , MemoryManager* const manager)
+:fCacheGrammar(false)
+,fUseCachedGrammar(false)
+,fGrammarPoolFromExternalApplication(true)
+,fStringPool(109, manager)
+,fGrammarBucket(0)
+,fDataTypeReg(0)
+,fMemoryManager(manager)
+,fGrammarPool(gramPool)
{
- fGrammarRegistry = new (manager) RefHashTableOf<Grammar>(29, true, manager);
+
+ fGrammarBucket = new (manager) RefHashTableOf<GrammarEntry>(29, true, manager);
+
+ if (!gramPool)
+ {
+ /***
+ * We need to instantiate a default grammar pool object so that
+ * all grammars and grammar components could be created through
+ * the Factory methods
+ */
+ fGrammarPool = new (manager) XMLGrammarPoolImpl(manager);
+ fGrammarPoolFromExternalApplication=false;
+ }
+
}
GrammarResolver::~GrammarResolver()
-{
- delete fGrammarRegistry;
- delete fCachedGrammarRegistry;
- if (fDataTypeReg)
+{
+ delete fGrammarBucket;
+
+ if (fDataTypeReg)
delete fDataTypeReg;
+
+ /***
+ * delete the grammar pool iff it is created by this resolver
+ */
+ if (!fGrammarPoolFromExternalApplication)
+ delete fGrammarPool;
}
// ---------------------------------------------------------------------------
@@ -166,97 +193,162 @@
return dv;
}
-Grammar* GrammarResolver::getGrammar( const XMLCh* const nameSpaceKey )
+//Deprecated
+Grammar* GrammarResolver::getGrammar(const XMLCh* const nameSpaceKey)
{
- if (!nameSpaceKey) {
+ if (!nameSpaceKey)
return 0;
- }
- Grammar* aGrammar = fGrammarRegistry->get(nameSpaceKey);
+ // we don't care the leakage
+ XMLGrammarDescription* gramDesc = getGrammarDescription(nameSpaceKey);
+ return getGrammar(gramDesc);
- if (!aGrammar && fUseCachedGrammar && fCachedGrammarRegistry)
- aGrammar = fCachedGrammarRegistry->get(nameSpaceKey);
+}
- return aGrammar;
+Grammar* GrammarResolver::getGrammar( XMLGrammarDescription* const gramDesc)
+{
+ if (!gramDesc)
+ return 0;
+
+ GrammarEntry* gramEntry = fGrammarBucket->get(gramDesc->getGrammarKey());
+
+ if (gramEntry)
+ return gramEntry->getGrammar();
+
+ /***
+ * if not found locally, try grammarPool if necessary
+ */
+ if (fUseCachedGrammar)
+ return fGrammarPool->retrieveGrammar(gramDesc);
+
+ return 0;
}
-RefHashTableOfEnumerator<Grammar>
+RefHashTableOfEnumerator<GrammarEntry>
GrammarResolver::getGrammarEnumerator() const
{
- return RefHashTableOfEnumerator<Grammar>(fGrammarRegistry);
+ return RefHashTableOfEnumerator<GrammarEntry>(fGrammarBucket);
}
bool GrammarResolver::containsNameSpace( const XMLCh* const nameSpaceKey )
{
- return fGrammarRegistry->containsKey( nameSpaceKey );
+ return fGrammarBucket->containsKey( nameSpaceKey );
}
-void GrammarResolver::putGrammar( const XMLCh* const nameSpaceKey, Grammar* const
grammarToAdopt ){
+//Deprecated
+void GrammarResolver::putGrammar( const XMLCh* const nameSpaceKey, Grammar* const
grammarToAdopt )
+{
+ // we don't care the leakage
+ XMLGrammarDescription* gramDesc = getGrammarDescription(nameSpaceKey);
+ putGrammar(gramDesc, grammarToAdopt);
+}
- if (fCacheGrammar)
- fCachedGrammarRegistry->put((void*) nameSpaceKey, grammarToAdopt);
+void GrammarResolver::putGrammar(XMLGrammarDescription* const gramDesc, Grammar*
const grammarToAdopt)
+{
+ if (!gramDesc || !grammarToAdopt)
+ return;
- fGrammarRegistry->put( (void*) nameSpaceKey, grammarToAdopt );
-}
+ /***
+ * the grammar will be either in the grammarpool, or in the grammarbucket
+ */
+ if (fCacheGrammar)
+ fGrammarPool->cacheGrammar(gramDesc, 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 );
+ }
+}
// ---------------------------------------------------------------------------
// GrammarResolver: methods
// ---------------------------------------------------------------------------
void GrammarResolver::reset() {
- fGrammarRegistry->removeAll();
+ fGrammarBucket->removeAll();
}
void GrammarResolver::resetCachedGrammar()
{
- if (fCachedGrammarRegistry)
- fCachedGrammarRegistry->removeAll();
+ fGrammarPool->clear();
+
}
void GrammarResolver::cacheGrammars()
{
- RefHashTableOfEnumerator<Grammar> grammarEnum(fGrammarRegistry);
- ValueVectorOf<XMLCh*> keys(8, fMemoryManager);
- unsigned int keyCount = 0;
-
- //Check if a grammar has already been cached.
- while (grammarEnum.hasMoreElements()) {
+ RefHashTableOfEnumerator<GrammarEntry> grammarEnum(fGrammarBucket);
+ /***
+ * It is up to the GrammarPool to handle duplicated grammar
+ *
+ * Destroy the grammarEntry but reuse the grammar and description
+ * embedded.
+ *
+ */
+ while (grammarEnum.hasMoreElements())
+ {
XMLCh* grammarKey = (XMLCh*) grammarEnum.nextElementKey();
+ GrammarEntry* theEntry = fGrammarBucket->orphanKey(grammarKey);
+ XMLGrammarDescription* description = theEntry->getDescription();
+ Grammar* grammar = theEntry->getGrammar();
+ theEntry->nullGrammar();
+ theEntry->nullDescription();
+ delete theEntry;
- if (fCachedGrammarRegistry &&
fCachedGrammarRegistry->containsKey(grammarKey)) {
- ThrowXML(RuntimeException, XMLExcepts::GC_ExistingGrammar);
- }
-
- keys.addElement(grammarKey);
- keyCount++;
+ fGrammarPool->cacheGrammar(description, grammar);
}
- if (!fCachedGrammarRegistry)
- fCachedGrammarRegistry = new (fMemoryManager) RefHashTableOf<Grammar>(29,
true, fMemoryManager);
-
- // Cache
- for (unsigned int i=0; i<keyCount; i++) {
-
- XMLCh* grammarKey = keys.elementAt(i);
- Grammar* grammar = fGrammarRegistry->orphanKey(grammarKey);
- fCachedGrammarRegistry->put((void*) grammarKey, grammar);
- }
}
-
// ---------------------------------------------------------------------------
// GrammarResolver: Setter methods
// ---------------------------------------------------------------------------
-void GrammarResolver::cacheGrammarFromParse(const bool aValue) {
+void GrammarResolver::cacheGrammarFromParse(const bool aValue)
+{
+
+ fCacheGrammar = aValue;
+ fGrammarBucket->removeAll();
+ fGrammarBucket->setAdoptElements(!fCacheGrammar);
+}
- if (aValue && !fCachedGrammarRegistry) {
- fCachedGrammarRegistry = new (fMemoryManager) RefHashTableOf<Grammar>(29,
true, fMemoryManager);
+Grammar* GrammarResolver::orphanGrammar(const XMLCh* const nameSpaceKey)
+{
+ // we don't care the leakage
+ XMLGrammarDescription* gramDesc = getGrammarDescription(nameSpaceKey);
+ return orphanGrammar(gramDesc);
+}
+
+Grammar* GrammarResolver::orphanGrammar(XMLGrammarDescription* const gramDesc)
+{
+ if (!gramDesc)
+ return 0;
+
+ if (fCacheGrammar)
+ return fGrammarPool->orphanGrammar(gramDesc);
+
+ GrammarEntry* theEntry = fGrammarBucket->orphanKey(gramDesc->getGrammarKey());
+ if (theEntry)
+ {
+ Grammar* aGrammar = theEntry->getGrammar();
+ theEntry->nullGrammar();
+ delete theEntry;
+ return aGrammar;
}
- fCacheGrammar = aValue;
- fGrammarRegistry->removeAll();
- fGrammarRegistry->setAdoptElements(!fCacheGrammar);
+ return 0;
+}
+
+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.7 +21 -17 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.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- GrammarResolver.hpp 16 May 2003 21:43:20 -0000 1.6
+++ GrammarResolver.hpp 20 Jun 2003 18:58:45 -0000 1.7
@@ -71,7 +71,9 @@
class DatatypeValidator;
class DatatypeValidatorFactory;
-
+class XMLGrammarPool;
+class XMLGrammarDescription;
+class GrammarEntry;
/**
* This class embodies the representation of a Grammar pool Resolver.
@@ -89,7 +91,10 @@
*
* Default Constructor
*/
- GrammarResolver(MemoryManager* const manager =
XMLPlatformUtils::fgMemoryManager);
+ GrammarResolver(
+ XMLGrammarPool* const gramPool
+ , MemoryManager* const manager =
XMLPlatformUtils::fgMemoryManager
+ );
/**
* Destructor
*/
@@ -116,13 +121,14 @@
* @return Grammar abstraction associated with the NameSpace key.
*/
Grammar* getGrammar( const XMLCh* const nameSpaceKey ) ;
+ Grammar* getGrammar( XMLGrammarDescription* const gramDesc ) ;
/**
* Get an enumeration of Grammar in the Grammar pool
*
* @return enumeration of Grammar in Grammar pool
*/
- RefHashTableOfEnumerator<Grammar> getGrammarEnumerator() const;
+ RefHashTableOfEnumerator<GrammarEntry> getGrammarEnumerator() const;
/**
@@ -169,6 +175,8 @@
* @param grammarToAdopt Grammar abstraction used by validator.
*/
void putGrammar(const XMLCh* const nameSpaceKey, Grammar* const grammarToAdopt
);
+ void putGrammar(XMLGrammarDescription* const nameSpaceKey
+ , Grammar* const grammarToAdopt );
/**
* Returns the Grammar with Namespace Key associated from the Grammar Pool
@@ -178,9 +186,10 @@
* @param nameSpaceKey Key to associate with Grammar abstraction
*/
Grammar* orphanGrammar(const XMLCh* const nameSpaceKey);
+ Grammar* orphanGrammar(XMLGrammarDescription* const nameSpaceKey);
/**
- * Cache the grammars in fGrammarRegistry to fCachedGrammarRegistry.
+ * Cache the grammars in fGrammarBucket to fCachedGrammarRegistry.
* If a grammar with the same key is already cached, an exception is
* thrown and none of the grammars will be cached.
*/
@@ -195,13 +204,16 @@
//@}
private:
+
+ XMLGrammarDescription* getGrammarDescription(const XMLCh* const);
+
// -----------------------------------------------------------------------
// Private data members
//
// fStringPool The string pool used by TraverseSchema to store
// element/attribute names and prefixes.
//
- // fGrammarRegistry The parsed Grammar Pool, if no caching option.
+ // fGrammarBucket The parsed Grammar Pool, if no caching option.
//
// fCachedGrammarRegistry The cached Grammar Pool. It represents a
// mapping between Namespace and a Grammar
@@ -213,11 +225,12 @@
// -----------------------------------------------------------------------
bool fCacheGrammar;
bool fUseCachedGrammar;
+ bool fGrammarPoolFromExternalApplication;
XMLStringPool fStringPool;
- RefHashTableOf<Grammar>* fGrammarRegistry;
- RefHashTableOf<Grammar>* fCachedGrammarRegistry;
+ RefHashTableOf<GrammarEntry>* fGrammarBucket;
DatatypeValidatorFactory* fDataTypeReg;
MemoryManager* fMemoryManager;
+ XMLGrammarPool* fGrammarPool;
};
inline XMLStringPool* GrammarResolver::getStringPool() {
@@ -229,15 +242,6 @@
inline void GrammarResolver::useCachedGrammarInParse(const bool aValue)
{
fUseCachedGrammar = aValue;
-}
-
-inline Grammar*
-GrammarResolver::orphanGrammar(const XMLCh* const nameSpaceKey) {
-
- if (fCacheGrammar)
- return fCachedGrammarRegistry->orphanKey(nameSpaceKey);
-
- return fGrammarRegistry->orphanKey(nameSpaceKey);
}
XERCES_CPP_NAMESPACE_END
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]