| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 | using Comal.Classes;using InABox.Clients;using InABox.Core;using System;using System.Collections.Generic;using System.Linq;using System.Timers;namespace Comal.TaskScheduler.Shared{    public class Scheduler    {		private Timer timer;        public TimeSpan Interval { get; set; }		public Scheduler()		{            CoreUtils.RegisterClasses();            ComalUtils.RegisterClasses();            // Set the Interval to 1 minute            Interval = new TimeSpan(0, 1, 0);			timer = new System.Timers.Timer(Interval.TotalMilliseconds);			timer.Elapsed += new ElapsedEventHandler(CheckSchedules);                    }        public void Start()		{            DoCheckSchedules();        }		public void Stop()		{			timer.Enabled = false;		}		private object? GetEntity(Type type, Guid id)		{			if (type == typeof(Equipment))				return new Client<Equipment>().Load(new Filter<Equipment>(x => x.ID).IsEqualTo(id)).FirstOrDefault();			else if (type == typeof(Customer))				return new Client<Customer>().Load(new Filter<Customer>(x => x.ID).IsEqualTo(id)).FirstOrDefault();			else if (type == typeof(Employee))				return new Client<Employee>().Load(new Filter<Employee>(x => x.ID).IsEqualTo(id)).FirstOrDefault();            else if (type == typeof(CustomModule))                return new Client<CustomModule>().Load(new Filter<CustomModule>(x => x.ID).IsEqualTo(id)).FirstOrDefault();            else if (type == typeof(ScheduledScript))                return new Client<ScheduledScript>().Load(new Filter<ScheduledScript>(x => x.ID).IsEqualTo(id)).FirstOrDefault();            return null;			//var type = schedule.DocumentType;			//IClient client = ClientFactory.CreateClient(type);			//var filter = new Filter<Entity>(x => x.ID).IsEqualTo(schedule.DocumentID);			//Entity entity = client.Load(filter).FirstOrDefault();			//var item = entity as ISchedulable;		}        private void DoCheckSchedules()        {            timer.Enabled = false;            Logger.Send(LogType.Information, ClientFactory.UserID, "Checking Schedules");            var scheduleClient = new Client<Schedule>();            try            {                Schedule[] schedules = scheduleClient.Load(                    new Filter<Schedule>(x => x.DocumentClass).IsNotEqualTo("")                        .And(x => x.DocumentID).IsNotEqualTo(Guid.Empty)                        .And(x => x.Active).IsEqualTo(true) //.And(x => x.DueDate).IsLessThan(DateTime.Now)                    );                EmployeeRole[] EmployeeRoles = new Client<EmployeeRole>().Load();                var cache = new Dictionary<string, Entity[]>();                for (int i = 0; i < schedules.Length; i++)                {                    Schedule schedule = schedules[i];                    if ((schedule.DocumentClass != "") && (schedule.DocumentID != Guid.Empty))                    {                        ISchedulePlugin? plugin = SchedulePluginFactory.GetPlugin(schedule.DocumentClass);                        if(plugin == null)                        {                            Logger.Send(LogType.Error, ClientFactory.UserID, $"No plugin for {schedule.DocumentClass}");                            continue;                        }                        //var entity = plugin.LoadEntity(schedule.DocumentID);                        if (!cache.ContainsKey(schedule.DocumentClass))                        {                            Guid[] ids = schedules.Where(x => x.DocumentClass.Equals(schedule.DocumentClass)).Select(x => x.DocumentID).ToArray();                            cache[schedule.DocumentClass] = plugin.LoadEntities(ids);                        }                        var entities = cache[schedule.DocumentClass];                        var entity = entities.FirstOrDefault(x => x.ID.Equals(schedule.DocumentID));                        if (entity != null)                        {                            Logger.Send(LogType.Information, ClientFactory.UserID, $"- {entity} - {schedule.Title}");                            try                            {                                if (!plugin.Execute(schedule, entity))                                    Logger.Send(LogType.Information, ClientFactory.UserID, "  * Schedule not yet due");                            }                            catch (Exception e)                            {                                Logger.Send(LogType.Information, ClientFactory.UserID, $"  * Exception while processing schedule: {e.Message}\n" + String.Join("\n",e.StackTrace));                            }                        }                        else                            Logger.Send(LogType.Information, ClientFactory.UserID, $"- {schedule.Title}: cannot find linked entity({schedule.DocumentClass})");                    }                }            }            catch (Exception err)            {                Logger.Send(LogType.Information, ClientFactory.UserID, err.Message + "\r\n" + err.StackTrace);            }            GC.Collect();            GC.WaitForPendingFinalizers();            GC.Collect();            timer.Enabled = true;        }		private void CheckSchedules(object source, ElapsedEventArgs e)		{            DoCheckSchedules();		}		}}
 |