From d4d619d4348114f396fff44910831d8d85dd4630 Mon Sep 17 00:00:00 2001
From: PeiYong Zhang <peiyongz@apache.org>
Date: Thu, 31 Jul 2003 17:14:27 +0000
Subject: [PATCH] Grammar embed grammar description

git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@175133 13f79535-47bb-0310-9956-ffa450edef68
---
 src/xercesc/validators/DTD/DTDGrammar.cpp     | 27 +++++++
 src/xercesc/validators/DTD/DTDGrammar.hpp     | 12 +++
 src/xercesc/validators/common/Grammar.hpp     | 11 ++-
 .../validators/schema/SchemaGrammar.cpp       | 27 +++++++
 .../validators/schema/SchemaGrammar.hpp       | 11 +++
 .../validators/schema/SchemaValidator.cpp     | 15 ++--
 .../schema/SubstitutionGroupComparator.cpp    |  7 +-
 .../validators/schema/TraverseSchema.cpp      | 79 +++++++------------
 .../schema/XMLSchemaDescriptionImpl.cpp       | 29 ++++---
 .../schema/XMLSchemaDescriptionImpl.hpp       | 15 ++--
 10 files changed, 149 insertions(+), 84 deletions(-)

diff --git a/src/xercesc/validators/DTD/DTDGrammar.cpp b/src/xercesc/validators/DTD/DTDGrammar.cpp
index 43884c217..bebdafdd6 100644
--- a/src/xercesc/validators/DTD/DTDGrammar.cpp
+++ b/src/xercesc/validators/DTD/DTDGrammar.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.7  2003/07/31 17:09:59  peiyongz
+ * Grammar embed grammar description
+ *
  * Revision 1.6  2003/05/18 14:02:06  knoaman
  * Memory manager implementation: pass per instance manager.
  *
@@ -95,6 +98,7 @@
 #include <xercesc/util/XMLUniDefs.hpp>
 #include <xercesc/util/XMLUni.hpp>
 #include <xercesc/validators/DTD/DTDGrammar.hpp>
+#include <xercesc/validators/DTD/XMLDTDDescriptionImpl.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -108,6 +112,7 @@ DTDGrammar::DTDGrammar(MemoryManager* const manager) :
     , fEntityDeclPool(0)
     , fNotationDeclPool(0)
     , fValidated(false)
+    , fGramDesc(0)
 {
     //
     //  Init all the pool members.
@@ -120,6 +125,9 @@ DTDGrammar::DTDGrammar(MemoryManager* const manager) :
     fEntityDeclPool = new (fMemoryManager) NameIdPool<DTDEntityDecl>(109, 128, fMemoryManager);
     fNotationDeclPool = new (fMemoryManager) NameIdPool<XMLNotationDecl>(109, 128, fMemoryManager);
 
+    //REVISIT: use grammarPool to create
+    fGramDesc = new (fMemoryManager) XMLDTDDescriptionImpl(XMLUni::fgDTDEntityString, fMemoryManager);
+
     //
     //  Call our own reset method. This lets us have the pool setup stuff
     //  done in just one place (because this stame setup stuff has to be
@@ -134,6 +142,7 @@ DTDGrammar::~DTDGrammar()
     delete fElemNonDeclPool;
     delete fEntityDeclPool;
     delete fNotationDeclPool;
+    delete fGramDesc;
 }
 
 // -----------------------------------------------------------------------
@@ -221,4 +230,22 @@ void DTDGrammar::resetEntityDeclPool() {
     fEntityDeclPool->put(new DTDEntityDecl(XMLUni::fgApos, chSingleQuote, true, true));
 }
 
+void DTDGrammar::setGrammarDescription( XMLGrammarDescription* gramDesc)
+{
+    if ((!gramDesc) || 
+        (gramDesc->getGrammarType() != Grammar::DTDGrammarType))
+        return;
+
+    if (fGramDesc)
+        delete fGramDesc;
+
+    //adopt the grammar Description
+    fGramDesc = (XMLDTDDescription*) gramDesc;
+}
+
+XMLGrammarDescription*  DTDGrammar::getGrammarDescription() const
+{
+    return fGramDesc;
+}
+
 XERCES_CPP_NAMESPACE_END
