Exemplo n.º 1
0
 private void RefreshLogFilesSourceCacheAsync(LogView oldLogView, LogView newLogView)
 {
     Task.Run(() =>
     {
         var logFilesToRefresh = new List <LogFile>();
         if (oldLogView != null)
         {
             foreach (var identifier in oldLogView.AllLogFilePathsAndDatabaseNames)
             {
                 var logFile = LogFilesSourceCache.Lookup(identifier);
                 if (logFile.HasValue)
                 {
                     logFilesToRefresh.Add(logFile.Value);
                 }
             }
         }
         if (newLogView != null)
         {
             foreach (var identifier in newLogView.AllLogFilePathsAndDatabaseNames)
             {
                 var logFile = LogFilesSourceCache.Lookup(identifier);
                 if (logFile.HasValue)
                 {
                     logFilesToRefresh.Add(logFile.Value);
                 }
             }
         }
         LogFilesSourceCache.Refresh(logFilesToRefresh);
         RaisePropertyChangedEvent("LogFiles");
     });
 }
Exemplo n.º 2
0
        public void OpenLogFilePath(string logFilePath)
        {
            var newLogFile = new LogFile(logFilePath);

            SettingsService.AddOrUpdateLogFile(newLogFile, true);
            LogFilesSourceCache.AddOrUpdate(newLogFile);
            SelectedLogFile = newLogFile;
            OpenSelectedLogFile();
        }
Exemplo n.º 3
0
 private void RemoveLogSourceFromLogView(ILogEntriesSource logEntriesSource)
 {
     if (logEntriesSource is LogFile logFile)
     {
         _selectedLogView.LogFilePaths.Remove(logFile.NetworkFile.FullName);
         LogFilesSourceCache.Refresh(logFile);
     }
     else if (logEntriesSource is Database database)
     {
         _selectedLogView.DatabaseNames.Remove(database.Name);
         DatabasesSourceCache.Refresh(database);
     }
     Mediator.NotifyColleagues(MediatorMessages.LogSourceRemovedFromSelectedLogView, logEntriesSource);
 }
Exemplo n.º 4
0
        private void InitializeBindings()
        {
            LogFilesSourceCache.Connect()
            .AutoRefresh(logFile => logFile.IsOpen)
            .AutoRefresh(logFile => logFile.RefreshIndicator)
            .Sort(SortExpressionComparer <LogFile> .Descending(logFile => logFile.DateLastOpened))
            .Filter(logFile => logFile.IsOpen && _selectedLogView != null && _selectedLogView.LogFilePaths.Contains(logFile.NetworkFile?.FullName))
            .ObserveOnDispatcher()
            .Bind(out _logFiles)
            .DisposeMany()
            .Subscribe();

            DatabasesSourceCache.Connect()
            .AutoRefresh(database => database.IsOpen)
            .AutoRefresh(database => database.RefreshIndicator)
            .Sort(SortExpressionComparer <Database> .Descending(database => database.DateLastOpened))
            .Filter(database => database.IsOpen && _selectedLogView != null && _selectedLogView.DatabaseNames.Contains(database.Name))
            .ObserveOnDispatcher()
            .Bind(out _databases)
            .DisposeMany()
            .Subscribe();

            //FileSizeText = fileWatcher.Latest.Select(fn => fn.Size)
            //    .Select(size => size.FormatWithAbbreviation())
            //    .DistinctUntilChanged()
            //    .ForBinding();

            //NumUnfilteredErrors = LogEntriesSourceCache.Connect().ToListObservable()
            //    .DistinctUntilChanged()
            //    .ForBinding();

            //LogEntriesSourceCache.Items
            //    .Where(l => (_selectedLogView.LogFilePaths.Contains(l.Identifier) || _selectedLogView.DatabaseNames.Contains(l.Identifier)) && l.Type == LogMessageType.Error)
            //    .Subscribe(
            //    NumUnfilteredErrors = 5,
            //    ex =>
            //    {
            //        NumUnfilteredErrors = 0;
            //    },
            //    () => { NumUnfilteredErrors = 0; });
        }
