Eclipse SUMO - Simulation of Urban MObility
OptionsLoader.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 // Copyright (C) 2001-2024 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials are made available under the
5 // terms of the Eclipse Public License 2.0 which is available at
6 // https://www.eclipse.org/legal/epl-2.0/
7 // This Source Code may also be made available under the following Secondary
8 // Licenses when the conditions for such availability set forth in the Eclipse
9 // Public License 2.0 are satisfied: GNU General Public License, version 2
10 // or later which is available at
11 // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12 // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13 /****************************************************************************/
20 // A SAX-Handler for loading options
21 /****************************************************************************/
22 #include <config.h>
23 
24 #include <algorithm>
25 #include <string>
26 #include <vector>
27 #include <xercesc/sax/HandlerBase.hpp>
28 #include <xercesc/sax/AttributeList.hpp>
29 #include <xercesc/sax/SAXParseException.hpp>
30 #include <xercesc/sax/SAXException.hpp>
36 #include <utils/common/ToString.h>
37 #include "OptionsIO.h"
38 #include "OptionsCont.h"
39 #include "OptionsLoader.h"
40 
41 
42 // ===========================================================================
43 // method definitions
44 // ===========================================================================
45 
46 OptionsLoader::OptionsLoader(OptionsCont& customOptions, const bool rootOnly) :
47  myRootOnly(rootOnly),
48  myOptions(customOptions),
49  myItem() {
50 }
51 
52 
54 
55 
56 void OptionsLoader::startElement(const XMLCh* const name, XERCES_CPP_NAMESPACE::AttributeList& attributes) {
58  if (!myRootOnly) {
59  for (int i = 0; i < (int)attributes.getLength(); i++) {
60  const std::string& key = StringUtils::transcode(attributes.getName(i));
61  const std::string& value = StringUtils::transcode(attributes.getValue(i));
62  if (key == "value" || key == "v") {
63  setValue(myItem, value);
64  }
65  // could give a hint here about unsupported attributes in configuration files
66  }
67  myValue = "";
68  }
69 }
70 
71 
72 void OptionsLoader::setValue(const std::string& key, const std::string& value) {
73  if (value.length() > 0) {
74  // try to add value in option container
75  try {
76  if (!setSecure(myOptions, key, value)) {
77  WRITE_ERRORF(TL("Could not set option '%' (probably defined twice)."), key);
78  myError = true;
79  }
80  } catch (ProcessError& e) {
81  WRITE_ERROR(e.what());
82  myError = true;
83  }
84  }
85 }
86 
87 
88 void OptionsLoader::characters(const XMLCh* const chars, const XERCES3_SIZE_t length) {
89  myValue = myValue + StringUtils::transcode(chars, (int) length);
90 }
91 
92 
93 bool
94 OptionsLoader::setSecure(OptionsCont& options, const std::string& name, const std::string& value) const {
95  if (options.isWriteable(name)) {
96  options.set(name, value);
97  return true;
98  }
99  return false;
100 }
101 
102 
103 void
104 OptionsLoader::endElement(const XMLCh* const /*name*/) {
105  if (myItem.length() == 0 || myValue.length() == 0) {
106  return;
107  }
108  if (myValue.find_first_not_of("\n\t \a") == std::string::npos) {
109  return;
110  }
112  myItem = "";
113  myValue = "";
114 }
115 
116 
117 void
118 OptionsLoader::warning(const XERCES_CPP_NAMESPACE::SAXParseException& exception) {
119  WRITE_WARNING(StringUtils::transcode(exception.getMessage()));
120  WRITE_WARNING(" (At line/column " \
121  + toString(exception.getLineNumber() + 1) + '/' \
122  + toString(exception.getColumnNumber()) + ").");
123  myError = true;
124 }
125 
126 
127 void
128 OptionsLoader::error(const XERCES_CPP_NAMESPACE::SAXParseException& exception) {
129  WRITE_ERROR(StringUtils::transcode(exception.getMessage()));
130  WRITE_ERROR(" (At line/column "
131  + toString(exception.getLineNumber() + 1) + '/'
132  + toString(exception.getColumnNumber()) + ").");
133  myError = true;
134 }
135 
136 
137 void
138 OptionsLoader::fatalError(const XERCES_CPP_NAMESPACE::SAXParseException& exception) {
139  WRITE_ERROR(StringUtils::transcode(exception.getMessage()));
140  WRITE_ERROR(" (At line/column "
141  + toString(exception.getLineNumber() + 1) + '/'
142  + toString(exception.getColumnNumber()) + ").");
143  myError = true;
144 }
145 
146 
147 bool
149  return myError;
150 }
151 
152 /****************************************************************************/
#define WRITE_ERRORF(...)
Definition: MsgHandler.h:305
#define WRITE_ERROR(msg)
Definition: MsgHandler.h:304
#define WRITE_WARNING(msg)
Definition: MsgHandler.h:295
#define TL(string)
Definition: MsgHandler.h:315
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:46
A storage for options typed value containers)
Definition: OptionsCont.h:89
bool isWriteable(const std::string &name)
Returns the information whether the named option may be set.
bool set(const std::string &name, const std::string &value, const bool append=false)
Sets the given value for the named option.
~OptionsLoader()
destructor
OptionsLoader(OptionsCont &customOptions, const bool routeOnly=false)
Constructor for default option container.
virtual void startElement(const XMLCh *const name, XERCES_CPP_NAMESPACE::AttributeList &attributes)
Called on the occurrence of the beginning of a tag.
void fatalError(const XERCES_CPP_NAMESPACE::SAXParseException &exception)
Called on an XML-fatal error.
bool myError
The information whether an error occurred.
void characters(const XMLCh *const chars, const XERCES3_SIZE_t length)
Called on the occurrence of character data.
bool errorOccurred() const
Returns the information whether an error occurred.
void warning(const XERCES_CPP_NAMESPACE::SAXParseException &exception)
Called on an XML-warning.
std::string myValue
The currently read characters string.
bool setSecure(OptionsCont &options, const std::string &name, const std::string &value) const
Tries to set the named option to the given value.
void endElement(const XMLCh *const name)
Called on the end of an element.
OptionsCont & myOptions
The options to fill.
std::string myItem
The name of the currently parsed option.
void setValue(const std::string &key, const std::string &value)
Tries to set the named option to the given value.
const bool myRootOnly
The information whether only the root element should be parsed.
void error(const XERCES_CPP_NAMESPACE::SAXParseException &exception)
Called on an XML-error.
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:146