diff --git a/src/xercesc/validators/DTD/DTDGrammar.hpp b/src/xercesc/validators/DTD/DTDGrammar.hpp
index 38fd445a8..c2db00a34 100644
--- a/src/xercesc/validators/DTD/DTDGrammar.hpp
+++ b/src/xercesc/validators/DTD/DTDGrammar.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.8  2003/07/31 17:09:59  peiyongz
+ * Grammar embed grammar description
+ *
  * Revision 1.7  2003/05/16 21:43:19  knoaman
  * Memory manager implementation: Modify constructors to pass in the memory manager.
  *
@@ -105,6 +108,8 @@
 #include <xercesc/validators/common/Grammar.hpp>
 #include <xercesc/validators/DTD/DTDElementDecl.hpp>
 #include <xercesc/validators/DTD/DTDEntityDecl.hpp>
+#include <xercesc/framework/XMLDTDDescription.hpp>
+
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -230,6 +235,9 @@ public:
     // -----------------------------------------------------------------------
     void setRootElemId(unsigned int rootElemId);
 
+    virtual void                    setGrammarDescription( XMLGrammarDescription*);
+    virtual XMLGrammarDescription*  getGrammarDescription() const;
+
     // -----------------------------------------------------------------------
     //  Content management methods
     // -----------------------------------------------------------------------
@@ -272,6 +280,9 @@ private:
     //      Indicates if the content of the Grammar has been pre-validated
     //      or not. When using a cached grammar, no need for pre content
     //      validation.
+    //
+    //  fGramDesc: adopted
+    //
     // -----------------------------------------------------------------------
     MemoryManager*               fMemoryManager;
     NameIdPool<DTDElementDecl>*  fElemDeclPool;
@@ -280,6 +291,7 @@ private:
     NameIdPool<XMLNotationDecl>* fNotationDeclPool;
     unsigned int                 fRootElemId;
     bool                         fValidated;
+    XMLDTDDescription*           fGramDesc;
 };
 
 
diff --git a/src/xercesc/validators/common/Grammar.hpp b/src/xercesc/validators/common/Grammar.hpp
index 3ce470bbb..500d36560 100644
--- a/src/xercesc/validators/common/Grammar.hpp
+++ b/src/xercesc/validators/common/Grammar.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.6  2003/07/31 17:07:33  peiyongz
+ * Grammar embed grammar description
+ *
  * Revision 1.5  2003/05/15 18:48:27  knoaman
  * Partial implementation of the configurable memory manager.
  *
@@ -102,6 +105,8 @@
 
 XERCES_CPP_NAMESPACE_BEGIN
 
+class XMLGrammarDescription;
+
 //
 // This abstract class specifies the interface for a Grammar
 //
@@ -233,11 +238,15 @@ public:
     // -----------------------------------------------------------------------
     virtual void reset()=0;
 
+    virtual void                    setGrammarDescription( XMLGrammarDescription*) = 0;
+    virtual XMLGrammarDescription*  getGrammarDescription() const = 0;
+
 protected :
     // -----------------------------------------------------------------------
     //  Hidden constructors
     // -----------------------------------------------------------------------
-    Grammar() {};
+    Grammar(){};
+
 };
 
 XERCES_CPP_NAMESPACE_END
diff --git a/src/xercesc/validators/schema/SchemaGrammar.cpp b/src/xercesc/validators/schema/SchemaGrammar.cpp
index 247739924..957a90e83 100644
--- a/src/xercesc/validators/schema/SchemaGrammar.cpp
+++ b/src/xercesc/validators/schema/SchemaGrammar.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.7  2003/07/31 17:12:10  peiyongz
+ * Grammar embed grammar description
+ *
  * Revision 1.6  2003/05/21 21:35:31  knoaman
  * Pass the memory manager.
  *
@@ -120,6 +123,7 @@
 #include <xercesc/validators/schema/SchemaSymbols.hpp>
 #include <xercesc/validators/schema/XercesGroupInfo.hpp>
 #include <xercesc/validators/schema/XercesAttGroupInfo.hpp>
+#include <xercesc/validators/schema/XMLSchemaDescriptionImpl.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -142,6 +146,7 @@ SchemaGrammar::SchemaGrammar(MemoryManager* const manager) :
     , fMemoryManager(manager)
     , fValidated(false)
     , fDatatypeRegistry(manager)