Exemplo n.º 5
0
        private async void OpenLogView(LogView logView)
        {
            logView.Open();
            AdjustOpenLogViewCount(1);
            RequestSetSelectedLogView(logView);
            logView.IsLoading = true;
            RequestToggleLaunchViewIsOpen();

            await Task.Delay(500);

            if (!logView.IsNew && LogViewToOpenDocumentIn == null)
            {
                OpenableObjectService.SaveOpenableObject(logView);
            }

            var tasks = new List <Task <ServiceOperationResult> >();

            foreach (var logFilePath in logView.LogFilePaths)
            {
                var logFile = LogFilesSourceCache.Lookup(logFilePath);
                if (logFile.HasValue)
                {
                    logFile.Value.Open();
                    OpenableObjectService.SaveOpenableObject(logFile.Value);
                    tasks.Add(LogFileService.LoadLogEntriesIntoSourceCacheAsync(logFile.Value, LogEntriesSourceCache));
                }
            }

            foreach (var databaseName in logView.DatabaseNames)
            {
                var database = DatabasesSourceCache.Lookup(databaseName);
                if (database.HasValue)
                {
                    database.Value.Open();
                    OpenableObjectService.SaveOpenableObject(database.Value);
                    tasks.Add(DatabaseService.LoadLogEntriesIntoSourceCache(database.Value, LogEntriesSourceCache));
                }
            }

            var results = await Task.WhenAll(tasks);

            var failedLogFilesString  = string.Empty;
            var failedDatabasesString = string.Empty;
            var errorMessage          = string.Empty;
            await Task.Run(() =>
            {
                for (int i = 0; i < results.Length - logView.DatabaseNames.Count; i++)
                {
                    var result = results[i];
                    if (result.OperationFailed && logView.LogFilePaths.Count > i)
                    {
                        failedLogFilesString += logView.LogFilePaths[i] + "," + Environment.NewLine;
                    }
                }
                if (failedLogFilesString.Length > 2)
                {
                    failedLogFilesString = failedLogFilesString.Substring(0, failedLogFilesString.Length - 3);
                }

                for (int i = logView.LogFilePaths.Count; i < results.Length; i++)
                {
                    var result = results[i];
                    if (result.OperationFailed)
                    {
                        failedDatabasesString += logView.DatabaseNames[i - logView.LogFilePaths.Count] + "," + Environment.NewLine;
                    }
                }
                if (failedDatabasesString.Length > 2)
                {
                    failedDatabasesString = failedDatabasesString.Substring(0, failedDatabasesString.Length - 3);
                }

                if (!string.IsNullOrWhiteSpace(failedLogFilesString))
                {
                    errorMessage += $"Failed to load log entries for the following log files:{Environment.NewLine + failedLogFilesString}";
                    if (!string.IsNullOrWhiteSpace(failedDatabasesString))
                    {
                        errorMessage += $"{Environment.NewLine + Environment.NewLine}Failed to load log entries for the following databases:{Environment.NewLine + failedDatabasesString}";
                    }
                }
                else if (!string.IsNullOrWhiteSpace(failedDatabasesString))
                {
                    errorMessage += $"Failed to load log entries for the following databases:{Environment.NewLine + failedDatabasesString}";
                }
            });

            if (!string.IsNullOrWhiteSpace(errorMessage))
            {
                //TODO: I'm getting this summary error message and individual error messages. Have to disable the error message for each individual log source.
                await DialogCoordinator.ShowMessageAsync(this, "Failed to Load Log Entries", errorMessage);
            }

            //Notify the LogViewManagementViewModel that the AutoRefreshSetting changed so that it can tell databases and log files
            Mediator.NotifyColleagues(MediatorMessages.AutoRefreshSettingChanged, logView.Settings.AutoRefresh);

            logView.IsLoading = false;
        }
