static void Main(string[] args) { log.Info("Application starts"); string host = ConfigurationManager.AppSettings["host"]; string port = ConfigurationManager.AppSettings["port"]; string service = ConfigurationManager.AppSettings["service"]; string protocol = ConfigurationManager.AppSettings["protocol"]; bool CarpoolingEnabled = bool.Parse(ConfigurationManager.AppSettings["CarpoolingEnabled"]); bool TrafficEnabled = bool.Parse(ConfigurationManager.AppSettings["TrafficEnabled"]); double TrafficPropagationMaxDistance = float.Parse(ConfigurationManager.AppSettings["TrafficPropagationMaxDistance"]); int CarpoolingMaxConnectionsPerTNode = int.Parse(ConfigurationManager.AppSettings["CarpoolingMaxConnectionsPerTNode"]); /* This variable is used to decide if update at startup the external carpooling rides to the network or wait the midnight */ bool updateExtRidesAtStartup = bool.Parse(ConfigurationManager.AppSettings["ExtCarpoolingRideUpdateAtStartup"]); //var host = Dns.GetHostAddresses(Dns.GetHostName())[0]; string url = protocol + "://" + host + ":" + port + service; log.Info(url); Notification.SendMessageByEmail(Notification.AlarmType.INFO, DateTime.Now.ToString() + "\r\nWebAPI starts at " + url + "\r\nBuilding network..."); /* Get the site timeZone from the GTFS data (needed for the carpooling date caonversion) */ string timeZone = null; timeZone = DBParser.GetTimeZoneFromAgencyTable(); /* Get the boundaries from the OSM Map (needed for the backend carpooling http requests) */ Point MapMinPoint = null, MapMaxPoint = null; string OSMXMLMapFilePath = System.IO.Path.GetFullPath(AppDomain.CurrentDomain.BaseDirectory + ConfigurationManager.AppSettings["dataPath"] + ConfigurationManager.AppSettings["OSMXMLMapFile"]); log.Info("Parsing " + OSMXMLMapFilePath + " OSM."); routingNetwork1 = new Routing.RoutingNetwork(); OSM.XMLParser Parser = new OSM.XMLParser(); Parser.GetBoundaries(OSMXMLMapFilePath, ref MapMinPoint, ref MapMaxPoint); if ((MapMinPoint != null) && (MapMaxPoint != null)) { log.Info("Map Boundaries: minlat:" + MapMinPoint.Latitude + ", minlon:" + MapMinPoint.Longitude + ", maxlat:" + MapMaxPoint.Latitude + ", maxlon:" + MapMaxPoint.Longitude); } else { string message = "Application ends\r\nMap boundaries not found into the OSM map: minlat:" + MapMinPoint.Latitude + ", minlon:" + MapMinPoint.Longitude + ", maxlat:" + MapMaxPoint.Latitude + ", maxlon:" + MapMaxPoint.Longitude; log.Error(message); Notification.SendMessageByEmail(Notification.AlarmType.ERROR, DateTime.Now.ToString() + "\r\n" + message); Environment.Exit(0); } /* Get the dynamic data version from the backend web service */ DynamicData = HTTPRequests.getDynamicDataVersionFromBackend(MapMinPoint, MapMaxPoint); if (DynamicData != null) { if (CarpoolingEnabled) { /* Set the Carpooling data version */ CarPooling.Version = new CarpoolerVersion(DynamicData.sites.First().carpooling_info.version, DynamicData.sites.First().carpooling_info.updated, DynamicData.sites.First().name, DynamicData.sites.First().carpooling_info.nightly_version, DynamicData.sites.First().carpooling_info.nightly_updated); log.Info("CARPOOLING Version:" + CarPooling.Version.version + " Timestamp:" + CarPooling.Version.timestampVersion + " NightlyVersion:" + CarPooling.Version.nightly_version + " NightlyTimestamp: " + CarPooling.Version.nightly_timestampVersion); bool updateExternalRides = false; if ((updateExtRidesAtStartup) || ((DateTime.Now.Hour < ExtCarpoolingAvailableUpdateTimeFrom) && (DateTime.Now.Hour >= ExtCarpoolingAvailableUpdateTimeTo))) { updateExternalRides = true; } /* Get the carpooling rides list from the backend web service */ CarPooling.Carpoolers = HTTPRequests.getCarpoolingDataFromBackend(MapMinPoint, MapMaxPoint, updateExternalRides); } if (TrafficEnabled) { /* Set the Traffic/incidents data version */ Traffic.Version = new TrafficVersion(DynamicData.sites.First().reports_info.version, DynamicData.sites.First().reports_info.updated, DynamicData.sites.First().name); log.Info("TRAFFIC Version:" + Traffic.Version.version + " Timestamp:" + Traffic.Version.timestampVersion); /* Get the Traffic/incidents data from the backend web service */ Traffic.TrafficReport = HTTPRequests.getTrafficDataFromBackend(MapMinPoint, MapMaxPoint, TrafficPropagationMaxDistance); } } /* Build the network */ routingNetwork1 = RoutePlanner.Globals.BuildNetwork(ref CParser, ref TParser, CarPooling.Carpoolers, Traffic.TrafficReport, TrafficPropagationMaxDistance, CarpoolingMaxConnectionsPerTNode); /* Copy the network */ //routingNetwork2 = new RoutingNetwork { }; //routingNetwork1.duplicateNetwork(ref routingNetwork2); log.Info("Starting server at " + url); Notification.SendMessageByEmail(Notification.AlarmType.INFO, DateTime.Now.ToString() + "\r\nService is running at " + url); HTTPAsyncServer Server = new HTTPAsyncServer(url); log.Error("Application ends"); Notification.SendMessageByEmail(Notification.AlarmType.ERROR, "Application ends"); }
void updateCarpoolingNetwork(CarPoolerDataVersioned CarPoolingTmp) { CarpoolParser CParserTmp = null; //JUST FOR TESTING: simulate a new data version //CarPoolingTmp.Version.version++; if ((Program.CarPooling.Version != null) && (CarPoolingTmp.Version != null) && ((CarPoolingTmp.Version.version != Program.CarPooling.Version.version) || (CarPoolingTmp.Version.nightly_version != Program.CarPooling.Version.nightly_version))) { log.Info("New Carpooling data are available (prevVersion:" + Program.CarPooling.Version.version + ", newVersion:" + CarPoolingTmp.Version.version + ")"); log.Info("New Carpooling data are available (nightlyPrevVersion:" + Program.CarPooling.Version.nightly_version + ", newNightlyVersion:" + CarPoolingTmp.Version.nightly_version + ")"); bool updateExternalRides = false; if ((DateTime.Now.Hour >= Program.ExtCarpoolingAvailableUpdateTimeFrom) && (DateTime.Now.Hour < Program.ExtCarpoolingAvailableUpdateTimeTo)) { updateExternalRides = true; } /* Get the carpooling rides list from the backend web service */ CarPoolingTmp.Carpoolers = HTTPRequests.getCarpoolingDataFromBackend(productionRoutingNetwork.MinPoint, productionRoutingNetwork.MaxPoint, updateExternalRides); ////JUST FOR TESTING: modify element //CarPoolingTmp.Carpoolers.First().Id = "pizza"; ////Just for testing: add new element //Carpooler test = new Carpooler("drtgwet", 2789, 4); //test.WayPoints.Add(new Point(46.013456, 8.943813)); //test.WayPoints.Add(new Point(46.011596, 8.964293)); //CarPoolingTmp.Carpoolers.Add(test); ////Just for testing: remove element //Carpooler testremove = CarPoolingTmp.Carpoolers.First(); //CarPoolingTmp.Carpoolers.Remove(testremove); ////Just for testing: add modified element //Carpooler testaddandchange = CarPoolingTmp.Carpoolers.First(); //testaddandchange.WayPoints.Add(new Point(1, 1)); //testaddandchange.WayPoints.Add(new Point(2, 2)); //CarPoolingTmp.Carpoolers.Add(testaddandchange); /* Get differences between the old version and the new one */ CarpoolDiff CarPoolingDiff = CarpoolParser.checkDifferences(Program.CarPooling.Carpoolers, CarPoolingTmp.Carpoolers, updateExternalRides); if ((CarPoolingDiff.ElementsToRemove.Count > 0) || (CarPoolingDiff.ElementsToAdd.Count > 0)) { /* Update the network only when there are no pending threads (Monitor.Wait) */ lock (_ActiveWorkersLock) { while (_CountOfActiveWorkers > 0) { Monitor.Wait(_ActiveWorkersLock); } log.Info("Updating the production network with the carpooling rides"); /* Remove the OLD Carpooling connections from the network */ if (CarPoolingDiff.ElementsToRemove.Count > 0) { log.Info("Removing " + CarPoolingDiff.ElementsToRemove.Count + " deleted carpooling connections from the processNetwork"); foreach (Carpooler el in CarPoolingDiff.ElementsToRemove) { productionRoutingNetwork.RemoveConnection(el); /* Update the original CParser and Carpooling classes */ Program.CParser.CarPoolers.Remove(el); } log.Info("ProcessNetwork updated! (" + CarPoolingDiff.ElementsToRemove.Count + " old carpooling connections deleted)"); /* Force the network update before processing the next request */ updateRN = true; } /* Add the NEW Carpooling connections to the network */ if (CarPoolingDiff.ElementsToAdd.Count > 0) { /* Construct the new Carpooling network */ log.Info("Adding " + CarPoolingDiff.ElementsToAdd.Count + " new carpooling connections to the processNetwork"); CParserTmp = new CarpoolParser(productionRoutingNetwork, CarPoolingDiff.ElementsToAdd); CParserTmp.ConnectWithRoadNetwork(); /* Update the original CParser and Carpooling classes */ foreach (Carpooler el in CarPoolingDiff.ElementsToAdd) { Program.CParser.CarPoolers.Add(el); } log.Info("Processnetwork updated! (" + CarPoolingDiff.ElementsToAdd.Count + " new carpooling connections added)"); /* Force the network update before processing the next request */ updateRN = true; } log.Info("Production network updated"); } } if (CarPoolingDiff.ElementsToIgnore.Count > 0) { log.Info(CarPoolingDiff.ElementsToIgnore.Count + " rides unchanged"); } /* If there are no modifications too, just update the version number (this happens for example if the driver quickly * enable and disable a ride, so the version number changes but the content doesn't) */ /* Update the carpooling version */ Program.CarPooling.Version = new CarpoolerVersion(CarPoolingTmp.Version.version, CarPoolingTmp.Version.timestampVersion, CarPoolingTmp.Version.nameSite, CarPoolingTmp.Version.nightly_version, CarPoolingTmp.Version.nightly_timestampVersion); } else { if (CarPoolingTmp.Version != null) { //log.Info("Carpooling version not changed: version=" + CarPoolingTmp.Version.version + " timestamp=" + CarPoolingTmp.Version.timestampVersion); } } }