//private Task<RetrievedData<T>> GenericGetDataAsync<T, F>(string id, DataSourcePreference preference, CancellationToken cancellationToken, Func<Func<Task<RetrievedData<T>>>> runFunction,  )
 //{
 //    var result = new RetrievedData<T>();
 //    foreach (var source in Sources)
 //    {
 //        if (result.HasData)
 //            continue;
 //        if ((preference & DataSourcePreference.MemoryCache) == 0 && source.IsMemoryCache)
 //            continue;
 //        if ((preference & DataSourcePreference.Offline) == 0 && source.IsOfflineSource)
 //            continue;
 //        if ((preference & DataSourcePreference.Online) == 0 && !source.IsOfflineSource)
 //            continue;
 //        if ((source.GetTransitStopFunction & DataSourceFunctionType.Provision) == DataSourceFunctionType.Provision)
 //            result = await source.GetTransitStop(id, cancellationToken);
 //    }
 //    if (result.HasData)
 //    {
 //        foreach (var source in Sources)
 //        {
 //            if (!result.HasData)
 //                continue;
 //            if ((preference & DataSourcePreference.MemoryCache) == 0 && source.IsMemoryCache)
 //                continue;
 //            if ((preference & DataSourcePreference.Offline) == 0 && source.IsOfflineSource)
 //                continue;
 //            if ((preference & DataSourcePreference.Online) == 0 && !source.IsOfflineSource)
 //                continue;
 //            if ((source.GetTransitStopFunction & DataSourceFunctionType.Correction) == DataSourceFunctionType.Correction)
 //                result = await source.CorrectTransitStop(result.Data, cancellationToken);
 //        }
 //    }
 //    return result;
 //}
 
 public static async Task<RetrievedData<TransitStop>> GetTransitStopAsync(string id, DataSourcePreference preference, CancellationToken cancellationToken)
 {
     var result = new RetrievedData<TransitStop>();
     foreach (var source in Sources)
     {
         if (cancellationToken.IsCancellationRequested)
             throw new OperationCanceledException();
         if (result.HasData || !source.IsQualified(preference))
             continue;
         if ((source.GetTransitStopFunction & DataSourceFunctionType.Provision) == DataSourceFunctionType.Provision)
             result = await source.GetTransitStop(id, cancellationToken);
     }
     if (result.HasData)
     {
         if (cancellationToken.IsCancellationRequested)
             throw new OperationCanceledException();
         foreach (var source in Sources)
         {
             if (!result.HasData || !source.IsQualified(preference))
                 continue;
             if ((source.GetTransitStopFunction & DataSourceFunctionType.Correction) == DataSourceFunctionType.Correction)
                 result = await source.CorrectTransitStop(result.Data, cancellationToken);
         }
     }
     return result;
 }
 public static RetrievedData<IEnumerable<RealTimeArrival>> GetRealTimeArrivalsForStop(string stopId, int minsBefore, int minsAfter, DataSourcePreference preference) => RunSync(() => GetRealTimeArrivalsForStopAsync(stopId, minsBefore, minsAfter, preference, CancellationToken.None));
 private bool IsQualified(DataSourcePreference preference)
 {
     if (preference == DataSourcePreference.MemoryCacheOnly)
         return IsMemoryCache;
     if ((preference & DataSourcePreference.MemoryCache) == 0 && IsMemoryCache)
         return false;
     if ((preference & DataSourcePreference.Offline) == 0 && IsOfflineSource)
         return false;
     if ((preference & DataSourcePreference.Online) == 0 && !IsOfflineSource)
         return false;
     return true;
 }
 public static RetrievedData<IEnumerable<TransitStop>> GetTransitStopsForArea(LatLonRect area, DataSourcePreference preference) => RunSync(() => GetTransitStopsForAreaAsync(area, preference, CancellationToken.None));
 public static RetrievedData<WeekSchedule> GetScheduleForStop(string stopId, DataSourcePreference preference) => RunSync(() => GetScheduleForStopAsync(stopId, preference, CancellationToken.None));
 public static RetrievedData<RealTimeArrival> GetRealTimeArrival(string stopId, string tripId, DataSourcePreference preference) => RunSync(() => GetRealTimeArrivalAsync(stopId, tripId, preference, CancellationToken.None));
 public static RetrievedData<TransitRoute> GetTransitRoute(string id, DataSourcePreference preference) => RunSync(() => GetTransitRouteAsync(id, preference, CancellationToken.None));
        public static async Task<RetrievedData<IEnumerable<RealTimeArrival>>> GetRealTimeArrivalsForStopAsync(string stopId, int minsBefore, int minsAfter, DataSourcePreference preference, CancellationToken cancellationToken)
        {
            IEnumerable<RealTimeArrival> resultArrivals = null;
            List<string> resultErrors = new List<string>();
            List<Exception> resultExceptions = new List<Exception>();
            foreach (var source in Sources)
            {
                if (!source.IsQualified(preference))
                    continue;

                if (source.CanGetRealTimeArrivalsForStop)
                {
                    var sResult = await source.GetRealTimeArrivalsForStop(stopId, minsBefore, minsAfter, cancellationToken);
                    if (sResult.HasData)
                    {
                        if (resultArrivals == null)
                            resultArrivals = sResult.Data;
                        else
                            resultArrivals = resultArrivals.Union(sResult.Data);
                    }
                    if (sResult.ErrorMessage != null)
                        resultErrors.Add(sResult.ErrorMessage);
                    if (sResult.CaughtException != null)
                        resultExceptions.Add(sResult.CaughtException);
                }
            }
            if (resultArrivals == null)
                resultArrivals = new RealTimeArrival[] { };
            return new RetrievedData<IEnumerable<RealTimeArrival>>(resultArrivals, resultErrors.Count == 0 ? null : resultErrors.Aggregate("", (acc, err) => (acc == "" ? "" : ", ") + err), resultExceptions.Count == 0 ? null : new AggregateException(resultExceptions));
        }
 public static async Task<RetrievedData<WeekSchedule>> GetScheduleForStopAsync(string stopId, DataSourcePreference preference, CancellationToken cancellationToken)
 {
     WeekSchedule result = null;
     List<string> resultErrors = new List<string>();
     List<Exception> resultExceptions = new List<Exception>();
     foreach (var source in Sources)
     {
         if (cancellationToken.IsCancellationRequested)
             throw new OperationCanceledException();
         if (!source.IsQualified(preference))
             continue;
         if (source.CanGetScheduleForStop)
         {
             var sResult = await source.GetScheduleForStop(stopId, cancellationToken);
             if (sResult.HasData)
             {
                 if (result == null)
                     result = sResult.Data;
                 else
                     result.Union(sResult.Data);
             }
             if (sResult.ErrorMessage != null)
                 resultErrors.Add(sResult.ErrorMessage);
             if (sResult.CaughtException != null)
                 resultExceptions.Add(sResult.CaughtException);
         }
     }
     //if (result == null)
     //    resultStops = new TransitStop[] { };
     if (result == null)
         return new RetrievedData<WeekSchedule>(resultErrors.Count == 0 ? null : resultErrors.Aggregate("", (acc, err) => (acc == "" ? "" : ", ") + err), resultExceptions.Count == 0 ? null : new AggregateException(resultExceptions));
     return new RetrievedData<WeekSchedule>(result, resultErrors.Count == 0 ? null : resultErrors.Aggregate("", (acc, err) => (acc == "" ? "" : ", ") + err), resultExceptions.Count == 0 ? null : new AggregateException(resultExceptions));
 }
