You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by pe...@apache.org on 2004/03/06 22:57:54 UTC
cvs commit: xml-xerces/c/tests/XSerializerTest XSerializerTest.cpp
peiyongz 2004/03/06 13:57:54
Modified: c/tests/XSerializerTest XSerializerTest.cpp
Log:
Make each test case run with distinct (de)serialization context, memMgr/gramPool/Parser
Revision Changes Path
1.8 +241 -246 xml-xerces/c/tests/XSerializerTest/XSerializerTest.cpp
Index: XSerializerTest.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/tests/XSerializerTest/XSerializerTest.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- XSerializerTest.cpp 14 Jan 2004 18:58:57 -0000 1.7
+++ XSerializerTest.cpp 6 Mar 2004 21:57:54 -0000 1.8
@@ -57,6 +57,9 @@
/*
* $Id$
* $Log$
+* Revision 1.8 2004/03/06 21:57:54 peiyongz
+* Make each test case run with distinct (de)serialization context, memMgr/gramPool/Parser
+*
* Revision 1.7 2004/01/14 18:58:57 peiyongz
* XSerializerTest documentation updated
*
@@ -114,19 +117,11 @@
// ---------------------------------------------------------------------------
// parsing components
// ---------------------------------------------------------------------------
-static SAX2XMLReader* parser = 0;
-static MemoryManager* myMemMgr = 0;
-static XMLGrammarPool* myGramPool = 0;
static XSerializerHandlers* handler = 0;
-static BinInputStream* myIn = 0;
-static BinOutputStream* myOut = 0;
-
-static bool serializeGrammarOK = true;
-static const int BufSize = 1024;
/***
*
-* This program is a variation of SAXCount.
+* This program is a variation of SAX2Count.
*
* Whenever a file is served, it does the following:
*
@@ -139,6 +134,27 @@
*
***/
+#include <stdio.h>
+
+static
+void parseCase(const char* const xmlFile);
+
+static
+bool parseOne(BinOutputStream* outStream
+ , const char* const xmlFile);
+
+static
+void parseTwo(BinInputStream* inStream
+ , const char* const xmlFile);
+
+static
+void parseFile(SAX2XMLReader* const parser
+ , const char* const xmlFile);
+
+static
+SAX2XMLReader* getParser(XMLGrammarPool* const theGramPool
+ , bool setHandler);
+
// ---------------------------------------------------------------------------
// Local helper methods
// ---------------------------------------------------------------------------
@@ -165,239 +181,6 @@
<< XERCES_STD_QUALIFIER endl;
}
-static void init()
-{
- //
- // Create our SAX handler object and install it on the parser, as the
- // document and error handler.
- //
- if (!handler)
- handler = new XSerializerHandlers();
-
-}
-
-static void cleanUp()
-{
- if (handler)
- delete handler;
-
- if (myIn)
- delete myIn;
-
- if (myOut)
- delete myOut;
-
-}
-
-static BinOutputStream* getOutputStream()
-{
- if (!myOut)
- {
- myOut = new BinMemOutputStream(BufSize);
- }
-
- ((BinMemOutputStream*)myOut)->reset();
-
- return myOut;
-}
-
-static BinInputStream* getInputStream()
-{
- if (!myOut)
- {
- XERCES_STD_QUALIFIER cerr << "DEserialization has to be done after serialization\n";
- exit(-1);
- }
-
- //BinMemInputStream can not refer to a different data once
- //it is instantiated, so we delete it and have a new one.
- if (myIn)
- {
- delete myIn;
- myIn = 0;
- }
-
- //make it to refer to the binary data saved in the myOut
- //but the data still belong to myOut
- myIn = new BinMemInputStream( ((BinMemOutputStream*)myOut)->getRawBuffer()
- , ((BinMemOutputStream*)myOut)->getSize()
- , BinMemInputStream::BufOpt_Reference
- );
- return myIn;
-}
-
-static void getParser(bool setHandler)
-{
-
- myMemMgr = new MemoryManagerImpl();
- myGramPool = new XMLGrammarPoolImpl(myMemMgr);
-
- parser = XMLReaderFactory::createXMLReader(myMemMgr, myGramPool);
-
- parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, doNamespaces);
- parser->setFeature(XMLUni::fgXercesSchema, doSchema);
- parser->setFeature(XMLUni::fgXercesSchemaFullChecking, schemaFullChecking);
- parser->setFeature(XMLUni::fgSAX2CoreNameSpacePrefixes, namespacePrefixes);
-
- if (valScheme == SAX2XMLReader::Val_Auto)
- {
- parser->setFeature(XMLUni::fgSAX2CoreValidation, true);
- parser->setFeature(XMLUni::fgXercesDynamic, true);
- }
- if (valScheme == SAX2XMLReader::Val_Never)
- {
- parser->setFeature(XMLUni::fgSAX2CoreValidation, false);
- }
- if (valScheme == SAX2XMLReader::Val_Always)
- {
- parser->setFeature(XMLUni::fgSAX2CoreValidation, true);
- parser->setFeature(XMLUni::fgXercesDynamic, false);
- }
-
- if (setHandler)
- {
- parser->setContentHandler(handler);
- parser->setErrorHandler(handler);
- }
- else
- {
- parser->setContentHandler(0);
- parser->setErrorHandler(0);
- }
-}
-
-static void destroyParser()
-{
- //the order is important
- delete parser;
- delete myGramPool;
- delete myMemMgr;
-}
-
-// parse the instance document and
-// build a grammar from parsing
-//return false if no grammar built
-static bool getAndSaveGrammar(const char* const xmlFile)
-{
- bool retVal = true;
- getParser(false); //don't emit error
-
- parser->setFeature(XMLUni::fgXercesCacheGrammarFromParse, true);
-
- try
- {
- parser->parse(xmlFile);
- }
- catch (...)
- {
- //do nothing
- // it could be instance document is invalid
- // but the grammar is fine
- }
-
- try
- {
- myGramPool->serializeGrammars(getOutputStream());
- }
- catch(const XSerializationException& e)
- {
- //do emit error here so that we know serialization failure
- XERCES_STD_QUALIFIER cerr << "An error occurred during serialization\n Message: "
- << StrX(e.getMessage()) << XERCES_STD_QUALIFIER endl;
-
- retVal = false;
- }
-
- destroyParser();
- return retVal;
-}
-
-static bool restoreGrammar()
-{
- bool retVal = true;
- getParser(true); //emit error
-
- try
- {
- myGramPool->deserializeGrammars(getInputStream());
- }
- catch(const XSerializationException& e)
- {
- XERCES_STD_QUALIFIER cerr << "An error occurred during de-serialization\n Message: "
- << StrX(e.getMessage()) << XERCES_STD_QUALIFIER endl;
-
- destroyParser();
- retVal = false;
- }
-
- //parser to be used by parseing file
- return retVal;
-}
-
-static void parseFile(const char* const xmlFile)
-{
- //
- // Get the starting time and kick off the parse of the indicated
- // file. Catch any exceptions that might propogate out of it.
- //
- unsigned long duration;
-
- //reset error count first
- handler->resetErrors();
-
- try
- {
- const unsigned long startMillis = XMLPlatformUtils::getCurrentMillis();
- parser->parse(xmlFile);
- const unsigned long endMillis = XMLPlatformUtils::getCurrentMillis();
- duration = endMillis - startMillis;
- }
- catch (const XMLException& e)
- {
- XERCES_STD_QUALIFIER cerr << "\nError during parsing: '" << xmlFile << "'\n"
- << "Exception message is: \n"
- << StrX(e.getMessage()) << "\n" << XERCES_STD_QUALIFIER endl;
- errorOccurred = true;
- }
- catch (...)
- {
- XERCES_STD_QUALIFIER cerr << "\nUnexpected exception during parsing: '" << xmlFile << "'\n";
- errorOccurred = true;
- }
-
- // Print out the stats that we collected and time taken
- if (!handler->getSawErrors())
- {
- XERCES_STD_QUALIFIER cout << xmlFile << ": " << duration << " ms ("
- << handler->getElementCount() << " elems, "
- << handler->getAttrCount() << " attrs, "
- << handler->getSpaceCount() << " spaces, "
- << handler->getCharacterCount() << " chars)" << XERCES_STD_QUALIFIER endl;
- }
- else
- errorOccurred = true;
-
-}
-
-static void parseCase(const char* const xmlFile)
-{
-
- //if we can successfully getAndSaveGrammar and
- // restoreGrammar, then parse using the cached Grammar
- if (getAndSaveGrammar(xmlFile) && restoreGrammar())
- {
- parser->setFeature(XMLUni::fgXercesUseCachedGrammarInParse, true);
- }
- else //otherwise, do a normal parsing
- {
- getParser(true);
- }
-
- parseFile(xmlFile);
- destroyParser();
-
-}
-
// ---------------------------------------------------------------------------
// Program entry point
// ---------------------------------------------------------------------------
@@ -515,7 +298,6 @@
XMLPlatformUtils::recognizeNEL(recognizeNEL);
}
- init();
}
catch (const XMLException& toCatch)
@@ -571,8 +353,6 @@
if (doList)
fin.close();
- cleanUp();
-
// And call the termination method
XMLPlatformUtils::Terminate();
@@ -580,6 +360,221 @@
return 4;
else
return 0;
+
+}
+
+// ---------------------------------------------------------------------------
+// Serialization/Deserialization
+// ---------------------------------------------------------------------------
+static const int BufSize = 1024;
+
+static void parseCase(const char* const xmlFile)
+{
+ //
+ // Create our SAX handler object and install it on the parser, as the
+ // document and error handler.
+ //
+ if (!handler)
+ handler = new XSerializerHandlers();
+
+ BinOutputStream* myOut = new BinMemOutputStream(BufSize);
+ Janitor<BinOutputStream> janOut(myOut);
+
+ if (!parseOne(myOut, xmlFile))
+ return;
+
+ BinInputStream* myIn = new BinMemInputStream(
+ ((BinMemOutputStream*)myOut)->getRawBuffer()
+ , ((BinMemOutputStream*)myOut)->getSize()
+ , BinMemInputStream::BufOpt_Reference
+ );
+ Janitor<BinInputStream> janIn(myIn);
+
+ parseTwo(myIn, xmlFile);
+
+}
+
+static
+bool parseOne(BinOutputStream* outStream
+ , const char* const xmlFile)
+{
+ //we don't use janitor here
+ MemoryManager* theMemMgr = new MemoryManagerImpl();
+ XMLGrammarPool* theGramPool = new XMLGrammarPoolImpl(theMemMgr);
+ SAX2XMLReader* theParser = getParser(theGramPool, false); //don't emit error
+ bool retVal = true;
+
+ theParser->setFeature(XMLUni::fgXercesCacheGrammarFromParse, true);
+
+ //scan instance document and cache grammar
+ try
+ {
+ theParser->parse(xmlFile);
+ }
+ catch (...)
+ {
+ //do nothing, it could be an invalid instance document, but the grammar is fine
+ }
+
+ //serialize the grammar pool
+ try
+ {
+ theGramPool->serializeGrammars(outStream);
+ }
+ catch (const XSerializationException& e)
+ {
+ //do emit error here so that we know serialization failure
+ XERCES_STD_QUALIFIER cerr << "An error occurred during serialization\n Message: "
+ << StrX(e.getMessage()) << XERCES_STD_QUALIFIER endl;
+
+ retVal = false;
+ }
+
+ catch (...)
+ {
+ //do emit error here so that we know serialization failure
+ XERCES_STD_QUALIFIER cerr << "An error occurred during serialization\n" << XERCES_STD_QUALIFIER endl;
+
+ retVal = false;
+ }
+
+ //the order is important
+ delete theParser;
+ delete theGramPool;
+ delete theMemMgr;
+
+ return retVal;
+}
+
+static
+void parseTwo(BinInputStream* inStream
+ , const char* const xmlFile)
+{
+ //we don't use janitor here
+ MemoryManager* theMemMgr = new MemoryManagerImpl();
+ XMLGrammarPool* theGramPool = new XMLGrammarPoolImpl(theMemMgr);
+ bool errorSeen = false;
+
+ //de-serialize grammar pool
+ try
+ {
+ theGramPool->deserializeGrammars(inStream);
+ }
+
+ catch(const XSerializationException& e)
+ {
+ XERCES_STD_QUALIFIER cerr << "An error occurred during de-serialization\n Message: "
+ << StrX(e.getMessage()) << XERCES_STD_QUALIFIER endl;
+
+ errorSeen = true;
+ }
+
+ catch (...)
+ {
+ //do emit error here so that we know serialization failure
+ XERCES_STD_QUALIFIER cerr << "An error occurred during de-serialization\n" << XERCES_STD_QUALIFIER endl;
+
+ errorSeen = true;
+ }
+
+ if (!errorSeen)
+ {
+ SAX2XMLReader* theParser = getParser(theGramPool, true); //set the handler
+
+ theParser->setFeature(XMLUni::fgXercesUseCachedGrammarInParse, true);
+ parseFile(theParser, xmlFile);
+ delete theParser;
+ }
+
+ //the order is important
+ delete theGramPool;
+ delete theMemMgr;
+
+ return;
+}
+
+static SAX2XMLReader* getParser(XMLGrammarPool* const theGramPool
+ , bool setHandler)
+{
+ SAX2XMLReader* parser = XMLReaderFactory::createXMLReader(theGramPool->getMemoryManager(), theGramPool);
+
+ parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, doNamespaces);
+ parser->setFeature(XMLUni::fgXercesSchema, doSchema);
+ parser->setFeature(XMLUni::fgXercesSchemaFullChecking, schemaFullChecking);
+ parser->setFeature(XMLUni::fgSAX2CoreNameSpacePrefixes, namespacePrefixes);
+
+ if (valScheme == SAX2XMLReader::Val_Auto)
+ {
+ parser->setFeature(XMLUni::fgSAX2CoreValidation, true);
+ parser->setFeature(XMLUni::fgXercesDynamic, true);
+ }
+ if (valScheme == SAX2XMLReader::Val_Never)
+ {
+ parser->setFeature(XMLUni::fgSAX2CoreValidation, false);
+ }
+ if (valScheme == SAX2XMLReader::Val_Always)
+ {
+ parser->setFeature(XMLUni::fgSAX2CoreValidation, true);
+ parser->setFeature(XMLUni::fgXercesDynamic, false);
+ }
+
+ if (setHandler)
+ {
+ parser->setContentHandler(handler);
+ parser->setErrorHandler(handler);
+ }
+ else
+ {
+ parser->setContentHandler(0);
+ parser->setErrorHandler(0);
+ }
+
+ return parser;
+}
+
+static void parseFile(SAX2XMLReader* const parser
+ , const char* const xmlFile)
+{
+ //
+ // Get the starting time and kick off the parse of the indicated
+ // file. Catch any exceptions that might propogate out of it.
+ //
+ unsigned long duration;
+
+ //reset error count first
+ handler->resetErrors();
+
+ try
+ {
+ const unsigned long startMillis = XMLPlatformUtils::getCurrentMillis();
+ parser->parse(xmlFile);
+ const unsigned long endMillis = XMLPlatformUtils::getCurrentMillis();
+ duration = endMillis - startMillis;
+ }
+ catch (const XMLException& e)
+ {
+ XERCES_STD_QUALIFIER cerr << "\nError during parsing: '" << xmlFile << "'\n"
+ << "Exception message is: \n"
+ << StrX(e.getMessage()) << "\n" << XERCES_STD_QUALIFIER endl;
+ errorOccurred = true;
+ }
+ catch (...)
+ {
+ XERCES_STD_QUALIFIER cerr << "\nUnexpected exception during parsing: '" << xmlFile << "'\n";
+ errorOccurred = true;
+ }
+
+ // Print out the stats that we collected and time taken
+ if (!handler->getSawErrors())
+ {
+ XERCES_STD_QUALIFIER cout << xmlFile << ": " << duration << " ms ("
+ << handler->getElementCount() << " elems, "
+ << handler->getAttrCount() << " attrs, "
+ << handler->getSpaceCount() << " spaces, "
+ << handler->getCharacterCount() << " chars)" << XERCES_STD_QUALIFIER endl;
+ }
+ else
+ errorOccurred = true;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org