Author: borisk
Date: Fri Nov 20 11:06:01 2009
New Revision: 882501
URL: http://svn.apache.org/viewvc?rev=882501&view=rev
Log:
Make sure that imported schemas, as well as those loaded with loadGrammar
or via the schemaLocation attributes get taken into account when we decide
whether the schema in question has already been loaded.
Modified:
xerces/c/trunk/src/xercesc/internal/IGXMLScanner.cpp
xerces/c/trunk/src/xercesc/internal/IGXMLScanner.hpp
xerces/c/trunk/src/xercesc/internal/IGXMLScanner2.cpp
xerces/c/trunk/src/xercesc/internal/SGXMLScanner.cpp
xerces/c/trunk/src/xercesc/internal/SGXMLScanner.hpp
xerces/c/trunk/src/xercesc/validators/schema/TraverseSchema.cpp
xerces/c/trunk/src/xercesc/validators/schema/TraverseSchema.hpp
Modified: xerces/c/trunk/src/xercesc/internal/IGXMLScanner.cpp
URL:
http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/internal/IGXMLScanner.cpp?rev=882501&r1=882500&r2=882501&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/internal/IGXMLScanner.cpp (original)
+++ xerces/c/trunk/src/xercesc/internal/IGXMLScanner.cpp Fri Nov 20 11:06:01
2009
@@ -83,6 +83,8 @@
, fModel(0)
, fPSVIElement(0)
, fErrorStack(0)
+ , fSchemaInfoList(0)
+ , fCachedSchemaInfoList (0)
{
CleanupType cleanup(this, &IGXMLScanner::cleanUp);
@@ -134,6 +136,8 @@
, fModel(0)
, fPSVIElement(0)
, fErrorStack(0)
+ , fSchemaInfoList(0)
+ , fCachedSchemaInfoList (0)
{
CleanupType cleanup(this, &IGXMLScanner::cleanUp);
@@ -542,6 +546,9 @@
fUndeclaredAttrRegistry = new (fMemoryManager)
Hash2KeysSetOf<StringHasher>(7, fMemoryManager);
fPSVIAttrList = new (fMemoryManager) PSVIAttributeList(fMemoryManager);
+ fSchemaInfoList = new (fMemoryManager) RefHash2KeysTableOf<SchemaInfo>(29,
fMemoryManager);
+ fCachedSchemaInfoList = new (fMemoryManager)
RefHash2KeysTableOf<SchemaInfo>(29, fMemoryManager);
+
// use fDTDValidator as the default validator
if (!fValidator)
fValidator = fDTDValidator;
@@ -564,6 +571,8 @@
delete fPSVIAttrList;
delete fPSVIElement;
delete fErrorStack;
+ delete fSchemaInfoList;
+ delete fCachedSchemaInfoList;
}
// ---------------------------------------------------------------------------
Modified: xerces/c/trunk/src/xercesc/internal/IGXMLScanner.hpp
URL:
http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/internal/IGXMLScanner.hpp?rev=882501&r1=882500&r2=882501&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/internal/IGXMLScanner.hpp (original)
+++ xerces/c/trunk/src/xercesc/internal/IGXMLScanner.hpp Fri Nov 20 11:06:01
2009
@@ -25,9 +25,11 @@
#include <xercesc/internal/XMLScanner.hpp>
#include <xercesc/util/KVStringPair.hpp>
#include <xercesc/util/NameIdPool.hpp>
+#include <xercesc/util/RefHash2KeysTableOf.hpp>
#include <xercesc/util/RefHash3KeysIdPool.hpp>
#include <xercesc/util/Hash2KeysSetOf.hpp>
#include <xercesc/validators/common/Grammar.hpp>
+#include <xercesc/validators/schema/SchemaInfo.hpp>
#include <xercesc/validators/schema/SchemaElementDecl.hpp>
XERCES_CPP_NAMESPACE_BEGIN
@@ -248,9 +250,13 @@
// start tag where they were utilized.
// fUndeclaredAttrRegistry
// set of attr QNames to detect duplicates
- // fPSVIAttrList
+ // fPSVIAttrList
// PSVI attribute list implementation that needs to be
// filled when a PSVIHandler is registered
+ // fSchemaInfoList
+ // Transient schema info list that is passed to TraverseSchema
instances.
+ // fCachedSchemaInfoList
+ // Cached Schema info list that is passed to TraverseSchema instances.
//
// -----------------------------------------------------------------------
bool fSeeXsi;
@@ -277,6 +283,8 @@
PSVIElement* fPSVIElement;
ValueStackOf<bool>* fErrorStack;
PSVIElemContext fPSVIElemContext;
+ RefHash2KeysTableOf<SchemaInfo>* fSchemaInfoList;
+ RefHash2KeysTableOf<SchemaInfo>* fCachedSchemaInfoList;
};
inline const XMLCh* IGXMLScanner::getName() const
Modified: xerces/c/trunk/src/xercesc/internal/IGXMLScanner2.cpp
URL:
http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/internal/IGXMLScanner2.cpp?rev=882501&r1=882500&r2=882501&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/internal/IGXMLScanner2.cpp (original)
+++ xerces/c/trunk/src/xercesc/internal/IGXMLScanner2.cpp Fri Nov 20 11:06:01
2009
@@ -24,7 +24,6 @@
// it a little more readable.
// ---------------------------------------------------------------------------
-
// ---------------------------------------------------------------------------
// Includes
// ---------------------------------------------------------------------------
@@ -1148,7 +1147,6 @@
// upon successful return from here we are ready to go.
void IGXMLScanner::scanReset(const InputSource& src)
{
-
// This call implicitly tells us that we are going to reuse the scanner
// if it was previously used. So tell the validator to reset itself.
//
@@ -1159,6 +1157,10 @@
fGrammarResolver->cacheGrammarFromParse(fToCacheGrammar);
fGrammarResolver->useCachedGrammarInParse(fUseCachedGrammar);
+ // Clear transient schema info list.
+ //
+ fSchemaInfoList->removeAll ();
+
// fModel may need updating, as fGrammarResolver could have cleaned it
if(fModel && getPSVIHandler())
fModel = fGrammarResolver->getXSModel();
@@ -1739,9 +1741,13 @@
// If multi-import is enabled, make sure the existing grammar came
// from the import directive. Otherwise we may end up reloading
- // the same schema that was previously loaded with loadGrammar, etc.
+ // the same schema that came from the external grammar pool. Ideally,
+ // we would move fSchemaInfoList to XMLGrammarPool so that it survives
+ // the destruction of the scanner in which case we could rely on the
+ // same logic we use to weed out duplicate schemas below.
//
- if (!grammar || grammar->getGrammarType() == Grammar::DTDGrammarType ||
+ if (!grammar ||
+ grammar->getGrammarType() == Grammar::DTDGrammarType ||
(getHandleMultipleImports() &&
((XMLSchemaDescription*)grammar->getGrammarDescription())->
getContextType () == XMLSchemaDescription::CONTEXT_IMPORT))
@@ -1826,6 +1832,26 @@
// Put a janitor on the input source
Janitor<InputSource> janSrc(srcToFill);
+ // Check if this exact schema has already been seen.
+ //
+ const XMLCh* sysId = srcToFill->getSystemId();
+ unsigned int uriId = (uri && *uri) ? fURIStringPool->addOrFind(uri) :
fEmptyNamespaceId;
+ SchemaInfo* importSchemaInfo = 0;
+
+ if (fUseCachedGrammar)
+ importSchemaInfo = fCachedSchemaInfoList->get(sysId, uriId);
+
+ if (!importSchemaInfo && !fToCacheGrammar)
+ importSchemaInfo = fSchemaInfoList->get(sysId, uriId);
+
+ if (importSchemaInfo)
+ {
+ // We haven't added any new grammars so it is safe to just
+ // return.
+ //
+ return;
+ }
+
// Should just issue warning if the schema is not found
bool flag = srcToFill->getIssueFatalErrorIfNotFound();
srcToFill->setIssueFatalErrorIfNotFound(false);
@@ -1846,19 +1872,38 @@
if (root != 0)
{
const XMLCh* newUri =
root->getAttribute(SchemaSymbols::fgATT_TARGETNAMESPACE);
+ bool newGrammar = false;
if (!XMLString::equals(newUri, uri)) {
if (fValidate || fValScheme == Val_Auto) {
fValidator->emitError(XMLValid::WrongTargetNamespace,
loc, uri);
}
grammar = fGrammarResolver->getGrammar(newUri);
+ newGrammar = true;
}
- if (!grammar || grammar->getGrammarType() ==
Grammar::DTDGrammarType ||
+ if (!grammar ||
+ grammar->getGrammarType() == Grammar::DTDGrammarType ||
(getHandleMultipleImports() &&
- ((XMLSchemaDescription*)
grammar->getGrammarDescription())->
+
((XMLSchemaDescription*)grammar->getGrammarDescription())->
getContextType () ==
XMLSchemaDescription::CONTEXT_IMPORT))
{
+ // If we switched namespace URI, recheck the schema info.
+ //
+ if (newGrammar)
+ {
+ unsigned int newUriId = (newUri && *newUri) ?
fURIStringPool->addOrFind(newUri) : fEmptyNamespaceId;
+
+ if (fUseCachedGrammar)
+ importSchemaInfo = fCachedSchemaInfoList->get(sysId,
newUriId);
+
+ if (!importSchemaInfo && !fToCacheGrammar)
+ importSchemaInfo = fSchemaInfoList->get(sysId,
newUriId);
+
+ if (importSchemaInfo)
+ return;
+ }
+
// Since we have seen a grammar, set our validation flag
// at this point if the validation scheme is auto
if (fValScheme == Val_Auto && !fValidate) {
@@ -1892,7 +1937,7 @@
XMLSchemaDescription* gramDesc = (XMLSchemaDescription*)
schemaGrammar->getGrammarDescription();
gramDesc->setContextType(XMLSchemaDescription::CONTEXT_PREPARSE);
- gramDesc->setLocationHints(srcToFill->getSystemId());
+ gramDesc->setLocationHints(sysId);
TraverseSchema traverseSchema
(
@@ -1900,8 +1945,10 @@
, fURIStringPool
, schemaGrammar
, fGrammarResolver
+ , fUseCachedGrammar ? fCachedSchemaInfoList :
fSchemaInfoList
+ , fToCacheGrammar ? fCachedSchemaInfoList :
fSchemaInfoList
, this
- , srcToFill->getSystemId()
+ , sysId
, fEntityHandler
, fErrorReporter
, fMemoryManager
@@ -2083,49 +2130,69 @@
const XMLCh* nsUri =
root->getAttribute(SchemaSymbols::fgATT_TARGETNAMESPACE);
Grammar* grammar = fGrammarResolver->getGrammar(nsUri);
- bool grammarFound = grammar &&
- grammar->getGrammarType() == Grammar::SchemaGrammarType &&
- getHandleMultipleImports();
+ // Check if this exact schema has already been seen.
+ //
+ const XMLCh* sysId = src.getSystemId();
+ SchemaInfo* importSchemaInfo = 0;
- SchemaGrammar* schemaGrammar;
+ if (grammar)
+ {
+ if (nsUri && *nsUri)
+ importSchemaInfo = fCachedSchemaInfoList->get(sysId,
fURIStringPool->addOrFind(nsUri));
+ else
+ importSchemaInfo = fCachedSchemaInfoList->get(sysId,
fEmptyNamespaceId);
+ }
- if (grammarFound)
- schemaGrammar = (SchemaGrammar*) grammar;
- else
- schemaGrammar = new (fGrammarPoolMemoryManager)
SchemaGrammar(fGrammarPoolMemoryManager);
+ if (!importSchemaInfo)
+ {
+ bool grammarFound = grammar &&
+ grammar->getGrammarType() == Grammar::SchemaGrammarType &&
+ getHandleMultipleImports();
- XMLSchemaDescription* gramDesc = (XMLSchemaDescription*)
schemaGrammar->getGrammarDescription();
- gramDesc->setContextType(XMLSchemaDescription::CONTEXT_PREPARSE);
- gramDesc->setLocationHints(src.getSystemId());
+ SchemaGrammar* schemaGrammar;
- TraverseSchema traverseSchema
- (
- root
- , fURIStringPool
- , schemaGrammar
- , fGrammarResolver
- , this
- , src.getSystemId()
- , fEntityHandler
- , fErrorReporter
- , fMemoryManager
- , grammarFound
- );
+ if (grammarFound)
+ schemaGrammar = (SchemaGrammar*) grammar;
+ else
+ schemaGrammar = new (fGrammarPoolMemoryManager)
SchemaGrammar(fGrammarPoolMemoryManager);
+
+ XMLSchemaDescription* gramDesc = (XMLSchemaDescription*)
schemaGrammar->getGrammarDescription();
+ gramDesc->setContextType(XMLSchemaDescription::CONTEXT_PREPARSE);
+ gramDesc->setLocationHints(sysId);
+
+ TraverseSchema traverseSchema
+ (
+ root
+ , fURIStringPool
+ , schemaGrammar
+ , fGrammarResolver
+ , fCachedSchemaInfoList
+ , toCache ? fCachedSchemaInfoList : fSchemaInfoList
+ , this
+ , sysId
+ , fEntityHandler
+ , fErrorReporter
+ , fMemoryManager
+ , grammarFound
+ );
+
+ grammar = schemaGrammar;
+ }
if (fValidate) {
- // validate the Schema scan so far
- fValidator->setGrammar(schemaGrammar);
- fValidator->preContentValidation(false, true);
+ // validate the Schema scan so far
+ fValidator->setGrammar(grammar);
+ fValidator->preContentValidation(false, true);
}
if (toCache) {
- fGrammarResolver->cacheGrammars();
+ fGrammarResolver->cacheGrammars();
}
if(getPSVIHandler())
- fModel = fGrammarResolver->getXSModel();
+ fModel = fGrammarResolver->getXSModel();
- return schemaGrammar;
+ return grammar;
}
}
Modified: xerces/c/trunk/src/xercesc/internal/SGXMLScanner.cpp
URL:
http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/internal/SGXMLScanner.cpp?rev=882501&r1=882500&r2=882501&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/internal/SGXMLScanner.cpp (original)
+++ xerces/c/trunk/src/xercesc/internal/SGXMLScanner.cpp Fri Nov 20 11:06:01
2009
@@ -89,6 +89,8 @@
, fModel(0)
, fPSVIElement(0)
, fErrorStack(0)
+ , fSchemaInfoList(0)
+ , fCachedSchemaInfoList(0)
{
CleanupType cleanup(this, &SGXMLScanner::cleanUp);
@@ -138,6 +140,8 @@
, fModel(0)
, fPSVIElement(0)
, fErrorStack(0)
+ , fSchemaInfoList(0)
+ , fCachedSchemaInfoList(0)
{
CleanupType cleanup(this, &SGXMLScanner::cleanUp);
@@ -1972,6 +1976,9 @@
fUndeclaredAttrRegistry = new (fMemoryManager)
Hash2KeysSetOf<StringHasher>(7, fMemoryManager);
fPSVIAttrList = new (fMemoryManager) PSVIAttributeList(fMemoryManager);
+ fSchemaInfoList = new (fMemoryManager) RefHash2KeysTableOf<SchemaInfo>(29,
fMemoryManager);
+ fCachedSchemaInfoList = new (fMemoryManager)
RefHash2KeysTableOf<SchemaInfo>(29, fMemoryManager);
+
if (fValidator)
{
if (!fValidator->handlesSchema())
@@ -2002,6 +2009,9 @@
if (fErrorStack)
delete fErrorStack;
+
+ delete fSchemaInfoList;
+ delete fCachedSchemaInfoList;
}
void SGXMLScanner::resizeElemState() {
@@ -3041,6 +3051,10 @@
fGrammarResolver->cacheGrammarFromParse(fToCacheGrammar);
fGrammarResolver->useCachedGrammarInParse(fUseCachedGrammar);
+ // Clear transient schema info list.
+ //
+ fSchemaInfoList->removeAll ();
+
// fModel may need updating, as fGrammarResolver could have cleaned it
if(fModel && getPSVIHandler())
fModel = fGrammarResolver->getXSModel();
@@ -3544,7 +3558,10 @@
// If multi-import is enabled, make sure the existing grammar came
// from the import directive. Otherwise we may end up reloading
- // the same schema that was previously loaded with loadGrammar, etc.
+ // the same schema that came from the external grammar pool. Ideally,
+ // we would move fSchemaInfoList to XMLGrammarPool so that it survives
+ // the destruction of the scanner in which case we could rely on the
+ // same logic we use to weed out duplicate schemas below.
//
if (!grammar || grammar->getGrammarType() == Grammar::DTDGrammarType ||
(getHandleMultipleImports() &&
@@ -3632,6 +3649,26 @@
// Put a janitor on the input source
Janitor<InputSource> janSrc(srcToFill);
+ // Check if this exact schema has already been seen.
+ //
+ const XMLCh* sysId = srcToFill->getSystemId();
+ unsigned int uriId = (uri && *uri) ? fURIStringPool->addOrFind(uri) :
fEmptyNamespaceId;
+ SchemaInfo* importSchemaInfo = 0;
+
+ if (fUseCachedGrammar)
+ importSchemaInfo = fCachedSchemaInfoList->get(sysId, uriId);
+
+ if (!importSchemaInfo && !fToCacheGrammar)
+ importSchemaInfo = fSchemaInfoList->get(sysId, uriId);
+
+ if (importSchemaInfo)
+ {
+ // We haven't added any new grammars so it is safe to just
+ // return.
+ //
+ return;
+ }
+
// Should just issue warning if the schema is not found
bool flag = srcToFill->getIssueFatalErrorIfNotFound();
srcToFill->setIssueFatalErrorIfNotFound(false);
@@ -3652,19 +3689,38 @@
if (root != 0)
{
const XMLCh* newUri =
root->getAttribute(SchemaSymbols::fgATT_TARGETNAMESPACE);
+ bool newGrammar = false;
if (!XMLString::equals(newUri, uri)) {
if (fValidate || fValScheme == Val_Auto) {
fValidator->emitError(XMLValid::WrongTargetNamespace,
loc, uri);
}
grammar = fGrammarResolver->getGrammar(newUri);
+ newGrammar = true;
}
- if (!grammar || grammar->getGrammarType() ==
Grammar::DTDGrammarType ||
+ if (!grammar ||
+ grammar->getGrammarType() == Grammar::DTDGrammarType ||
(getHandleMultipleImports() &&
((XMLSchemaDescription*)
grammar->getGrammarDescription())->
getContextType () ==
XMLSchemaDescription::CONTEXT_IMPORT))
{
+ // If we switched namespace URI, recheck the schema info.
+ //
+ if (newGrammar)
+ {
+ unsigned int newUriId = (newUri && *newUri) ?
fURIStringPool->addOrFind(newUri) : fEmptyNamespaceId;
+
+ if (fUseCachedGrammar)
+ importSchemaInfo = fCachedSchemaInfoList->get(sysId,
newUriId);
+
+ if (!importSchemaInfo && !fToCacheGrammar)
+ importSchemaInfo = fSchemaInfoList->get(sysId,
newUriId);
+
+ if (importSchemaInfo)
+ return;
+ }
+
// Since we have seen a grammar, set our validation flag
// at this point if the validation scheme is auto
if (fValScheme == Val_Auto && !fValidate) {
@@ -3687,7 +3743,7 @@
XMLSchemaDescription* gramDesc = (XMLSchemaDescription*)
schemaGrammar->getGrammarDescription();
gramDesc->setContextType(XMLSchemaDescription::CONTEXT_PREPARSE);
- gramDesc->setLocationHints(srcToFill->getSystemId());
+ gramDesc->setLocationHints(sysId);
TraverseSchema traverseSchema
(
@@ -3695,8 +3751,10 @@
, fURIStringPool
, schemaGrammar
, fGrammarResolver
+ , fUseCachedGrammar ? fCachedSchemaInfoList :
fSchemaInfoList
+ , fToCacheGrammar ? fCachedSchemaInfoList :
fSchemaInfoList
, this
- , srcToFill->getSystemId()
+ , sysId
, fEntityHandler
, fErrorReporter
, fMemoryManager
@@ -3859,49 +3917,69 @@
const XMLCh* nsUri =
root->getAttribute(SchemaSymbols::fgATT_TARGETNAMESPACE);
Grammar* grammar = fGrammarResolver->getGrammar(nsUri);
- bool grammarFound = grammar &&
- grammar->getGrammarType() == Grammar::SchemaGrammarType &&
- getHandleMultipleImports();
+ // Check if this exact schema has already been seen.
+ //
+ const XMLCh* sysId = src.getSystemId();
+ SchemaInfo* importSchemaInfo = 0;
- SchemaGrammar* schemaGrammar;
+ if (grammar)
+ {
+ if (nsUri && *nsUri)
+ importSchemaInfo = fCachedSchemaInfoList->get(sysId,
fURIStringPool->addOrFind(nsUri));
+ else
+ importSchemaInfo = fCachedSchemaInfoList->get(sysId,
fEmptyNamespaceId);
+ }
- if (grammarFound)
- schemaGrammar = (SchemaGrammar*) grammar;
- else
- schemaGrammar = new (fGrammarPoolMemoryManager)
SchemaGrammar(fGrammarPoolMemoryManager);
+ if (!importSchemaInfo)
+ {
+ bool grammarFound = grammar &&
+ grammar->getGrammarType() == Grammar::SchemaGrammarType &&
+ getHandleMultipleImports();
- XMLSchemaDescription* gramDesc = (XMLSchemaDescription*)
schemaGrammar->getGrammarDescription();
- gramDesc->setContextType(XMLSchemaDescription::CONTEXT_PREPARSE);
- gramDesc->setLocationHints(src.getSystemId());
+ SchemaGrammar* schemaGrammar;
- TraverseSchema traverseSchema
- (
- root
- , fURIStringPool
- , schemaGrammar
- , fGrammarResolver
- , this
- , src.getSystemId()
- , fEntityHandler
- , fErrorReporter
- , fMemoryManager
- , grammarFound
- );
+ if (grammarFound)
+ schemaGrammar = (SchemaGrammar*) grammar;
+ else
+ schemaGrammar = new (fGrammarPoolMemoryManager)
SchemaGrammar(fGrammarPoolMemoryManager);
+
+ XMLSchemaDescription* gramDesc = (XMLSchemaDescription*)
schemaGrammar->getGrammarDescription();
+ gramDesc->setContextType(XMLSchemaDescription::CONTEXT_PREPARSE);
+ gramDesc->setLocationHints(sysId);
+
+ TraverseSchema traverseSchema
+ (
+ root
+ , fURIStringPool
+ , schemaGrammar
+ , fGrammarResolver
+ , fCachedSchemaInfoList
+ , toCache ? fCachedSchemaInfoList : fSchemaInfoList
+ , this
+ , sysId
+ , fEntityHandler
+ , fErrorReporter
+ , fMemoryManager
+ , grammarFound
+ );
+
+ grammar = schemaGrammar;
+ }
if (fValidate) {
- // validate the Schema scan so far
- fValidator->setGrammar(schemaGrammar);
- fValidator->preContentValidation(false, true);
+ // validate the Schema scan so far
+ fValidator->setGrammar(grammar);
+ fValidator->preContentValidation(false, true);
}
if (toCache) {
- fGrammarResolver->cacheGrammars();
+ fGrammarResolver->cacheGrammars();
}
if(getPSVIHandler())
- fModel = fGrammarResolver->getXSModel();
+ fModel = fGrammarResolver->getXSModel();
- return schemaGrammar;
+ return grammar;
}
}
Modified: xerces/c/trunk/src/xercesc/internal/SGXMLScanner.hpp
URL:
http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/internal/SGXMLScanner.hpp?rev=882501&r1=882500&r2=882501&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/internal/SGXMLScanner.hpp (original)
+++ xerces/c/trunk/src/xercesc/internal/SGXMLScanner.hpp Fri Nov 20 11:06:01
2009
@@ -25,9 +25,11 @@
#include <xercesc/internal/XMLScanner.hpp>
#include <xercesc/util/KVStringPair.hpp>
#include <xercesc/util/ValueHashTableOf.hpp>
+#include <xercesc/util/RefHash2KeysTableOf.hpp>
#include <xercesc/util/RefHash3KeysIdPool.hpp>
#include <xercesc/util/Hash2KeysSetOf.hpp>
#include <xercesc/validators/common/Grammar.hpp>
+#include <xercesc/validators/schema/SchemaInfo.hpp>
#include <xercesc/validators/schema/SchemaElementDecl.hpp>
@@ -163,9 +165,13 @@
// start tag where they were utilized.
// fUndeclaredAttrRegistry
// set of namespaceId/localName pairs to detect duplicates
- // fPSVIAttrList
+ // fPSVIAttrList
// PSVI attribute list implementation that needs to be
// filled when a PSVIHandler is registered
+ // fSchemaInfoList
+ // Transient schema info list that is passed to TraverseSchema
instances.
+ // fCachedSchemaInfoList
+ // Cached Schema info list that is passed to TraverseSchema instances.
//
// -----------------------------------------------------------------------
bool fSeeXsi;
@@ -190,6 +196,8 @@
PSVIElement* fPSVIElement;
ValueStackOf<bool>* fErrorStack;
PSVIElemContext fPSVIElemContext;
+ RefHash2KeysTableOf<SchemaInfo>* fSchemaInfoList;
+ RefHash2KeysTableOf<SchemaInfo>* fCachedSchemaInfoList;
private :
// -----------------------------------------------------------------------
Modified: xerces/c/trunk/src/xercesc/validators/schema/TraverseSchema.cpp
URL:
http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/validators/schema/TraverseSchema.cpp?rev=882501&r1=882500&r2=882501&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/validators/schema/TraverseSchema.cpp (original)
+++ xerces/c/trunk/src/xercesc/validators/schema/TraverseSchema.cpp Fri Nov 20
11:06:01 2009
@@ -156,6 +156,8 @@
, XMLStringPool* const uriStringPool
, SchemaGrammar* const schemaGrammar
, GrammarResolver* const grammarResolver
+ , RefHash2KeysTableOf<SchemaInfo>*
cachedSchemaInfoList
+ , RefHash2KeysTableOf<SchemaInfo>* schemaInfoList
, XMLScanner* const xmlScanner
, const XMLCh* const schemaURL
, XMLEntityHandler* const entityHandler
@@ -201,7 +203,8 @@
, fRedefineComponents(0)
, fIdentityConstraintNames(0)
, fValidSubstitutionGroups(0)
- , fSchemaInfoList(0)
+ , fSchemaInfoList(schemaInfoList)
+ , fCachedSchemaInfoList (cachedSchemaInfoList)
, fParser(0)
, fLocator(0)
, fMemoryManager(manager)
@@ -608,7 +611,10 @@
}
const XMLCh* includeURL = srcToFill->getSystemId();
- SchemaInfo* includeSchemaInfo = fSchemaInfoList->get(includeURL,
fTargetNSURI);
+ SchemaInfo* includeSchemaInfo = fCachedSchemaInfoList->get(includeURL,
fTargetNSURI);
+
+ if (!includeSchemaInfo && fSchemaInfoList != fCachedSchemaInfoList)
+ includeSchemaInfo = fSchemaInfoList->get(includeURL, fTargetNSURI);
if (includeSchemaInfo) {
@@ -760,6 +766,11 @@
}
// ------------------------------------------------------------------
+ // Get 'schemaLocation' attribute
+ // ------------------------------------------------------------------
+ const XMLCh* schemaLocation = getElementAttValue(elem,
SchemaSymbols::fgATT_SCHEMALOCATION, DatatypeValidator::AnyURI);
+
+ // ------------------------------------------------------------------
// Resolve namespace to a grammar
// ------------------------------------------------------------------
Grammar* aGrammar = 0;
@@ -768,7 +779,7 @@
XMLSchemaDescription* gramDesc
=fGrammarResolver->getGrammarPool()->createSchemaDescription(nameSpaceValue);
Janitor<XMLSchemaDescription> janName(gramDesc);
gramDesc->setContextType(XMLSchemaDescription::CONTEXT_IMPORT);
- gramDesc->setLocationHints(getElementAttValue(elem,
SchemaSymbols::fgATT_SCHEMALOCATION, DatatypeValidator::AnyURI));
+ gramDesc->setLocationHints(schemaLocation);
aGrammar = fGrammarResolver->getGrammar(gramDesc);
}
@@ -778,11 +789,6 @@
addImportedNS(fURIStringPool->addOrFind(nameSpaceValue));
}
- // ------------------------------------------------------------------
- // Get 'schemaLocation' attribute
- // ------------------------------------------------------------------
- const XMLCh* schemaLocation = getElementAttValue(elem,
SchemaSymbols::fgATT_SCHEMALOCATION, DatatypeValidator::AnyURI);
-
// a bare <xs:import/> doesn't load anything
if(!schemaLocation && !nameSpace)
return;
@@ -807,15 +813,14 @@
Janitor<InputSource> janSrc(srcToFill);
const XMLCh* importURL = srcToFill->getSystemId();
- SchemaInfo* importSchemaInfo = 0;
+ unsigned int nameSpaceId = nameSpace ?
fURIStringPool->addOrFind(nameSpace) : fEmptyNamespaceURI;
- if (nameSpace)
- importSchemaInfo = fSchemaInfoList->get(importURL,
fURIStringPool->addOrFind(nameSpace));
- else
- importSchemaInfo = fSchemaInfoList->get(importURL, fEmptyNamespaceURI);
+ SchemaInfo* importSchemaInfo = fCachedSchemaInfoList->get(importURL,
nameSpaceId);
- if (importSchemaInfo) {
+ if (!importSchemaInfo && fSchemaInfoList != fCachedSchemaInfoList)
+ importSchemaInfo = fSchemaInfoList->get(importURL, nameSpaceId);
+ if (importSchemaInfo) {
fSchemaInfo->addSchemaInfo(importSchemaInfo, SchemaInfo::IMPORT);
addImportedNS(importSchemaInfo->getTargetNSURI());
return;
@@ -8150,7 +8155,10 @@
return false;
}
- SchemaInfo* redefSchemaInfo = fSchemaInfoList->get(includeURL,
fTargetNSURI);
+ SchemaInfo* redefSchemaInfo = fCachedSchemaInfoList->get(includeURL,
fTargetNSURI);
+
+ if (!redefSchemaInfo && fSchemaInfoList != fCachedSchemaInfoList)
+ redefSchemaInfo = fSchemaInfoList->get(includeURL, fTargetNSURI);
if (redefSchemaInfo) {
@@ -8714,7 +8722,6 @@
fNonXSAttList = new (fMemoryManager) ValueVectorOf<DOMNode*>(4,
fMemoryManager);
fNotationRegistry = new (fMemoryManager) RefHash2KeysTableOf<XMLCh>(13,
(bool) false, fMemoryManager);
- fSchemaInfoList = new (fMemoryManager) RefHash2KeysTableOf<SchemaInfo>(29,
fMemoryManager);
fPreprocessedNodes = new (fMemoryManager) RefHashTableOf<SchemaInfo,
PtrHasher>
(
29
@@ -8727,7 +8734,6 @@
void TraverseSchema::cleanUp() {
- delete fSchemaInfoList;
delete fCurrentTypeNameStack;
delete fCurrentGroupStack;
Modified: xerces/c/trunk/src/xercesc/validators/schema/TraverseSchema.hpp
URL:
http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/validators/schema/TraverseSchema.hpp?rev=882501&r1=882500&r2=882501&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/validators/schema/TraverseSchema.hpp (original)
+++ xerces/c/trunk/src/xercesc/validators/schema/TraverseSchema.hpp Fri Nov 20
11:06:01 2009
@@ -81,6 +81,8 @@
, XMLStringPool* const uriStringPool
, SchemaGrammar* const schemaGrammar
, GrammarResolver* const grammarResolver
+ , RefHash2KeysTableOf<SchemaInfo>* cachedSchemaInfoList
+ , RefHash2KeysTableOf<SchemaInfo>* schemaInfoList
, XMLScanner* const xmlScanner
, const XMLCh* const schemaURL
, XMLEntityHandler* const entityHandler
@@ -770,6 +772,7 @@
RefHash2KeysTableOf<IdentityConstraint>* fIdentityConstraintNames;
RefHash2KeysTableOf<ElemVector>* fValidSubstitutionGroups;
RefHash2KeysTableOf<SchemaInfo>* fSchemaInfoList;
+ RefHash2KeysTableOf<SchemaInfo>* fCachedSchemaInfoList;
XSDDOMParser* fParser;
XSDErrorReporter fXSDErrorReporter;
XSDLocator* fLocator;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]