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]

Reply via email to