Exemple #10
0
 public static async Task<RetrievedData<IEnumerable<TransitStop>>> GetTransitStopsForAreaAsync(LatLonRect area, DataSourcePreference preference, CancellationToken cancellationToken)
 {
     IEnumerable<TransitStop> resultStops = null;
     List<string> resultErrors = new List<string>();
     List<Exception> resultExceptions = new List<Exception>();
     foreach (var source in Sources)
     {
         if (cancellationToken.IsCancellationRequested)
             throw new OperationCanceledException();
         if (!source.IsQualified(preference))
             continue;
         if (source.CanGetTransitStopsForArea)
         {
             var sResult = await source.GetTransitStopsForArea(area, cancellationToken);
             if (sResult.HasData)
             {
                 if (resultStops == null)
                     resultStops = sResult.Data;
                 else
                     resultStops = resultStops.Union(sResult.Data);
             }
             if (sResult.ErrorMessage != null)
                 resultErrors.Add(sResult.ErrorMessage);
             if (sResult.CaughtException != null)
                 resultExceptions.Add(sResult.CaughtException);
         }
     }
     if (resultStops == null)
         resultStops = new TransitStop[] { };
     return new RetrievedData<IEnumerable<TransitStop>>(resultStops, resultErrors.Count == 0 ? null : resultErrors.Aggregate("", (acc, err) => (acc == "" ? "" : ", ") + err), resultExceptions.Count == 0 ? null : new AggregateException(resultExceptions));
 }