knoaman 2002/12/03 17:57:10
Modified: c/src/xercesc/parsers XercesDOMParser.cpp SAXParser.hpp
SAXParser.cpp SAX2XMLReaderImpl.hpp
SAX2XMLReaderImpl.cpp DOMBuilderImpl.cpp
AbstractDOMParser.hpp AbstractDOMParser.cpp
Log:
Scanner re-organization.
Revision Changes Path
1.9 +4 -3 xml-xerces/c/src/xercesc/parsers/XercesDOMParser.cpp
Index: XercesDOMParser.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/parsers/XercesDOMParser.cpp,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- XercesDOMParser.cpp 4 Nov 2002 14:57:03 -0000 1.8
+++ XercesDOMParser.cpp 4 Dec 2002 01:57:09 -0000 1.9
@@ -74,6 +74,7 @@
#include <xercesc/util/IOException.hpp>
#include <xercesc/internal/XMLScanner.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
+#include <xercesc/validators/common/GrammarResolver.hpp>
XERCES_CPP_NAMESPACE_BEGIN
@@ -111,7 +112,7 @@
Grammar* XercesDOMParser::getGrammar(const XMLCh* const nameSpaceKey)
{
- return getScanner()->getGrammar(nameSpaceKey);
+ return getGrammarResolver()->getGrammar(nameSpaceKey);
}
Grammar* XercesDOMParser::getRootGrammar()
@@ -319,7 +320,7 @@
void XercesDOMParser::resetCachedGrammarPool()
{
- getScanner()->resetCachedGrammarPool();
+ getGrammarResolver()->resetCachedGrammar();
}
XERCES_CPP_NAMESPACE_END
1.15 +58 -11 xml-xerces/c/src/xercesc/parsers/SAXParser.hpp
Index: SAXParser.hpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/parsers/SAXParser.hpp,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- SAXParser.hpp 4 Nov 2002 14:57:03 -0000 1.14
+++ SAXParser.hpp 4 Dec 2002 01:57:09 -0000 1.15
@@ -56,6 +56,9 @@
/*
* $Log$
+ * Revision 1.15 2002/12/04 01:57:09 knoaman
+ * Scanner re-organization.
+ *
* Revision 1.14 2002/11/04 14:57:03 tng
* C++ Namespace Support.
*
@@ -199,6 +202,7 @@
class XMLScanner;
class XMLValidator;
class Grammar;
+class GrammarResolver;
/**
@@ -478,6 +482,19 @@
bool isUsingCachedGrammarInParse() const;
/**
+ * Get the 'calculate src offset flag'
+ *
+ * This method returns the state of the parser's src offset calculation
+ * when parsing an XML document.
+ *
+ * @return true, if the parser is currently configured to
+ * calculate src offsets, false otherwise.
+ *
+ * @see #setCalculateSrcOfs
+ */
+ bool getCalculateSrcOfs() const;
+
+ /**
* Retrieve the grammar that is associated with the specified namespace key
*
* @param nameSpaceKey Namespace key
@@ -730,6 +747,28 @@
*/
void useCachedGrammarInParse(const bool newState);
+ /** Enable/disable src offset calculation
+ *
+ * This method allows users to enable/disable src offset calculation.
+ * Disabling the calculation will improve performance.
+ *
+ * The parser's default state is: true.
+ *
+ * @param newState The value specifying whether we should enable or
+ * disable src offset calculation
+ *
+ * @see #getCalculateSrcOfs
+ */
+ void setCalculateSrcOfs(const bool newState);
+
+ /** Set the scanner to use when scanning the XML document
+ *
+ * This method allows users to set the scanner to use
+ * when scanning a given XML document.
+ *
+ * @param scannerName The name of the desired scanner
+ */
+ void useScanner(const XMLCh* const scannerName);
//@}
@@ -1803,6 +1842,11 @@
SAXParser(const SAXParser&);
void operator=(const SAXParser&);
+ // -----------------------------------------------------------------------
+ // Initialize/Cleanup methods
+ // -----------------------------------------------------------------------
+ void initialize();
+ void cleanUp();
// -----------------------------------------------------------------------
// Private data members
@@ -1851,17 +1895,20 @@
// during construction.
//
// -----------------------------------------------------------------------
- VecAttrListImpl fAttrList;
- DocumentHandler* fDocHandler;
- DTDHandler* fDTDHandler;
- unsigned int fElemDepth;
- EntityResolver* fEntityResolver;
- ErrorHandler* fErrorHandler;
- unsigned int fAdvDHCount;
- XMLDocumentHandler** fAdvDHList;
- unsigned int fAdvDHListSize;
- bool fParseInProgress;
- XMLScanner* fScanner;
+ bool fParseInProgress;
+ unsigned int fElemDepth;
+ unsigned int fAdvDHCount;
+ unsigned int fAdvDHListSize;
+ VecAttrListImpl fAttrList;
+ DocumentHandler* fDocHandler;
+ DTDHandler* fDTDHandler;
+ EntityResolver* fEntityResolver;
+ ErrorHandler* fErrorHandler;
+ XMLDocumentHandler** fAdvDHList;
+ XMLScanner* fScanner;
+ GrammarResolver* fGrammarResolver;
+ XMLStringPool* fURIStringPool;
+ XMLValidator* fValidator;
};
1.10 +76 -13 xml-xerces/c/src/xercesc/parsers/SAXParser.cpp
Index: SAXParser.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/parsers/SAXParser.cpp,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- SAXParser.cpp 4 Nov 2002 14:57:03 -0000 1.9
+++ SAXParser.cpp 4 Dec 2002 01:57:09 -0000 1.10
@@ -56,6 +56,9 @@
/*
* $Log$
+ * Revision 1.10 2002/12/04 01:57:09 knoaman
+ * Scanner re-organization.
+ *
* Revision 1.9 2002/11/04 14:57:03 tng
* C++ Namespace Support.
*
@@ -183,14 +186,16 @@
// ---------------------------------------------------------------------------
// Includes
// ---------------------------------------------------------------------------
+#include <xercesc/parsers/SAXParser.hpp>
+#include <xercesc/internal/XMLScannerResolver.hpp>
+#include <xercesc/framework/XMLValidator.hpp>
#include <xercesc/util/IOException.hpp>
#include <xercesc/sax/DocumentHandler.hpp>
#include <xercesc/sax/DTDHandler.hpp>
#include <xercesc/sax/ErrorHandler.hpp>
#include <xercesc/sax/EntityResolver.hpp>
#include <xercesc/sax/SAXParseException.hpp>
-#include <xercesc/internal/XMLScanner.hpp>
-#include <xercesc/parsers/SAXParser.hpp>
+#include <xercesc/validators/common/GrammarResolver.hpp>
#include <string.h>
XERCES_CPP_NAMESPACE_BEGIN
@@ -201,32 +206,66 @@
// ---------------------------------------------------------------------------
SAXParser::SAXParser(XMLValidator* const valToAdopt) :
- fDocHandler(0)
- , fDTDHandler(0)
+ fParseInProgress(false)
, fElemDepth(0)
+ , fAdvDHCount(0)
+ , fAdvDHListSize(32)
+ , fDocHandler(0)
+ , fDTDHandler(0)
, fEntityResolver(0)
, fErrorHandler(0)
- , fAdvDHCount(0)
, fAdvDHList(0)
- , fAdvDHListSize(32)
- , fParseInProgress(false)
, fScanner(0)
+ , fGrammarResolver(0)
+ , fURIStringPool(0)
+ , fValidator(valToAdopt)
+{
+ try
+ {
+ initialize();
+ }
+ catch(...)
+ {
+ cleanUp();
+ throw;
+ }
+}
+
+
+SAXParser::~SAXParser()
{
+ cleanUp();
+}
+
+// ---------------------------------------------------------------------------
+// SAXParser: Initialize/CleanUp methods
+// ---------------------------------------------------------------------------
+void SAXParser::initialize()
+{
+ // Create grammar resolver and string pool to pass to scanner
+ fGrammarResolver = new GrammarResolver();
+ fURIStringPool = new XMLStringPool();
+
// Create our scanner and tell it what validator to use
- fScanner = new XMLScanner(valToAdopt);
+ fScanner = XMLScannerResolver::getDefaultScanner(fValidator);
+ fScanner->setGrammarResolver(fGrammarResolver);
+ fScanner->setURIStringPool(fURIStringPool);
// Create the initial advanced handler list array and zero it out
fAdvDHList = new XMLDocumentHandler*[fAdvDHListSize];
memset(fAdvDHList, 0, sizeof(void*) * fAdvDHListSize);
}
-
-SAXParser::~SAXParser()
+void SAXParser::cleanUp()
{
delete [] fAdvDHList;
delete fScanner;
-}
+ delete fGrammarResolver;
+ delete fURIStringPool;
+ if (fValidator)
+ delete fValidator;
+}
// ---------------------------------------------------------------------------
@@ -396,9 +435,14 @@
return fScanner->isUsingCachedGrammarInParse();
}
+bool SAXParser::getCalculateSrcOfs() const
+{
+ return fScanner->getCalculateSrcOfs();
+}
+
Grammar* SAXParser::getGrammar(const XMLCh* const nameSpaceKey)
{
- return fScanner->getGrammar(nameSpaceKey);
+ return fGrammarResolver->getGrammar(nameSpaceKey);
}
Grammar* SAXParser::getRootGrammar()
@@ -489,6 +533,25 @@
fScanner->useCachedGrammarInParse(newState);
}
+void SAXParser::setCalculateSrcOfs(const bool newState)
+{
+ fScanner->setCalculateSrcOfs(newState);
+}
+
+void SAXParser::useScanner(const XMLCh* const scannerName)
+{
+ XMLScanner* tempScanner = XMLScannerResolver::resolveScanner(scannerName,
fValidator);
+
+ if (tempScanner) {
+
+ // REVISIT: need to set scanner options and handlers
+ delete fScanner;
+ fScanner = tempScanner;
+ fScanner->setGrammarResolver(fGrammarResolver);
+ fScanner->setURIStringPool(fURIStringPool);
+ }
+}
+
// ---------------------------------------------------------------------------
// SAXParser: Overrides of the SAX Parser interface
@@ -1258,7 +1321,7 @@
void SAXParser::resetCachedGrammarPool()
{
- fScanner->resetCachedGrammarPool();
+ fGrammarResolver->resetCachedGrammar();
}
XERCES_CPP_NAMESPACE_END
1.15 +34 -30 xml-xerces/c/src/xercesc/parsers/SAX2XMLReaderImpl.hpp
Index: SAX2XMLReaderImpl.hpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/parsers/SAX2XMLReaderImpl.hpp,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- SAX2XMLReaderImpl.hpp 4 Nov 2002 14:57:03 -0000 1.14
+++ SAX2XMLReaderImpl.hpp 4 Dec 2002 01:57:09 -0000 1.15
@@ -56,6 +56,9 @@
/*
* $Log$
+ * Revision 1.15 2002/12/04 01:57:09 knoaman
+ * Scanner re-organization.
+ *
* Revision 1.14 2002/11/04 14:57:03 tng
* C++ Namespace Support.
*
@@ -199,6 +202,7 @@
class ContentHandler;
class LexicalHandler;
class DeclHandler;
+class GrammarResolver;
/**
* This class implements the SAX2 'XMLReader' interface and should be
@@ -1643,6 +1647,12 @@
void operator=(const SAX2XMLReaderImpl&);
// -----------------------------------------------------------------------
+ // Initialize/Cleanup methods
+ // -----------------------------------------------------------------------
+ void initialize();
+ void cleanUp();
+
+ // -----------------------------------------------------------------------
// Private data members
//
// fAttrList
@@ -1722,30 +1732,30 @@
// Indicate if the document has external DTD subset.
//
// -----------------------------------------------------------------------
- VecAttributesImpl fAttrList ;
- ContentHandler* fDocHandler ;
- RefVectorOf<XMLAttr>* tempAttrVec ;
-
- bool fnamespacePrefix;
- bool fautoValidation;
- bool fValidation;
-
- XMLBufferMgr fStringBuffers ;
- RefStackOf<XMLBuffer> * fPrefixes ;
- ValueStackOf<unsigned int> * prefixCounts ;
-
- DTDHandler* fDTDHandler;
- unsigned int fElemDepth;
- EntityResolver* fEntityResolver;
- ErrorHandler* fErrorHandler;
- LexicalHandler* fLexicalHandler;
- DeclHandler* fDeclHandler;
- unsigned int fAdvDHCount;
- XMLDocumentHandler** fAdvDHList;
- unsigned int fAdvDHListSize;
- bool fParseInProgress;
- XMLScanner* fScanner;
- bool fHasExternalSubset;
+ bool fNamespacePrefix;
+ bool fAutoValidation;
+ bool fValidation;
+ bool fParseInProgress;
+ bool fHasExternalSubset;
+ unsigned int fElemDepth;
+ unsigned int fAdvDHCount;
+ unsigned int fAdvDHListSize;
+ VecAttributesImpl fAttrList ;
+ ContentHandler* fDocHandler ;
+ RefVectorOf<XMLAttr>* fTempAttrVec ;
+ XMLBufferMgr fStringBuffers ;
+ RefStackOf<XMLBuffer> * fPrefixes ;
+ ValueStackOf<unsigned int>* fPrefixCounts ;
+ DTDHandler* fDTDHandler;
+ EntityResolver* fEntityResolver;
+ ErrorHandler* fErrorHandler;
+ LexicalHandler* fLexicalHandler;
+ DeclHandler* fDeclHandler;
+ XMLDocumentHandler** fAdvDHList;
+ XMLScanner* fScanner;
+ GrammarResolver* fGrammarResolver;
+ XMLStringPool* fURIStringPool;
+ XMLValidator* fValidator;
// -----------------------------------------------------------------------
// internal function used to set the state of the parser
@@ -1755,7 +1765,6 @@
bool getDoNamespaces() const;
void setDoSchema(const bool newState);
bool getDoSchema() const;
-
};
@@ -1800,11 +1809,6 @@
inline bool SAX2XMLReaderImpl::getValidationConstraintFatal() const
{
return fScanner->getValidationConstraintFatal();
-}
-
-inline Grammar* SAX2XMLReaderImpl::getGrammar(const XMLCh* const nameSpaceKey)
-{
- return fScanner->getGrammar(nameSpaceKey);
}
inline Grammar* SAX2XMLReaderImpl::getRootGrammar()
1.13 +103 -42 xml-xerces/c/src/xercesc/parsers/SAX2XMLReaderImpl.cpp
Index: SAX2XMLReaderImpl.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/parsers/SAX2XMLReaderImpl.cpp,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- SAX2XMLReaderImpl.cpp 4 Nov 2002 14:57:03 -0000 1.12
+++ SAX2XMLReaderImpl.cpp 4 Dec 2002 01:57:09 -0000 1.13
@@ -56,6 +56,9 @@
/*
* $Log$
+ * Revision 1.13 2002/12/04 01:57:09 knoaman
+ * Scanner re-organization.
+ *
* Revision 1.12 2002/11/04 14:57:03 tng
* C++ Namespace Support.
*
@@ -224,6 +227,7 @@
#include <xercesc/util/XMLChTranscoder.hpp>
#include <xercesc/util/RefStackOf.hpp>
#include <xercesc/util/XMLUniDefs.hpp>
+#include <xercesc/util/Janitor.hpp>
#include <xercesc/sax2/ContentHandler.hpp>
#include <xercesc/sax2/LexicalHandler.hpp>
#include <xercesc/sax2/DeclHandler.hpp>
@@ -232,8 +236,9 @@
#include <xercesc/sax/EntityResolver.hpp>
#include <xercesc/sax/SAXParseException.hpp>
#include <xercesc/sax/SAXException.hpp>
-#include <xercesc/internal/XMLScanner.hpp>
+#include <xercesc/internal/XMLScannerResolver.hpp>
#include <xercesc/parsers/SAX2XMLReaderImpl.hpp>
+#include <xercesc/validators/common/GrammarResolver.hpp>
#include <string.h>
XERCES_CPP_NAMESPACE_BEGIN
@@ -245,25 +250,59 @@
};
SAX2XMLReaderImpl::SAX2XMLReaderImpl() :
- fDocHandler(0)
- , fDTDHandler(0)
+
+ fNamespacePrefix(false)
+ , fAutoValidation(false)
+ , fValidation(true)
+ , fParseInProgress(false)
+ , fHasExternalSubset(false)
, fElemDepth(0)
+ , fAdvDHCount(0)
+ , fAdvDHListSize(32)
+ , fDocHandler(0)
+ , fTempAttrVec(0)
+ , fPrefixes(0)
+ , fPrefixCounts(0)
+ , fDTDHandler(0)
, fEntityResolver(0)
, fErrorHandler(0)
, fLexicalHandler(0)
, fDeclHandler(0)
- , fAdvDHCount(0)
, fAdvDHList(0)
- , fAdvDHListSize(32)
- , fParseInProgress(false)
, fScanner(0)
- , fHasExternalSubset(false)
+ , fGrammarResolver(0)
+ , fURIStringPool(0)
{
- //
+ try
+ {
+ initialize();
+ }
+ catch(...)
+ {
+ cleanUp();
+ throw;
+ }
+}
+
+SAX2XMLReaderImpl::~SAX2XMLReaderImpl()
+{
+ cleanUp();
+}
+
+// ---------------------------------------------------------------------------
+// SAX2XMLReaderImpl: Initialize/Cleanup methods
+// ---------------------------------------------------------------------------
+void SAX2XMLReaderImpl::initialize()
+{
+ // Create grammar resolver and string pool that we pass to the scanner
+ fGrammarResolver = new GrammarResolver();
+ fURIStringPool = new XMLStringPool();
+
// Create a scanner and tell it what validator to use. Then set us
// as the document event handler so we can fill the DOM document.
- //
- fScanner = new XMLScanner(0);
+ fScanner = XMLScannerResolver::getDefaultScanner(0);
+ fScanner->setGrammarResolver(fGrammarResolver);
+ fScanner->setURIStringPool(fURIStringPool);
// Create the initial advanced handler list array and zero it out
fAdvDHList = new XMLDocumentHandler*[fAdvDHListSize];
@@ -272,28 +311,24 @@
// SAX2 default is for namespaces (feature
http://xml.org/sax/features/namespaces) to be on
setDoNamespaces(true) ;
- // SAX2 default is for namespaces-prefixes to be off
- fnamespacePrefix = false;
-
- // SAX2 default: validation on, auto-validation off
- fValidation = true;
- fautoValidation = false;
-
// default: schema is on
setDoSchema(true);
fPrefixes = new RefStackOf<XMLBuffer> (10, false) ;
- tempAttrVec = new RefVectorOf<XMLAttr> (10, false) ;
- prefixCounts = new ValueStackOf<unsigned int>(10) ;
+ fTempAttrVec = new RefVectorOf<XMLAttr> (10, false) ;
+ fPrefixCounts = new ValueStackOf<unsigned int>(10) ;
}
-SAX2XMLReaderImpl::~SAX2XMLReaderImpl()
+
+void SAX2XMLReaderImpl::cleanUp()
{
delete [] fAdvDHList;
delete fScanner;
delete fPrefixes;
- delete tempAttrVec;
- delete prefixCounts ;
+ delete fTempAttrVec;
+ delete fPrefixCounts;
+ delete fGrammarResolver;
+ delete fURIStringPool;
}
// ---------------------------------------------------------------------------
@@ -389,6 +424,7 @@
// ---------------------------------------------------------------------------
void SAX2XMLReaderImpl::setValidator(XMLValidator* valueToAdopt)
{
+ fValidator = valueToAdopt;
fScanner->setValidator(valueToAdopt);
}
@@ -757,9 +793,9 @@
fElemDepth = 0;
// Pop any prefix buffers left over from previous uses
- while (!prefixCounts->empty())
+ while (!fPrefixCounts->empty())
{
- unsigned int numPrefix = prefixCounts->pop();
+ unsigned int numPrefix = fPrefixCounts->pop();
for (unsigned int i = 0; i < numPrefix; i++)
{
XMLBuffer * buf = fPrefixes->pop() ;
@@ -817,9 +853,9 @@
const XMLCh* nsURI = 0;
const XMLAttr* tempAttr = 0;
- if (!fnamespacePrefix)
+ if (!fNamespacePrefix)
{
- tempAttrVec->removeAllElements();
+ fTempAttrVec->removeAllElements();
}
for (unsigned int i = 0; i < attrCount; i++)
@@ -832,10 +868,10 @@
nsPrefix = tempAttr->getName();
nsURI = tempAttr->getValue();
}
- if (!fnamespacePrefix)
+ if (!fNamespacePrefix)
{
if (nsURI == 0)
- tempAttrVec->addElement((XMLAttr* const)tempAttr);
+ fTempAttrVec->addElement((XMLAttr* const)tempAttr);
}
if (nsURI != 0)
{
@@ -850,9 +886,9 @@
nsURI = 0;
nsPrefix = 0;
}
- prefixCounts->push(numPrefix) ;
- if (!fnamespacePrefix)
- fAttrList.setVector(tempAttrVec, tempAttrVec->size(), fScanner);
+ fPrefixCounts->push(numPrefix) ;
+ if (!fNamespacePrefix)
+ fAttrList.setVector(fTempAttrVec, fTempAttrVec->size(), fScanner);
else
fAttrList.setVector(&attrList, attrCount, fScanner);
@@ -891,7 +927,7 @@
elemDecl.getBaseName(),
elemQName.getRawBuffer());
- unsigned int numPrefix = prefixCounts->pop();
+ unsigned int numPrefix = fPrefixCounts->pop();
for (unsigned int i = 0; i < numPrefix; ++i)
{
XMLBuffer * buf = fPrefixes->pop() ;
@@ -955,7 +991,7 @@
elemDecl.getBaseName(),
elemQName.getRawBuffer());
- unsigned int numPrefix = prefixCounts->pop();
+ unsigned int numPrefix = fPrefixCounts->pop();
for (unsigned int i = 0; i < numPrefix; i++)
{
XMLBuffer * buf = fPrefixes->pop() ;
@@ -1339,7 +1375,7 @@
{
fValidation = value;
if (fValidation)
- if (fautoValidation)
+ if (fAutoValidation)
setValidationScheme(Val_Auto);
else
setValidationScheme(Val_Always);
@@ -1348,14 +1384,14 @@
}
else if (XMLString::compareIString(name, XMLUni::fgSAX2CoreNameSpacePrefixes)
== 0)
{
- fnamespacePrefix = value;
+ fNamespacePrefix = value;
}
else if (XMLString::compareIString(name, XMLUni::fgXercesDynamic) == 0)
{
- fautoValidation = value;
+ fAutoValidation = value;
// for auto validation, the sax2 core validation feature must also be
enabled.
if (fValidation)
- if (fautoValidation)
+ if (fAutoValidation)
setValidationScheme(Val_Auto);
else
setValidationScheme(Val_Always);
@@ -1394,6 +1430,10 @@
if (value || !fScanner->isCachingGrammarFromParse())
fScanner->useCachedGrammarInParse(value);
}
+ else if (XMLString::compareIString(name, XMLUni::fgXercesCalculateSrcOfs) == 0)
+ {
+ fScanner->setCalculateSrcOfs(value);
+ }
else
throw SAXNotRecognizedException("Unknown Feature");
}
@@ -1405,9 +1445,9 @@
else if (XMLString::compareIString(name, XMLUni::fgSAX2CoreValidation) == 0)
return fValidation;
else if (XMLString::compareIString(name, XMLUni::fgSAX2CoreNameSpacePrefixes)
== 0)
- return fnamespacePrefix;
+ return fNamespacePrefix;
else if (XMLString::compareIString(name, XMLUni::fgXercesDynamic) == 0)
- return fautoValidation;
+ return fAutoValidation;
else if (XMLString::compareIString(name, XMLUni::fgXercesSchema) == 0)
return getDoSchema();
else if (XMLString::compareIString(name, XMLUni::fgXercesSchemaFullChecking) ==
0)
@@ -1422,6 +1462,8 @@
return fScanner->isCachingGrammarFromParse();
else if (XMLString::compareIString(name,
XMLUni::fgXercesUseCachedGrammarInParse) == 0)
return fScanner->isUsingCachedGrammarInParse();
+ else if (XMLString::compareIString(name, XMLUni::fgXercesCalculateSrcOfs) == 0)
+ return fScanner->getCalculateSrcOfs();
else
throw SAXNotRecognizedException("Unknown Feature");
@@ -1437,13 +1479,24 @@
{
fScanner->setExternalSchemaLocation((XMLCh*)value);
}
-
else if (XMLString::compareIString(name,
XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation) == 0)
{
fScanner->setExternalNoNamespaceSchemaLocation((XMLCh*)value);
}
+ else if (XMLString::equals(name, XMLUni::fgXercesScannerName))
+ {
+ XMLScanner* tempScanner = XMLScannerResolver::resolveScanner((const XMLCh*)
value, fValidator);
- else
+ if (tempScanner) {
+
+ // REVISIT: set scanner options and handlers
+ tempScanner->setGrammarResolver(fGrammarResolver);
+ tempScanner->setURIStringPool(fURIStringPool);
+ delete fScanner;
+ fScanner = tempScanner;
+ }
+ }
+ else
throw SAXNotRecognizedException("Unknown Property");
}
@@ -1454,6 +1507,8 @@
return (void*)fScanner->getExternalSchemaLocation();
else if (XMLString::compareIString(name,
XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation) == 0)
return (void*)fScanner->getExternalNoNamespaceSchemaLocation();
+ else if (XMLString::equals(name, XMLUni::fgXercesScannerName))
+ return (void*)fScanner->getName();
else
throw SAXNotRecognizedException("Unknown Property");
return 0;
@@ -1575,8 +1630,14 @@
void SAX2XMLReaderImpl::resetCachedGrammarPool()
{
- fScanner->resetCachedGrammarPool();
+ fGrammarResolver->resetCachedGrammar();
}
+
+Grammar* SAX2XMLReaderImpl::getGrammar(const XMLCh* const nameSpaceKey)
+{
+ return fGrammarResolver->getGrammar(nameSpaceKey);
+}
+
XERCES_CPP_NAMESPACE_END
1.14 +19 -5 xml-xerces/c/src/xercesc/parsers/DOMBuilderImpl.cpp
Index: DOMBuilderImpl.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/parsers/DOMBuilderImpl.cpp,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- DOMBuilderImpl.cpp 4 Nov 2002 14:57:03 -0000 1.13
+++ DOMBuilderImpl.cpp 4 Dec 2002 01:57:09 -0000 1.14
@@ -78,6 +78,7 @@
#include <xercesc/sax/SAXParseException.hpp>
#include <xercesc/internal/XMLScanner.hpp>
#include <xercesc/framework/Wrapper4DOMInputSource.hpp>
+#include <xercesc/validators/common/GrammarResolver.hpp>
XERCES_CPP_NAMESPACE_BEGIN
@@ -231,7 +232,11 @@
else if (XMLString::compareIString(name,
XMLUni::fgXercesUseCachedGrammarInParse) == 0)
{
if (state || !getScanner()->isCachingGrammarFromParse())
- getScanner()->useCachedGrammarInParse(state);
+ getScanner()->useCachedGrammarInParse(state);
+ }
+ else if (XMLString::compareIString(name, XMLUni::fgXercesCalculateSrcOfs) == 0)
+ {
+ getScanner()->setCalculateSrcOfs(state);
}
else {
throw DOMException(DOMException::NOT_FOUND_ERR, 0);
@@ -304,6 +309,10 @@
{
return getScanner()->isUsingCachedGrammarInParse();
}
+ else if (XMLString::compareIString(name, XMLUni::fgXercesCalculateSrcOfs) == 0)
+ {
+ return getScanner()->getCalculateSrcOfs();
+ }
else {
throw DOMException(DOMException::NOT_FOUND_ERR, 0);
}
@@ -320,7 +329,8 @@
(XMLString::compareIString(name, XMLUni::fgDOMValidation) == 0) ||
(XMLString::compareIString(name, XMLUni::fgDOMValidateIfSchema) == 0) ||
(XMLString::compareIString(name, XMLUni::fgDOMCharsetOverridesXMLEncoding)
== 0) ||
- (XMLString::compareIString(name, XMLUni::fgDOMWhitespaceInElementContent)
== 0)) {
+ (XMLString::compareIString(name, XMLUni::fgDOMWhitespaceInElementContent)
== 0) ||
+ (XMLString::compareIString(name, XMLUni::fgXercesCalculateSrcOfs) == 0)) {
return true;
}
@@ -362,6 +372,10 @@
{
setExternalNoNamespaceSchemaLocation((XMLCh*)value);
}
+ else if (XMLString::equals(name, XMLUni::fgXercesScannerName))
+ {
+ AbstractDOMParser::useScanner((const XMLCh*) value);
+ }
else
throw DOMException(DOMException::NOT_FOUND_ERR, 0);
}
@@ -577,12 +591,12 @@
void DOMBuilderImpl::resetCachedGrammarPool()
{
- getScanner()->resetCachedGrammarPool();
+ getGrammarResolver()->resetCachedGrammar();
}
Grammar* DOMBuilderImpl::getGrammar(const XMLCh* const nameSpaceKey) const
{
- return getScanner()->getGrammar(nameSpaceKey);
+ return getGrammarResolver()->getGrammar(nameSpaceKey);
}
Grammar* DOMBuilderImpl::getRootGrammar() const
1.13 +60 -4 xml-xerces/c/src/xercesc/parsers/AbstractDOMParser.hpp
Index: AbstractDOMParser.hpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/parsers/AbstractDOMParser.hpp,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- AbstractDOMParser.hpp 4 Nov 2002 14:57:03 -0000 1.12
+++ AbstractDOMParser.hpp 4 Dec 2002 01:57:09 -0000 1.13
@@ -61,7 +61,6 @@
#if !defined(ABSTRACTDOMPARSER_HPP)
#define ABSTRACTDOMPARSER_HPP
-
#include <xercesc/dom/DOMDocument.hpp>
#include <xercesc/framework/XMLDocumentHandler.hpp>
#include <xercesc/framework/XMLErrorReporter.hpp>
@@ -81,6 +80,7 @@
class DOMDocumentImpl;
class DOMDocumentTypeImpl;
class DOMElement;
+class GrammarResolver;
/**
@@ -362,6 +362,19 @@
*/
bool getCreateCommentNodes()const;
+ /**
+ * Get the 'calculate src offset flag'
+ *
+ * This method returns the state of the parser's src offset calculation
+ * when parsing an XML document.
+ *
+ * @return true, if the parser is currently configured to
+ * calculate src offsets, false otherwise.
+ *
+ * @see #setCalculateSrcOfs
+ */
+ bool getCalculateSrcOfs() const;
+
//@}
@@ -611,6 +624,29 @@
*/
void setCreateCommentNodes(const bool create);
+ /** Enable/disable src offset calculation
+ *
+ * This method allows users to enable/disable src offset calculation.
+ * Disabling the calculation will improve performance.
+ *
+ * The parser's default state is: true.
+ *
+ * @param newState The value specifying whether we should enable or
+ * disable src offset calculation
+ *
+ * @see #getCalculateSrcOfs
+ */
+ void setCalculateSrcOfs(const bool newState);
+
+ /** Set the scanner to use when scanning the XML document
+ *
+ * This method allows users to set the the scanner to use
+ * when scanning a given XML document.
+ *
+ * @param scannerName The name of the desired scanner
+ */
+ void useScanner(const XMLCh* const scannerName);
+
//@}
@@ -1234,6 +1270,12 @@
*/
XMLScanner* getScanner() const;
+ /** Get the Grammar resolver
+ *
+ * This provides derived classes with access to the grammar resolver.
+ */
+ GrammarResolver* getGrammarResolver() const;
+
/** Get the parse in progress flag
*
* This provides derived classes with access to the parse in progress
@@ -1291,6 +1333,12 @@
private :
// -----------------------------------------------------------------------
+ // Initialize/Cleanup methods
+ // -----------------------------------------------------------------------
+ void initialize();
+ void cleanUp();
+
+ // -----------------------------------------------------------------------
// Private data members
//
// fCurrentNode
@@ -1353,6 +1401,8 @@
bool fIncludeIgnorableWhitespace;
bool fWithinElement;
bool fParseInProgress;
+ bool fCreateCommentNodes;
+ bool fDocumentAdoptedByUser;
XMLBufferMgr fBufMgr;
XMLScanner* fScanner;
DOMNode* fCurrentParent;
@@ -1362,8 +1412,9 @@
ValueStackOf<DOMNode*>* fNodeStack;
DOMDocumentTypeImpl* fDocumentType;
RefVectorOf<DOMDocumentImpl>* fDocumentVector;
- bool fCreateCommentNodes;
- bool fDocumentAdoptedByUser;
+ GrammarResolver* fGrammarResolver;
+ XMLStringPool* fURIStringPool;
+ XMLValidator* fValidator;
XMLBuffer& fInternalSubset;
};
@@ -1394,6 +1445,11 @@
inline XMLScanner* AbstractDOMParser::getScanner() const
{
return fScanner;
+}
+
+inline GrammarResolver* AbstractDOMParser::getGrammarResolver() const
+{
+ return fGrammarResolver;
}
inline bool AbstractDOMParser::getCreateCommentNodes() const
1.28 +73 -17 xml-xerces/c/src/xercesc/parsers/AbstractDOMParser.cpp
Index: AbstractDOMParser.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/parsers/AbstractDOMParser.cpp,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -r1.27 -r1.28
--- AbstractDOMParser.cpp 4 Nov 2002 14:57:03 -0000 1.27
+++ AbstractDOMParser.cpp 4 Dec 2002 01:57:09 -0000 1.28
@@ -68,13 +68,14 @@
// ---------------------------------------------------------------------------
// Includes
// ---------------------------------------------------------------------------
+#include <xercesc/parsers/AbstractDOMParser.hpp>
+#include <xercesc/internal/XMLScannerResolver.hpp>
+#include <xercesc/internal/ElemStack.hpp>
#include <xercesc/sax/EntityResolver.hpp>
#include <xercesc/util/XMLUniDefs.hpp>
#include <xercesc/framework/XMLNotationDecl.hpp>
+#include <xercesc/framework/XMLValidator.hpp>
#include <xercesc/util/IOException.hpp>
-#include <xercesc/internal/XMLScanner.hpp>
-#include <xercesc/validators/DTD/DTDValidator.hpp>
-#include <xercesc/parsers/AbstractDOMParser.hpp>
#include <xercesc/dom/DOMImplementation.hpp>
#include <xercesc/dom/DOMElement.hpp>
#include <xercesc/dom/impl/DOMAttrImpl.hpp>
@@ -92,9 +93,9 @@
#include <xercesc/dom/DOMProcessingInstruction.hpp>
#include <xercesc/dom/impl/DOMProcessingInstructionImpl.hpp>
#include <xercesc/dom/impl/DOMNodeIDMap.hpp>
-
#include <xercesc/validators/common/ContentSpecNode.hpp>
-#include <xercesc/validators/DTD/DTDAttDefList.hpp>
+#include <xercesc/validators/common/GrammarResolver.hpp>
+
XERCES_CPP_NAMESPACE_BEGIN
@@ -108,6 +109,8 @@
, fIncludeIgnorableWhitespace(true)
, fWithinElement(false)
, fParseInProgress(false)
+, fCreateCommentNodes(true)
+, fDocumentAdoptedByUser(false)
, fScanner(0)
, fCurrentParent(0)
, fCurrentNode(0)
@@ -116,34 +119,65 @@
, fNodeStack(0)
, fDocumentType(0)
, fDocumentVector(0)
-, fCreateCommentNodes(true)
-, fDocumentAdoptedByUser(false)
+, fGrammarResolver(0)
+, fURIStringPool(0)
+, fValidator(valToAdopt)
, fInternalSubset(fBufMgr.bidOnBuffer())
{
- //
+ try
+ {
+ initialize();
+ }
+ catch(...)
+ {
+ cleanUp();
+ throw;
+ }
+}
+
+
+AbstractDOMParser::~AbstractDOMParser()
+{
+ cleanUp();
+}
+
+// ---------------------------------------------------------------------------
+// AbstractDOMParser: Initialize/CleanUp methods
+// ---------------------------------------------------------------------------
+void AbstractDOMParser::initialize()
+{
+ // Create grammar resolver and string pool to pass to the scanner
+ fGrammarResolver = new GrammarResolver;
+ fURIStringPool = new XMLStringPool;
+
// Create a scanner and tell it what validator to use. Then set us
// as the document event handler so we can fill the DOM document.
- //
- fScanner = new XMLScanner(valToAdopt);
+ fScanner = XMLScannerResolver::getDefaultScanner(fValidator);
fScanner->setDocHandler(this);
fScanner->setDocTypeHandler(this);
+ fScanner->setGrammarResolver(fGrammarResolver);
+ fScanner->setURIStringPool(fURIStringPool);
fNodeStack = new ValueStackOf<DOMNode*>(64);
this->reset();
}
-
-AbstractDOMParser::~AbstractDOMParser()
+void AbstractDOMParser::cleanUp()
{
if (fDocumentVector)
delete fDocumentVector;
if (!fDocumentAdoptedByUser)
delete fDocument;
+
delete fNodeStack;
delete fScanner;
-}
+ delete fGrammarResolver;
+ delete fURIStringPool;
+ if (fValidator)
+ delete fValidator;
+}
// ---------------------------------------------------------------------------
// AbstractDOMParser: Utilities
@@ -266,6 +300,11 @@
return fScanner->getLoadExternalDTD();
}
+bool AbstractDOMParser::getCalculateSrcOfs() const
+{
+ return fScanner->getCalculateSrcOfs();
+}
+
// ---------------------------------------------------------------------------
// AbstractDOMParser: Setter methods
@@ -328,6 +367,24 @@
fScanner->setLoadExternalDTD(newState);
}
+void AbstractDOMParser::setCalculateSrcOfs(const bool newState)
+{
+ fScanner->setCalculateSrcOfs(newState);
+}
+
+void AbstractDOMParser::useScanner(const XMLCh* const scannerName)
+{
+ XMLScanner* tempScanner = XMLScannerResolver::resolveScanner(scannerName,
fValidator);
+
+ if (tempScanner) {
+
+ // REVISIT: need to set scanner options and handlers
+ delete fScanner;
+ fScanner = tempScanner;
+ fScanner->setGrammarResolver(fGrammarResolver);
+ fScanner->setURIStringPool(fURIStringPool);
+ }
+}
// ---------------------------------------------------------------------------
// AbstractDOMParser: Parsing methods
@@ -801,10 +858,9 @@
// done here.
const XMLCh* qualifiedName = attr->getFullName();
XMLBufBid bbPrefixQName(&fBufMgr);
- XMLBufBid bbQName(&fBufMgr);
XMLBuffer& prefixBuf = bbPrefixQName.getBuffer();
- XMLBuffer& nameBuf = bbQName.getBuffer();
- unsigned int uriId = fScanner->resolveQName(qualifiedName,
nameBuf, prefixBuf, ElemStack::Mode_Attribute);
+ int colonPos = -1;
+ unsigned int uriId = fScanner->resolveQName(qualifiedName,
prefixBuf, ElemStack::Mode_Attribute, colonPos);
const XMLCh* namespaceURI = 0;
if (XMLString::equals(qualifiedName, XMLNS)) //for
xmlns=...
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]