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