00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifdef _MSC_VER
00025 #include <windows_config.h>
00026 #else
00027 #include <config.h>
00028 #endif
00029
00030 #include "RORDLoader_SUMOBase.h"
00031 #include <utils/common/SUMOVTypeParameter.h>
00032 #include "RORouteDef.h"
00033 #include "RONet.h"
00034 #include <utils/common/UtilExceptions.h>
00035 #include <utils/common/MsgHandler.h>
00036 #include <utils/common/StringTokenizer.h>
00037 #include <utils/common/ToString.h>
00038 #include "ROVehicle.h"
00039 #include "RORouteDef_Alternatives.h"
00040 #include "RORouteDef_Complete.h"
00041 #include "RORoute.h"
00042 #include <utils/xml/SUMOVehicleParserHelper.h>
00043
00044 #ifdef CHECK_MEMORY_LEAKS
00045 #include <foreign/nvwa/debug_new.h>
00046 #endif // CHECK_MEMORY_LEAKS
00047
00048
00049
00050
00051
00052 RORDLoader_SUMOBase::RORDLoader_SUMOBase(RONet &net,
00053 SUMOTime begin, SUMOTime end,
00054 SUMOReal gawronBeta, SUMOReal gawronA,
00055 int maxRouteNumber, bool tryRepair, bool withTaz,
00056 const std::string &file) throw(ProcessError)
00057 : ROTypedXMLRoutesLoader(net, begin, end, file),
00058 myVehicleParameter(0), myCurrentIsOk(true), myAltIsValid(true), myHaveNextRoute(false),
00059 myCurrentAlternatives(0),
00060 myGawronBeta(gawronBeta), myGawronA(gawronA), myMaxRouteNumber(maxRouteNumber),
00061 myCurrentRoute(0), myCurrentDepart(-1), myTryRepair(tryRepair), myWithTaz(withTaz),
00062 myColor(0), myCurrentVType(0) {
00063 }
00064
00065
00066 RORDLoader_SUMOBase::~RORDLoader_SUMOBase() throw() {
00067
00068 delete myCurrentAlternatives;
00069 delete myCurrentRoute;
00070 delete myVehicleParameter;
00071 delete myColor;
00072 }
00073
00074
00075 void
00076 RORDLoader_SUMOBase::myStartElement(SumoXMLTag element,
00077 const SUMOSAXAttributes &attrs) throw(ProcessError) {
00078 switch (element) {
00079 case SUMO_TAG_ROUTE:
00080 startRoute(attrs);
00081 break;
00082 case SUMO_TAG_VEHICLE:
00083
00084 delete myVehicleParameter;
00085 myVehicleParameter = 0;
00086 myVehicleParameter = SUMOVehicleParserHelper::parseVehicleAttributes(attrs);
00087 if (myVehicleParameter!=0) {
00088 myCurrentDepart = myVehicleParameter->depart;
00089 }
00090 myCurrentIsOk = myVehicleParameter!=0;
00091 break;
00092 case SUMO_TAG_VTYPE:
00093 myCurrentVType = SUMOVehicleParserHelper::beginVTypeParsing(attrs);
00094 break;
00095 case SUMO_TAG_ROUTE_DISTRIBUTION:
00096 myAltIsValid = true;
00097 startAlternative(attrs);
00098 if (!myCurrentIsOk) {
00099 myAltIsValid = false;
00100 }
00101 break;
00102 default:
00103 break;
00104 }
00105
00106 if (myCurrentVType!=0&&element!=SUMO_TAG_VTYPE) {
00107 SUMOVehicleParserHelper::parseVTypeEmbedded(*myCurrentVType, element, attrs);
00108 return;
00109 }
00110 if (!myCurrentIsOk) {
00111 throw ProcessError();
00112 }
00113 }
00114
00115
00116 void
00117 RORDLoader_SUMOBase::startRoute(const SUMOSAXAttributes &attrs) {
00118 delete myColor;
00119 myColor = 0;
00120 if (!myAltIsValid) {
00121 return;
00122 }
00123 if (attrs.hasAttribute(SUMO_ATTR_COLOR)) {
00124 myColor = new RGBColor(RGBColor::parseColorReporting(attrs.getString(SUMO_ATTR_COLOR), "route", 0, true, myCurrentIsOk));
00125 }
00126 if (myCurrentAlternatives==0) {
00127 myCurrentIsOk = true;
00128 if (myVehicleParameter!=0) {
00129 myCurrentRouteName = attrs.getOptStringReporting(SUMO_ATTR_ID, "route", 0, myCurrentIsOk, "!" + myVehicleParameter->id);
00130 } else {
00131 myCurrentRouteName = attrs.getStringReporting(SUMO_ATTR_ID, "route", 0, myCurrentIsOk);
00132 }
00133 } else {
00134
00135 myCost = attrs.getSUMORealReporting(SUMO_ATTR_COST, "route(alternative)", myCurrentAlternatives->getID().c_str(), myCurrentIsOk);
00136 myProbability = attrs.getSUMORealReporting(SUMO_ATTR_PROB, "route(alternative)", myCurrentAlternatives->getID().c_str(), myCurrentIsOk);
00137 if (myCurrentIsOk&&myCost<0) {
00138 MsgHandler::getErrorInstance()->inform("Invalid cost in alternative for route '" + myCurrentAlternatives->getID() + "' (" + toString<SUMOReal>(myCost) + ").");
00139 myCurrentIsOk = false;
00140 return;
00141 }
00142 if (myCurrentIsOk&&myProbability<0) {
00143 MsgHandler::getErrorInstance()->inform("Invalid probability in alternative for route '" + myCurrentAlternatives->getID() + "' (" + toString<SUMOReal>(myProbability) + ").");
00144 myCurrentIsOk = false;
00145 return;
00146 }
00147 }
00148 if (attrs.hasAttribute(SUMO_ATTR_EDGES)) {
00149 myCharacters(SUMO_TAG_ROUTE, attrs.getStringReporting(SUMO_ATTR_EDGES, "route", 0, myCurrentIsOk));
00150 }
00151 }
00152
00153
00154 void
00155 RORDLoader_SUMOBase::startAlternative(const SUMOSAXAttributes &attrs) {
00156
00157 myCurrentIsOk = true;
00158 std::string id;
00159 if (myVehicleParameter!=0) {
00160 id = myVehicleParameter->id;
00161 if (id=="") {
00162 MsgHandler::getErrorInstance()->inform("Missing 'id' of a routeDistribution.");
00163 myCurrentIsOk = false;
00164 return;
00165 }
00166 id = "!" + id;
00167 } else {
00168 if (!attrs.setIDFromAttributes("routeDistribution", id)) {
00169 myCurrentIsOk = false;
00170 return;
00171 }
00172 }
00173
00174 int index = attrs.getIntReporting(SUMO_ATTR_LAST, "route", id.c_str(), myCurrentIsOk);
00175 if (myCurrentIsOk&&index<0) {
00176 MsgHandler::getErrorInstance()->inform("Negative index of a route alternative (id='" + id + "').");
00177 myCurrentIsOk = false;
00178 return;
00179 }
00180
00181 myCurrentAlternatives = new RORouteDef_Alternatives(id, index, myGawronBeta, myGawronA, myMaxRouteNumber);
00182 }
00183
00184 void
00185 RORDLoader_SUMOBase::myCharacters(SumoXMLTag element,
00186 const std::string &chars) throw(ProcessError) {
00187
00188
00189 if (element!=SUMO_TAG_ROUTE) {
00190 return;
00191 }
00192 if (!myAltIsValid) {
00193 return;
00194 }
00195 if (myCurrentRoute!=0) {
00196 return;
00197 }
00198
00199 if (myCurrentAlternatives!=0) {
00200 if (myCost<0||myProbability<0||!myCurrentIsOk) {
00201 return;
00202 }
00203 }
00204
00205 std::vector<const ROEdge*> *list = new std::vector<const ROEdge*>();
00206 if (myWithTaz && myVehicleParameter->wasSet(VEHPARS_TAZ_SET)) {
00207 ROEdge *edge = myNet.getEdge(myVehicleParameter->fromTaz+"-source");
00208 if (edge!=0) {
00209 list->push_back(edge);
00210 } else {
00211 MsgHandler::getErrorInstance()->inform("The vehicle '" + myVehicleParameter->id + "' contains the unknown zone '" + myVehicleParameter->fromTaz + "'.");
00212 myCurrentIsOk = false;
00213 }
00214 }
00215 StringTokenizer st(chars);
00216 while (myCurrentIsOk&&st.hasNext()) {
00217 const std::string id = st.next();
00218 ROEdge *edge = myNet.getEdge(id);
00219 if (edge!=0) {
00220 list->push_back(edge);
00221 } else {
00222 if (!myTryRepair) {
00223 std::string rid = myCurrentAlternatives!=0 ? myCurrentAlternatives->getID() : myCurrentRouteName;
00224 MsgHandler::getErrorInstance()->inform("The route '" + rid + "' contains the unknown edge '" + id + "'.");
00225 myCurrentIsOk = false;
00226 }
00227 }
00228 }
00229 if (myWithTaz && myVehicleParameter->wasSet(VEHPARS_TAZ_SET)) {
00230 ROEdge *edge = myNet.getEdge(myVehicleParameter->toTaz);
00231 if (edge!=0) {
00232 list->push_back(edge);
00233 } else {
00234 MsgHandler::getErrorInstance()->inform("The vehicle '" + myVehicleParameter->id + "' contains the unknown zone '" + myVehicleParameter->fromTaz + "'.");
00235 myCurrentIsOk = false;
00236 }
00237 }
00238 if (myCurrentIsOk) {
00239 if (myCurrentAlternatives!=0) {
00240 myCurrentAlternatives->addLoadedAlternative(
00241 new RORoute(myCurrentAlternatives->getID(), myCost, myProbability, *list, myColor));
00242 } else {
00243 myCurrentRoute = new RORouteDef_Complete(myCurrentRouteName, myColor, *list, myTryRepair);
00244 }
00245 myColor = 0;
00246 }
00247 delete list;
00248 }
00249
00250
00251 void
00252 RORDLoader_SUMOBase::myEndElement(SumoXMLTag element) throw(ProcessError) {
00253 switch (element) {
00254 case SUMO_TAG_ROUTE:
00255 if (!myAltIsValid) {
00256 return;
00257 }
00258 if (myCurrentRoute!=0&&myCurrentIsOk) {
00259 if (myCurrentAlternatives==0) {
00260 myNet.addRouteDef(myCurrentRoute);
00261 myCurrentRoute = 0;
00262 }
00263 if (myVehicleParameter==0) {
00264 myHaveNextRoute = true;
00265 }
00266 myCurrentRoute = 0;
00267 }
00268 break;
00269 case SUMO_TAG_ROUTE_DISTRIBUTION:
00270 if (!myCurrentIsOk) {
00271 return;
00272 }
00273 if (myVehicleParameter==0) {
00274 myHaveNextRoute = true;
00275 }
00276 myNet.addRouteDef(myCurrentAlternatives);
00277 myCurrentRoute = 0;
00278 myCurrentAlternatives = 0;
00279 break;
00280 case SUMO_TAG_VEHICLE:
00281 closeVehicle();
00282 delete myVehicleParameter;
00283 myVehicleParameter = 0;
00284 myHaveNextRoute = true;
00285 break;
00286 case SUMO_TAG_VTYPE: {
00287 SUMOVehicleParserHelper::closeVTypeParsing(*myCurrentVType);
00288 myNet.addVehicleType(myCurrentVType);
00289 myCurrentVType = 0;
00290 }
00291 default:
00292 break;
00293 }
00294 if (!myCurrentIsOk) {
00295 throw ProcessError();
00296 }
00297 }
00298
00299
00300 bool
00301 RORDLoader_SUMOBase::closeVehicle() throw() {
00302
00303 if (myVehicleParameter->depart<myBegin||myVehicleParameter->depart>=myEnd) {
00304 myCurrentIsOk = false;
00305 return false;
00306 }
00307
00308 SUMOVTypeParameter *type = myNet.getVehicleTypeSecure(myVehicleParameter->vtypeid);
00309
00310 RORouteDef *route = myNet.getRouteDef(myVehicleParameter->routeid);
00311 if (route==0) {
00312 route = myNet.getRouteDef("!" + myVehicleParameter->id);
00313 }
00314 if (route==0) {
00315 MsgHandler::getErrorInstance()->inform("The route of the vehicle '" + myVehicleParameter->id + "' is not known.");
00316 myCurrentIsOk = false;
00317 return false;
00318 }
00319
00320 if (!MsgHandler::getErrorInstance()->wasInformed()) {
00321 ROVehicle *veh = new ROVehicle(*myVehicleParameter, route, type);
00322 myNet.addVehicle(myVehicleParameter->id, veh);
00323 return true;
00324 }
00325 return false;
00326 }
00327
00328
00329 void
00330 RORDLoader_SUMOBase::beginNextRoute() throw() {
00331 myHaveNextRoute = false;
00332 }
00333
00334
00335
00336
00337