diff --git a/src/xercesc/internal/IGXMLScanner2.cpp b/src/xercesc/internal/IGXMLScanner2.cpp index 33f06fbcf1fee2190e7505f8dfd15b436588845d..8717f81b9d1423ebee0609ec356b7271e43d68b7 100644 --- a/src/xercesc/internal/IGXMLScanner2.cpp +++ b/src/xercesc/internal/IGXMLScanner2.cpp @@ -2035,7 +2035,7 @@ InputSource* IGXMLScanner::resolveSystemId(const XMLCh* const sysId // IGXMLScanner: Private grammar preparsing methods // --------------------------------------------------------------------------- Grammar* IGXMLScanner::loadXMLSchemaGrammar(const InputSource& src, - const bool toCache) + const bool toCache) { // Reset the validators fSchemaValidator->reset(); @@ -2080,8 +2080,21 @@ Grammar* IGXMLScanner::loadXMLSchemaGrammar(const InputSource& src, DOMElement* root = document->getDocumentElement();// This is what we pass to TraverserSchema if (root != 0) { - SchemaGrammar* grammar = new (fGrammarPoolMemoryManager) SchemaGrammar(fGrammarPoolMemoryManager); - XMLSchemaDescription* gramDesc = (XMLSchemaDescription*) grammar->getGrammarDescription(); + const XMLCh* nsUri = root->getAttribute(SchemaSymbols::fgATT_TARGETNAMESPACE); + Grammar* grammar = fGrammarResolver->getGrammar(nsUri); + + bool grammarFound = grammar && + grammar->getGrammarType() == Grammar::SchemaGrammarType && + getHandleMultipleImports(); + + SchemaGrammar* schemaGrammar; + + if (grammarFound) + schemaGrammar = (SchemaGrammar*) grammar; + else + schemaGrammar = new (fGrammarPoolMemoryManager) SchemaGrammar(fGrammarPoolMemoryManager); + + XMLSchemaDescription* gramDesc = (XMLSchemaDescription*) schemaGrammar->getGrammarDescription(); gramDesc->setContextType(XMLSchemaDescription::CONTEXT_PREPARSE); gramDesc->setLocationHints(src.getSystemId()); @@ -2089,28 +2102,30 @@ Grammar* IGXMLScanner::loadXMLSchemaGrammar(const InputSource& src, ( root , fURIStringPool - , grammar + , schemaGrammar , fGrammarResolver , this , src.getSystemId() , fEntityHandler , fErrorReporter , fMemoryManager + , grammarFound ); if (fValidate) { // validate the Schema scan so far - fValidator->setGrammar(grammar); + fValidator->setGrammar(schemaGrammar); fValidator->preContentValidation(false, true); } if (toCache) { fGrammarResolver->cacheGrammars(); } + if(getPSVIHandler()) fModel = fGrammarResolver->getXSModel(); - return grammar; + return schemaGrammar; } } diff --git a/src/xercesc/internal/SGXMLScanner.cpp b/src/xercesc/internal/SGXMLScanner.cpp index c0d9f36f926a269893bd625da3b12114f20ec0b6..46b3668094f81c5f3a61c67ff6cd60d428677f06 100644 --- a/src/xercesc/internal/SGXMLScanner.cpp +++ b/src/xercesc/internal/SGXMLScanner.cpp @@ -3856,8 +3856,21 @@ Grammar* SGXMLScanner::loadXMLSchemaGrammar(const InputSource& src, DOMElement* root = document->getDocumentElement();// This is what we pass to TraverserSchema if (root != 0) { - SchemaGrammar* grammar = new (fGrammarPoolMemoryManager) SchemaGrammar(fGrammarPoolMemoryManager); - XMLSchemaDescription* gramDesc = (XMLSchemaDescription*) grammar->getGrammarDescription(); + const XMLCh* nsUri = root->getAttribute(SchemaSymbols::fgATT_TARGETNAMESPACE); + Grammar* grammar = fGrammarResolver->getGrammar(nsUri); + + bool grammarFound = grammar && + grammar->getGrammarType() == Grammar::SchemaGrammarType && + getHandleMultipleImports(); + + SchemaGrammar* schemaGrammar; + + if (grammarFound) + schemaGrammar = (SchemaGrammar*) grammar; + else + schemaGrammar = new (fGrammarPoolMemoryManager) SchemaGrammar(fGrammarPoolMemoryManager); + + XMLSchemaDescription* gramDesc = (XMLSchemaDescription*) schemaGrammar->getGrammarDescription(); gramDesc->setContextType(XMLSchemaDescription::CONTEXT_PREPARSE); gramDesc->setLocationHints(src.getSystemId()); @@ -3865,18 +3878,19 @@ Grammar* SGXMLScanner::loadXMLSchemaGrammar(const InputSource& src, ( root , fURIStringPool - , (SchemaGrammar*) grammar + , schemaGrammar , fGrammarResolver , this , src.getSystemId() , fEntityHandler , fErrorReporter , fMemoryManager + , grammarFound ); if (fValidate) { // validate the Schema scan so far - fValidator->setGrammar(grammar); + fValidator->setGrammar(schemaGrammar); fValidator->preContentValidation(false, true); } @@ -3887,7 +3901,7 @@ Grammar* SGXMLScanner::loadXMLSchemaGrammar(const InputSource& src, if(getPSVIHandler()) fModel = fGrammarResolver->getXSModel(); - return grammar; + return schemaGrammar; } }