SUMO - Simulation of Urban MObility
XMLSubSys.cpp
Go to the documentation of this file.
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 
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines