SUMO - Simulation of Urban MObility
|
00001 /****************************************************************************/ 00009 // Utility methods for initialising, closing and using the XML-subsystem 00010 /****************************************************************************/ 00011 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/ 00012 // Copyright (C) 2001-2012 DLR (http://www.dlr.de/) and contributors 00013 /****************************************************************************/ 00014 // 00015 // This file is part of SUMO. 00016 // SUMO is free software: you can redistribute it and/or modify 00017 // it under the terms of the GNU General Public License as published by 00018 // the Free Software Foundation, either version 3 of the License, or 00019 // (at your option) any later version. 00020 // 00021 /****************************************************************************/ 00022 00023 00024 // =========================================================================== 00025 // included modules 00026 // =========================================================================== 00027 #ifdef _MSC_VER 00028 #include <windows_config.h> 00029 #else 00030 #include <config.h> 00031 #endif 00032 00033 #include <iostream> 00034 #include <xercesc/sax2/XMLReaderFactory.hpp> 00035 #include <xercesc/util/PlatformUtils.hpp> 00036 #include <utils/common/TplConvert.h> 00037 #include <utils/common/MsgHandler.h> 00038 #include "SUMOSAXHandler.h" 00039 #include "XMLSubSys.h" 00040 00041 #ifdef CHECK_MEMORY_LEAKS 00042 #include <foreign/nvwa/debug_new.h> 00043 #endif // CHECK_MEMORY_LEAKS 00044 00045 00046 // =========================================================================== 00047 // static member variables 00048 // =========================================================================== 00049 std::vector<SAX2XMLReader*> XMLSubSys::myReaders; 00050 unsigned int XMLSubSys::myNextFreeReader; 00051 bool XMLSubSys::myEnableValidation; 00052 00053 00054 // =========================================================================== 00055 // method definitions 00056 // =========================================================================== 00057 void 00058 XMLSubSys::init(bool enableValidation) { 00059 myEnableValidation = enableValidation; 00060 try { 00061 XMLPlatformUtils::Initialize(); 00062 myReaders.push_back(getSAXReader()); 00063 myNextFreeReader = 0; 00064 } catch (const XMLException& e) { 00065 throw ProcessError("Error during XML-initialization:\n " + TplConvert<XMLCh>::_2str(e.getMessage())); 00066 } 00067 } 00068 00069 00070 void 00071 XMLSubSys::close() { 00072 for (std::vector<SAX2XMLReader*>::iterator i = myReaders.begin(); i != myReaders.end(); ++i) { 00073 delete *i; 00074 } 00075 myReaders.clear(); 00076 XMLPlatformUtils::Terminate(); 00077 } 00078 00079 00080 SAX2XMLReader* 00081 XMLSubSys::getSAXReader(SUMOSAXHandler& handler) { 00082 SAX2XMLReader* reader = getSAXReader(); 00083 if (reader == 0) { 00084 return 0; 00085 } 00086 reader->setContentHandler(&handler); 00087 reader->setErrorHandler(&handler); 00088 return reader; 00089 } 00090 00091 00092 void 00093 XMLSubSys::setHandler(GenericSAXHandler& handler) { 00094 myReaders[myNextFreeReader - 1]->setContentHandler(&handler); 00095 myReaders[myNextFreeReader - 1]->setErrorHandler(&handler); 00096 } 00097 00098 00099 bool 00100 XMLSubSys::runParser(GenericSAXHandler& handler, 00101 const std::string& file) { 00102 try { 00103 if (myNextFreeReader == myReaders.size()) { 00104 myReaders.push_back(getSAXReader()); 00105 } 00106 myNextFreeReader++; 00107 setHandler(handler); 00108 std::string prevFile = handler.getFileName(); 00109 handler.setFileName(file); 00110 myReaders[myNextFreeReader - 1]->parse(file.c_str()); 00111 handler.setFileName(prevFile); 00112 myNextFreeReader--; 00113 } catch (ProcessError& e) { 00114 if (std::string(e.what()) != std::string("Process Error") && std::string(e.what()) != std::string("")) { 00115 WRITE_ERROR(e.what()); 00116 } 00117 return false; 00118 } catch (...) { 00119 WRITE_ERROR("An error occured."); 00120 return false; 00121 } 00122 return !MsgHandler::getErrorInstance()->wasInformed(); 00123 } 00124 00125 00126 SAX2XMLReader* 00127 XMLSubSys::getSAXReader() { 00128 SAX2XMLReader* reader = XMLReaderFactory::createXMLReader(); 00129 if (reader == 0) { 00130 WRITE_ERROR("The XML-parser could not be build"); 00131 return 0; 00132 } 00133 if (!myEnableValidation) { 00134 reader->setProperty(XMLUni::fgXercesScannerName, (void*)XMLUni::fgWFXMLScanner); 00135 } 00136 setFeature(*reader, "http://xml.org/sax/features/namespaces", false); 00137 setFeature(*reader, "http://apache.org/xml/features/validation/schema", myEnableValidation); 00138 setFeature(*reader, "http://apache.org/xml/features/validation/schema-full-checking", myEnableValidation); 00139 setFeature(*reader, "http://xml.org/sax/features/validation", myEnableValidation); 00140 setFeature(*reader, "http://apache.org/xml/features/validation/dynamic", myEnableValidation); 00141 return reader; 00142 } 00143 00144 00145 void 00146 XMLSubSys::setFeature(XERCES_CPP_NAMESPACE_QUALIFIER SAX2XMLReader& reader, 00147 const std::string& feature, bool value) { 00148 XMLCh* xmlFeature = XMLString::transcode(feature.c_str()); 00149 reader.setFeature(xmlFeature, value); 00150 XMLString::release(&xmlFeature); 00151 } 00152 00153 00154 /****************************************************************************/ 00155