From b46c4b438182e43fc13350b27eae538cc1bdec09 Mon Sep 17 00:00:00 2001 From: Kate Shin Date: Thu, 28 Sep 2017 13:02:57 -0700 Subject: [PATCH] Fix issues in file browser service (#469) * fix file browser service bug * modify filebrowser service * change filebrowser contract * fix contract * fix file browser add/expand event contracts * remove commented code --- ....cs => FileBrowserExpandedNotification.cs} | 13 ++++++++---- ...on.cs => FileBrowserOpenedNotification.cs} | 13 ++++++++---- ...cs => FileBrowserValidatedNotification.cs} | 8 ++++---- .../FileBrowser/Contracts/FileTreeNode.cs | 6 ------ .../FileBrowser/FileBrowserService.cs | 20 +++++++++++++------ .../HostLoader.cs | 6 +++++- .../DisasterRecovery/BackupServiceTests.cs | 14 +++++++------ .../FileBrowser/FileBrowserServiceTests.cs | 8 ++++---- 8 files changed, 53 insertions(+), 35 deletions(-) rename src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/{FileBrowserExpandCompleteNotification.cs => FileBrowserExpandedNotification.cs} (70%) rename src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/{FileBrowserOpenCompleteNotification.cs => FileBrowserOpenedNotification.cs} (73%) rename src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/{FileBrowserValidateCompleteNotification.cs => FileBrowserValidatedNotification.cs} (73%) diff --git a/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileBrowserExpandCompleteNotification.cs b/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileBrowserExpandedNotification.cs similarity index 70% rename from src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileBrowserExpandCompleteNotification.cs rename to src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileBrowserExpandedNotification.cs index ce246831..b59cae53 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileBrowserExpandCompleteNotification.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileBrowserExpandedNotification.cs @@ -9,8 +9,13 @@ namespace Microsoft.SqlTools.ServiceLayer.FileBrowser.Contracts /// /// Event params for expanding a node /// - public class FileBrowserExpandCompleteParams + public class FileBrowserExpandedParams { + /// + /// Connection uri + /// + public string OwnerUri; + /// /// Expanded node /// @@ -30,11 +35,11 @@ namespace Microsoft.SqlTools.ServiceLayer.FileBrowser.Contracts /// /// Notification for expand completion /// - public class FileBrowserExpandCompleteNotification + public class FileBrowserExpandedNotification { public static readonly - EventType Type = - EventType.Create("filebrowser/expandcomplete"); + EventType Type = + EventType.Create("filebrowser/expandcomplete"); } } \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileBrowserOpenCompleteNotification.cs b/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileBrowserOpenedNotification.cs similarity index 73% rename from src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileBrowserOpenCompleteNotification.cs rename to src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileBrowserOpenedNotification.cs index 39854c1d..aa3c9d4e 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileBrowserOpenCompleteNotification.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileBrowserOpenedNotification.cs @@ -11,8 +11,13 @@ namespace Microsoft.SqlTools.ServiceLayer.FileBrowser.Contracts /// Event params for opening a file browser /// Returns full directory structure on the server side /// - public class FileBrowserOpenCompleteParams + public class FileBrowserOpenedParams { + /// + /// Connection uri + /// + public string OwnerUri; + /// /// Entire file/folder tree /// @@ -32,11 +37,11 @@ namespace Microsoft.SqlTools.ServiceLayer.FileBrowser.Contracts /// /// Notification for completing file browser opening /// - public class FileBrowserOpenCompleteNotification + public class FileBrowserOpenedNotification { public static readonly - EventType Type = - EventType.Create("filebrowser/opencomplete"); + EventType Type = + EventType.Create("filebrowser/opencomplete"); } } diff --git a/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileBrowserValidateCompleteNotification.cs b/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileBrowserValidatedNotification.cs similarity index 73% rename from src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileBrowserValidateCompleteNotification.cs rename to src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileBrowserValidatedNotification.cs index 2e23cf43..e16261e0 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileBrowserValidateCompleteNotification.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileBrowserValidatedNotification.cs @@ -9,7 +9,7 @@ namespace Microsoft.SqlTools.ServiceLayer.FileBrowser.Contracts /// /// Event params for validation completion /// - public class FileBrowserValidateCompleteParams + public class FileBrowserValidatedParams { /// /// Result of the operation @@ -25,11 +25,11 @@ namespace Microsoft.SqlTools.ServiceLayer.FileBrowser.Contracts /// /// Notification for validation completion /// - public class FileBrowserValidateCompleteNotification + public class FileBrowserValidatedNotification { public static readonly - EventType Type = - EventType.Create("filebrowser/validatecomplete"); + EventType Type = + EventType.Create("filebrowser/validatecomplete"); } } diff --git a/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileTreeNode.cs b/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileTreeNode.cs index da0d78d6..1ea2c5be 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileTreeNode.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileTreeNode.cs @@ -20,11 +20,6 @@ namespace Microsoft.SqlTools.ServiceLayer.FileBrowser.Contracts this.Children = new List(); } - /// - /// Parent node - /// - public FileTreeNode Parent { get; private set; } - /// /// List of children nodes /// @@ -48,7 +43,6 @@ namespace Microsoft.SqlTools.ServiceLayer.FileBrowser.Contracts public void AddChildNode(FileTreeNode item) { - item.Parent = this; this.Children.Add(item); } } diff --git a/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/FileBrowserService.cs b/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/FileBrowserService.cs index d914db17..e9107dcb 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/FileBrowserService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/FileBrowserService.cs @@ -175,7 +175,7 @@ namespace Microsoft.SqlTools.ServiceLayer.FileBrowser internal async Task RunFileBrowserOpenTask(FileBrowserOpenParams fileBrowserParams) { - FileBrowserOpenCompleteParams result = new FileBrowserOpenCompleteParams(); + FileBrowserOpenedParams result = new FileBrowserOpenedParams(); try { @@ -197,7 +197,14 @@ namespace Microsoft.SqlTools.ServiceLayer.FileBrowser { FileBrowserOperation browser = new FileBrowserOperation(conn, fileBrowserParams.ExpandPath, fileBrowserParams.FileFilters); browser.PopulateFileTree(); + + if (this.ownerToFileBrowserMap.ContainsKey(fileBrowserParams.OwnerUri)) + { + this.ownerToFileBrowserMap.Remove(fileBrowserParams.OwnerUri); + } this.ownerToFileBrowserMap.Add(fileBrowserParams.OwnerUri, browser); + + result.OwnerUri = fileBrowserParams.OwnerUri; result.FileTree = browser.FileTree; result.Succeeded = true; } @@ -212,18 +219,19 @@ namespace Microsoft.SqlTools.ServiceLayer.FileBrowser result.Message = ex.Message; } - await ServiceHost.SendEvent(FileBrowserOpenCompleteNotification.Type, result); + await ServiceHost.SendEvent(FileBrowserOpenedNotification.Type, result); } internal async Task RunFileBrowserExpandTask(FileBrowserExpandParams fileBrowserParams) { - FileBrowserExpandCompleteParams result = new FileBrowserExpandCompleteParams(); + FileBrowserExpandedParams result = new FileBrowserExpandedParams(); try { if (this.ownerToFileBrowserMap.ContainsKey(fileBrowserParams.OwnerUri)) { FileBrowserOperation browser = this.ownerToFileBrowserMap[fileBrowserParams.OwnerUri]; browser.ExpandSelectedNode(fileBrowserParams.ExpandPath); + result.OwnerUri = fileBrowserParams.OwnerUri; result.ExpandedNode = browser.FileTree.SelectedNode; result.Succeeded = true; } @@ -238,12 +246,12 @@ namespace Microsoft.SqlTools.ServiceLayer.FileBrowser result.Message = ex.Message; } - await ServiceHost.SendEvent(FileBrowserExpandCompleteNotification.Type, result); + await ServiceHost.SendEvent(FileBrowserExpandedNotification.Type, result); } internal async Task RunFileBrowserValidateTask(FileBrowserValidateParams fileBrowserParams) { - FileBrowserValidateCompleteParams result = new FileBrowserValidateCompleteParams(); + FileBrowserValidatedParams result = new FileBrowserValidatedParams(); try { @@ -276,7 +284,7 @@ namespace Microsoft.SqlTools.ServiceLayer.FileBrowser result.Message = ex.Message; } - await ServiceHost.SendEvent(FileBrowserValidateCompleteNotification.Type, result); + await ServiceHost.SendEvent(FileBrowserValidatedNotification.Type, result); } } } \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/HostLoader.cs b/src/Microsoft.SqlTools.ServiceLayer/HostLoader.cs index 945f2b80..ee4df1a1 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/HostLoader.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/HostLoader.cs @@ -12,6 +12,7 @@ using Microsoft.SqlTools.ServiceLayer.Admin; using Microsoft.SqlTools.ServiceLayer.Connection; using Microsoft.SqlTools.ServiceLayer.DisasterRecovery; using Microsoft.SqlTools.ServiceLayer.EditData; +using Microsoft.SqlTools.ServiceLayer.FileBrowser; using Microsoft.SqlTools.ServiceLayer.Hosting; using Microsoft.SqlTools.ServiceLayer.LanguageServices; using Microsoft.SqlTools.ServiceLayer.Metadata; @@ -95,8 +96,11 @@ namespace Microsoft.SqlTools.ServiceLayer DisasterRecoveryService.Instance.InitializeService(serviceHost); serviceProvider.RegisterSingleService(DisasterRecoveryService.Instance); + FileBrowserService.Instance.InitializeService(serviceHost); + serviceProvider.RegisterSingleService(FileBrowserService.Instance); + ProfilerService.Instance.InitializeService(serviceHost); - serviceProvider.RegisterSingleService(ProfilerService.Instance); + serviceProvider.RegisterSingleService(ProfilerService.Instance); InitializeHostedServices(serviceProvider, serviceHost); serviceHost.ServiceProvider = serviceProvider; diff --git a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/DisasterRecovery/BackupServiceTests.cs b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/DisasterRecovery/BackupServiceTests.cs index eab73614..a9a73e26 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/DisasterRecovery/BackupServiceTests.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/DisasterRecovery/BackupServiceTests.cs @@ -265,8 +265,8 @@ CREATE CERTIFICATE {1} WITH SUBJECT = 'Backup Encryption Certificate'; "; await service.RunFileBrowserOpenTask(openParams); // Verify complete notification event was fired and the result - serviceHostMock.Verify(x => x.SendEvent(FileBrowserOpenCompleteNotification.Type, - It.Is(p => p.Succeeded == true + serviceHostMock.Verify(x => x.SendEvent(FileBrowserOpenedNotification.Type, + It.Is(p => p.Succeeded == true && p.FileTree != null && p.FileTree.RootNode != null && p.FileTree.RootNode.Children != null @@ -286,9 +286,11 @@ CREATE CERTIFICATE {1} WITH SUBJECT = 'Backup Encryption Certificate'; "; await service.RunFileBrowserExpandTask(expandParams); // Verify result - serviceHostMock.Verify(x => x.SendEvent(FileBrowserExpandCompleteNotification.Type, - It.Is(p => p.Succeeded == true - && p.ExpandedNode.FullPath == backupConfigInfo.DefaultBackupFolder)), + serviceHostMock.Verify(x => x.SendEvent(FileBrowserExpandedNotification.Type, + It.Is(p => p.Succeeded == true + && p.ExpandedNode != null + && p.ExpandedNode.Children != null + && p.ExpandedNode.Children.Count > 0)), Times.Once()); var validateParams = new FileBrowserValidateParams @@ -302,7 +304,7 @@ CREATE CERTIFICATE {1} WITH SUBJECT = 'Backup Encryption Certificate'; "; await service.RunFileBrowserValidateTask(validateParams); // Verify complete notification event was fired and the result - serviceHostMock.Verify(x => x.SendEvent(FileBrowserValidateCompleteNotification.Type, It.Is(p => p.Succeeded == true)), Times.Once()); + serviceHostMock.Verify(x => x.SendEvent(FileBrowserValidatedNotification.Type, It.Is(p => p.Succeeded == true)), Times.Once()); // Remove the backup file if (File.Exists(backupPath)) diff --git a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/FileBrowser/FileBrowserServiceTests.cs b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/FileBrowser/FileBrowserServiceTests.cs index 4763bf77..30472166 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/FileBrowser/FileBrowserServiceTests.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/FileBrowser/FileBrowserServiceTests.cs @@ -115,8 +115,8 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.FileBrowser await service.RunFileBrowserOpenTask(openParams); // Verify complete notification event was fired and the result - serviceHostMock.Verify(x => x.SendEvent(FileBrowserOpenCompleteNotification.Type, - It.Is(p => p.Succeeded == true + serviceHostMock.Verify(x => x.SendEvent(FileBrowserOpenedNotification.Type, + It.Is(p => p.Succeeded == true && p.FileTree != null && p.FileTree.RootNode != null && p.FileTree.RootNode.Children != null @@ -145,7 +145,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.FileBrowser await service.RunFileBrowserValidateTask(validateParams); // Verify complete notification event was fired and the result - serviceHostMock.Verify(x => x.SendEvent(FileBrowserValidateCompleteNotification.Type, It.Is(p => p.Succeeded == true)), Times.Once()); + serviceHostMock.Verify(x => x.SendEvent(FileBrowserValidatedNotification.Type, It.Is(p => p.Succeeded == true)), Times.Once()); } [Fact] @@ -168,7 +168,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.FileBrowser await service.RunFileBrowserValidateTask(validateParams); // Verify complete notification event was fired and the result - serviceHostMock.Verify(x => x.SendEvent(FileBrowserValidateCompleteNotification.Type, It.Is(p => p.Succeeded == false)), Times.Once()); + serviceHostMock.Verify(x => x.SendEvent(FileBrowserValidatedNotification.Type, It.Is(p => p.Succeeded == false)), Times.Once()); } #region private methods