[GME-commit] GMESRC/GME/XmlBackEnd DOMErrorPrinter.cpp, NONE, 1.1 DOMErrorPrinter.h, NONE, 1.1 CoreXmlFile.cpp, 1.32, 1.33 CoreXmlFile.h, 1.16, 1.17 OperOptions.cpp, 1.3, 1.4 OperOptions.h, 1.2, 1.3 XmlBackEnd.vcproj, 1.9, 1.10
Log messages of CVS commits
gme-commit at list.isis.vanderbilt.edu
Thu Feb 21 12:17:01 CST 2008
Update of /project/gme-repository/GMESRC/GME/XmlBackEnd
In directory escher:/tmp/cvs-serv24322
Modified Files:
CoreXmlFile.cpp CoreXmlFile.h OperOptions.cpp OperOptions.h
XmlBackEnd.vcproj
Added Files:
DOMErrorPrinter.cpp DOMErrorPrinter.h
Log Message:
Xml parsing notifies about errors in case of
the individual xml files and the project files.
Shared parser objects used for faster parsing if option turned on from config file.
CVS User: Zoltan Molnar, ISIS (zolmol)
Index: XmlBackEnd.vcproj
===================================================================
RCS file: /project/gme-repository/GMESRC/GME/XmlBackEnd/XmlBackEnd.vcproj,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** XmlBackEnd.vcproj 18 Feb 2008 20:43:49 -0000 1.9
--- XmlBackEnd.vcproj 21 Feb 2008 18:16:58 -0000 1.10
***************
*** 276,279 ****
--- 276,282 ----
</File>
<File
+ RelativePath=".\DOMErrorPrinter.cpp">
+ </File>
+ <File
RelativePath=".\FileHelp.cpp">
</File>
***************
*** 501,504 ****
--- 504,510 ----
<File
RelativePath=".\DirSupplier.h">
+ </File>
+ <File
+ RelativePath=".\DOMErrorPrinter.h">
</File>
<File
Index: OperOptions.h
===================================================================
RCS file: /project/gme-repository/GMESRC/GME/XmlBackEnd/OperOptions.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** OperOptions.h 13 Feb 2008 18:54:57 -0000 1.2
--- OperOptions.h 21 Feb 2008 18:16:58 -0000 1.3
***************
*** 32,35 ****
--- 32,36 ----
bool m_doModelParentLock;
bool m_doBaseTypeLock;
+ bool m_optimizedParsing;
bool m_partialLoad;
bool m_useAccountInfo;
--- NEW FILE: DOMErrorPrinter.h ---
#pragma once
#include <xercesc/dom/DOMErrorHandler.hpp>
#include <xercesc/dom/DOMError.hpp>
class MsgConsole;
class DOMErrorPrinter : public XERCES_CPP_NAMESPACE::DOMErrorHandler
{
public:
DOMErrorPrinter( MsgConsole* p_consolePtr)
: m_consolePtr( p_consolePtr)
{};
virtual ~DOMErrorPrinter()
{};
void resetErrors()
{};
virtual bool handleError(const XERCES_CPP_NAMESPACE::DOMError& domError); // implemented callback method
protected:
MsgConsole* m_consolePtr;
private :
DOMErrorPrinter(const DOMErrorHandler&);
void operator=(const DOMErrorHandler&);
};
--- NEW FILE: DOMErrorPrinter.cpp ---
#include "stdafx.h"
#include ".\DomErrorPrinter.h"
#include <xercesc/dom/DOMLocator.hpp>
#include <xercesc/util/XMLString.hpp>
#include "MsgConsole.h"
//#include "Transcoder.h"
using namespace XERCES_CPP_NAMESPACE;
bool DOMErrorPrinter::handleError(const DOMError &domError)
{
msgtype_enum mt;
bool fatal = false;
if( domError.getSeverity() == DOMError::DOM_SEVERITY_WARNING)
mt = MSG_WARNING;
else if( domError.getSeverity() == DOMError::DOM_SEVERITY_ERROR)
mt = MSG_ERROR;
else
fatal = true, mt = MSG_ERROR;
// general message
char *e_msg = XMLString::transcode(domError.getMessage());
std::string msg = std::string( fatal? "[Fatal Error] ": "") + e_msg;
// send msg
if( m_consolePtr) m_consolePtr->sendMsg( msg, mt);
else MsgConsole::ssendMsg( msg, mt);
XMLString::release(&e_msg);
// location info available?
DOMLocator* loc = domError.getLocation();
if( loc)
{
char line_nmbs[256];
memset( line_nmbs, 0, sizeof(line_nmbs));
char* f_str = XMLString::transcode(loc->getURI());
sprintf( line_nmbs, "Line: %u Column: %u of File: ", loc->getLineNumber(), loc->getColumnNumber());
std::string linfo = std::string( line_nmbs) + f_str;
// send msg
if( m_consolePtr) m_consolePtr->sendMsg( linfo, mt);
else MsgConsole::ssendMsg( linfo, mt);
XMLString::release( &f_str);
}
// Instructs the serializer to continue serialization if possible.
return true;
}
Index: CoreXmlFile.h
===================================================================
RCS file: /project/gme-repository/GMESRC/GME/XmlBackEnd/CoreXmlFile.h,v
retrieving revision 1.16
retrieving revision 1.17
diff -C2 -d -r1.16 -r1.17
*** CoreXmlFile.h 20 Feb 2008 22:08:52 -0000 1.16
--- CoreXmlFile.h 21 Feb 2008 18:16:58 -0000 1.17
***************
*** 783,786 ****
--- 783,804 ----
inline bool fileExist ( const std::string& p_file);
*/
+ protected: // parser opts
+
+ XERCES_CPP_NAMESPACE::DOMDocument*
+ enclosedParse ( const std::string& p_fileName, XERCES_CPP_NAMESPACE::DOMBuilder* p_parser, bool *p_success);
+
+ XERCES_CPP_NAMESPACE::DOMImplementationLS * giveDomImpl();
+ XERCES_CPP_NAMESPACE::DOMBuilder* giveDomParser( XERCES_CPP_NAMESPACE::DOMImplementationLS * domimpl);
+ void giveDOMObjs( XERCES_CPP_NAMESPACE::DOMImplementationLS* *p_domImpl, XERCES_CPP_NAMESPACE::DOMBuilder* *p_domParser, XERCES_CPP_NAMESPACE::DOMErrorHandler* *p_domErrHandler);
+ void newDOMObjs( XERCES_CPP_NAMESPACE::DOMImplementationLS* *p_domImpl, XERCES_CPP_NAMESPACE::DOMBuilder* *p_domParser, XERCES_CPP_NAMESPACE::DOMErrorHandler* *p_domErrHandler);
+ void initParsers ();
+ void deleteParser (XERCES_CPP_NAMESPACE::DOMBuilder* *p_parser);
+ void finiParsers ();
+
+ bool m_strategyShared;
+
+ DOMImplementationLS * m_domImpl;
+ DOMBuilder * m_domParser;
+ DOMErrorHandler* m_domErrHandler;
protected:
Index: OperOptions.cpp
===================================================================
RCS file: /project/gme-repository/GMESRC/GME/XmlBackEnd/OperOptions.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** OperOptions.cpp 15 Feb 2008 21:06:43 -0000 1.3
--- OperOptions.cpp 21 Feb 2008 18:16:58 -0000 1.4
***************
*** 19,22 ****
--- 19,23 ----
, m_doModelParentLock( true)
, m_doBaseTypeLock( true)
+ , m_optimizedParsing( false)
, m_partialLoad( false)
, m_useAccountInfo( false)
***************
*** 50,53 ****
--- 51,55 ----
m_doModelParentLock = true;
m_doBaseTypeLock = true;
+ m_optimizedParsing = false;
m_partialLoad = false;
m_useAccountInfo = false;
***************
*** 128,131 ****
--- 130,137 ----
m_defCheckOutOnAction = parseBool( line, "DefCheckOutOnAction"); //m_defCheckOutOnAction = true;
}
+ else if( 0 == line.find( "OptimizedParsing"))
+ {
+ m_optimizedParsing = parseBool( line, "OptimizedParsing");
+ }
else if( 0 == line.find( "PartialLoad"))//=true"))
{
***************
*** 238,241 ****
--- 244,248 ----
//parent->sendMsg( std::string( "[DebugMode]Log=") + (m_createLog?"true":"false"), MSG_INFO);
#endif
+ if( m_optimizedParsing) parent->sendMsg( std::string( "OptimizedParsing=") + (m_optimizedParsing?"true":"false"), MSG_INFO);
parent->sendMsg( std::string( "PartialLoad=") + (m_partialLoad?"true":"false"), MSG_INFO);
//parent->sendMsg( std::string( "Adv. Settings {RTgt, CEnd, CSeg, ModP, BasT}=")
Index: CoreXmlFile.cpp
===================================================================
RCS file: /project/gme-repository/GMESRC/GME/XmlBackEnd/CoreXmlFile.cpp,v
retrieving revision 1.32
retrieving revision 1.33
diff -C2 -d -r1.32 -r1.33
*** CoreXmlFile.cpp 20 Feb 2008 22:08:52 -0000 1.32
--- CoreXmlFile.cpp 21 Feb 2008 18:16:58 -0000 1.33
***************
*** 13,16 ****
--- 13,18 ----
#include "FilesInUseDlg.h"
#include "FilesInUseDetailsDlg.h"
+ #include "DomErrorPrinter.h"
+ #include <xercesc/util/OutOfMemoryException.hpp>
#include <xercesc/framework/LocalFileFormatTarget.hpp>
#include "SvnExec.h"
***************
*** 588,591 ****
--- 590,597 ----
m_comSvn = CComPtr<ISvnExec>(0);
m_cmdSvn = 0;
+ m_domImpl = 0;
+ m_domParser = 0;
+ m_domErrHandler = 0;
+ m_strategyShared = false;
fillParentMap();
***************
*** 3210,3218 ****
DOMImplementationLS * domimpl = DOMImplementationRegistry::getDOMImplementation(NULL);
ASSERT( domimpl != NULL );
! parser = domimpl->createDOMBuilder( DOMImplementationLS::MODE_SYNCHRONOUS, NULL );
ASSERT( parser != NULL );
! XERCES_CPP_NAMESPACE::DOMDocument * doc = parser->parseURI( m_projectFileName.c_str() );
! if( doc == NULL )
{
//sendMsg( "Could not find or parse project file " + m_projectFileName, MSG_ERROR);
--- 3216,3235 ----
DOMImplementationLS * domimpl = DOMImplementationRegistry::getDOMImplementation(NULL);
ASSERT( domimpl != NULL );
! parser = !domimpl? 0: domimpl->createDOMBuilder( DOMImplementationLS::MODE_SYNCHRONOUS, NULL );
ASSERT( parser != NULL );
+ if( !domimpl || !parser)
+ {
+ sendMsg( "Exception: Could not create parser!", MSG_ERROR);
+ HR_THROW(E_FILEOPEN);
+ }
! DOMErrorHandler* err_handler = new DOMErrorPrinter( &m_console);
! parser->setErrorHandler( err_handler);
!
! //XERCES_CPP_NAMESPACE::DOMDocument * doc = parser->parseURI( m_projectFileName.c_str() );
! //if( doc == NULL )
! bool suc;
! XERCES_CPP_NAMESPACE::DOMDocument * doc = enclosedParse( m_projectFileName, parser, &suc);
! if( !doc || !suc)
{
//sendMsg( "Could not find or parse project file " + m_projectFileName, MSG_ERROR);
***************
*** 3220,3225 ****
bool fexists = GetFileAttributesEx( m_projectFileName.c_str(), GetFileExInfoStandard, &attr );
setFileNames( true); // reset the file name to a newly found one
! doc = parser->parseURI( m_projectFileName.c_str() );
! if( doc == NULL)
{
if( fexists) sendMsg( "Could not parse project file '" + m_projectFileName + "'!", MSG_ERROR);
--- 3237,3243 ----
bool fexists = GetFileAttributesEx( m_projectFileName.c_str(), GetFileExInfoStandard, &attr );
setFileNames( true); // reset the file name to a newly found one
! //doc = parser->parseURI( m_projectFileName.c_str() );
! doc = enclosedParse( m_projectFileName, parser, &suc);
! if( !doc || !suc)
{
if( fexists) sendMsg( "Could not parse project file '" + m_projectFileName + "'!", MSG_ERROR);
***************
*** 3334,3337 ****
--- 3352,3356 ----
XMLString::release( &hashValue);
+ delete err_handler;
delete parser;
}
***************
*** 3645,3654 ****
DOMBuilder * parser = NULL;
try
! {
! DOMImplementationLS * domimpl = DOMImplementationRegistry::getDOMImplementation( XMLString::transcode("XML 1.0"));//NULL
! ASSERT( domimpl != NULL );
- parser = !domimpl? 0: domimpl->createDOMBuilder( DOMImplementationLS::MODE_SYNCHRONOUS, NULL );
- ASSERT( parser != NULL );
if( !domimpl || !parser)
{
--- 3664,3672 ----
DOMBuilder * parser = NULL;
try
! {
! DOMImplementationLS * domimpl = 0;
! DOMErrorHandler* err_handler = 0;
! giveDOMObjs( &domimpl, &parser, &err_handler);
if( !domimpl || !parser)
{
***************
*** 3657,3662 ****
}
! XERCES_CPP_NAMESPACE::DOMDocument * doc = parser->parseURI( fileName );
! if( doc == NULL)
{
sendMsg( std::string( "Could not parse file ") + fileName + "!", MSG_ERROR);
--- 3675,3681 ----
}
! bool suc;
! XERCES_CPP_NAMESPACE::DOMDocument * doc = enclosedParse( fileName, parser, &suc);
! if( !doc || !suc)
{
sendMsg( std::string( "Could not parse file ") + fileName + "!", MSG_ERROR);
***************
*** 3668,3671 ****
--- 3687,3691 ----
{
// todo linenumbers
+ // this might be totally useless
bool might_be_ok = false;
DOMNodeList* list = doc->getChildNodes();
***************
*** 3701,3710 ****
readObject( doc_e, pointers, NULL, fullLoad, lastWriteTime );
! delete parser;
}
catch(...)
{
if( parser != NULL )
! delete parser;
sendMsg( std::string( "Exception during reading ") + fileName + " file!", MSG_ERROR);
--- 3721,3730 ----
readObject( doc_e, pointers, NULL, fullLoad, lastWriteTime );
! deleteParser( &parser);//delete parser;
}
catch(...)
{
if( parser != NULL )
! deleteParser( &parser);//delete parser;
sendMsg( std::string( "Exception during reading ") + fileName + " file!", MSG_ERROR);
***************
*** 3970,3976 ****
--- 3990,4002 ----
clearAll();
+
+ m_strategyShared = m_userOpts.m_optimizedParsing;
+ initParsers(); // shows a message and throws if can't create parser objects
+
// load all dirs
loadDirs( m_folderPath, pointers, fullLoad);
+ finiParsers();
+
#ifdef _DEBUG
#if(DETAILS_ABOUT_XMLBACKEND)
***************
*** 7014,7017 ****
--- 7040,7197 ----
return std::string( "<A HREF=\"mga:") + id + "\">" + (nm.size()>0?nm:"noname") + "</A>";
+ }
+
+ void CCoreXmlFile::initParsers()
+ {
+ m_domImpl = 0;
+ m_domParser = 0;
+ m_domErrHandler = 0;
+
+ if( m_strategyShared) // reusable objects are intended
+ {
+ newDOMObjs( &m_domImpl, &m_domParser, &m_domErrHandler);
+
+ if( !m_domImpl || !m_domParser || !m_domErrHandler)
+ {
+ sendMsg( "Could not create parser and related objects!", MSG_ERROR);
+ HR_THROW(E_FILEOPEN);
+ }
+ }
+ }
+
+ void CCoreXmlFile::finiParsers()
+ {
+ if( m_domParser)
+ {
+ delete m_domParser;
+ m_domParser = 0;
+ }
+
+ if( m_domErrHandler)
+ {
+ delete m_domErrHandler;
+ m_domErrHandler = 0;
+ }
+ }
+
+ // pretends to delete a parser
+ // but deletes it only in unique strategy case
+ void CCoreXmlFile::deleteParser( DOMBuilder* *p_parser)
+ {
+ if( !m_strategyShared)
+ {
+ if( *p_parser)
+ {
+ delete *p_parser;
+ *p_parser = 0;
+ }
+ }
+ }
+
+ void CCoreXmlFile::newDOMObjs( XERCES_CPP_NAMESPACE::DOMImplementationLS* *p_domImpl, XERCES_CPP_NAMESPACE::DOMBuilder* *p_domParser, XERCES_CPP_NAMESPACE::DOMErrorHandler* *p_domErrHandler)
+ {
+ DOMImplementationLS * domimpl = DOMImplementationRegistry::getDOMImplementation( XMLString::transcode("XML 1.0"));//NULL
+ ASSERT( domimpl != NULL );
+
+ DOMBuilder * parser = !domimpl? 0: domimpl->createDOMBuilder( DOMImplementationLS::MODE_SYNCHRONOUS, NULL );
+ ASSERT( parser != NULL );
+
+ DOMErrorHandler* err_handler = new DOMErrorPrinter( &m_console);
+ ASSERT( err_handler != NULL);
+ if( parser && err_handler)
+ parser->setErrorHandler( err_handler);
+
+ *p_domImpl = domimpl;
+ *p_domParser = parser;
+ *p_domErrHandler = err_handler;
+ }
+
+ void CCoreXmlFile::giveDOMObjs( XERCES_CPP_NAMESPACE::DOMImplementationLS* *p_domImpl, XERCES_CPP_NAMESPACE::DOMBuilder* *p_domParser, XERCES_CPP_NAMESPACE::DOMErrorHandler* *p_domErrHandler)
+ {
+ if( m_strategyShared)
+ {
+ // reuse the current set
+ *p_domImpl = m_domImpl;
+ *p_domParser = m_domParser;
+ *p_domErrHandler = m_domErrHandler;
+ }
+ else
+ {
+ // create a new set of objects
+ newDOMObjs( p_domImpl, p_domParser, p_domErrHandler);
+ }
+ }
+
+ DOMImplementationLS * CCoreXmlFile::giveDomImpl()
+ {
+ if( m_strategyShared)
+ return m_domImpl;
+ else
+ {
+ DOMImplementationLS * domimpl = DOMImplementationRegistry::getDOMImplementation( XMLString::transcode("XML 1.0"));//NULL
+ ASSERT( domimpl != NULL );
+ return domimpl;
+ }
+ }
+
+ DOMBuilder * CCoreXmlFile::giveDomParser( DOMImplementationLS * domimpl)
+ {
+ if( m_strategyShared)
+ return m_domParser;
+ else
+ {
+ DOMBuilder *parser = !domimpl? 0: domimpl->createDOMBuilder( DOMImplementationLS::MODE_SYNCHRONOUS, NULL );
+ ASSERT( parser != NULL );
+ return parser;
+ }
+ }
+
+ XERCES_CPP_NAMESPACE::DOMDocument* CCoreXmlFile::enclosedParse( const std::string& p_fileName, DOMBuilder* p_parser, bool *p_success)
+ {
+ ASSERT( p_parser);
+ ASSERT( p_success);
+ if( p_success) *p_success = p_parser != 0;
+ if( !p_parser) return 0;
+
+ XERCES_CPP_NAMESPACE::DOMDocument* doc = 0;
+
+ try {
+ doc = p_parser->parseURI( p_fileName.c_str());
+ }
+ catch( const OutOfMemoryException&) {
+ sendMsg( "Exception: Out of memory during parsing of " + p_fileName + "!", MSG_ERROR);
+ if( p_success) *p_success = false;
+ }
+ catch (const XMLException& e) {
+ char* e_msg = XMLString::transcode( e.getMessage());
+ sendMsg( "An error occurred during parsing of " + p_fileName + ". Message: " + e_msg, MSG_ERROR);
+ XMLString::release( &e_msg);
+ if( p_success) *p_success = false;
+ }
+ catch (const DOMException& e) {
+ const unsigned int maxChars = 2047;
+ XMLCh errText[maxChars + 1];
+ if( DOMImplementation::loadDOMExceptionMsg( e.code, errText, maxChars))
+ {
+ char* e_msg = XMLString::transcode( errText);
+ sendMsg( "An error occurred during parsing of " + p_fileName + ". Message: " + e_msg, MSG_ERROR);
+ XMLString::release( &e_msg);
+ }
+ else
+ {
+ char* e_msg = XMLString::transcode( e.getMessage());
+ sendMsg( "An error occurred during parsing of " + p_fileName + ". Message: " + e_msg, MSG_ERROR);
+ XMLString::release( &e_msg);
+ }
+
+ if( p_success) *p_success = false;
+ }
+ catch (...)
+ {
+ sendMsg( "Unknown exception occurred during parsing of " + p_fileName + "!", MSG_ERROR);
+ if( p_success) *p_success = false;
+ }
+
+ return doc;
}
More information about the GME-commit
mailing list