Hi,
I'm working on an application which is built against Xerces 2.8.0. This
application subclasses XMLGrammarPoolImpl to provide its own grammar caching
behaviour. In order to control this better it would be convenient if Xerces
would not automatically attempt to load schema grammars if they could not be
located in the grammar pool (as can already be controlled for DTDs).
The first attached patch (load-schema.patch) adds a new property on
SAX2XMLReader and DOMBuilder named XMLUni::fgLoadSchema[1], which controls
this behaviour. Is there a possibility of getting this in the next release
of Xerces?
Secondly, Xerces' SAX2XMLReader and DOMBuilder have a property
XMLUni::fgXercesSchemaFullChecking[2], which controls validation of schema
files themselves. However, even when this property is set, Xerces doesn't
validate the loaded schema files against its schemas. The second attached
patch (schema-checking.patch) should change this. Is the current Xerces
behaviour a bug?
Thanks,
Wouter Coene
[1]. Or "
http://apache.org/xml/features/nonvalidating/load-schema"
[2]. Or "
http://apache.org/xml/features/validation/schema-full-checking"
Index: src/xercesc/parsers/AbstractDOMParser.cpp
===================================================================
--- src/xercesc/parsers/AbstractDOMParser.cpp (revision 1377)
+++ src/xercesc/parsers/AbstractDOMParser.cpp (revision 1379)
@@ -319,6 +319,11 @@
return fScanner->getLoadExternalDTD();
}
+bool AbstractDOMParser::getLoadSchema() const
+{
+ return fScanner->getLoadSchema();
+}
+
bool AbstractDOMParser::getCalculateSrcOfs() const
{
return fScanner->getCalculateSrcOfs();
@@ -442,6 +447,11 @@
fScanner->setLoadExternalDTD(newState);
}
+void AbstractDOMParser::setLoadSchema(const bool newState)
+{
+ fScanner->setLoadSchema(newState);
+}
+
void AbstractDOMParser::setCalculateSrcOfs(const bool newState)
{
fScanner->setCalculateSrcOfs(newState);
Index: src/xercesc/parsers/SAX2XMLReaderImpl.cpp
===================================================================
--- src/xercesc/parsers/SAX2XMLReaderImpl.cpp (revision 1377)
+++ src/xercesc/parsers/SAX2XMLReaderImpl.cpp (revision 1379)
@@ -1300,6 +1300,10 @@
{
fScanner->setLoadExternalDTD(value);
}
+ else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesLoadSchema) == 0)
+ {
+ fScanner->setLoadSchema(value);
+ }
else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesContinueAfterFatalError) == 0)
{
fScanner->setExitOnFirstFatal(!value);
@@ -1374,6 +1378,8 @@
return fScanner->getIdentityConstraintChecking();
else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesLoadExternalDTD) == 0)
return fScanner->getLoadExternalDTD();
+ else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesLoadSchema) == 0)
+ return fScanner->getLoadSchema();
else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesContinueAfterFatalError) == 0)
return !fScanner->getExitOnFirstFatal();
else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesValidationErrorAsFatal) == 0)
Index: src/xercesc/parsers/AbstractDOMParser.hpp
===================================================================
--- src/xercesc/parsers/AbstractDOMParser.hpp (revision 1377)
+++ src/xercesc/parsers/AbstractDOMParser.hpp (revision 1379)
@@ -347,6 +347,18 @@
*/
bool getLoadExternalDTD() const;
+ /** Get the 'Loading Schema' flag
+ *
+ * This method returns the state of the parser's loading schema
+ * flag.
+ *
+ * @return true, if the parser is currently configured to
+ * automatically load schemas, false otherwise.
+ *
+ * @see #setLoadSchema
+ */
+ bool getLoadSchema() const;
+
/** Get the 'create comment node' flag
*
* This method returns the flag that specifies whether the parser is
@@ -748,6 +760,21 @@
*/
void setLoadExternalDTD(const bool newState);
+ /** Set the 'Loading Schema' flag
+ *
+ * This method allows users to enable or disable the loading of schemas.
+ * When set to false, the parser not attempt to load schemas beyond
+ * querying the grammar pool for it.
+ *
+ * The parser's default state is: true.
+ *
+ * @param newState The value specifying whether external DTD should
+ * be loaded or not.
+ *
+ * @see #getLoadSchema
+ */
+ void setLoadSchema(const bool newState);
+
/** Set the 'create comment nodes' flag
*
* This method allows the user to specify whether the parser should
Index: src/xercesc/parsers/DOMBuilderImpl.cpp
===================================================================
--- src/xercesc/parsers/DOMBuilderImpl.cpp (revision 1377)
+++ src/xercesc/parsers/DOMBuilderImpl.cpp (revision 1379)
@@ -200,6 +200,11 @@
setLoadExternalDTD(state);
}
+ else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesLoadSchema) == 0)
+ {
+ setLoadSchema(state);
+ }
+
else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesContinueAfterFatalError) == 0)
{
setExitOnFirstFatalError(!state);
@@ -320,6 +325,11 @@
return getLoadExternalDTD();
}
+ else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesLoadSchema) == 0)
+ {
+ return getLoadSchema();
+ }
+
else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesContinueAfterFatalError) == 0)
{
return !getExitOnFirstFatalError();
Index: src/xercesc/parsers/SAX2XMLReaderImpl.hpp
===================================================================
--- src/xercesc/parsers/SAX2XMLReaderImpl.hpp (revision 1377)
+++ src/xercesc/parsers/SAX2XMLReaderImpl.hpp (revision 1379)
@@ -279,6 +279,7 @@
* <br>
http://apache.org/xml/features/validation/schema (default: true)
* <br>
http://apache.org/xml/features/validation/schema-full-checking (default: false)
* <br>
http://apache.org/xml/features/nonvalidating/load-external-dtd (default: true)
+ * <br>
http://apache.org/xml/features/nonvalidating/load-schema (default: true)
* <br>
http://apache.org/xml/features/continue-after-fatal-error (default: false)
* <br>
http://apache.org/xml/features/validation-error-as-fatal (default: false)
* <br>
http://apache.org/xml/features/validation/reuse-validator (Deprecated) (default: false)
Index: src/xercesc/validators/schema/TraverseSchema.cpp
===================================================================
--- src/xercesc/validators/schema/TraverseSchema.cpp (revision 1377)
+++ src/xercesc/validators/schema/TraverseSchema.cpp (revision 1379)
@@ -608,6 +608,11 @@
return;
}
+ if (!fScanner->getLoadSchema())
+ {
+ return;
+ }
+
// ------------------------------------------------------------------
// Parse input source
// ------------------------------------------------------------------
@@ -809,7 +814,7 @@
return;
}
- if (grammarFound) {
+ if (grammarFound || (!fScanner->getLoadSchema())) {
return;
}
@@ -8030,6 +8035,12 @@
return false;
}
+ if (!fScanner->getLoadSchema())
+ {
+ reportSchemaError(redefineElem, XMLUni::fgXMLErrDomain, XMLErrs::SchemaScanFatalError, includeURL);
+ return false;
+ }
+
// ------------------------------------------------------------------
// Parse input source
// ------------------------------------------------------------------
Index: src/xercesc/internal/SGXMLScanner.cpp
===================================================================
--- src/xercesc/internal/SGXMLScanner.cpp (revision 1377)
+++ src/xercesc/internal/SGXMLScanner.cpp (revision 1379)
@@ -3649,7 +3649,7 @@
grammar = fGrammarResolver->getGrammar(&theSchemaDescription);
}
- if (!grammar || grammar->getGrammarType() == Grammar::DTDGrammarType) {
+ if (fLoadSchema && (!grammar || grammar->getGrammarType() == Grammar::DTDGrammarType)) {
XSDDOMParser parser(0, fMemoryManager, 0);
parser.setValidationScheme(XercesDOMParser::Val_Never);
@@ -3798,7 +3798,7 @@
}
}
}
- else {
+ else if (grammar) {
// Since we have seen a grammar, set our validation flag
// at this point if the validation scheme is auto
Index: src/xercesc/internal/XMLScanner.cpp
===================================================================
--- src/xercesc/internal/XMLScanner.cpp (revision 1377)
+++ src/xercesc/internal/XMLScanner.cpp (revision 1379)
@@ -163,6 +163,7 @@
, fToCacheGrammar(false)
, fUseCachedGrammar(false)
, fLoadExternalDTD(true)
+ , fLoadSchema(true)
, fNormalizeData(true)
, fGenerateSyntheticAnnotations(false)
, fValidateAnnotations(false)
@@ -260,7 +261,8 @@
, fIdentityConstraintChecking(true)
, fToCacheGrammar(false)
, fUseCachedGrammar(false)
- , fLoadExternalDTD(true)
+ , fLoadExternalDTD(true)
+ , fLoadSchema(true)
, fNormalizeData(true)
, fGenerateSyntheticAnnotations(false)
, fValidateAnnotations(false)
Index: src/xercesc/internal/IGXMLScanner2.cpp
===================================================================
--- src/xercesc/internal/IGXMLScanner2.cpp (revision 1377)
+++ src/xercesc/internal/IGXMLScanner2.cpp (revision 1379)
@@ -1772,7 +1772,7 @@
grammar = fGrammarResolver->getGrammar(&theSchemaDescription);
}
- if (!grammar || grammar->getGrammarType() == Grammar::DTDGrammarType) {
+ if (fLoadSchema && (!grammar || grammar->getGrammarType() == Grammar::DTDGrammarType)) {
XSDDOMParser parser(0, fMemoryManager, 0);
parser.setValidationScheme(XercesDOMParser::Val_Never);
@@ -1932,7 +1932,7 @@
}
}
}
- else {
+ else if (grammar) {
// Since we have seen a grammar, set our validation flag
// at this point if the validation scheme is auto
Index: src/xercesc/internal/XMLScanner.hpp
===================================================================
--- src/xercesc/internal/XMLScanner.hpp (revision 1377)
+++ src/xercesc/internal/XMLScanner.hpp (revision 1379)
@@ -266,6 +266,7 @@
XMLCh* getExternalNoNamespaceSchemaLocation() const;
SecurityManager* getSecurityManager() const;
bool getLoadExternalDTD() const;
+ bool getLoadSchema() const;
bool getNormalizeData() const;
bool isCachingGrammarFromParse() const;
bool isUsingCachedGrammarInParse() const;
@@ -372,6 +373,7 @@
void setExternalNoNamespaceSchemaLocation(const char* const noNamespaceSchemaLocation);
void setSecurityManager(SecurityManager* const securityManager);
void setLoadExternalDTD(const bool loadDTD);
+ void setLoadSchema(const bool loadSchema);
void setNormalizeData(const bool normalizeData);
void setCalculateSrcOfs(const bool newValue);
void setParseSettings(XMLScanner* const refScanner);
@@ -704,6 +706,10 @@
// fLoadExternalDTD
// This flag indicates whether the external DTD be loaded or not
//
+ // fLoadSchema
+ // This flag indicates whether the parser should attempt to load
+ // schemas if they cannot be found in the grammar pool.
+ //
// fNormalizeData
// This flag indicates whether the parser should perform datatype
// normalization that is defined in the schema.
@@ -748,6 +754,7 @@
bool fToCacheGrammar;
bool fUseCachedGrammar;
bool fLoadExternalDTD;
+ bool fLoadSchema;
bool fNormalizeData;
bool fGenerateSyntheticAnnotations;
bool fValidateAnnotations;
@@ -1048,6 +1055,11 @@
return fLoadExternalDTD;
}
+inline bool XMLScanner::getLoadSchema() const
+{
+ return fLoadSchema;
+}
+
inline bool XMLScanner::getNormalizeData() const
{
return fNormalizeData;
@@ -1260,6 +1272,11 @@
fLoadExternalDTD = loadDTD;
}
+inline void XMLScanner::setLoadSchema(const bool loadSchema)
+{
+ fLoadSchema = loadSchema;
+}
+
inline void XMLScanner::setNormalizeData(const bool normalizeData)
{
fNormalizeData = normalizeData;
Index: src/xercesc/util/XMLUni.cpp
===================================================================
--- src/xercesc/util/XMLUni.cpp (revision 1377)
+++ src/xercesc/util/XMLUni.cpp (revision 1379)
@@ -1051,6 +1051,21 @@
, chLatin_d, chLatin_t, chLatin_d, chNull
};
+//Xerces:
http://apache.org/xml/features/nonvalidating/load-schema+const XMLCh XMLUni::fgXercesLoadSchema[] =
+{
+ chLatin_h, chLatin_t, chLatin_t, chLatin_p, chColon, chForwardSlash
+ , chForwardSlash, chLatin_a, chLatin_p, chLatin_a, chLatin_c, chLatin_h
+ , chLatin_e, chPeriod, chLatin_o, chLatin_r, chLatin_g, chForwardSlash
+ , chLatin_x, chLatin_m, chLatin_l, chForwardSlash, chLatin_f, chLatin_e
+ , chLatin_a, chLatin_t, chLatin_u, chLatin_r, chLatin_e, chLatin_s
+ , chForwardSlash, chLatin_n, chLatin_o, chLatin_n
+ , chLatin_v, chLatin_a, chLatin_l, chLatin_i, chLatin_d
+ , chLatin_a, chLatin_t, chLatin_i, chLatin_n, chLatin_g, chForwardSlash
+ , chLatin_l, chLatin_o, chLatin_a, chLatin_d, chDash
+ , chLatin_s, chLatin_c, chLatin_h, chLatin_e, chLatin_m, chLatin_a, chNull
+};
+
//Xerces:
http://apache.org/xml/features/continue-after-fatal-error const XMLCh XMLUni::fgXercesContinueAfterFatalError[] =
{
Index: src/xercesc/util/XMLUni.hpp
===================================================================
--- src/xercesc/util/XMLUni.hpp (revision 1377)
+++ src/xercesc/util/XMLUni.hpp (revision 1379)
@@ -215,6 +215,7 @@
static const XMLCh fgXercesSchemaExternalNoNameSpaceSchemaLocation[];
static const XMLCh fgXercesSecurityManager[];
static const XMLCh fgXercesLoadExternalDTD[];
+ static const XMLCh fgXercesLoadSchema[];
static const XMLCh fgXercesContinueAfterFatalError[];
static const XMLCh fgXercesValidationErrorAsFatal[];
static const XMLCh fgXercesUserAdoptsDOMDocument[];
Index: src/xercesc/internal/SGXMLScanner.cpp
===================================================================
--- src/xercesc/internal/SGXMLScanner.cpp (revision 1436)
+++ src/xercesc/internal/SGXMLScanner.cpp (revision 1437)
@@ -3650,9 +3650,10 @@
}
if (fLoadSchema && (!grammar || grammar->getGrammarType() == Grammar::DTDGrammarType)) {
- XSDDOMParser parser(0, fMemoryManager, 0);
+ XSDDOMParser parser(0, fMemoryManager, fGrammarResolver->getGrammarPool());
- parser.setValidationScheme(XercesDOMParser::Val_Never);
+ parser.setValidationScheme(getValidationSchemaFullChecking()?
+ XercesDOMParser::Val_Always : XercesDOMParser::Val_Never);
parser.setDoNamespaces(true);
parser.setUserEntityHandler(fEntityHandler);
parser.setUserErrorReporter(fErrorReporter);
@@ -3910,9 +3911,10 @@
if (fValidatorFromUser)
fValidator->reset();
- XSDDOMParser parser(0, fMemoryManager, 0);
+ XSDDOMParser parser(0, fMemoryManager, fGrammarResolver->getGrammarPool());
- parser.setValidationScheme(XercesDOMParser::Val_Never);
+ parser.setValidationScheme(getValidationSchemaFullChecking()?
+ XercesDOMParser::Val_Always : XercesDOMParser::Val_Never);
parser.setDoNamespaces(true);
parser.setUserEntityHandler(fEntityHandler);
parser.setUserErrorReporter(fErrorReporter);
Index: src/xercesc/internal/IGXMLScanner2.cpp
===================================================================
--- src/xercesc/internal/IGXMLScanner2.cpp (revision 1436)
+++ src/xercesc/internal/IGXMLScanner2.cpp (revision 1437)
@@ -1773,9 +1773,10 @@
}
if (fLoadSchema && (!grammar || grammar->getGrammarType() == Grammar::DTDGrammarType)) {
- XSDDOMParser parser(0, fMemoryManager, 0);
+ XSDDOMParser parser(0, fMemoryManager, fGrammarResolver->getGrammarPool());
- parser.setValidationScheme(XercesDOMParser::Val_Never);
+ parser.setValidationScheme(getValidationSchemaFullChecking()?
+ XercesDOMParser::Val_Always : XercesDOMParser::Val_Never);
parser.setDoNamespaces(true);
parser.setUserEntityHandler(fEntityHandler);
parser.setUserErrorReporter(fErrorReporter);
@@ -2062,9 +2063,10 @@
}
}
- XSDDOMParser parser(0, fMemoryManager, 0);
+ XSDDOMParser parser(0, fMemoryManager, fGrammarResolver->getGrammarPool());
- parser.setValidationScheme(XercesDOMParser::Val_Never);
+ parser.setValidationScheme(getValidationSchemaFullChecking()?
+ XercesDOMParser::Val_Always : XercesDOMParser::Val_Never);
parser.setDoNamespaces(true);
parser.setUserEntityHandler(fEntityHandler);
parser.setUserErrorReporter(fErrorReporter);
---------------------------------------------------------------------
To unsubscribe, e-mail:
c-dev-unsubscribe@...
For additional commands, e-mail:
c-dev-help@...