You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by tn...@apache.org on 2001/05/28 22:55:04 UTC
cvs commit: xml-xerces/c/src/internal XMLScanner.cpp XMLScanner.hpp XMLScanner2.cpp
tng 01/05/28 13:55:04
Modified: c/src/internal XMLScanner.cpp XMLScanner.hpp XMLScanner2.cpp
Log:
Schema: allocate a fDTDValidator, fSchemaValidator explicitly to avoid wrong cast
Revision Changes Path
1.41 +161 -79 xml-xerces/c/src/internal/XMLScanner.cpp
Index: XMLScanner.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/internal/XMLScanner.cpp,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -r1.40 -r1.41
--- XMLScanner.cpp 2001/05/23 20:36:54 1.40
+++ XMLScanner.cpp 2001/05/28 20:55:02 1.41
@@ -55,7 +55,7 @@
*/
/*
- * $Id: XMLScanner.cpp,v 1.40 2001/05/23 20:36:54 tng Exp $
+ * $Id: XMLScanner.cpp,v 1.41 2001/05/28 20:55:02 tng Exp $
*/
@@ -172,6 +172,8 @@
, fStandalone(false)
, fValidate(false)
, fValidator(valToAdopt)
+ , fDTDValidator(0)
+ , fSchemaValidator(0)
, fValidatorFromUser(false)
, fValScheme(Val_Never)
, fDoSchema(false)
@@ -190,8 +192,12 @@
if (fValidator) {
fValidatorFromUser = true;
- initValidator();
+ initValidator(fValidator);
}
+ else {
+ //use fDTDValidator as the default validator
+ fValidator = fDTDValidator;
+ }
}
XMLScanner::XMLScanner( XMLDocumentHandler* const docHandler
@@ -219,6 +225,8 @@
, fStandalone(false)
, fValidate(false)
, fValidator(valToAdopt)
+ , fDTDValidator(0)
+ , fSchemaValidator(0)
, fValidatorFromUser(false)
, fValScheme(Val_Never)
, fDoSchema(false)
@@ -235,9 +243,13 @@
{
commonInit();
- if (fValidator){
+ if (valToAdopt){
fValidatorFromUser = true;
- initValidator();
+ initValidator(fValidator);
+ }
+ else {
+ //use fDTDValidator as the default validator
+ fValidator = fDTDValidator;
}
}
@@ -246,7 +258,12 @@
delete fAttrList;
delete fIDRefList;
delete fRawAttrList;
- delete fValidator;
+ if (fValidatorFromUser)
+ delete fValidator;
+
+ delete fDTDValidator;
+ delete fSchemaValidator;
+
delete fEntityDeclPool;
//fGrammarResolver will delete the fGrammar as well
@@ -860,25 +877,31 @@
fGrammarResolver = new GrammarResolver();
resetEntityDeclPool();
+
+ // Create the Validator and init them
+ fDTDValidator = new DTDValidator();
+ initValidator(fDTDValidator);
+ fSchemaValidator = new SchemaValidator();
+ initValidator(fSchemaValidator);
}
-void XMLScanner::initValidator() {
+void XMLScanner::initValidator(XMLValidator* theValidator) {
//
// Tell the validator about the stuff it needs to know in order to
// do its work.
//
- fValidator->setScannerInfo(this, &fReaderMgr, &fBufMgr);
- fValidator->setErrorReporter(fErrorReporter);
+ theValidator->setScannerInfo(this, &fReaderMgr, &fBufMgr);
+ theValidator->setErrorReporter(fErrorReporter);
// So lets ask the validator whether it requires namespaces or not. If it
// does, we have to override the namespace enablement flag.
- if (fValidator->requiresNamespaces() && !fDoNamespaces)
+ if (theValidator->requiresNamespaces() && !fDoNamespaces)
setDoNamespaces(true);
- if (fValidator->handlesSchema())
- ((SchemaValidator*) fValidator)->setGrammarResolver(fGrammarResolver);
+ if (theValidator->handlesSchema())
+ ((SchemaValidator*) theValidator)->setGrammarResolver(fGrammarResolver);
}
void XMLScanner::resetEntityDeclPool() {
@@ -1683,15 +1706,23 @@
if (gotData) {
if (fDoNamespaces) {
// Restore the grammar
- const ElemStack::StackElem* topElem2 = fElemStack.topElement();
- XMLBuffer bufURI;
- getURIText(topElem2->fThisElement->getURI(), bufURI);
- if (!switchGrammar(bufURI.getRawBuffer()) && fValidate)
- fValidator->emitError
- (
- XMLValid::GrammarNotFound
- , bufURI.getRawBuffer()
- );
+ fGrammar = fElemStack.getCurrentGrammar();
+ if (fGrammar->getGrammarType() == Grammar::SchemaGrammarType && !fValidator->handlesSchema()) {
+ if (fValidatorFromUser)
+ ThrowXML(RuntimeException, XMLExcepts::Gen_NoSchemaValidator);
+ else {
+ fValidator = fSchemaValidator;
+ }
+ }
+ else if (fGrammar->getGrammarType() == Grammar::DTDGrammarType && !fValidator->handlesDTD()) {
+ if (fValidatorFromUser)
+ ThrowXML(RuntimeException, XMLExcepts::Gen_NoDTDValidator);
+ else {
+ fValidator = fDTDValidator;
+ }
+ }
+
+ fValidator->setGrammar(fGrammar);
}
// Restore the validation flag
@@ -1967,6 +1998,11 @@
}
else if (fReaderMgr.skippedString(XMLUni::fgDocTypeString))
{
+ if (!fReuseGrammar && fValidatorFromUser && !fValidator->handlesDTD())
+ {
+ ThrowXML(RuntimeException, XMLExcepts::Gen_NoDTDValidator);
+ }
+
//
// We have a doc type. So, create a DTDScanner and
// store the Grammar in DTDGrammar.
@@ -2780,15 +2816,18 @@
XMLElementDecl* elemDecl;
if (uriId != fEmptyNamespaceId) {
- XMLBuffer bufURI;
- getURIText(uriId, bufURI);
- if (!switchGrammar(bufURI.getRawBuffer()) && fValidate && !laxThisOne)
- {
- fValidator->emitError
- (
- XMLValid::GrammarNotFound
- , bufURI.getRawBuffer()
- );
+ if (fURIStringPool->getId(fGrammar->getTargetNamespace()) != uriId) {
+ // switch grammar first
+ XMLBuffer bufURI;
+ getURIText(uriId, bufURI);
+ if (!switchGrammar(bufURI.getRawBuffer()) && fValidate && !laxThisOne)
+ {
+ fValidator->emitError
+ (
+ XMLValid::GrammarNotFound
+ , bufURI.getRawBuffer()
+ );
+ }
}
elemDecl = fGrammar->getElemDecl
(
@@ -2797,17 +2836,39 @@
, fQNameBuf.getRawBuffer()
, currentScope
);
+
if (!elemDecl) {
- // if not found, then it may be a reference, try TOP_LEVEL_SCOPE
- elemDecl = fGrammar->findOrAddElemDecl
- (
- uriId
- , fNameBuf.getRawBuffer()
- , fPrefixBuf.getRawBuffer()
- , fQNameBuf.getRawBuffer()
- , Grammar::TOP_LEVEL_SCOPE
- , wasAdded
- );
+ if (currentScope != Grammar::TOP_LEVEL_SCOPE) {
+ // Not found in specified uri
+ // try emptyNamesapce see if element should be un-qualified.
+ elemDecl = fGrammar->getElemDecl
+ (
+ fEmptyNamespaceId
+ , fNameBuf.getRawBuffer()
+ , fQNameBuf.getRawBuffer()
+ , currentScope
+ );
+ }
+
+ if (elemDecl) {
+ fValidator->emitError
+ (
+ XMLValid::ElementNotUnQualified
+ , elemDecl->getFullName()
+ );
+ }
+ else {
+ // if not found, then it may be a reference, try TOP_LEVEL_SCOPE
+ elemDecl = fGrammar->findOrAddElemDecl
+ (
+ uriId
+ , fNameBuf.getRawBuffer()
+ , fPrefixBuf.getRawBuffer()
+ , fQNameBuf.getRawBuffer()
+ , Grammar::TOP_LEVEL_SCOPE
+ , wasAdded
+ );
+ }
}
}
else
@@ -2815,6 +2876,8 @@
//the element has no prefix,
//thus it is either a non-qualified element defined in current targetNS
//or an element that is defined in the globalNS
+
+ //try unqualifed first
elemDecl = fGrammar->getElemDecl
(
uriId
@@ -2824,46 +2887,56 @@
);
if (!elemDecl) {
- // if not found, then it may be a reference, try TOP_LEVEL_SCOPE
+ // Not found in specified uri
+ // use target namespace URI id to see if element needs to be fully qualified.
elemDecl = fGrammar->getElemDecl
(
- uriId
- , fNameBuf.getRawBuffer()
- , fQNameBuf.getRawBuffer()
- , Grammar::TOP_LEVEL_SCOPE
- );
- }
+ fURIStringPool->getId(fGrammar->getTargetNamespace())
+ , fNameBuf.getRawBuffer()
+ , fQNameBuf.getRawBuffer()
+ , currentScope
+ );
- if (!elemDecl)
- {
- if (!switchGrammar(XMLUni::fgZeroLenString) && fValidate && !laxThisOne)
- {
+ if (elemDecl) {
fValidator->emitError
(
- XMLValid::GrammarNotFound
- , XMLUni::fgZeroLenString
+ XMLValid::ElementNotQualified
+ , elemDecl->getFullName()
);
}
+ else {
+ //still not found, now try globalNS
+ if (fURIStringPool->getId(fGrammar->getTargetNamespace()) != fEmptyNamespaceId) {
+ if (!switchGrammar(XMLUni::fgZeroLenString) && fValidate && !laxThisOne)
+ {
+ fValidator->emitError
+ (
+ XMLValid::GrammarNotFound
+ , XMLUni::fgZeroLenString
+ );
+ }
+ }
- elemDecl = fGrammar->getElemDecl
- (
- uriId
+ elemDecl = fGrammar->getElemDecl
+ (
+ uriId
+ , fNameBuf.getRawBuffer()
+ , fQNameBuf.getRawBuffer()
+ , currentScope
+ );
+
+ if (!elemDecl) {
+ // if not found, then it may be a reference, try TOP_LEVEL_SCOPE
+ elemDecl = fGrammar->findOrAddElemDecl
+ (
+ uriId
, fNameBuf.getRawBuffer()
+ , fPrefixBuf.getRawBuffer()
, fQNameBuf.getRawBuffer()
- , currentScope
- );
-
- if (!elemDecl) {
- // if not found, then it may be a reference, try TOP_LEVEL_SCOPE
- elemDecl = fGrammar->findOrAddElemDecl
- (
- uriId
- , fNameBuf.getRawBuffer()
- , fPrefixBuf.getRawBuffer()
- , fQNameBuf.getRawBuffer()
- , Grammar::TOP_LEVEL_SCOPE
- , wasAdded
- );
+ , Grammar::TOP_LEVEL_SCOPE
+ , wasAdded
+ );
+ }
}
}
}
@@ -2926,6 +2999,7 @@
currentScope = typeinfo->getScopeDefined();
fElemStack.setCurrentScope(currentScope);
}
+ fElemStack.setCurrentGrammar(fGrammar);
//
// If this is the first element and we are validating, check the root
@@ -2997,16 +3071,24 @@
else
{
// Restore the grammar
- const ElemStack::StackElem* topElem = fElemStack.topElement();
- XMLBuffer bufURI;
- getURIText(topElem->fThisElement->getURI(), bufURI);
- if (!switchGrammar(bufURI.getRawBuffer()) && fValidate)
- fValidator->emitError
- (
- XMLValid::GrammarNotFound
- , bufURI.getRawBuffer()
- );
- }
+ fGrammar = fElemStack.getCurrentGrammar();
+ if (fGrammar->getGrammarType() == Grammar::SchemaGrammarType && !fValidator->handlesSchema()) {
+ if (fValidatorFromUser)
+ ThrowXML(RuntimeException, XMLExcepts::Gen_NoSchemaValidator);
+ else {
+ fValidator = fSchemaValidator;
+ }
+ }
+ else if (fGrammar->getGrammarType() == Grammar::DTDGrammarType && !fValidator->handlesDTD()) {
+ if (fValidatorFromUser)
+ ThrowXML(RuntimeException, XMLExcepts::Gen_NoDTDValidator);
+ else {
+ fValidator = fDTDValidator;
+ }
+ }
+
+ fValidator->setGrammar(fGrammar);
+ }
}
// If we have a document handler, then tell it about this start tag
1.19 +20 -13 xml-xerces/c/src/internal/XMLScanner.hpp
Index: XMLScanner.hpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/internal/XMLScanner.hpp,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- XMLScanner.hpp 2001/05/11 15:17:28 1.18
+++ XMLScanner.hpp 2001/05/28 20:55:02 1.19
@@ -56,6 +56,9 @@
/*
* $Log: XMLScanner.hpp,v $
+ * Revision 1.19 2001/05/28 20:55:02 tng
+ * Schema: allocate a fDTDValidator, fSchemaValidator explicitly to avoid wrong cast
+ *
* Revision 1.18 2001/05/11 15:17:28 tng
* Schema: Nillable fixes.
*
@@ -326,16 +329,6 @@
unsigned int getEmptyNamespaceId() const;
/**
- * When namespaces are enabled, any elements whose names have no prefix
- * are mapped to a global namespace. This is the URL id for the URL
- * to which those names are mapped. It has no official standard text,
- * but the parser must use some id here.
- *
- * @return The URL pool id of the URL for the global namespace.
- */
- unsigned int getGlobalNamespaceId() const;
-
- /**
* When a prefix is found that has not been mapped, an error is issued.
* However, if the parser has been instructed not to stop on the first
* fatal error, it needs to be able to continue. To do so, it will map
@@ -488,7 +481,7 @@
// Private helper methods
// -----------------------------------------------------------------------
void commonInit();
- void initValidator();
+ void initValidator(XMLValidator* theValidator);
void resetEntityDeclPool();
void resetURIStringPool();
@@ -691,6 +684,14 @@
// fValidator
// The installed validator. We look at them via the abstract
// validator interface, and don't know what it actual is.
+ // Either point to user's installed validator, or fDTDValidator
+ // or fSchemaValidator.
+ //
+ // fDTDValidator
+ // The DTD validator instance.
+ //
+ // fSchemaValidator
+ // The Schema validator instance.
//
// fValidatorFromUser
// This flag indicates whether the validator was installed from
@@ -778,6 +779,8 @@
bool fStandalone;
bool fValidate;
XMLValidator* fValidator;
+ DTDValidator* fDTDValidator;
+ SchemaValidator* fSchemaValidator;
bool fValidatorFromUser;
ValSchemes fValScheme;
bool fDoSchema;
@@ -991,6 +994,8 @@
inline void XMLScanner::setErrorReporter(XMLErrorReporter* const errHandler)
{
fErrorReporter = errHandler;
+ fDTDValidator->setErrorReporter(fErrorReporter);
+ fSchemaValidator->setErrorReporter(fErrorReporter);
}
inline void XMLScanner::setErrorHandler(ErrorHandler* const handler)
@@ -1033,9 +1038,11 @@
inline void XMLScanner::setValidator(XMLValidator* const valToAdopt)
{
- delete fValidator;
+ if (fValidatorFromUser)
+ delete fValidator;
fValidator = valToAdopt;
- initValidator();
+ fValidatorFromUser = true;
+ initValidator(fValidator);
}
inline void XMLScanner::setDoSchema(const bool doSchema)
1.32 +69 -53 xml-xerces/c/src/internal/XMLScanner2.cpp
Index: XMLScanner2.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/internal/XMLScanner2.cpp,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -r1.31 -r1.32
--- XMLScanner2.cpp 2001/05/16 14:32:32 1.31
+++ XMLScanner2.cpp 2001/05/28 20:55:02 1.32
@@ -55,7 +55,7 @@
*/
/*
- * $Id: XMLScanner2.cpp,v 1.31 2001/05/16 14:32:32 tng Exp $
+ * $Id: XMLScanner2.cpp,v 1.32 2001/05/28 20:55:02 tng Exp $
*/
@@ -740,48 +740,44 @@
if (fDoNamespaces)
resetURIStringPool();
- // create a default validator
- if (fValidate) {
- if (!fValidator)
- setValidator(new DTDValidator());
+ // create a default grammar first
+ if (fValidatorFromUser) {
+ if (fValidator->handlesDTD()) {
+ fGrammar = new DTDGrammar();
+ }
+ else {
+ fGrammar = new SchemaGrammar();
+ }
+ }
+ else {
+ // set fValidator as fDTDValidator
+ fValidator = fDTDValidator;
+ fGrammar = new DTDGrammar();
}
- // create a default grammar first
- fGrammar = new DTDGrammar();
fGrammarResolver->putGrammar(XMLUni::fgZeroLenString, fGrammar);
-
- if (fValidator)
- fValidator->setGrammar(fGrammar);
-
+ fValidator->setGrammar(fGrammar);
}
else {
// reusing grammar, thus the fGrammar must pre-exist already
- // if validating, make sure the validator handles this reuse grammar type
- if (fValidate) {
- if (fValidator) {
- if (fGrammar->getGrammarType() == Grammar::SchemaGrammarType && !fValidator->handlesSchema()) {
- if (fValidatorFromUser)
- ThrowXML(RuntimeException, XMLExcepts::Gen_NoSchemaValidator);
- else
- setValidator(new SchemaValidator());
- }
- else if (fGrammar->getGrammarType() == Grammar::DTDGrammarType && !fValidator->handlesDTD()) {
- if (fValidatorFromUser)
- ThrowXML(RuntimeException, XMLExcepts::Gen_NoSchemaValidator);
- else
- setValidator(new DTDValidator());
- }
+ // make sure the validator handles this reuse grammar type
+ if (fGrammar->getGrammarType() == Grammar::SchemaGrammarType && !fValidator->handlesSchema()) {
+ if (fValidatorFromUser)
+ ThrowXML(RuntimeException, XMLExcepts::Gen_NoSchemaValidator);
+ else {
+ fValidator = fSchemaValidator;
}
+ }
+ else if (fGrammar->getGrammarType() == Grammar::DTDGrammarType && !fValidator->handlesDTD()) {
+ if (fValidatorFromUser)
+ ThrowXML(RuntimeException, XMLExcepts::Gen_NoDTDValidator);
else {
- if (fGrammar->getGrammarType() == Grammar::SchemaGrammarType)
- setValidator(new SchemaValidator());
- else if (fGrammar->getGrammarType() == Grammar::DTDGrammarType)
- setValidator(new DTDValidator());
+ fValidator = fDTDValidator;
}
-
- if (!fValidator->getGrammar())
- fValidator->setGrammar(fGrammar);
}
+
+ if (!fValidator->getGrammar())
+ fValidator->setGrammar(fGrammar);
}
@@ -1181,22 +1177,15 @@
fElemStack.setValidationFlag(fValidate);
}
- // set up the SchemaValidator if validating
- if(fValidate) {
- if (fValidator) {
- if (!fValidator->handlesSchema())
- {
- // the fValidator is from user
- if (fValidatorFromUser)
- ThrowXML(RuntimeException, XMLExcepts::Gen_NoSchemaValidator);
- else {
- // the fValidator is created by the Scanner, replace it with a SchemaValidator
- setValidator(new SchemaValidator());
- }
- }
+ // we have seen a schema, so set up the fValidator as fSchemaValidator
+ if (!fValidator->handlesSchema())
+ {
+ if (fValidatorFromUser) {
+ // the fValidator is from user
+ ThrowXML(RuntimeException, XMLExcepts::Gen_NoSchemaValidator);
}
else {
- setValidator(new SchemaValidator());
+ fValidator = fSchemaValidator;
}
}
@@ -1307,8 +1296,7 @@
}
}
fGrammar = grammar;
- if (fValidate)
- fValidator->setGrammar(fGrammar);
+ fValidator->setGrammar(fGrammar);
}
// ---------------------------------------------------------------------------
@@ -2557,8 +2545,22 @@
return false;
else {
fGrammar = tempGrammar;
- if (fValidator)
- fValidator->setGrammar(fGrammar);
+ if (fGrammar->getGrammarType() == Grammar::SchemaGrammarType && !fValidator->handlesSchema()) {
+ if (fValidatorFromUser)
+ ThrowXML(RuntimeException, XMLExcepts::Gen_NoSchemaValidator);
+ else {
+ fValidator = fSchemaValidator;
+ }
+ }
+ else if (fGrammar->getGrammarType() == Grammar::DTDGrammarType && !fValidator->handlesDTD()) {
+ if (fValidatorFromUser)
+ ThrowXML(RuntimeException, XMLExcepts::Gen_NoDTDValidator);
+ else {
+ fValidator = fDTDValidator;
+ }
+ }
+
+ fValidator->setGrammar(fGrammar);
return true;
}
}
@@ -2574,8 +2576,22 @@
return false;
else {
fGrammar = tempGrammar;
- if (fValidator)
- fValidator->setGrammar(fGrammar);
+ if (fGrammar->getGrammarType() == Grammar::SchemaGrammarType && !fValidator->handlesSchema()) {
+ if (fValidatorFromUser)
+ ThrowXML(RuntimeException, XMLExcepts::Gen_NoSchemaValidator);
+ else {
+ fValidator = fSchemaValidator;
+ }
+ }
+ else if (fGrammar->getGrammarType() == Grammar::DTDGrammarType && !fValidator->handlesDTD()) {
+ if (fValidatorFromUser)
+ ThrowXML(RuntimeException, XMLExcepts::Gen_NoDTDValidator);
+ else {
+ fValidator = fDTDValidator;
+ }
+ }
+
+ fValidator->setGrammar(fGrammar);
return true;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org