Eclipse 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-2019 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
17 // Utility methods for initialising, closing and using the XML-subsystem
18 /****************************************************************************/
19 
20 
21 // ===========================================================================
22 // included modules
23 // ===========================================================================
24 #include <config.h>
25 
26 #include <cstdint>
27 #include <xercesc/util/PlatformUtils.hpp>
30 #include "SUMOSAXHandler.h"
31 #include "SUMOSAXReader.h"
32 #include "XMLSubSys.h"
33 
34 
35 // ===========================================================================
36 // static member variables
37 // ===========================================================================
38 std::vector<SUMOSAXReader*> XMLSubSys::myReaders;
40 XERCES_CPP_NAMESPACE::SAX2XMLReader::ValSchemes XMLSubSys::myValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Auto;
41 XERCES_CPP_NAMESPACE::SAX2XMLReader::ValSchemes XMLSubSys::myNetValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Auto;
42 
43 
44 // ===========================================================================
45 // method definitions
46 // ===========================================================================
47 void
49  try {
50  XERCES_CPP_NAMESPACE::XMLPlatformUtils::Initialize();
51  myNextFreeReader = 0;
52  } catch (const XERCES_CPP_NAMESPACE::XMLException& e) {
53  throw ProcessError("Error during XML-initialization:\n " + StringUtils::transcode(e.getMessage()));
54  }
55 }
56 
57 
58 void
59 XMLSubSys::setValidation(const std::string& validationScheme, const std::string& netValidationScheme) {
60  if (validationScheme == "never") {
61  myValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Never;
62  } else if (validationScheme == "auto") {
63  myValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Auto;
64  } else if (validationScheme == "always") {
65  myValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Always;
66  } else {
67  throw ProcessError("Unknown xml validation scheme + '" + validationScheme + "'.");
68  }
69  if (netValidationScheme == "never") {
70  myNetValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Never;
71  } else if (netValidationScheme == "auto") {
72  myNetValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Auto;
73  } else if (netValidationScheme == "always") {
74  myNetValidationScheme = XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Always;
75  } else {
76  throw ProcessError("Unknown network validation scheme + '" + netValidationScheme + "'.");
77  }
78 }
79 
80 
81 bool
82 XMLSubSys::isValidating(const bool net) {
83  if (net) {
84  return myNetValidationScheme != XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Never;
85  }
86  return myValidationScheme != XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Never;
87 }
88 
89 
90 void
92  for (std::vector<SUMOSAXReader*>::iterator i = myReaders.begin(); i != myReaders.end(); ++i) {
93  delete *i;
94  }
95  myReaders.clear();
96  XERCES_CPP_NAMESPACE::XMLPlatformUtils::Terminate();
97 }
98 
99 
102  return new SUMOSAXReader(handler, myValidationScheme);
103 }
104 
105 
106 void
108  myReaders[myNextFreeReader - 1]->setHandler(handler);
109 }
110 
111 
112 bool
114  const std::string& file, const bool isNet) {
116  try {
117  XERCES_CPP_NAMESPACE::SAX2XMLReader::ValSchemes validationScheme = isNet ? myNetValidationScheme : myValidationScheme;
118  if (myNextFreeReader == (int)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 occurred wile parsing '" + file + "'");
141  return false;
142  }
144 }
145 
146 
147 /****************************************************************************/
148 
XMLSubSys::myReaders
static std::vector< SUMOSAXReader * > myReaders
The XML Readers used for repeated parsing.
Definition: XMLSubSys.h:155
XMLSubSys::runParser
static bool runParser(GenericSAXHandler &handler, const std::string &file, const bool isNet=false)
Runs the given handler on the given file; returns if everything's ok.
Definition: XMLSubSys.cpp:113
SUMOSAXHandler
SAX-handler base for SUMO-files.
Definition: SUMOSAXHandler.h:42
MsgHandler::wasInformed
bool wasInformed() const
Returns the information whether any messages were added.
Definition: MsgHandler.cpp:270
XMLSubSys::close
static void close()
Closes the xml-subsystem.
Definition: XMLSubSys.cpp:91
MsgHandler.h
SUMOSAXReader
SAX-reader encapsulation containing binary reader.
Definition: SUMOSAXReader.h:56
SUMOSAXHandler.h
XMLSubSys::setHandler
static void setHandler(GenericSAXHandler &handler)
Sets the given handler for the default reader.
Definition: XMLSubSys.cpp:107
XMLSubSys::myNextFreeReader
static int myNextFreeReader
Information whether the reader is parsing.
Definition: XMLSubSys.h:158
MsgHandler::clear
virtual void clear()
Clears information whether an error occurred previously.
Definition: MsgHandler.cpp:160
XMLSubSys::setValidation
static void setValidation(const std::string &validationScheme, const std::string &netValidationScheme)
Enables or disables validation.
Definition: XMLSubSys.cpp:59
ProcessError
Definition: UtilExceptions.h:40
XMLSubSys::init
static void init()
Initialises the xml-subsystem.
Definition: XMLSubSys.cpp:48
StringUtils.h
StringUtils::transcode
static std::string transcode(const XMLCh *const data)
converts a 0-terminated XMLCh* array (usually UTF-16, stemming from Xerces) into std::string in UTF-8
Definition: StringUtils.h:132
XMLSubSys::isValidating
static bool isValidating(const bool net=false)
Returns whether validation is enabled.
Definition: XMLSubSys.cpp:82
XMLSubSys::myValidationScheme
static XERCES_CPP_NAMESPACE::SAX2XMLReader::ValSchemes myValidationScheme
Information whether built reader/parser shall validate XML-documents against schemata.
Definition: XMLSubSys.h:161
GenericSAXHandler::getFileName
const std::string & getFileName() const
returns the current file name
Definition: GenericSAXHandler.cpp:75
config.h
SUMOSAXReader.h
MsgHandler::getErrorInstance
static MsgHandler * getErrorInstance()
Returns the instance to add errors to.
Definition: MsgHandler.cpp:81
GenericSAXHandler
A handler which converts occuring elements and attributes into enums.
Definition: GenericSAXHandler.h:68
XMLSubSys::getSAXReader
static SUMOSAXReader * getSAXReader(SUMOSAXHandler &handler)
Builds a reader and assigns the handler to it.
Definition: XMLSubSys.cpp:101
WRITE_ERROR
#define WRITE_ERROR(msg)
Definition: MsgHandler.h:245
GenericSAXHandler::setFileName
void setFileName(const std::string &name)
Sets the current file name.
Definition: GenericSAXHandler.cpp:69
XMLSubSys.h
XMLSubSys::myNetValidationScheme
static XERCES_CPP_NAMESPACE::SAX2XMLReader::ValSchemes myNetValidationScheme
Information whether built reader/parser shall validate SUMO networks against schemata.
Definition: XMLSubSys.h:164