using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.BL; using Tango.BL.Entities; using Tango.FSE.BL.CacheEntities; using Tango.FSE.Web.Messages; namespace Tango.FSE.BL.Services { public class MachineEventsService : FSEServiceBase { private const string EVENT_TYPES_COLLECTION = "EventTypes"; private MemoryCacheDictionary _eventTypesCache; public MachineEventsService() { _eventTypesCache = MemoryCache.GetOrCreateCache(EVENT_TYPES_COLLECTION); } public Task> GetAllEventTypes() { return DataResolver>.Builder.New() .ConfigureCascade(DataResolverNode.InMemoryCache, DataResolverNode.Web, DataResolverNode.Online, DataResolverNode.DiskCache) .InMemoryCache((context) => { var eventTypes = _eventTypesCache .ToList() .Select(x => x.ToObservable()) .ToList(); if (eventTypes.Count == 0) { throw new IndexOutOfRangeException("The memory cache did contain any event types."); } return eventTypes; }) .Web((context) => { var eventTypes = WebClient.GetEventTypes(new GetEventTypesRequest()).GetAwaiter().GetResult().EventTypes.Select(x => x.ToObservable()).ToList(); List cachedEventTypes = new List(); try { foreach (var eventType in eventTypes) { var cachedEventType = CachedEventType.FromObservable(eventType); _eventTypesCache.Put(cachedEventType.Guid, cachedEventType); } } catch (Exception ex) { LogManager.Log(ex, "Error caching event types on memory."); } try { using (var cache = DiskCache.CreateContext()) { var collection = cache.Database.GetCollection(EVENT_TYPES_COLLECTION); foreach (var cachedEventType in cachedEventTypes) { collection.Upsert(cachedEventType); } } } catch (Exception ex) { LogManager.Log(ex, "Error caching event types to disk."); } return eventTypes; }) .Online((context) => { using (ObservablesContext db = ObservablesContext.CreateDefault()) { var eventTypes = db.EventTypes.ToList(); List cachedEventTypes = new List(); try { foreach (var eventType in eventTypes) { var cachedEventType = CachedEventType.FromObservable(eventType); _eventTypesCache.Put(cachedEventType.Guid, cachedEventType); } } catch (Exception ex) { LogManager.Log(ex, "Error caching event types on memory."); } try { using (var cache = DiskCache.CreateContext()) { var collection = cache.Database.GetCollection(EVENT_TYPES_COLLECTION); foreach (var cachedEventType in cachedEventTypes) { collection.Upsert(cachedEventType); } } } catch (Exception ex) { LogManager.Log(ex, "Error caching event types to disk."); } return eventTypes; } }) .DiskCache((context) => { using (var cache = DiskCache.CreateContext()) { var collection = cache.Database.GetCollection(EVENT_TYPES_COLLECTION); var cachedEventTypes = collection.FindAll().ToList(); foreach (var cachedEventType in cachedEventTypes) { _eventTypesCache.Put(cachedEventType.Guid, cachedEventType); } return cachedEventTypes.Select(x => x.ToObservable()).ToList(); } }) .BuildExecuteAsync(); } } }