SUMO - Simulation of Urban MObility
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.dlr.de/
12 // Copyright (C) 2002-2017 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 
41 // ===========================================================================
42 // static member variables
43 // ===========================================================================
44 std::vector<SUMOSAXReader*> XMLSubSys::myReaders;
46 XERCES_CPP_NAMESPACE::SAX2XMLReader::ValSchemes XMLSubSys::myValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Auto;
47 XERCES_CPP_NAMESPACE::SAX2XMLReader::ValSchemes XMLSubSys::myNetValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Auto;
48 
49 
50 // ===========================================================================
51 // method definitions
52 // ===========================================================================
53 void
55  try {
56  XERCES_CPP_NAMESPACE::XMLPlatformUtils::Initialize();
57  myNextFreeReader = 0;
58  } catch (const XERCES_CPP_NAMESPACE::XMLException& e) {
59  throw ProcessError("Error during XML-initialization:\n " + TplConvert::_2str(e.getMessage()));
60  }
61 }
62 
63 
64 void
65 XMLSubSys::setValidation(const std::string& validationScheme, const std::string& netValidationScheme) {
66  if (validationScheme == "never") {
67  myValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Never;
68  } else if (validationScheme == "auto") {
69  myValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Auto;
70  } else if (validationScheme == "always") {
71  myValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Always;
72  } else {
73  throw ProcessError("Unknown xml validation scheme + '" + validationScheme + "'.");
74  }
75  if (netValidationScheme == "never") {
76  myNetValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Never;
77  } else if (netValidationScheme == "auto") {
78  myNetValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Auto;
79  } else if (netValidationScheme == "always") {
80  myNetValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Always;
81  } else {
82  throw ProcessError("Unknown network validation scheme + '" + netValidationScheme + "'.");
83  }
84 }
85 
86 
87 void
89  for (std::vector<SUMOSAXReader*>::iterator i = myReaders.begin(); i != myReaders.end(); ++i) {
90  delete *i;
91  }
92  myReaders.clear();
93  XERCES_CPP_NAMESPACE::XMLPlatformUtils::Terminate();
94 }
95 
96 
99  return new SUMOSAXReader(handler, myValidationScheme);
100 }
101 
102 
103 void
105  myReaders[myNextFreeReader - 1]->setHandler(handler);
106 }
107 
108 
109 bool
111  const std::string& file, const bool isNet) {
112  try {
113  XERCES_CPP_NAMESPACE::SAX2XMLReader::ValSchemes validationScheme = isNet ? myNetValidationScheme : myValidationScheme;
114  if (myNextFreeReader == (int)myReaders.size()) {
115  myReaders.push_back(new SUMOSAXReader(handler, validationScheme));
116  } else {
117  myReaders[myNextFreeReader]->setValidation(validationScheme);
118  myReaders[myNextFreeReader]->setHandler(handler);
119  }
121  std::string prevFile = handler.getFileName();
122  handler.setFileName(file);
123  myReaders[myNextFreeReader - 1]->parse(file);
124  handler.setFileName(prevFile);
126  } catch (ProcessError& e) {
127  WRITE_ERROR(std::string(e.what()) != std::string("") ? std::string(e.what()) : std::string("Process Error"));
128  return false;
129  } catch (const std::runtime_error& re) {
130  WRITE_ERROR("Runtime error: " + std::string(re.what()) + " while parsing '" + file + "'");
131  return false;
132  } catch (const std::exception& ex) {
133  WRITE_ERROR("Error occurred: " + std::string(ex.what()) + " while parsing '" + file + "'");
134  return false;
135  } catch (...) {
136  WRITE_ERROR("Unspecified error occured wile parsing '" + file + "'");
137  return false;
138  }
140 }
141 
142 
143 /****************************************************************************/
144 
static void init()
Initialises the xml-subsystem.
Definition: XMLSubSys.cpp:54
static MsgHandler * getErrorInstance()
Returns the instance to add errors to.
Definition: MsgHandler.cpp:76
static void close()
Closes the xml-subsystem.
Definition: XMLSubSys.cpp:88
static void setValidation(const std::string &validationScheme, const std::string &netValidationScheme)
Enables or disables validation.
Definition: XMLSubSys.cpp:65
const std::string & getFileName() const
returns the current file name
SAX-reader encapsulation containing binary reader.
Definition: SUMOSAXReader.h:58
static int myNextFreeReader
Information whether the reader is parsing.
Definition: XMLSubSys.h:156
SAX-handler base for SUMO-files.
bool wasInformed() const
Returns the information whether any messages were added.
Definition: MsgHandler.cpp:269
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:110
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:159
static SUMOSAXReader * getSAXReader(SUMOSAXHandler &handler)
Builds a reader and assigns the handler to it.
Definition: XMLSubSys.cpp:98
static void setHandler(GenericSAXHandler &handler)
Sets the given handler for the default reader.
Definition: XMLSubSys.cpp:104
#define WRITE_ERROR(msg)
Definition: MsgHandler.h:206
static XERCES_CPP_NAMESPACE::SAX2XMLReader::ValSchemes myNetValidationScheme
Information whether built reader/parser shall validate SUMO networks against schemata.
Definition: XMLSubSys.h:162
static std::vector< SUMOSAXReader * > myReaders
The XML Readers used for repeated parsing.
Definition: XMLSubSys.h:153
static std::string _2str(const int var)
convert int to string
Definition: TplConvert.h:57