SUMO - Simulation of Urban MObility
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
XMLSubSys.cpp
Go to the documentation of this file.
1 /****************************************************************************/
9 // Utility methods for initialising, closing and using the XML-subsystem
10 /****************************************************************************/
11 // SUMO, Simulation of Urban MObility; see http://sumo-sim.org/
12 // Copyright (C) 2002-2014 DLR (http://www.dlr.de/) and contributors
13 /****************************************************************************/
14 //
15 // This file is part of SUMO.
16 // SUMO is free software: you can redistribute it and/or modify
17 // it under the terms of the GNU General Public License as published by
18 // the Free Software Foundation, either version 3 of the License, or
19 // (at your option) any later version.
20 //
21 /****************************************************************************/
22 
23 
24 // ===========================================================================
25 // included modules
26 // ===========================================================================
27 #ifdef _MSC_VER
28 #include <windows_config.h>
29 #else
30 #include <config.h>
31 #endif
32 
33 #include <xercesc/util/PlatformUtils.hpp>
36 #include "SUMOSAXHandler.h"
37 #include "SUMOSAXReader.h"
38 #include "XMLSubSys.h"
39 
40 #ifdef CHECK_MEMORY_LEAKS
41 #include <foreign/nvwa/debug_new.h>
42 #endif // CHECK_MEMORY_LEAKS
43 
44 
45 // ===========================================================================
46 // static member variables
47 // ===========================================================================
48 std::vector<SUMOSAXReader*> XMLSubSys::myReaders;
49 unsigned int XMLSubSys::myNextFreeReader;
50 XERCES_CPP_NAMESPACE::SAX2XMLReader::ValSchemes XMLSubSys::myValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Auto;
51 XERCES_CPP_NAMESPACE::SAX2XMLReader::ValSchemes XMLSubSys::myNetValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Auto;
52 
53 
54 // ===========================================================================
55 // method definitions
56 // ===========================================================================
57 void
59  try {
60  XERCES_CPP_NAMESPACE::XMLPlatformUtils::Initialize();
61  myNextFreeReader = 0;
62  } catch (const XERCES_CPP_NAMESPACE::XMLException& e) {
63  throw ProcessError("Error during XML-initialization:\n " + TplConvert::_2str(e.getMessage()));
64  }
65 }
66 
67 
68 void
69 XMLSubSys::setValidation(const std::string& validationScheme, const std::string& netValidationScheme) {
70  if (validationScheme == "never") {
71  myValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Never;
72  } else if (validationScheme == "auto") {
73  myValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Auto;
74  } else if (validationScheme == "always") {
75  myValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Always;
76  } else {
77  throw ProcessError("Unknown xml validation scheme + '" + validationScheme + "'.");
78  }
79  if (netValidationScheme == "never") {
80  myNetValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Never;
81  } else if (netValidationScheme == "auto") {
82  myNetValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Auto;
83  } else if (netValidationScheme == "always") {
84  myNetValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Always;
85  } else {
86  throw ProcessError("Unknown network validation scheme + '" + netValidationScheme + "'.");
87  }
88 }
89 
90 
91 void
93  for (std::vector<SUMOSAXReader*>::iterator i = myReaders.begin(); i != myReaders.end(); ++i) {
94  delete *i;
95  }
96  myReaders.clear();
97  XERCES_CPP_NAMESPACE::XMLPlatformUtils::Terminate();
98 }
99 
100 
103  return new SUMOSAXReader(handler, myValidationScheme);
104 }
105 
106 
107 void
109  myReaders[myNextFreeReader - 1]->setHandler(handler);
110 }
111 
112 
113 bool
115  const std::string& file, const bool isNet) {
116  try {
117  XERCES_CPP_NAMESPACE::SAX2XMLReader::ValSchemes validationScheme = isNet ? myNetValidationScheme : myValidationScheme;
118  if (myNextFreeReader == myReaders.size()) {
119  myReaders.push_back(new SUMOSAXReader(handler, validationScheme));
120  } else {
121  myReaders[myNextFreeReader]->setValidation(validationScheme);
122  myReaders[myNextFreeReader]->setHandler(handler);
123  }
125  std::string prevFile = handler.getFileName();
126  handler.setFileName(file);
127  myReaders[myNextFreeReader - 1]->parse(file);
128  handler.setFileName(prevFile);
130  } catch (ProcessError& e) {
131  WRITE_ERROR(std::string(e.what()) != std::string("") ? std::string(e.what()) : std::string("Process Error"));
132  return false;
133  } catch (const std::runtime_error& re) {
134  WRITE_ERROR("Runtime error: " + std::string(re.what()) + " while parsing '" + file + "'");
135  return false;
136  } catch (const std::exception& ex) {
137  WRITE_ERROR("Error occurred: " + std::string(ex.what()) + " while parsing '" + file + "'");
138  return false;
139  } catch (...) {
140  WRITE_ERROR("Unspecified error occured wile parsing '" + file + "'");
141  return false;
142  }
144 }
145 
146 
147 /****************************************************************************/
148