Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/utils/handlers/DataHandler.cpp
169678 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2001-2025 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
/****************************************************************************/
14
/// @file DataHandler.cpp
15
/// @author Jakob Erdmann
16
/// @date Jun 2021
17
///
18
// The XML-Handler for data elements loading
19
/****************************************************************************/
20
#include <config.h>
21
22
#include <utils/common/MsgHandler.h>
23
#include <utils/common/StringUtils.h>
24
#include <utils/xml/XMLSubSys.h>
25
26
#include "DataHandler.h"
27
28
29
// ===========================================================================
30
// method definitions
31
// ===========================================================================
32
33
DataHandler::DataHandler(const std::string& filename) :
34
CommonHandler(filename),
35
SUMOSAXHandler(filename) {
36
}
37
38
39
DataHandler::~DataHandler() {}
40
41
42
bool
43
DataHandler::parse() {
44
// run parser and return result
45
return XMLSubSys::runParser(*this, getFileName());
46
}
47
48
49
void
50
DataHandler::parseSumoBaseObject(CommonXMLStructure::SumoBaseObject* obj) {
51
// check if loading was aborted
52
if (!myAbortLoading) {
53
// switch tag
54
switch (obj->getTag()) {
55
// Stopping Places
56
case SUMO_TAG_INTERVAL:
57
if (buildDataInterval(obj,
58
obj->getStringAttribute(SUMO_ATTR_ID),
59
obj->getDoubleAttribute(SUMO_ATTR_BEGIN),
60
obj->getDoubleAttribute(SUMO_ATTR_END))) {
61
obj->markAsCreated();
62
}
63
break;
64
case SUMO_TAG_EDGE:
65
if (buildEdgeData(obj,
66
obj->getStringAttribute(SUMO_ATTR_ID),
67
obj->getParameters())) {
68
obj->markAsCreated();
69
}
70
break;
71
case SUMO_TAG_EDGEREL:
72
if (buildEdgeRelationData(obj,
73
obj->getStringAttribute(SUMO_ATTR_FROM),
74
obj->getStringAttribute(SUMO_ATTR_TO),
75
obj->getParameters())) {
76
obj->markAsCreated();
77
}
78
break;
79
case SUMO_TAG_TAZREL:
80
if (buildTAZRelationData(obj,
81
obj->getStringAttribute(SUMO_ATTR_FROM),
82
obj->getStringAttribute(SUMO_ATTR_TO),
83
obj->getParameters())) {
84
obj->markAsCreated();
85
}
86
break;
87
default:
88
break;
89
}
90
// now iterate over childrens
91
for (const auto& child : obj->getSumoBaseObjectChildren()) {
92
// call this function recursively
93
parseSumoBaseObject(child);
94
}
95
}
96
}
97
98
99
void
100
DataHandler::myStartElement(int element, const SUMOSAXAttributes& attrs) {
101
// obtain tag
102
const SumoXMLTag tag = (element == 0) ? SUMO_TAG_ROOTFILE : static_cast<SumoXMLTag>(element);
103
// open SUMOBaseOBject
104
myCommonXMLStructure.openSUMOBaseOBject();
105
// check tag
106
try {
107
switch (tag) {
108
// interval
109
case SUMO_TAG_INTERVAL:
110
parseInterval(attrs);
111
break;
112
// datas
113
case SUMO_TAG_EDGE:
114
parseEdgeData(attrs);
115
break;
116
case SUMO_TAG_EDGEREL:
117
parseEdgeRelationData(attrs);
118
break;
119
case SUMO_TAG_TAZREL:
120
parseTAZRelationData(attrs);
121
break;
122
case SUMO_TAG_PARAM:
123
WRITE_WARNING(TL("Data elements cannot load attributes as params"));
124
myCommonXMLStructure.abortSUMOBaseOBject();
125
break;
126
default:
127
// tag cannot be parsed in routeHandler
128
myCommonXMLStructure.abortSUMOBaseOBject();
129
break;
130
}
131
} catch (InvalidArgument& e) {
132
writeError(e.what());
133
}
134
}
135
136
137
void
138
DataHandler::myEndElement(int element) {
139
// obtain tag
140
const SumoXMLTag tag = static_cast<SumoXMLTag>(element);
141
// get last inserted object
142
CommonXMLStructure::SumoBaseObject* obj = myCommonXMLStructure.getCurrentSumoBaseObject();
143
// close SUMOBaseOBject
144
myCommonXMLStructure.closeSUMOBaseOBject();
145
if (obj) {
146
// check tag
147
switch (tag) {
148
// only interval
149
case SUMO_TAG_INTERVAL:
150
// parse object and all their childrens
151
parseSumoBaseObject(obj);
152
// delete object (and all of their childrens)
153
delete obj;
154
break;
155
default:
156
break;
157
}
158
}
159
}
160
161
162
void
163
DataHandler::parseInterval(const SUMOSAXAttributes& attrs) {
164
// declare Ok Flag
165
bool parsedOk = true;
166
// needed attributes
167
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
168
const double begin = attrs.get<double>(SUMO_ATTR_BEGIN, "", parsedOk);
169
const double end = attrs.get<double>(SUMO_ATTR_END, "", parsedOk);
170
// continue if flag is ok
171
if (parsedOk) {
172
// set tag
173
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_INTERVAL);
174
// add all attributes
175
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
176
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_BEGIN, begin);
177
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_END, end);
178
} else {
179
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
180
}
181
}
182
183
184
void
185
DataHandler::parseEdgeData(const SUMOSAXAttributes& attrs) {
186
// declare Ok Flag
187
bool parsedOk = true;
188
// needed attributes
189
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
190
// fill attributes
191
getAttributes(attrs, {SUMO_ATTR_ID});
192
// continue if flag is ok
193
if (parsedOk) {
194
// set tag
195
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_EDGE);
196
// add all attributes
197
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
198
} else {
199
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
200
}
201
}
202
203
204
void
205
DataHandler::parseEdgeRelationData(const SUMOSAXAttributes& attrs) {
206
// declare Ok Flag
207
bool parsedOk = true;
208
// needed attributes
209
const std::string from = attrs.get<std::string>(SUMO_ATTR_FROM, "", parsedOk);
210
const std::string to = attrs.get<std::string>(SUMO_ATTR_TO, "", parsedOk);
211
// fill attributes
212
getAttributes(attrs, {SUMO_ATTR_FROM, SUMO_ATTR_TO});
213
// continue if flag is ok
214
if (parsedOk) {
215
// set tag
216
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_EDGEREL);
217
// add all attributes
218
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FROM, from);
219
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TO, to);
220
} else {
221
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
222
}
223
}
224
225
226
void
227
DataHandler::parseTAZRelationData(const SUMOSAXAttributes& attrs) {
228
// declare Ok Flag
229
bool parsedOk = true;
230
// needed attributes
231
const std::string from = attrs.get<std::string>(SUMO_ATTR_FROM, "", parsedOk);
232
const std::string to = attrs.get<std::string>(SUMO_ATTR_TO, "", parsedOk);
233
// fill attributes
234
getAttributes(attrs, {SUMO_ATTR_FROM, SUMO_ATTR_TO});
235
// continue if flag is ok
236
if (parsedOk) {
237
// set tag
238
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_TAZREL);
239
// add all attributes
240
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FROM, from);
241
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TO, to);
242
} else {
243
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
244
}
245
}
246
247
248
void
249
DataHandler::getAttributes(const SUMOSAXAttributes& attrs, const std::vector<SumoXMLAttr> avoidAttributes) const {
250
// transform avoidAttributes to strings
251
std::vector<std::string> avoidAttributesStr;
252
for (const SumoXMLAttr& avoidAttribute : avoidAttributes) {
253
avoidAttributesStr.push_back(toString(avoidAttribute));
254
}
255
// iterate over attributes and fill parameters map
256
for (const std::string& attribute : attrs.getAttributeNames()) {
257
if (std::find(avoidAttributesStr.begin(), avoidAttributesStr.end(), attribute) == avoidAttributesStr.end()) {
258
myCommonXMLStructure.getCurrentSumoBaseObject()->addParameter(attribute, attrs.getStringSecure(attribute, ""));
259
}
260
}
261
}
262
263
264
void
265
DataHandler::checkParent(const SumoXMLTag currentTag, const SumoXMLTag parentTag, bool& ok) {
266
// check that parent SUMOBaseObject's tag is the parentTag
267
if ((myCommonXMLStructure.getCurrentSumoBaseObject()->getParentSumoBaseObject() &&
268
(myCommonXMLStructure.getCurrentSumoBaseObject()->getParentSumoBaseObject()->getTag() == parentTag)) == false) {
269
writeError(toString(currentTag) + " must be defined within the definition of a " + toString(parentTag));
270
ok = false;
271
}
272
}
273
274
/****************************************************************************/
275
276