+    , fGramDesc(0)
 {
     //
     //  Init all the pool members.
@@ -158,6 +163,9 @@ SchemaGrammar::SchemaGrammar(MemoryManager* const manager) :
         fIDRefList = new (fMemoryManager) RefHashTableOf<XMLRefInfo>(29, fMemoryManager);
         fDatatypeRegistry.expandRegistryToFullSchemaSet();
 
+        //REVISIT: use grammarPool to create
+        fGramDesc = new (fMemoryManager) XMLSchemaDescriptionImpl(XMLUni::fgXMLNSURIName, fMemoryManager);
+
         //
         //  Call our own reset method. This lets us have the pool setup stuff
         //  done in just one place (because this stame setup stuff has to be
@@ -263,6 +271,25 @@ void SchemaGrammar::cleanUp()
     delete fNamespaceScope;
     delete fValidSubstitutionGroups;
     delete fIDRefList;
+    delete fGramDesc;
+}
+
+void SchemaGrammar::setGrammarDescription( XMLGrammarDescription* gramDesc)
+{
+    if ((!gramDesc) || 
+        (gramDesc->getGrammarType() != Grammar::SchemaGrammarType))
+        return;
+
+    if (fGramDesc)
+        delete fGramDesc;
+
+    //adopt the grammar Description
+    fGramDesc = (XMLSchemaDescription*) gramDesc;
+}
+
+XMLGrammarDescription* SchemaGrammar::getGrammarDescription() const
+{
+    return fGramDesc;
 }
 
 XERCES_CPP_NAMESPACE_END
diff --git a/src/xercesc/validators/schema/SchemaGrammar.hpp b/src/xercesc/validators/schema/SchemaGrammar.hpp
index 105a0d48d..82c33e83c 100644
--- a/src/xercesc/validators/schema/SchemaGrammar.hpp
+++ b/src/xercesc/validators/schema/SchemaGrammar.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.8  2003/07/31 17:12:10  peiyongz
+ * Grammar embed grammar description
+ *
  * Revision 1.7  2003/05/16 21:43:21  knoaman
  * Memory manager implementation: Modify constructors to pass in the memory manager.
  *
@@ -133,6 +136,7 @@
 #include <xercesc/util/ValueVectorOf.hpp>
 #include <xercesc/validators/datatype/IDDatatypeValidator.hpp>
 #include <xercesc/validators/datatype/DatatypeValidatorFactory.hpp>
+#include <xercesc/framework/XMLSchemaDescription.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -279,6 +283,9 @@ public:
     void setNamespaceScope(NamespaceScope* const nsScope);
     void setValidSubstitutionGroups(RefHash2KeysTableOf<ElemVector>* const);
 
+    virtual void                    setGrammarDescription( XMLGrammarDescription*);
+    virtual XMLGrammarDescription*  getGrammarDescription() const;
+
     // -----------------------------------------------------------------------
     //  Helper methods
     // -----------------------------------------------------------------------
@@ -347,6 +354,9 @@ private:
     //      Indicates if the content of the Grammar has been pre-validated
     //      or not (UPA checking, etc.). When using a cached grammar, no need
     //      for pre content validation.
+    //
+    //  fGramDesc: adopted
+    //
     // -----------------------------------------------------------------------
     XMLCh*                                 fTargetNamespace;
     RefHash3KeysIdPool<SchemaElementDecl>* fElemDeclPool;
@@ -363,6 +373,7 @@ private:
     MemoryManager*                         fMemoryManager;
     bool                                   fValidated;
     DatatypeValidatorFactory               fDatatypeRegistry;
+    XMLSchemaDescription*                  fGramDesc;
 };
 
 
diff --git a/src/xercesc/validators/schema/SchemaValidator.cpp b/src/xercesc/validators/schema/SchemaValidator.cpp
index c5cc5ac37..3df5c0c9d 100644
--- a/src/xercesc/validators/schema/SchemaValidator.cpp
+++ b/src/xercesc/validators/schema/SchemaValidator.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.35  2003/07/31 17:14:27  peiyongz
+ * Grammar embed grammar description
+ *
  * Revision 1.34  2003/06/25 22:38:18  peiyongz
  * to use new GrammarResolver::getGrammar()
  *
@@ -793,9 +796,7 @@ void SchemaValidator::validateElement(const   XMLElementDecl*  elemDef)
 
             // retrieve Grammar for the uri
             const XMLCh* uriStr = getScanner()->getURIText(uri);
