예제 #1
0
        public void TossEvent(Event evt, IAlarmCache alarms)
        {
            var potKey = evt.LinkedTo;

            (bool completed, bool alarmExist)@case = (evt.completed, alarms.TryGetValue(potKey, out var alarm));

            switch (@case)
            {
            case var x when x.completed && x.alarmExist:
                alarm.RemoveEvent(evt);
                break;

            case var x when x.completed && !x.alarmExist:
                Debug.Assert(false, $"Completed EmissionEvent that has no alarm event {evt}");
                break;

            case var x when !x.completed && x.alarmExist:
                alarm.AddEvent(evt);
                break;

            case var x when !x.completed && !x.alarmExist:
                alarms.Add(potKey, new Alarm(evt));
                break;
            }
        }
예제 #2
0
        public void MergeSentAlarms(IEnumerable <Alarm.ShortView> sentAlarms, IAlarmCache alarms)
        {
            sentAlarms.ToList().ForEach(sentAlarm =>
            {
                if (alarms.TryGetValue(sentAlarm.Key, out var cacheAlarm))
                {
                    var sentStates = new List <Alarm.AlarmState> {
                        Alarm.AlarmState.AlarmSent, Alarm.AlarmState.FinishedSent
                    };

                    switch (sentAlarm.State)
                    {
                    case Alarm.AlarmState.AlarmSent:
                        if (cacheAlarm.State == Alarm.AlarmState.AlarmPending)
                        {
                            cacheAlarm.State = sentAlarm.State;
                        }
                        else
                        {
                            Debug.Assert(false, $"Alarm id:{sentAlarm.Id}, key:{sentAlarm.Key} state changed state:{sentAlarm.State} cache-state:{cacheAlarm.State}");
                        }
                        break;

                    case Alarm.AlarmState.FinishedSent:
                        if (cacheAlarm.State == Alarm.AlarmState.FinishPending)
                        {
                            cacheAlarm.State = Alarm.AlarmState.Completed;
                        }
                        else
                        {
                            Debug.Assert(false, $"Alarm id:{sentAlarm.Id}, key:{sentAlarm.Key} state changed state:{sentAlarm.State} cache-state:{cacheAlarm.State}");
                        }
                        break;

                    default:
                        //Skip not sent alarms (or process it differently)
                        //Debug.Assert(false, $"Alarm id:{sentAlarm.Id}, key:{sentAlarm.Key} in wrong state:{sentAlarm.State}");
                        break;
                    }
                }
                else
                {
                    Debug.Assert(false, $"Alarm id:{sentAlarm.Id}, key:{sentAlarm.Key} not found in cache");
                }
            });

            alarms.PurgeCompletedAlarms();
        }
예제 #3
0
 public void ProcessEventBatch(IEnumerable <Event> events, IAlarmCache alarms)
 {
     events.ToList().ForEach(x => TossEvent(x, alarms));
 }