SUMO - Simulation of Urban MObility
XMLSubSys.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2002-2017 German Aerospace Center (DLR) and others.
4 /****************************************************************************/
5 //
6 // This program and the accompanying materials
7 // are made available under the terms of the Eclipse Public License v2.0
8 // which accompanies this distribution, and is available at
9 // http://www.eclipse.org/legal/epl-v20.html
10 //
11 /****************************************************************************/
19 // Utility methods for initialising, closing and using the XML-subsystem
20 /****************************************************************************/
21 
22 
23 // ===========================================================================
24 // included modules
25 // ===========================================================================
26 #ifdef _MSC_VER
27 #include <windows_config.h>
28 #else
29 #include <config.h>
30 #endif
31 
32 #include <xercesc/util/PlatformUtils.hpp>
35 #include "SUMOSAXHandler.h"
36 #include "SUMOSAXReader.h"
37 #include "XMLSubSys.h"
38 
39 
40 // ===========================================================================
41 // static member variables
42 // ===========================================================================
43 std::vector<SUMOSAXReader*> XMLSubSys::myReaders;
45 XERCES_CPP_NAMESPACE::SAX2XMLReader::ValSchemes XMLSubSys::myValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Auto;
46 XERCES_CPP_NAMESPACE::SAX2XMLReader::ValSchemes XMLSubSys::myNetValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Auto;
47 
48 
49 // ===========================================================================
50 // method definitions
51 // ===========================================================================
52 void
54  try {
55  XERCES_CPP_NAMESPACE::XMLPlatformUtils::Initialize();
56  myNextFreeReader = 0;
57  } catch (const XERCES_CPP_NAMESPACE::XMLException& e) {
58  throw ProcessError("Error during XML-initialization:\n " + TplConvert::_2str(e.getMessage()));
59  }
60 }
61 
62 
63 void
64 XMLSubSys::setValidation(const std::string& validationScheme, const std::string& netValidationScheme) {
65  if (validationScheme == "never") {
66  myValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Never;
67  } else if (validationScheme == "auto") {
68  myValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Auto;
69  } else if (validationScheme == "always") {
70  myValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Always;
71  } else {
72  throw ProcessError("Unknown xml validation scheme + '" + validationScheme + "'.");
73  }
74  if (netValidationScheme == "never") {
75  myNetValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Never;
76  } else if (netValidationScheme == "auto") {
77  myNetValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Auto;
78  } else if (netValidationScheme == "always") {
79  myNetValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Always;
80  } else {
81  throw ProcessError("Unknown network validation scheme + '" + netValidationScheme + "'.");
82  }
83 }
84 
85 
86 void
88  for (std::vector<SUMOSAXReader*>::iterator i = myReaders.begin(); i != myReaders.end(); ++i) {
89  delete *i;
90  }
91  myReaders.clear();
92  XERCES_CPP_NAMESPACE::XMLPlatformUtils::Terminate();
93 }
94 
95 
98  return new SUMOSAXReader(handler, myValidationScheme);
99 }
100 
101 
102 void
104  myReaders[myNextFreeReader - 1]->setHandler(handler);
105 }
106 
107 
108 bool
110  const std::string& file, const bool isNet) {
111  try {
112  XERCES_CPP_NAMESPACE::SAX2XMLReader::ValSchemes validationScheme = isNet ? myNetValidationScheme : myValidationScheme;
113  if (myNextFreeReader == (int)myReaders.size()) {
114  myReaders.push_back(new SUMOSAXReader(handler, validationScheme));
115  } else {
116  myReaders[myNextFreeReader]->setValidation(validationScheme);
117  myReaders[myNextFreeReader]->setHandler(handler);
118  }
120  std::string prevFile = handler.getFileName();
121  handler.setFileName(file);
122  myReaders[myNextFreeReader - 1]->parse(file);
123  handler.setFileName(prevFile);
125  } catch (ProcessError& e) {
126  WRITE_ERROR(std::string(e.what()) != std::string("") ? std::string(e.what()) : std::string("Process Error"));
127  return false;
128  } catch (const std::runtime_error& re) {
129  WRITE_ERROR("Runtime error: " + std::string(re.what()) + " while parsing '" + file + "'");
130  return false;
131  } catch (const std::exception& ex) {
132  WRITE_ERROR("Error occurred: " + std::string(ex.what()) + " while parsing '" + file + "'");
133  return false;
134  } catch (...) {
135  WRITE_ERROR("Unspecified error occured wile parsing '" + file + "'");
136  return false;
137  }
139 }
140 
141 
142 /****************************************************************************/
143 
static void init()
Initialises the xml-subsystem.
Definition: XMLSubSys.cpp:53
static MsgHandler * getErrorInstance()
Returns the instance to add errors to.
Definition: MsgHandler.cpp:75
static void close()
Closes the xml-subsystem.
Definition: XMLSubSys.cpp:87
static void setValidation(const std::string &validationScheme, const std::string &netValidationScheme)
Enables or disables validation.
Definition: XMLSubSys.cpp:64
const std::string & getFileName() const
returns the current file name
SAX-reader encapsulation containing binary reader.
Definition: SUMOSAXReader.h:57
static int myNextFreeReader
Information whether the reader is parsing.
Definition: XMLSubSys.h:155
SAX-handler base for SUMO-files.
bool wasInformed() const
Returns the information whether any messages were added.
Definition: MsgHandler.cpp:268
static bool runParser(GenericSAXHandler &handler, const std::string &file, const bool isNet=false)
Runs the given handler on the given file; returns if everything&#39;s ok.
Definition: XMLSubSys.cpp:109
A handler which converts occuring elements and attributes into enums.
void setFileName(const std::string &name)
Sets the current file name.
static XERCES_CPP_NAMESPACE::SAX2XMLReader::ValSchemes myValidationScheme
Information whether built reader/parser shall validate XML-documents against schemata.
Definition: XMLSubSys.h:158
static SUMOSAXReader * getSAXReader(SUMOSAXHandler &handler)
Builds a reader and assigns the handler to it.
Definition: XMLSubSys.cpp:97
static void setHandler(GenericSAXHandler &handler)
Sets the given handler for the default reader.
Definition: XMLSubSys.cpp:103
#define WRITE_ERROR(msg)
Definition: MsgHandler.h:205
static XERCES_CPP_NAMESPACE::SAX2XMLReader::ValSchemes myNetValidationScheme
Information whether built reader/parser shall validate SUMO networks against schemata.
Definition: XMLSubSys.h:161
static std::vector< SUMOSAXReader * > myReaders
The XML Readers used for repeated parsing.
Definition: XMLSubSys.h:152
static std::string _2str(const int var)
convert int to string
Definition: TplConvert.h:56