-            XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(uriStr);
-            Janitor<XMLSchemaDescription> janName(gramDesc);
-            SchemaGrammar* sGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(gramDesc);
+            SchemaGrammar* sGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(uriStr);
             if (!sGrammar) {
 
                 // Check built-in simple types
@@ -993,10 +994,10 @@ void SchemaValidator::preContentValidation(bool reuseGrammar,
     //  And enumerate all the complextype info in the grammar
     //    and do Unique Particle Attribution Checking
 
-    RefHashTableOfEnumerator<GrammarEntry> grammarEnum = fGrammarResolver->getGrammarEnumerator();
+    RefHashTableOfEnumerator<Grammar> grammarEnum = fGrammarResolver->getGrammarEnumerator();
     while (grammarEnum.hasMoreElements())
     {
-        SchemaGrammar& sGrammar = (SchemaGrammar&) *(grammarEnum.nextElement().getGrammar());
+        SchemaGrammar& sGrammar = (SchemaGrammar&) grammarEnum.nextElement();
         if (sGrammar.getGrammarType() != Grammar::SchemaGrammarType || sGrammar.getValidated())
              continue;
 
@@ -1697,9 +1698,7 @@ SchemaValidator::checkNameAndTypeOK(SchemaGrammar* const currentGrammar,
     const XMLCh* schemaURI = getScanner()->getURIStringPool()->getValueForId(derivedURI);
 
     if (derivedURI != getScanner()->getEmptyNamespaceId()) {
-        XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(schemaURI);
-        Janitor<XMLSchemaDescription> janName(gramDesc);
-        aGrammar= (SchemaGrammar*) fGrammarResolver->getGrammar(gramDesc);
+        aGrammar= (SchemaGrammar*) fGrammarResolver->getGrammar(schemaURI);
     }
 
     if (!aGrammar) { //something is wrong
diff --git a/src/xercesc/validators/schema/SubstitutionGroupComparator.cpp b/src/xercesc/validators/schema/SubstitutionGroupComparator.cpp
index 4cf3d463d..6f3b7e3f5 100644
--- a/src/xercesc/validators/schema/SubstitutionGroupComparator.cpp
+++ b/src/xercesc/validators/schema/SubstitutionGroupComparator.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.8  2003/07/31 17:14:27  peiyongz
+ * Grammar embed grammar description
+ *
  * Revision 1.7  2003/06/25 22:38:18  peiyongz
  * to use new GrammarResolver::getGrammar()
  *
@@ -164,9 +167,7 @@ bool SubstitutionGroupComparator::isEquivalentTo(QName* const anElement
     if (!uri)
         return false;
 
-    XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(uri);
-    Janitor<XMLSchemaDescription> janName(gramDesc);
-    SchemaGrammar *sGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(gramDesc);
+    SchemaGrammar *sGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(uri);
     if (!sGrammar || sGrammar->getGrammarType() == Grammar::DTDGrammarType)
         return false;
 
diff --git a/src/xercesc/validators/schema/TraverseSchema.cpp b/src/xercesc/validators/schema/TraverseSchema.cpp
index ed734309e..aba171b46 100644
--- a/src/xercesc/validators/schema/TraverseSchema.cpp
+++ b/src/xercesc/validators/schema/TraverseSchema.cpp
@@ -380,12 +380,14 @@ void TraverseSchema::preprocessSchema(DOMElement* const schemaRoot,
     fTargetNSURIString = fSchemaGrammar->getTargetNamespace();
     fTargetNSURI = fURIStringPool->addOrFind(fTargetNSURIString);
 
-    XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(fTargetNSURIString);
-    fGrammarResolver->putGrammar(gramDesc, fSchemaGrammar);
+    XMLSchemaDescription* gramDesc = (XMLSchemaDescription*) fSchemaGrammar->getGrammarDescription();       
+    gramDesc->setTargetNamespace(fTargetNSURIString);
+
+    fGrammarResolver->putGrammar(fSchemaGrammar);
     fAttributeCheck.setIDRefList(fSchemaGrammar->getIDRefList());
 
     // Save current schema info
-    SchemaInfo* currInfo = new (fGrammarPoolMemoryManager) SchemaInfo(0, 0, 0, fTargetNSURI, fScopeCount,
+    SchemaInfo* currInfo = new (fMemoryManager) SchemaInfo(0, 0, 0, fTargetNSURI, fScopeCount,
                                           fNamespaceScope->increaseDepth(),
                                           XMLString::replicate(schemaURL, fGrammarPoolMemoryManager),
                                           fTargetNSURIString, schemaRoot,
@@ -576,7 +578,7 @@ void TraverseSchema::preprocessInclude(const DOMElement* const elem) {
             // --------------------------------------------------------
             SchemaInfo* saveInfo = fSchemaInfo;
 
-            fSchemaInfo = new (fGrammarPoolMemoryManager) SchemaInfo(0, 0, 0, fTargetNSURI, fScopeCount,
+            fSchemaInfo = new (fMemoryManager) SchemaInfo(0, 0, 0, fTargetNSURI, fScopeCount,
                                          fNamespaceScope->increaseDepth(),
                                          XMLString::replicate(includeURL, fGrammarPoolMemoryManager),
                                          fTargetNSURIString, root,
@@ -660,6 +662,8 @@ void TraverseSchema::preprocessImport(const DOMElement* const elem) {
     {
         XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(nameSpace);
         Janitor<XMLSchemaDescription> janName(gramDesc);
+        gramDesc->setContextType(XMLSchemaDescription::CONTEXT_IMPORT);
+        gramDesc->setLocationHints(getElementAttValue(elem, SchemaSymbols::fgATT_SCHEMALOCATION));
         aGrammar = fGrammarResolver->getGrammar(gramDesc);
     }
 
@@ -756,6 +760,10 @@ void TraverseSchema::preprocessImport(const DOMElement* const elem) {
             // --------------------------------------------------------
             SchemaInfo* saveInfo = fSchemaInfo;            
             fSchemaGrammar = new (fGrammarPoolMemoryManager) SchemaGrammar(fGrammarPoolMemoryManager);
+            XMLSchemaDescription* gramDesc = (XMLSchemaDescription*) fSchemaGrammar->getGrammarDescription();
+            gramDesc->setContextType(XMLSchemaDescription::CONTEXT_IMPORT);
+            gramDesc->setLocationHints(importURL);
+
             preprocessSchema(root, importURL);
             fPreprocessedNodes->put((void*) elem, fSchemaInfo);
 
@@ -1633,9 +1641,7 @@ TraverseSchema::traverseAttributeGroupDeclNS(const DOMElement* const elem,
     // ------------------------------------------------------------------
     // Get grammar information
     // ------------------------------------------------------------------
-    XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(uriStr);
-    Janitor<XMLSchemaDescription> janName(gramDesc);
-    Grammar* aGrammar = fGrammarResolver->getGrammar(gramDesc);
+    Grammar* aGrammar = fGrammarResolver->getGrammar(uriStr);
 
     if (!aGrammar || aGrammar->getGrammarType() != Grammar::SchemaGrammarType) {
 
@@ -2545,9 +2551,7 @@ QName* TraverseSchema::traverseElementDecl(const DOMElement* const elem,
 
                             if (!subsElements && fTargetNSURI != subsElemURI) {
 
-                                XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(fURIStringPool->getValueForId(subsElemURI));
-                                Janitor<XMLSchemaDescription> janName(gramDesc);
-                                SchemaGrammar* aGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(gramDesc);
+                                SchemaGrammar* aGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(fURIStringPool->getValueForId(subsElemURI));
 
                                 if (aGrammar) {
                                     subsElements = aGrammar->getValidSubstitutionGroups()->get(subsElemBaseName, subsElemURI);
@@ -2578,9 +2582,7 @@ QName* TraverseSchema::traverseElementDecl(const DOMElement* const elem,
                             while (importingEnum.hasMoreElements()) {
 
                                 const SchemaInfo& curRef = importingEnum.nextElement();
-                                XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(curRef.getTargetNSURIString());
-                                Janitor<XMLSchemaDescription> janName(gramDesc);
-                                SchemaGrammar* aGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(gramDesc);
+                                SchemaGrammar* aGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(curRef.getTargetNSURIString());
                                 ValueVectorOf<SchemaElementDecl*>* subsElemList =
                                     aGrammar->getValidSubstitutionGroups()->get(subsElemBaseName, subsElemURI);
 
@@ -2809,9 +2811,7 @@ const XMLCh* TraverseSchema::traverseNotationDecl(const DOMElement* const elem,
             return 0;
         }
 
-        XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(uriStr);
-        Janitor<XMLSchemaDescription> janName(gramDesc);
-        Grammar* grammar = fGrammarResolver->getGrammar(gramDesc);
+        Grammar* grammar = fGrammarResolver->getGrammar(uriStr);
 
         if (grammar == 0 || grammar->getGrammarType() != Grammar::SchemaGrammarType) {
 
@@ -4483,9 +4483,7 @@ TraverseSchema::getDatatypeValidator(const XMLCh* const uriStr,
 
         if ((uriStr && *uriStr) && !XMLString::equals(uriStr, fTargetNSURIString)) {
 
-            XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(uriStr);
-            Janitor<XMLSchemaDescription> janName(gramDesc);
-            Grammar* grammar = fGrammarResolver->getGrammar(gramDesc);
+            Grammar* grammar = fGrammarResolver->getGrammar(uriStr);
 
             if (grammar && grammar->getGrammarType() == Grammar::SchemaGrammarType) {
                 dv = ((SchemaGrammar*) grammar)->getDatatypeRegistry()->getDatatypeValidator(fBuffer.getRawBuffer());
@@ -5006,9 +5004,7 @@ TraverseSchema::getElementComplexTypeInfo(const DOMElement* const elem,
         if (!fSchemaInfo->isImportingNS(uriId))
             return 0;
 
-        XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(typeURI);
-        Janitor<XMLSchemaDescription> janName(gramDesc);
-        Grammar* aGrammar = fGrammarResolver->getGrammar(gramDesc);
+        Grammar* aGrammar = fGrammarResolver->getGrammar(typeURI);
 
         if (!aGrammar || aGrammar->getGrammarType() != Grammar::SchemaGrammarType) {
             return 0;
@@ -5083,9 +5079,7 @@ TraverseSchema::getSubstituteGroupElemDecl(const DOMElement* const elem,
                                                      0, Grammar::TOP_LEVEL_SCOPE, wasAdded);
         }
 
-        XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(nameURI);
-        Janitor<XMLSchemaDescription> janName(gramDesc);
-        Grammar* grammar = fGrammarResolver->getGrammar(gramDesc);
+        Grammar* grammar = fGrammarResolver->getGrammar(nameURI);
 
         if (grammar && grammar->getGrammarType() == Grammar::SchemaGrammarType) {
             elemDecl = (SchemaElementDecl*)
@@ -5385,9 +5379,7 @@ void TraverseSchema::processAttributeDeclRef(const DOMElement* const elem,
             return;
         }
 
-        XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(uriStr);
-        Janitor<XMLSchemaDescription> janName(gramDesc);
-        Grammar* grammar = fGrammarResolver->getGrammar(gramDesc);
+        Grammar* grammar = fGrammarResolver->getGrammar(uriStr);
 
         if (grammar == 0 || grammar->getGrammarType() != Grammar::SchemaGrammarType) {
 
@@ -6088,9 +6080,7 @@ ComplexTypeInfo* TraverseSchema::getTypeInfoFromNS(const DOMElement* const elem,
                                                    const XMLCh* const localPart)
 {
 
-    XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(uriStr);
-    Janitor<XMLSchemaDescription> janName(gramDesc);
-    Grammar* grammar = fGrammarResolver->getGrammar(gramDesc);
+    Grammar* grammar = fGrammarResolver->getGrammar(uriStr);
 
     if (grammar != 0 && grammar->getGrammarType() == Grammar::SchemaGrammarType) {
 
@@ -6398,9 +6388,7 @@ void TraverseSchema::restoreSchemaInfo(SchemaInfo* const toRestore,
 
         int targetNSURI = toRestore->getTargetNSURI();
 
-        XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(toRestore->getTargetNSURIString());
-        Janitor<XMLSchemaDescription> janName(gramDesc);
-        fSchemaGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(gramDesc);
+        fSchemaGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(toRestore->getTargetNSURIString());
 
         if (!fSchemaGrammar) {
             return;
@@ -6496,9 +6484,7 @@ TraverseSchema::buildValidSubstitutionListB(const DOMElement* const elem,
                 break; // an error must have occured
             }
 
-            XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(fURIStringPool->getValueForId(chainElemURI));
-            Janitor<XMLSchemaDescription> janName(gramDesc);
-            SchemaGrammar* aGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(gramDesc);
+            SchemaGrammar* aGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(fURIStringPool->getValueForId(chainElemURI));
 
             if (!aGrammar)
                 break;
@@ -6527,9 +6513,7 @@ TraverseSchema::buildValidSubstitutionListB(const DOMElement* const elem,
         while (importingEnum.hasMoreElements()) {
 
             const SchemaInfo& curRef = importingEnum.nextElement();
-            XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(curRef.getTargetNSURIString());
-            Janitor<XMLSchemaDescription> janName(gramDesc);
-            SchemaGrammar* aGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(gramDesc);
+            SchemaGrammar* aGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(curRef.getTargetNSURIString());
             ValueVectorOf<SchemaElementDecl*>* subsElemList =
                 aGrammar->getValidSubstitutionGroups()->get(chainElemName, chainElemURI);
 
@@ -6563,9 +6547,7 @@ TraverseSchema::buildValidSubstitutionListF(const DOMElement* const elem,
                 return; // an error must have occured
             }
 
-            XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(fURIStringPool->getValueForId(subsElemURI));
-            Janitor<XMLSchemaDescription> janName(gramDesc);
-            SchemaGrammar* aGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(gramDesc);
+            SchemaGrammar* aGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(fURIStringPool->getValueForId(subsElemURI));
 
             if (!aGrammar)
                 return;
@@ -6651,9 +6633,7 @@ XercesGroupInfo* TraverseSchema::processGroupRef(const DOMElement* const elem,
             return 0;
         }
 
-        XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(uriStr);
-        Janitor<XMLSchemaDescription> janName(gramDesc);
-        Grammar* aGrammar = fGrammarResolver->getGrammar(gramDesc);
+        Grammar* aGrammar = fGrammarResolver->getGrammar(uriStr);
 
         if (!aGrammar || aGrammar->getGrammarType() != Grammar::SchemaGrammarType) {
 
@@ -6837,10 +6817,7 @@ void TraverseSchema::processElements(const DOMElement* const elem,
             if (elemScope != Grammar::TOP_LEVEL_SCOPE) {
 
                 if (elemURI != fTargetNSURI && elemURI != schemaURI && elemURI != fEmptyNamespaceURI) {
-
-                    XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(fURIStringPool->getValueForId(elemURI));
-                    Janitor<XMLSchemaDescription> janName(gramDesc);
-                    Grammar* aGrammar = fGrammarResolver->getGrammar(gramDesc);
+                    Grammar* aGrammar = fGrammarResolver->getGrammar(fURIStringPool->getValueForId(elemURI));
 
                     if (!aGrammar || aGrammar->getGrammarType() != Grammar::SchemaGrammarType) {
                         continue; // REVISIT - error message
@@ -7624,7 +7601,7 @@ bool TraverseSchema::openRedefinedSchema(const DOMElement* const redefineElem) {
         // Update schema information with redefined schema
         // --------------------------------------------------------
         redefSchemaInfo = fSchemaInfo;
-        fSchemaInfo = new (fGrammarPoolMemoryManager) SchemaInfo(0, 0, 0, fTargetNSURI, fScopeCount,
+        fSchemaInfo = new (fMemoryManager) SchemaInfo(0, 0, 0, fTargetNSURI, fScopeCount,
                                      fNamespaceScope->increaseDepth(),
                                      XMLString::replicate(includeURL, fGrammarPoolMemoryManager),
                                      fTargetNSURIString, root,
diff --git a/src/xercesc/validators/schema/XMLSchemaDescriptionImpl.cpp b/src/xercesc/validators/schema/XMLSchemaDescriptionImpl.cpp
index d9146ec6a..e2b67e740 100644
--- a/src/xercesc/validators/schema/XMLSchemaDescriptionImpl.cpp
+++ b/src/xercesc/validators/schema/XMLSchemaDescriptionImpl.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.3  2003/07/31 17:14:27  peiyongz
+ * Grammar embed grammar description
+ *
  * Revision 1.2  2003/06/20 22:19:12  peiyongz
  * Stateless Grammar Pool :: Part I
  *
@@ -71,6 +74,7 @@
 //  Includes
 // ---------------------------------------------------------------------------
 #include <xercesc/validators/schema/XMLSchemaDescriptionImpl.hpp>
+#include <xercesc/util/QName.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -90,8 +94,10 @@ XMLSchemaDescriptionImpl::XMLSchemaDescriptionImpl(const XMLCh* const   targetNa
     if (targetNamespace)
         fNamespace = XMLString::replicate(targetNamespace, memMgr);
 
+
+    fLocationHints =  new (memMgr) RefArrayVectorOf<XMLCh>(4, true, memMgr);
+
     /***
-        fLocationHints
         fAttributes
     ***/
 }
@@ -110,9 +116,6 @@ XMLSchemaDescriptionImpl::~XMLSchemaDescriptionImpl()
     if (fEnclosingElementName)
         delete fEnclosingElementName;
 
-    if (fAttributes)
-        delete fAttributes;
-
 }
 
 const XMLCh* XMLSchemaDescriptionImpl::getGrammarKey() const
@@ -163,12 +166,9 @@ void XMLSchemaDescriptionImpl::setTargetNamespace(const XMLCh* const newNamespac
     fNamespace = XMLString::replicate(newNamespace, XMLGrammarDescription::getMemoryManager()); 
 }
 
-void XMLSchemaDescriptionImpl::setLocationHints(RefArrayVectorOf<XMLCh> *hints)
-{  
-    if (fLocationHints)
-        delete fLocationHints;
-                                
-    fLocationHints = hints; 
+void XMLSchemaDescriptionImpl::setLocationHints(const XMLCh* const hint)
+{    
+    fLocationHints->addElement(XMLString::replicate(hint, XMLGrammarDescription::getMemoryManager())); 
 }
 
 void XMLSchemaDescriptionImpl::setTriggeringComponent(QName* const trigComponent)
@@ -176,7 +176,7 @@ void XMLSchemaDescriptionImpl::setTriggeringComponent(QName* const trigComponent
     if ( fTriggeringComponent)
         delete fTriggeringComponent;
                                 
-    fTriggeringComponent = trigComponent; 
+    fTriggeringComponent = new QName(*trigComponent); 
 
 }
 
@@ -185,15 +185,14 @@ void XMLSchemaDescriptionImpl::setEnclosingElementName(QName* const encElement)
     if (fEnclosingElementName)
         delete fEnclosingElementName;
                                  
-    fEnclosingElementName = encElement; 
+    fEnclosingElementName = new QName(*encElement); 
 
 }
 
 void XMLSchemaDescriptionImpl::setAttributes(XMLAttDef* const attDefs)
 { 
-    if (fAttributes)
-        delete fAttributes;
-                             
+    // XMLAttDef is part of the grammar that this description refers to
+    // so we reference to it instead of adopting/owning/cloning.
     fAttributes = attDefs; 
 }
 
diff --git a/src/xercesc/validators/schema/XMLSchemaDescriptionImpl.hpp b/src/xercesc/validators/schema/XMLSchemaDescriptionImpl.hpp
index dbd0763d6..50252de36 100644
--- a/src/xercesc/validators/schema/XMLSchemaDescriptionImpl.hpp
+++ b/src/xercesc/validators/schema/XMLSchemaDescriptionImpl.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.2  2003/07/31 17:14:27  peiyongz
+ * Grammar embed grammar description
+ *
  * Revision 1.1  2003/06/20 18:40:29  peiyongz
  * Stateless Grammar Pool :: Part I
  *
@@ -156,7 +159,7 @@ public :
       * setLocationHints
       *
       */	
-    virtual void                   setLocationHints(RefArrayVectorOf<XMLCh>* const);
+    virtual void                   setLocationHints(const XMLCh* const);
 
     /**
       * setTriggeringComponent
@@ -195,15 +198,15 @@ private :
     //
     //  fContextType  
     //
-    //  fNamespace
+    //  fNamespace            owned
     //
-    //  fLocationHints
+    //  fLocationHints        owned
     //
-    //  fTriggeringComponent
+    //  fTriggeringComponent  owned
     //
-    //  fEnclosingElementName
+    //  fEnclosingElementName owned
     //                       
-    //  fAttributes
+    //  fAttributes           referenced
     //
     // -----------------------------------------------------------------------
 
-- 
GitLab