/// <summary> /// Builds the available parkades model with the a default entry /// </summary> /// TODO Refactor /// <param name="analyticsModes">analytics Model</param> /// <returns>Filled Available Dates Model</returns> private static IEnumerable <SelectListItem> BuildAvailableParkadeDropDown(IParkingFinderAnalyticsModel analyticsModes) { IList <SelectListItem> availableDates = BuildAvailableParkadesEntries(analyticsModes); BuildDefaultEntry(ref availableDates, "Choose a Parkade", string.Empty); return(availableDates.GroupBy(x => x.Value).Select(g => g.First())); }
/// <summary> /// Base Execute Method for all Analytics Services /// </summary> /// <param name="requestedDateTime">the reuested Date time to get analytics data</param> /// <param name="requestedId">the requested id to get data for</param> /// <param name="analyticsModel">Reference to the current Analytics data</param> /// <returns>output string with the analytics result</returns> public string Execute(DateTime requestedDateTime, string requestedId, IParkingFinderAnalyticsModel analyticsModel) { IEnumerable <IParkingFinderAnalyticsData> analyticsDataFromDayAndId = PrepareAnalyticsData(requestedDateTime, requestedId, analyticsModel); Tuple <int, IList <IList <DateTime> > > calculatedTimeSpans = CalculateBestTimeSpans(analyticsDataFromDayAndId); return(BuildResultString(calculatedTimeSpans.Item1, requestedDateTime, calculatedTimeSpans.Item2)); }
/// <summary> /// Analyses the Best Parking times for a given date and a parkade /// </summary> /// <param name="requestModel">given data in as request model</param> /// <returns>The Result of the best parking analytics in a model</returns> public IBestParkingAnalyticsModel AnalyseBestParking(IAnalyticsRequestModel requestModel) { if (!requestModel.IsValid()) { Logger.Error("AnalyseBestParking: Request Model is not valid"); return(new BestParkingAnalyticsModel()); } IParkingFinderAnalyticsModel analyticsModel = this.GetAnalyticsModel; string resultString = this.BestParkingService.Execute( requestModel.DateAsDatetime, requestModel.Id, analyticsModel); IEnumerable <IParkingFinderAnalyticsData> analyticsModelForId = analyticsModel .AnalyticsData .FirstOrDefault(element => element.Key.ToString().Equals(requestModel.Id)) .Value .Where(element => element .TimeStamp .ToString(Labels.DateFormat) .Equals(requestModel .DateAsDatetime .ToString(Labels.DateFormat))) .OrderBy(element => element.TimeStamp); return(new BestParkingAnalyticsModel() { ResultText = resultString, AnalyticsData = analyticsModelForId }); }
/// <summary> /// Requests the Data Collection View /// </summary> /// <returns>Partial View</returns> public ActionResult BestParkingFormView() { IParkingFinderAnalyticsModel analyticsModel = this.AnalyticsServiceFacade.GetAnalyticsModel; IEnumerable <SelectListItem> availableDate = BuildAvailableDateDropDown(analyticsModel); IEnumerable <SelectListItem> availableParkade = BuildAvailableParkadeDropDown(analyticsModel); return(PartialView("Partial/BestParkingForm", BuildAnalyticsBestParkingFormViewModel(availableDate, availableParkade))); }
/// <summary> /// Builds the complete List for available Dates /// </summary> /// <param name="analyticsModel">analytics Model</param> /// <returns>Filled Available Dates Model</returns> private static IList <SelectListItem> BuildAvailableDatesEntries(IParkingFinderAnalyticsModel analyticsModel) { return((from analyticsElement in analyticsModel.AnalyticsData from analyticsElementEntry in analyticsElement.Value select analyticsElementEntry.TimeStamp.ToString(Labels.DateFormat) into dateOfData select new SelectListItem() { Value = dateOfData, Text = dateOfData, Disabled = false, }).ToList()); }
/// <summary> /// Builds the DropDown List Entries for the available Parkades /// </summary> /// TODO Refactor /// <param name="analyticsModel">current analytics Model</param> /// <returns>Filled Select List for Dropdown</returns> private static IList <SelectListItem> BuildAvailableParkadesEntries(IParkingFinderAnalyticsModel analyticsModel) { return((from analyticsElement in analyticsModel.AnalyticsData from analyticsElementEntry in analyticsElement.Value select new Tuple <int, string>(analyticsElementEntry.OccupancyModel.Site.Id, analyticsElementEntry.OccupancyModel.Site.DisplayName) into dateOfData orderby dateOfData.Item2 select new SelectListItem() { Value = dateOfData.Item1.ToString(), Text = dateOfData.Item2.ToUtf8(), Disabled = false, }).ToList()); }
/// <summary> /// Application Start /// Is Called one time on Startup /// </summary> protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); // Deserialize and set the result in cache IParkingFinderAnalyticsModel deserializedAnalyticsModel = this.PredefinedServiceFacade .SerializationService .Deserialize <ParkingFinderAnalyticsModel>(Settings.AnaylticsSerializationPath); this.PredefinedServiceFacade .CachingService .SetModel <ParkingFinderAnalyticsModel>(deserializedAnalyticsModel); }
/// <summary> /// The Loop which gets the Price every x minutes /// x can be adjusted via web.config entry "DelayWhileDataCollection" /// TODO Raus hier /// </summary> /// <param name="threadGuid">the guid of the current thread</param> private void DataCollectionLoop(Guid threadGuid) { // Check if the shut down should be forced while (!this.PredefinedServiceFacade.ThreadService.ShutDownForced(threadGuid)) { // Get the station data from json dynamically based on the ids of the input IOccupanciesModel occupancies = this.ParkingFnderFacade.RequestParkadeOccupancies <OccupanciesModel>(); IParkingFinderAnalyticsModel analyticsModel = (IParkingFinderAnalyticsModel)this.PredefinedServiceFacade.CachingService.GetModel <ParkingFinderAnalyticsModel>(); foreach (OccupancyModel occupancy in occupancies.Occupancies) { IParkingFinderAnalyticsData specificAnalyticsData = new ParkingFinderAnalyticsData() { OccupancyModel = occupancy, TimeStamp = DateTime.Now }; IList <IParkingFinderAnalyticsData> analyticsData; if (analyticsModel.AnalyticsData.TryGetValue(occupancy.Site.Id, out analyticsData)) { analyticsData.Add(specificAnalyticsData); } else { analyticsData = new List <IParkingFinderAnalyticsData>() { specificAnalyticsData }; analyticsModel.AnalyticsData.Add(occupancy.Site.Id, analyticsData); } } // Serialize and save the Result this.PredefinedServiceFacade.CachingService.SetModel <ParkingFinderAnalyticsModel>(analyticsModel); this.PredefinedServiceFacade.SerializationService.Serialize(analyticsModel, Settings.AnaylticsSerializationPath); // Sleep in Web.config // Sleep again System.Threading.Thread.Sleep(600000); } // Remove this thread from the static list Logger.Info("DataCollectionLoop: shutdown triggered"); this.PredefinedServiceFacade.ThreadService.RemoveDataCollectionThread(threadGuid); }
/// <summary> /// Helper to prepare the analytics data vor evaluation /// </summary> /// <param name="requestedDateTime">the reuested date time</param> /// <param name="requestedId">the requested parkade id </param> /// <param name="analyticsModel">all analytics data</param> /// <returns>filtered analytics data based on the input</returns> private static IEnumerable <IParkingFinderAnalyticsData> PrepareAnalyticsData(DateTime requestedDateTime, string requestedId, IParkingFinderAnalyticsModel analyticsModel) { KeyValuePair <int, IList <IParkingFinderAnalyticsData> > specificAnalyticsModel = analyticsModel .AnalyticsData .FirstOrDefault(element => element.Key.ToString().Equals(requestedId)); return(specificAnalyticsModel.Value.Where( listElement => listElement.TimeStamp.ToString(CoreLabels.DateFormat) .Equals(requestedDateTime.ToString(CoreLabels.DateFormat)))); }
/// <summary> /// Base Execute Method for all Analytics Services /// </summary> /// <param name="requestedDateTime">the reuested Date time to get analytics data</param> /// <param name="requestedId">the requested id to get data for</param> /// <param name="analyticsModel">Reference to the current Analytics data</param> /// <returns>output string with the analytics result</returns> public string Execute(DateTime requestedDateTime, string requestedId, IParkingFinderAnalyticsModel analyticsModel) { throw new NotImplementedException(); }