RORDLoader_SUMOBase.cpp

Go to the documentation of this file.
00001 /****************************************************************************/
00007 // The base class for SUMO-native route handlers
00008 /****************************************************************************/
00009 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/
00010 // Copyright 2001-2010 DLR (http://www.dlr.de/) and contributors
00011 /****************************************************************************/
00012 //
00013 //   This program is free software; you can redistribute it and/or modify
00014 //   it under the terms of the GNU General Public License as published by
00015 //   the Free Software Foundation; either version 2 of the License, or
00016 //   (at your option) any later version.
00017 //
00018 /****************************************************************************/
00019 
00020 
00021 // ===========================================================================
00022 // included modules
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 // method definitions
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     // clean up (on failure)
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         // try to parse the vehicle definition
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     // parse embedded vtype information
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         // parse route alternative...
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     // try to get the id
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     // try to get the index of the last element
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     // build the alternative cont
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     // process routes only, all other elements do
00188     //  not have embedded characters
00189     if (element!=SUMO_TAG_ROUTE) {
00190         return;
00191     }
00192     if (!myAltIsValid) {
00193         return;
00194     }
00195     if (myCurrentRoute!=0) {
00196         return;
00197     }
00198     // check whether the costs and the probability are valid
00199     if (myCurrentAlternatives!=0) {
00200         if (myCost<0||myProbability<0||!myCurrentIsOk) {
00201             return;
00202         }
00203     }
00204     // build the list of edges
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()) { // !!! too slow !!!
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     // get the vehicle id
00303     if (myVehicleParameter->depart<myBegin||myVehicleParameter->depart>=myEnd) {
00304         myCurrentIsOk = false;
00305         return false;
00306     }
00307     // get vehicle type
00308     SUMOVTypeParameter *type = myNet.getVehicleTypeSecure(myVehicleParameter->vtypeid);
00309     // get the route
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     // build the vehicle
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 

Generated on Wed May 5 00:06:36 2010 for Sumo - Simulation of Urban MObility by  doxygen 1.5.6