private void UpdateSnapshotAnalyzerInfo()
        {
            var analyzerlist = Engine.GetCurrentAnalyzersInfo();

            foreach (var anal in analyzerlist)
            {
                SnapShotGenerator.AddAnalyzerInfoToSnapShot(anal);
            }
        }
 private void Restart_Click(object sender, RoutedEventArgs e)
 {
     Task.Run(() =>
     {
         Thread.CurrentThread.IsBackground = true;
         SnapShotGenerator.Reset();
         App.Engine.StopEngine();
     });
 }
        public MainWindow(FileLogger logger)
        {
            Logger = logger;
            InitializeComponent();
            ShutDownButton.IsEnabled = false;

            EventProcessor.OnUpdatedInfo += HandleEventProcessorInfo;
            App.Engine.OnStateChanged    += HandleEngineStateChange;
            App.Engine.OnNewAnalyzerInfo += HandleAnalyzerInfo;


            Task.Run(() =>
            {
                while (true)
                {
                    MessageAggregator.Collection.Clear();
                    for (var i = 0; i < 50; ++i)
                    {
                        if (App.Engine.EngineMessages.TryDequeue(out var msg))
                        {
                            MessageAggregator.AddMessage(msg, msg.Message.GenerateMessageIdentifierFromString());
                        }
                    }
                    foreach (var messageTracker in MessageAggregator.Collection)
                    {
                        MesseageOutputQueue.Enqueue($"{messageTracker.Value.Message} | {messageTracker.Value.AmountCounter} times from {messageTracker.Value.FirstOccurrence} to {messageTracker.Value.LastOccurrence}");
                    }
                    for (int i = 1; i <= 14; ++i)
                    {
                        if (MesseageOutputQueue.TryDequeue(out string message))
                        {
                            //UpdateMessageBox($"{DateTime.UtcNow}\t{message}{Environment.NewLine}");
                            Logger.AddRow(message);
                            SnapShotGenerator.AddMessageToSnapShot(DateTime.UtcNow, message);
                        }
                    }
                }
            });

            Task.Run(() =>
            {
                while (true)
                {
                    UpdateSnapshotAnalyzerInfo();
                    Task.Delay(4000).Wait();
                }
            });
            StartUpdateSelectedAnalyzerTask();
        }
        private void HandleCommand(Commands command, string[] args)
        {
            OutputQueue.Enqueue("Command " + command + " recieved.");
            switch (command)
            {
            case Commands.help:

                OutputQueue.Enqueue("Available commands:");
                foreach (var avCom in Enum.GetValues(typeof(Commands)))
                {
                    OutputQueue.Enqueue(avCom.ToString());
                }
                break;

            case Commands.exit:
                Program.RunRestartLoop = false;
                Engine.StopEngine();
                Running = false;
                EventHubProcessor.StopReceiver();
                SnapShotGenerator.Stop();
                OutputQueue.Enqueue("Command sent to engine. See log for info.");
                break;

            case Commands.reloadrulesforanal:
                if (args.Length < 2 || string.IsNullOrEmpty(args[1]))
                {
                    OutputQueue.Enqueue("missing analyzer name");
                    break;
                }
                Engine.ReloadRulesForAnalyzer(args[1]);
                OutputQueue.Enqueue("Command sent to engine. See log for info.");
                break;

            case Commands.showrulesforanal:
                if (args.Length < 2 || string.IsNullOrEmpty(args[1]))
                {
                    OutputQueue.Enqueue("missing analyzer name");
                    break;
                }
                var rules  = Engine.GetRulesLoadedInAnalyzer(args[1]);
                var loaded = rules.Aggregate("", (current, rule) => current + rule + Environment.NewLine);
                OutputQueue.Enqueue(loaded);
                break;

            case Commands.state:
                OutputQueue.Enqueue(CurrentState.ToString());
                break;

            case Commands.showloadedanal:
                OutputQueue.Enqueue(Environment.NewLine);
                OutputQueue.Enqueue(string.Join(Environment.NewLine, Engine.GetCurrentAnalyzersInfo().Select(item => $"{item.Name}\t\t{item.State}\tin queue {item.EventsInQueue}.\tLoaded rules {item.NumberOfRulesLoaded}.")));
                break;

            case Commands.restart:
                Task.Run(() =>
                {
                    Thread.CurrentThread.IsBackground = true;
                    SnapShotGenerator.Reset();
                    Engine.StopEngine();
                });
                OutputQueue.Enqueue("Command sent to engine. See log for info.");
                break;
            }
        }