Author: borisk
Date: Thu Nov 19 14:57:34 2009
New Revision: 882166
URL: http://svn.apache.org/viewvc?rev=882166&view=rev
Log:
Implement loading of multiple schemas with the same namespace in
loadGrammar() when multi-import is enabled.
Modified:
xerces/c/trunk/src/xercesc/internal/IGXMLScanner2.cpp
xerces/c/trunk/src/xercesc/internal/SGXMLScanner.cpp
Modified: xerces/c/trunk/src/xercesc/internal/IGXMLScanner2.cpp
URL:
http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/internal/IGXMLScanner2.cpp?rev=882166&r1=882165&r2=882166&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/internal/IGXMLScanner2.cpp (original)
+++ xerces/c/trunk/src/xercesc/internal/IGXMLScanner2.cpp Thu Nov 19 14:57:34
2009
@@ -2035,7 +2035,7 @@
// 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 @@
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 @@
(
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;
}
}
Modified: xerces/c/trunk/src/xercesc/internal/SGXMLScanner.cpp
URL:
http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/internal/SGXMLScanner.cpp?rev=882166&r1=882165&r2=882166&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/internal/SGXMLScanner.cpp (original)
+++ xerces/c/trunk/src/xercesc/internal/SGXMLScanner.cpp Thu Nov 19 14:57:34
2009
@@ -3856,8 +3856,21 @@
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 @@
(
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 @@
if(getPSVIHandler())
fModel = fGrammarResolver->getXSModel();
- return grammar;
+ return schemaGrammar;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]