Exemplo n.º 6
0
        private void InitializeBindings()
        {
            #region Log views
            var logViewsSharedSource = LogViewsSourceCache.Connect();
            logViewsSharedSource
            .AutoRefresh(l => l.DateLastOpened)
            .Sort(SortExpressionComparer <LogView> .Descending(l => l.DateLastOpened))
            .ObserveOnDispatcher()
            .Bind(out var logViews)
            .Subscribe();
            logViewsSharedSource
            .AutoRefresh(l => l.DateLastOpened)
            .Sort(SortExpressionComparer <LogView> .Descending(l => l.DateLastOpened))
            .Top(_numberInRecents)
            .ObserveOnDispatcher()
            .Bind(out var recentlyUsedLogViews)
            .Subscribe();
            logViewsSharedSource
            .AutoRefresh(l => l.DateLastOpened)
            .AutoRefresh(l => l.IsPinned)
            .Filter(l => l.IsPinned)
            .Sort(SortExpressionComparer <LogView> .Descending(l => l.DateLastOpened))
            .ObserveOnDispatcher()
            .Bind(out var pinnedLogViews)
            .Subscribe();

            LogViews             = logViews;
            RecentlyUsedLogViews = recentlyUsedLogViews;
            PinnedLogViews       = pinnedLogViews;
            #endregion

            #region Log files
            var logFilesSharedSource = LogFilesSourceCache.Connect();

            logFilesSharedSource
            .AutoRefresh(l => l.DateLastOpened)
            .Sort(SortExpressionComparer <LogFile> .Descending(l => l.DateLastOpened))
            .ObserveOnDispatcher()
            .Bind(out var allLogFiles)
            .Subscribe();
            logFilesSharedSource
            .AutoRefresh(l => l.DateLastOpened)
            .Sort(SortExpressionComparer <LogFile> .Descending(l => l.DateLastOpened))
            .Top(_numberInRecents)
            .ObserveOnDispatcher()
            .Bind(out var recentlyUsedLogFiles)
            .Subscribe();
            logFilesSharedSource
            .AutoRefresh(l => l.IsPinned)
            .AutoRefresh(l => l.DateLastOpened)
            .Filter(l => l.IsPinned)
            .Sort(SortExpressionComparer <LogFile> .Descending(l => l.DateLastOpened))
            .ObserveOnDispatcher()
            .Bind(out var pinnedLogFiles)
            .Subscribe();

            LogFiles             = allLogFiles;
            RecentlyUsedLogFiles = recentlyUsedLogFiles;
            PinnedLogFiles       = pinnedLogFiles;
            #endregion

            #region Databases
            var databasesSharedSource = DatabasesSourceCache.Connect();

            databasesSharedSource
            .ObserveOnDispatcher()
            .Bind(out var databases)
            .Subscribe();
            databasesSharedSource
            .AutoRefresh(d => d.DateLastOpened)
            .Sort(SortExpressionComparer <Database> .Descending(d => d.DateLastOpened))
            .Top(_numberInRecents)
            .ObserveOnDispatcher()
            .Bind(out var recentlyUsedDatabases)
            .Subscribe();
            databasesSharedSource
            .AutoRefresh(l => l.IsPinned)
            .AutoRefresh(d => d.DateLastOpened)
            .Filter(l => l.IsPinned)
            .Sort(SortExpressionComparer <Database> .Descending(d => d.DateLastOpened))
            .ObserveOnDispatcher()
            .Bind(out var pinnedDatabases)
            .Subscribe();

            Databases             = databases;
            RecentlyUsedDatabases = recentlyUsedDatabases;
            PinnedDatabases       = pinnedDatabases;
            #endregion

            #region Searchable openable objects
            //TODO: Right now if item added to source caches, this source cache won't see it. Maybe do a join?
            //TODO: Need to open search popup when user clicks on search box if there's text in the search box.
            AllOpenableObjectsSourceCache.AddOrUpdate(LogViewsSourceCache.Items);
            AllOpenableObjectsSourceCache.AddOrUpdate(LogFilesSourceCache.Items);
            AllOpenableObjectsSourceCache.AddOrUpdate(DatabasesSourceCache.Items);


            AllOpenableObjectsSourceCache.Connect()
            .AutoRefresh(d => SearchTerm)
            .Filter(o => string.IsNullOrEmpty(SearchTerm) || o.Identifier.ToLower().Contains(SearchTerm.ToLower()))
            .ObserveOnDispatcher()
            .Bind(out var searchableOpenableObjects)
            .Subscribe();
            SearchableOpenableObjects = searchableOpenableObjects;
            #endregion
        }