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