diff --git a/src/sql/common/constants.ts b/src/sql/base/common/errors.ts similarity index 56% rename from src/sql/common/constants.ts rename to src/sql/base/common/errors.ts index 39a0f26ed6..fa0bdd2003 100644 --- a/src/sql/common/constants.ts +++ b/src/sql/base/common/errors.ts @@ -3,16 +3,10 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -// localizable strings - -export const InvalidProvider = 'Provider is invalid'; - -/** - * Feature names - */ -export const RestoreFeatureName = 'restore'; -export const BackupFeatureName = 'backup'; - -export const MssqlProviderId = 'MSSQL'; -export const notebookModeId = 'notebook'; - +export function invalidProvider(name?: string): Error { + if (name) { + return new Error(`Invalid provider: ${name}`); + } else { + return new Error('Invalid provider'); + } +} diff --git a/src/sql/parts/common/customInputConverter.ts b/src/sql/parts/common/customInputConverter.ts index 85e7c1053e..087fc343c7 100644 --- a/src/sql/parts/common/customInputConverter.ts +++ b/src/sql/parts/common/customInputConverter.ts @@ -15,7 +15,6 @@ import { QueryPlanInput } from 'sql/parts/queryPlan/queryPlanInput'; import { NotebookInput } from 'sql/workbench/parts/notebook/notebookInput'; import { INotebookService } from 'sql/workbench/services/notebook/common/notebookService'; import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; -import { notebookModeId } from 'sql/common/constants'; import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput'; const fs = require('fs'); @@ -27,6 +26,7 @@ export const untitledFilePrefix = 'SQLQuery'; // mode identifier for SQL mode export const sqlModeId = 'sql'; +export const notebookModeId = 'notebook'; /** * Checks if the specified input is supported by one our custom input types, and if so convert it diff --git a/src/sql/parts/connection/connectionDialog/advancedPropertiesController.ts b/src/sql/parts/connection/connectionDialog/advancedPropertiesController.ts index c0ea96a7b6..32efc89e35 100644 --- a/src/sql/parts/connection/connectionDialog/advancedPropertiesController.ts +++ b/src/sql/parts/connection/connectionDialog/advancedPropertiesController.ts @@ -10,7 +10,7 @@ import { OptionsDialog } from 'sql/workbench/browser/modal/optionsDialog'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import * as azdata from 'azdata'; import { localize } from 'vs/nls'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; export class AdvancedPropertiesController { private _advancedDialog: OptionsDialog; @@ -61,4 +61,4 @@ export class AdvancedPropertiesController { isArray: undefined, }; } -} \ No newline at end of file +} diff --git a/src/sql/parts/disasterRecovery/backup/backupDialog.ts b/src/sql/parts/disasterRecovery/backup/backupDialog.ts index 756b2b2793..e0693deed9 100644 --- a/src/sql/parts/disasterRecovery/backup/backupDialog.ts +++ b/src/sql/parts/disasterRecovery/backup/backupDialog.ts @@ -8,7 +8,7 @@ import { IConnectionProfile } from 'sql/platform/connection/common/interfaces'; import { BackupModule } from 'sql/parts/disasterRecovery/backup/backup.module'; import { BACKUP_SELECTOR } from 'sql/parts/disasterRecovery/backup/backup.component'; import { attachModalDialogStyler } from 'sql/platform/theme/common/styler'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; diff --git a/src/sql/parts/disasterRecovery/restore/restoreDialog.ts b/src/sql/parts/disasterRecovery/restore/restoreDialog.ts index b31e4b27ee..d535a0a1eb 100644 --- a/src/sql/parts/disasterRecovery/restore/restoreDialog.ts +++ b/src/sql/parts/disasterRecovery/restore/restoreDialog.ts @@ -33,7 +33,7 @@ import { TableDataView } from 'sql/base/browser/ui/table/tableDataView'; import * as DialogHelper from 'sql/workbench/browser/modal/dialogHelper'; import { Modal } from 'sql/workbench/browser/modal/modal'; import { attachButtonStyler, attachModalDialogStyler, attachTableStyler, attachInputBoxStyler, attachSelectBoxStyler, attachEditableDropdownStyler, attachCheckboxStyler } from 'sql/platform/theme/common/styler'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; import * as BackupConstants from 'sql/parts/disasterRecovery/backup/constants'; import { RestoreViewModel, RestoreOptionParam, SouceDatabaseNamesParam } from 'sql/parts/disasterRecovery/restore/restoreViewModel'; import * as FileValidationConstants from 'sql/workbench/services/fileBrowser/common/fileValidationServiceConstants'; diff --git a/src/sql/parts/jobManagement/views/jobHistory.component.ts b/src/sql/parts/jobManagement/views/jobHistory.component.ts index 41665d6d42..4d421e4247 100644 --- a/src/sql/parts/jobManagement/views/jobHistory.component.ts +++ b/src/sql/parts/jobManagement/views/jobHistory.component.ts @@ -33,7 +33,7 @@ import { TabChild } from 'sql/base/browser/ui/panel/tab.component'; import { IDashboardService } from 'sql/platform/dashboard/browser/dashboardService'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; export const DASHBOARD_SELECTOR: string = 'jobhistory-component'; diff --git a/src/sql/parts/jobManagement/views/jobStepsView.component.ts b/src/sql/parts/jobManagement/views/jobStepsView.component.ts index 79665cf541..2a12541a37 100644 --- a/src/sql/parts/jobManagement/views/jobStepsView.component.ts +++ b/src/sql/parts/jobManagement/views/jobStepsView.component.ts @@ -24,7 +24,7 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { TabChild } from 'sql/base/browser/ui/panel/tab.component'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; export const JOBSTEPSVIEW_SELECTOR: string = 'jobstepsview-component'; diff --git a/src/sql/parts/jobManagement/views/jobsView.component.ts b/src/sql/parts/jobManagement/views/jobsView.component.ts index 8686d87375..24507a1284 100644 --- a/src/sql/parts/jobManagement/views/jobsView.component.ts +++ b/src/sql/parts/jobManagement/views/jobsView.component.ts @@ -37,7 +37,7 @@ import { escape } from 'sql/base/common/strings'; import { IWorkbenchThemeService, IColorTheme } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { tableBackground, cellBackground, cellBorderColor } from 'sql/platform/theme/common/colors'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; export const JOBSVIEW_SELECTOR: string = 'jobsview-component'; export const ROW_HEIGHT: number = 45; diff --git a/src/sql/parts/objectExplorer/serverGroupDialog/serverGroupDialog.ts b/src/sql/parts/objectExplorer/serverGroupDialog/serverGroupDialog.ts index 779d4f411a..7e2ad5dc7c 100644 --- a/src/sql/parts/objectExplorer/serverGroupDialog/serverGroupDialog.ts +++ b/src/sql/parts/objectExplorer/serverGroupDialog/serverGroupDialog.ts @@ -24,7 +24,7 @@ import { Modal } from 'sql/workbench/browser/modal/modal'; import { InputBox } from 'sql/base/browser/ui/inputBox/inputBox'; import { ServerGroupViewModel } from 'sql/parts/objectExplorer/serverGroupDialog/serverGroupViewModel'; import { attachButtonStyler, attachModalDialogStyler } from 'sql/platform/theme/common/styler'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; import { IClipboardService } from 'sql/platform/clipboard/common/clipboardService'; export class ServerGroupDialog extends Modal { diff --git a/src/sql/parts/profiler/dialog/profilerColumnEditorDialog.ts b/src/sql/parts/profiler/dialog/profilerColumnEditorDialog.ts index 03da1f043a..ffb7da8bc3 100644 --- a/src/sql/parts/profiler/dialog/profilerColumnEditorDialog.ts +++ b/src/sql/parts/profiler/dialog/profilerColumnEditorDialog.ts @@ -8,7 +8,7 @@ import 'vs/css!sql/parts/profiler/media/profiler'; import { Modal } from 'sql/workbench/browser/modal/modal'; import { attachModalDialogStyler } from 'sql/platform/theme/common/styler'; import { ProfilerInput } from 'sql/parts/profiler/editor/profilerInput'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; import { IClipboardService } from 'sql/platform/clipboard/common/clipboardService'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; diff --git a/src/sql/parts/profiler/dialog/profilerFilterDialog.ts b/src/sql/parts/profiler/dialog/profilerFilterDialog.ts index f5f9ea75dc..489ad10345 100644 --- a/src/sql/parts/profiler/dialog/profilerFilterDialog.ts +++ b/src/sql/parts/profiler/dialog/profilerFilterDialog.ts @@ -7,7 +7,7 @@ import 'vs/css!sql/media/icons/common-icons'; import 'vs/css!./media/profilerFilterDialog'; import { Button } from 'sql/base/browser/ui/button/button'; import { Modal } from 'sql/workbench/browser/modal/modal'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; import { attachButtonStyler, attachModalDialogStyler, attachInputBoxStyler } from 'sql/platform/theme/common/styler'; import { KeyCode } from 'vs/base/common/keyCodes'; import { IThemeService } from 'vs/platform/theme/common/themeService'; diff --git a/src/sql/platform/accounts/browser/accountDialog.ts b/src/sql/platform/accounts/browser/accountDialog.ts index a31d28f09f..7446c8ddf2 100644 --- a/src/sql/platform/accounts/browser/accountDialog.ts +++ b/src/sql/platform/accounts/browser/accountDialog.ts @@ -32,7 +32,7 @@ import { AddAccountAction } from 'sql/platform/accounts/common/accountActions'; import { AccountListRenderer, AccountListDelegate } from 'sql/platform/accounts/browser/accountListRenderer'; import { AccountProviderAddedEventParams, UpdateAccountListEventParams } from 'sql/platform/accounts/common/eventTypes'; import { IClipboardService } from 'sql/platform/clipboard/common/clipboardService'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; class AccountPanel extends ViewletPanel { diff --git a/src/sql/platform/accounts/browser/autoOAuthDialog.ts b/src/sql/platform/accounts/browser/autoOAuthDialog.ts index 67e6bd54e5..7cd71d54d8 100644 --- a/src/sql/platform/accounts/browser/autoOAuthDialog.ts +++ b/src/sql/platform/accounts/browser/autoOAuthDialog.ts @@ -19,7 +19,7 @@ import { Modal } from 'sql/workbench/browser/modal/modal'; import { InputBox } from 'sql/base/browser/ui/inputBox/inputBox'; import { attachModalDialogStyler, attachButtonStyler } from 'sql/platform/theme/common/styler'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; diff --git a/src/sql/platform/accounts/browser/firewallRuleDialog.ts b/src/sql/platform/accounts/browser/firewallRuleDialog.ts index 2ab3eb7f3e..472bb336aa 100644 --- a/src/sql/platform/accounts/browser/firewallRuleDialog.ts +++ b/src/sql/platform/accounts/browser/firewallRuleDialog.ts @@ -27,7 +27,7 @@ import { FirewallRuleViewModel } from 'sql/platform/accounts/common/firewallRule import { attachModalDialogStyler, attachButtonStyler } from 'sql/platform/theme/common/styler'; import { InputBox } from 'sql/base/browser/ui/inputBox/inputBox'; import { IAccountPickerService } from 'sql/platform/accounts/common/accountPicker'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; // TODO: Make the help link 1) extensible (01/08/2018, https://github.com/Microsoft/azuredatastudio/issues/450) // in case that other non-Azure sign in is to be used diff --git a/src/sql/platform/backup/common/backupServiceImp.ts b/src/sql/platform/backup/common/backupServiceImp.ts index 9528a44580..8c65c42fd5 100644 --- a/src/sql/platform/backup/common/backupServiceImp.ts +++ b/src/sql/platform/backup/common/backupServiceImp.ts @@ -3,14 +3,13 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; import { IConnectionManagementService } from 'sql/platform/connection/common/connectionManagement'; import * as azdata from 'azdata'; -import * as Constants from 'sql/common/constants'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; -import * as TelemetryUtils from 'sql/common/telemetryUtilities'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; +import * as TelemetryUtils from 'sql/platform/telemetry/telemetryUtilities'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IBackupService, TaskExecutionMode } from 'sql/platform/backup/common/backupService'; +import { invalidProvider } from 'sql/base/common/errors'; export class BackupService implements IBackupService { @@ -42,7 +41,7 @@ export class BackupService implements IBackupService { */ public backup(connectionUri: string, backupInfo: { [key: string]: any }, taskExecutionMode: TaskExecutionMode): Thenable { return new Promise((resolve, reject) => { - let providerResult = this.getProvider(connectionUri); + const providerResult = this.getProvider(connectionUri); if (providerResult) { TelemetryUtils.addTelemetry(this._telemetryService, TelemetryKeys.BackupCreated, { provider: providerResult.providerName }); providerResult.provider.backup(connectionUri, backupInfo, taskExecutionMode).then(result => { @@ -51,7 +50,7 @@ export class BackupService implements IBackupService { reject(error); }); } else { - reject(Constants.InvalidProvider); + reject(invalidProvider()); } }); } diff --git a/src/sql/platform/capabilities/common/capabilitiesService.ts b/src/sql/platform/capabilities/common/capabilitiesService.ts index 4683212bb0..577d902161 100644 --- a/src/sql/platform/capabilities/common/capabilitiesService.ts +++ b/src/sql/platform/capabilities/common/capabilitiesService.ts @@ -3,40 +3,19 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { ConnectionManagementInfo } from 'sql/platform/connection/common/connectionManagementInfo'; -import * as Constants from 'sql/common/constants'; -import { ConnectionProviderProperties, IConnectionProviderRegistry, Extensions as ConnectionExtensions } from 'sql/workbench/parts/connection/common/connectionProviderExtension'; -import { toObject } from 'sql/base/common/map'; +import { ConnectionProviderProperties } from 'sql/workbench/parts/connection/common/connectionProviderExtension'; import * as azdata from 'sqlops'; -import { Event, Emitter } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { IAction } from 'vs/base/common/actions'; -import { Memento } from 'vs/workbench/common/memento'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; -import { Registry } from 'vs/platform/registry/common/platform'; -import { IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; -import { entries } from 'sql/base/common/objects'; export const SERVICE_ID = 'capabilitiesService'; export const HOST_NAME = 'azdata'; export const HOST_VERSION = '1.0'; -const connectionRegistry = Registry.as(ConnectionExtensions.ConnectionProviderContributions); - -interface ConnectionCache { - [id: string]: ConnectionProviderProperties; -} - -interface CapabilitiesMomento { - connectionProviderCache: ConnectionCache; -} - export const clientCapabilities = { hostName: HOST_NAME, hostVersion: HOST_VERSION @@ -86,161 +65,3 @@ export interface ICapabilitiesService { readonly providers: { [id: string]: ProviderFeatures }; } - -/** - * Capabilities service implementation class. This class provides the ability - * to discover the DMP capabilties that a DMP provider offers. - */ -export class CapabilitiesService extends Disposable implements ICapabilitiesService { - _serviceBrand: any; - - private _momento: Memento; - private _providers = new Map(); - private _featureUpdateEvents = new Map>(); - private _legacyProviders = new Map(); - - private _onCapabilitiesRegistered = this._register(new Emitter()); - public readonly onCapabilitiesRegistered = this._onCapabilitiesRegistered.event; - - constructor( - @IStorageService private _storageService: IStorageService, - @IExtensionService extensionService: IExtensionService, - @IExtensionManagementService extentionManagementService: IExtensionManagementService - ) { - super(); - - this._momento = new Memento('capabilities', this._storageService); - - if (!this.capabilities.connectionProviderCache) { - this.capabilities.connectionProviderCache = {}; - } - - // handle in case some extensions have already registered (unlikley) - entries(connectionRegistry.providers).map(v => { - this.handleConnectionProvider({ id: v[0], properties: v[1] }); - }); - // register for when new extensions are added - this._register(connectionRegistry.onNewProvider(this.handleConnectionProvider, this)); - - // handle adding already known capabilities (could have caching problems) - entries(this.capabilities.connectionProviderCache).map(v => { - this.handleConnectionProvider({ id: v[0], properties: v[1] }, false); - }); - - extensionService.whenInstalledExtensionsRegistered().then(() => { - this.cleanupProviders(); - }); - - _storageService.onWillSaveState(() => this.shutdown()); - - this._register(extentionManagementService.onDidUninstallExtension(({ identifier }) => { - const connectionProvider = 'connectionProvider'; - extensionService.getExtensions().then(i => { - let extension = i.find(c => c.identifier.value.toLowerCase() === identifier.id.toLowerCase()); - if (extension && extension.contributes - && extension.contributes[connectionProvider] - && extension.contributes[connectionProvider].providerId) { - let id = extension.contributes[connectionProvider].providerId; - delete this.capabilities.connectionProviderCache[id]; - } - }); - })); - } - - private cleanupProviders(): void { - let knownProviders = Object.keys(connectionRegistry.providers); - for (let key in this.capabilities.connectionProviderCache) { - if (!knownProviders.includes(key)) { - this._providers.delete(key); - delete this.capabilities.connectionProviderCache[key]; - } - } - } - - private handleConnectionProvider(e: { id: string, properties: ConnectionProviderProperties }, isNew = true): void { - - let provider = this._providers.get(e.id); - if (provider) { - provider.connection = e.properties; - } else { - provider = { - connection: e.properties - }; - this._providers.set(e.id, provider); - } - if (!this._featureUpdateEvents.has(e.id)) { - this._featureUpdateEvents.set(e.id, new Emitter()); - } - - if (isNew) { - this.capabilities.connectionProviderCache[e.id] = e.properties; - this._onCapabilitiesRegistered.fire(provider); - } - } - - /** - * Retrieve a list of registered server capabilities - */ - public getCapabilities(provider: string): ProviderFeatures { - return this._providers.get(provider); - } - - public getLegacyCapabilities(provider: string): azdata.DataProtocolServerCapabilities { - return this._legacyProviders.get(provider); - } - - public get providers(): { [id: string]: ProviderFeatures } { - return toObject(this._providers); - } - - private get capabilities(): CapabilitiesMomento { - return this._momento.getMemento(StorageScope.GLOBAL) as CapabilitiesMomento; - } - - /** - * Register the capabilities provider and query the provider for its capabilities - * @param provider - */ - public registerProvider(provider: azdata.CapabilitiesProvider): void { - // request the capabilities from server - provider.getServerCapabilities(clientCapabilities).then(serverCapabilities => { - this._legacyProviders.set(serverCapabilities.providerName, serverCapabilities); - }); - } - - /** - * Returns true if the feature is available for given connection - * @param featureComponent a component which should have the feature name - * @param connectionManagementInfo connectionManagementInfo - */ - public isFeatureAvailable(action: IAction, connectionManagementInfo: ConnectionManagementInfo): boolean { - let isCloud = connectionManagementInfo && connectionManagementInfo.serverInfo && connectionManagementInfo.serverInfo.isCloud; - let isMssql = connectionManagementInfo.connectionProfile.providerName === 'MSSQL'; - // TODO: The logic should from capabilities service. - if (action) { - let featureName: string = action.id; - switch (featureName) { - case Constants.BackupFeatureName: - if (isMssql) { - return connectionManagementInfo.connectionProfile.databaseName && !isCloud; - } else { - return !!connectionManagementInfo.connectionProfile.databaseName; - } - case Constants.RestoreFeatureName: - if (isMssql) { - return !isCloud; - } else { - return !!connectionManagementInfo.connectionProfile.databaseName; - } - default: - return true; - } - } else { - return true; - } - } - - private shutdown(): void { - this._momento.saveMemento(); - } -} diff --git a/src/sql/platform/capabilities/common/capabilitiesServiceImpl.ts b/src/sql/platform/capabilities/common/capabilitiesServiceImpl.ts new file mode 100644 index 0000000000..c70831a34d --- /dev/null +++ b/src/sql/platform/capabilities/common/capabilitiesServiceImpl.ts @@ -0,0 +1,190 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; +import { Memento } from 'vs/workbench/common/memento'; +import { Emitter } from 'vs/base/common/event'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { IAction } from 'vs/base/common/actions'; + +import * as azdata from 'azdata'; + +import { entries } from 'sql/base/common/objects'; +import { RestoreFeatureName, BackupFeatureName } from 'sql/workbench/common/actions'; +import { toObject } from 'sql/base/common/map'; +import { ConnectionProviderProperties, IConnectionProviderRegistry, Extensions as ConnectionExtensions } from 'sql/workbench/parts/connection/common/connectionProviderExtension'; +import { ICapabilitiesService, ProviderFeatures, clientCapabilities } from 'sql/platform/capabilities/common/capabilitiesService'; +import { ConnectionManagementInfo } from 'sql/platform/connection/common/connectionManagementInfo'; + +const connectionRegistry = Registry.as(ConnectionExtensions.ConnectionProviderContributions); + +interface ConnectionCache { + [id: string]: ConnectionProviderProperties; +} + +interface CapabilitiesMomento { + connectionProviderCache: ConnectionCache; +} + +/** + * Capabilities service implementation class. This class provides the ability + * to discover the DMP capabilties that a DMP provider offers. + */ +export class CapabilitiesService extends Disposable implements ICapabilitiesService { + _serviceBrand: any; + + private _momento: Memento; + private _providers = new Map(); + private _featureUpdateEvents = new Map>(); + private _legacyProviders = new Map(); + + private _onCapabilitiesRegistered = this._register(new Emitter()); + public readonly onCapabilitiesRegistered = this._onCapabilitiesRegistered.event; + + constructor( + @IStorageService private _storageService: IStorageService, + @IExtensionService extensionService: IExtensionService, + @IExtensionManagementService extentionManagementService: IExtensionManagementService + ) { + super(); + + this._momento = new Memento('capabilities', this._storageService); + + if (!this.capabilities.connectionProviderCache) { + this.capabilities.connectionProviderCache = {}; + } + + // handle in case some extensions have already registered (unlikley) + entries(connectionRegistry.providers).map(v => { + this.handleConnectionProvider({ id: v[0], properties: v[1] }); + }); + // register for when new extensions are added + this._register(connectionRegistry.onNewProvider(this.handleConnectionProvider, this)); + + // handle adding already known capabilities (could have caching problems) + entries(this.capabilities.connectionProviderCache).map(v => { + this.handleConnectionProvider({ id: v[0], properties: v[1] }, false); + }); + + extensionService.whenInstalledExtensionsRegistered().then(() => { + this.cleanupProviders(); + }); + + _storageService.onWillSaveState(() => this.shutdown()); + + this._register(extentionManagementService.onDidUninstallExtension(({ identifier }) => { + const connectionProvider = 'connectionProvider'; + extensionService.getExtensions().then(i => { + let extension = i.find(c => c.identifier.value.toLowerCase() === identifier.id.toLowerCase()); + if (extension && extension.contributes + && extension.contributes[connectionProvider] + && extension.contributes[connectionProvider].providerId) { + let id = extension.contributes[connectionProvider].providerId; + delete this.capabilities.connectionProviderCache[id]; + } + }); + })); + } + + private cleanupProviders(): void { + let knownProviders = Object.keys(connectionRegistry.providers); + for (let key in this.capabilities.connectionProviderCache) { + if (!knownProviders.includes(key)) { + this._providers.delete(key); + delete this.capabilities.connectionProviderCache[key]; + } + } + } + + private handleConnectionProvider(e: { id: string, properties: ConnectionProviderProperties }, isNew = true): void { + + let provider = this._providers.get(e.id); + if (provider) { + provider.connection = e.properties; + } else { + provider = { + connection: e.properties + }; + this._providers.set(e.id, provider); + } + if (!this._featureUpdateEvents.has(e.id)) { + this._featureUpdateEvents.set(e.id, new Emitter()); + } + + if (isNew) { + this.capabilities.connectionProviderCache[e.id] = e.properties; + this._onCapabilitiesRegistered.fire(provider); + } + } + + /** + * Retrieve a list of registered server capabilities + */ + public getCapabilities(provider: string): ProviderFeatures { + return this._providers.get(provider); + } + + public getLegacyCapabilities(provider: string): azdata.DataProtocolServerCapabilities { + return this._legacyProviders.get(provider); + } + + public get providers(): { [id: string]: ProviderFeatures } { + return toObject(this._providers); + } + + private get capabilities(): CapabilitiesMomento { + return this._momento.getMemento(StorageScope.GLOBAL) as CapabilitiesMomento; + } + + /** + * Register the capabilities provider and query the provider for its capabilities + * @param provider + */ + public registerProvider(provider: azdata.CapabilitiesProvider): void { + // request the capabilities from server + provider.getServerCapabilities(clientCapabilities).then(serverCapabilities => { + this._legacyProviders.set(serverCapabilities.providerName, serverCapabilities); + }); + } + + /** + * Returns true if the feature is available for given connection + * @param featureComponent a component which should have the feature name + * @param connectionManagementInfo connectionManagementInfo + */ + public isFeatureAvailable(action: IAction, connectionManagementInfo: ConnectionManagementInfo): boolean { + let isCloud = connectionManagementInfo && connectionManagementInfo.serverInfo && connectionManagementInfo.serverInfo.isCloud; + let isMssql = connectionManagementInfo.connectionProfile.providerName === 'MSSQL'; + // TODO: The logic should from capabilities service. + if (action) { + let featureName: string = action.id; + switch (featureName) { + case BackupFeatureName: + if (isMssql) { + return connectionManagementInfo.connectionProfile.databaseName && !isCloud; + } else { + return !!connectionManagementInfo.connectionProfile.databaseName; + } + case RestoreFeatureName: + if (isMssql) { + return !isCloud; + } else { + return !!connectionManagementInfo.connectionProfile.databaseName; + } + default: + return true; + } + } else { + return true; + } + } + + private shutdown(): void { + this._momento.saveMemento(); + } +} diff --git a/src/sql/platform/connection/common/connectionManagementService.ts b/src/sql/platform/connection/common/connectionManagementService.ts index 14a2c529dc..a8502872e6 100644 --- a/src/sql/platform/connection/common/connectionManagementService.ts +++ b/src/sql/platform/connection/common/connectionManagementService.ts @@ -23,8 +23,8 @@ import { ConnectionStatusManager } from 'sql/platform/connection/common/connecti import { DashboardInput } from 'sql/workbench/parts/dashboard/dashboardInput'; import { ConnectionGlobalStatus } from 'sql/parts/connection/common/connectionGlobalStatus'; import { ConnectionStatusbarItem } from 'sql/parts/connection/common/connectionStatus'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; -import * as TelemetryUtils from 'sql/common/telemetryUtilities'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; +import * as TelemetryUtils from 'sql/platform/telemetry/telemetryUtilities'; import { warn } from 'sql/base/common/log'; import { IResourceProviderService } from 'sql/workbench/services/resourceProvider/common/resourceProviderService'; import { IAngularEventingService, AngularEventType } from 'sql/platform/angularEventing/common/angularEventingService'; diff --git a/src/sql/platform/fileBrowser/common/fileBrowserService.ts b/src/sql/platform/fileBrowser/common/fileBrowserService.ts index 915a706d90..3692244f80 100644 --- a/src/sql/platform/fileBrowser/common/fileBrowserService.ts +++ b/src/sql/platform/fileBrowser/common/fileBrowserService.ts @@ -3,20 +3,18 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import * as azdata from 'azdata'; import { IConnectionManagementService } from 'sql/platform/connection/common/connectionManagement'; import { FileBrowserTree } from 'sql/workbench/services/fileBrowser/common/fileBrowserTree'; import { FileNode } from 'sql/workbench/services/fileBrowser/common/fileNode'; import { IFileBrowserService } from 'sql/platform/fileBrowser/common/interfaces'; -import * as Constants from 'sql/common/constants'; import { IErrorMessageService } from 'sql/platform/errorMessage/common/errorMessageService'; import { Event, Emitter } from 'vs/base/common/event'; import Severity from 'vs/base/common/severity'; import { localize } from 'vs/nls'; import * as strings from 'vs/base/common/strings'; +import { invalidProvider } from 'sql/base/common/errors'; export class FileBrowserService implements IFileBrowserService { public _serviceBrand: any; @@ -28,7 +26,7 @@ export class FileBrowserService implements IFileBrowserService { private _expandResolveMap: { [key: string]: any } = {}; static fileNodeId: number = 0; - constructor( @IConnectionManagementService private _connectionService: IConnectionManagementService, + constructor(@IConnectionManagementService private _connectionService: IConnectionManagementService, @IErrorMessageService private _errorMessageService: IErrorMessageService) { } @@ -50,7 +48,7 @@ export class FileBrowserService implements IFileBrowserService { public openFileBrowser(ownerUri: string, expandPath: string, fileFilters: string[], changeFilter: boolean): Thenable { return new Promise((resolve, reject) => { - let provider = this.getProvider(ownerUri); + const provider = this.getProvider(ownerUri); if (provider) { provider.openFileBrowser(ownerUri, expandPath, fileFilters, changeFilter).then(result => { resolve(result); @@ -58,7 +56,7 @@ export class FileBrowserService implements IFileBrowserService { reject(error); }); } else { - reject(Constants.InvalidProvider); + reject(invalidProvider()); } }); } @@ -83,7 +81,7 @@ export class FileBrowserService implements IFileBrowserService { this._pathToFileNodeMap[fileNode.fullPath] = fileNode; let self = this; return new Promise((resolve, reject) => { - let provider = this.getProvider(fileNode.ownerUri); + const provider = this.getProvider(fileNode.ownerUri); if (provider) { provider.expandFolderNode(fileNode.ownerUri, fileNode.fullPath).then(result => { var mapKey = self.generateResolveMapKey(fileNode.ownerUri, fileNode.fullPath); @@ -92,7 +90,7 @@ export class FileBrowserService implements IFileBrowserService { reject(error); }); } else { - reject(Constants.InvalidProvider); + reject(invalidProvider()); } }); } @@ -121,7 +119,7 @@ export class FileBrowserService implements IFileBrowserService { public validateFilePaths(ownerUri: string, serviceType: string, selectedFiles: string[]): Thenable { return new Promise((resolve, reject) => { - let provider = this.getProvider(ownerUri); + const provider = this.getProvider(ownerUri); if (provider) { provider.validateFilePaths(ownerUri, serviceType, selectedFiles).then(result => { resolve(result); @@ -129,7 +127,7 @@ export class FileBrowserService implements IFileBrowserService { reject(error); }); } else { - reject(Constants.InvalidProvider); + reject(invalidProvider()); } }); } diff --git a/src/sql/platform/jobManagement/common/jobActions.ts b/src/sql/platform/jobManagement/common/jobActions.ts index 10c8425f40..77fba9ca17 100644 --- a/src/sql/platform/jobManagement/common/jobActions.ts +++ b/src/sql/platform/jobManagement/common/jobActions.ts @@ -17,7 +17,7 @@ import { OperatorsViewComponent } from 'sql/parts/jobManagement/views/operatorsV import { ProxiesViewComponent } from 'sql/parts/jobManagement/views/proxiesView.component'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; import { IErrorMessageService } from 'sql/platform/errorMessage/common/errorMessageService'; import { JobManagementView } from 'sql/parts/jobManagement/views/jobManagementView'; @@ -104,7 +104,7 @@ export class RunJobAction extends Action { this.jobManagementService.jobAction(ownerUri, jobName, JobActions.Run).then(result => { if (result.success) { var startMsg = nls.localize('jobSuccessfullyStarted', ': The job was successfully started.'); - this.notificationService.info(jobName+startMsg); + this.notificationService.info(jobName + startMsg); refreshAction.run(context); resolve(true); } else { @@ -140,7 +140,7 @@ export class StopJobAction extends Action { if (result.success) { refreshAction.run(context); var stopMsg = nls.localize('jobSuccessfullyStopped', ': The job was successfully stopped.'); - this.notificationService.info(jobName+stopMsg); + this.notificationService.info(jobName + stopMsg); resolve(true); } else { this.errorMessageService.showDialog(Severity.Error, 'Error', result.errorMessage); @@ -532,7 +532,7 @@ export class DeleteProxyAction extends Action { if (!result || !result.success) { let errorMessage = nls.localize("jobaction.failedToDeleteProxy", "Could not delete proxy '{0}'.\nError: {1}", proxy.accountName, result.errorMessage ? result.errorMessage : 'Unknown error'); - self._errorMessageService.showDialog(Severity.Error, errorLabel, errorMessage); + self._errorMessageService.showDialog(Severity.Error, errorLabel, errorMessage); } else { let successMessage = nls.localize('jobaction.deletedProxy', 'The proxy was deleted successfully'); self._notificationService.info(successMessage); @@ -546,4 +546,4 @@ export class DeleteProxyAction extends Action { ); return Promise.resolve(true); } -} \ No newline at end of file +} diff --git a/src/sql/platform/query/common/queryManagement.ts b/src/sql/platform/query/common/queryManagement.ts index c6ebdafded..55a4f58e57 100644 --- a/src/sql/platform/query/common/queryManagement.ts +++ b/src/sql/platform/query/common/queryManagement.ts @@ -8,8 +8,8 @@ import { IConnectionManagementService } from 'sql/platform/connection/common/con import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IDisposable } from 'vs/base/common/lifecycle'; import * as azdata from 'azdata'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; -import * as TelemetryUtils from 'sql/common/telemetryUtilities'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; +import * as TelemetryUtils from 'sql/platform/telemetry/telemetryUtilities'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { Event, Emitter } from 'vs/base/common/event'; import { keys } from 'vs/base/common/map'; @@ -335,4 +335,4 @@ export class QueryManagementService implements IQueryManagementService { return runner.getEditRows(rowData); }); } -} \ No newline at end of file +} diff --git a/src/sql/platform/restore/common/restoreServiceImpl.ts b/src/sql/platform/restore/common/restoreServiceImpl.ts index ec2936bbee..397977e10d 100644 --- a/src/sql/platform/restore/common/restoreServiceImpl.ts +++ b/src/sql/platform/restore/common/restoreServiceImpl.ts @@ -3,7 +3,6 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import * as types from 'vs/base/common/types'; @@ -22,10 +21,10 @@ import * as Utils from 'sql/platform/connection/common/utils'; import { IObjectExplorerService } from 'sql/workbench/services/objectExplorer/common/objectExplorerService'; import { ITaskService } from 'sql/platform/taskHistory/common/taskService'; import { TaskStatus, TaskNode } from 'sql/parts/taskHistory/common/taskNode'; -import * as Constants from 'sql/common/constants'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; -import * as TelemetryUtils from 'sql/common/telemetryUtilities'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; +import * as TelemetryUtils from 'sql/platform/telemetry/telemetryUtilities'; import { IConnectionManagementService } from 'sql/platform/connection/common/connectionManagement'; +import { invalidProvider } from 'sql/base/common/errors'; export class RestoreService implements IRestoreService { @@ -43,7 +42,7 @@ export class RestoreService implements IRestoreService { */ getRestoreConfigInfo(connectionUri: string): Thenable { return new Promise((resolve, reject) => { - let providerResult = this.getProvider(connectionUri); + const providerResult = this.getProvider(connectionUri); if (providerResult) { providerResult.provider.getRestoreConfigInfo(connectionUri).then(result => { resolve(result); @@ -51,7 +50,7 @@ export class RestoreService implements IRestoreService { reject(error); }); } else { - reject(Constants.InvalidProvider); + reject(invalidProvider()); } }); } @@ -61,7 +60,7 @@ export class RestoreService implements IRestoreService { */ restore(connectionUri: string, restoreInfo: azdata.RestoreInfo): Thenable { return new Promise((resolve, reject) => { - let providerResult = this.getProvider(connectionUri); + const providerResult = this.getProvider(connectionUri); if (providerResult) { TelemetryUtils.addTelemetry(this._telemetryService, TelemetryKeys.RestoreRequested, { provider: providerResult.providerName }); providerResult.provider.restore(connectionUri, restoreInfo).then(result => { @@ -70,7 +69,7 @@ export class RestoreService implements IRestoreService { reject(error); }); } else { - reject(Constants.InvalidProvider); + reject(invalidProvider); } }); } @@ -89,7 +88,7 @@ export class RestoreService implements IRestoreService { */ getRestorePlan(connectionUri: string, restoreInfo: azdata.RestoreInfo): Thenable { return new Promise((resolve, reject) => { - let providerResult = this.getProvider(connectionUri); + const providerResult = this.getProvider(connectionUri); if (providerResult) { providerResult.provider.getRestorePlan(connectionUri, restoreInfo).then(result => { resolve(result); @@ -97,7 +96,7 @@ export class RestoreService implements IRestoreService { reject(error); }); } else { - reject(Constants.InvalidProvider); + reject(invalidProvider); } }); @@ -108,7 +107,7 @@ export class RestoreService implements IRestoreService { */ cancelRestorePlan(connectionUri: string, restoreInfo: azdata.RestoreInfo): Thenable { return new Promise((resolve, reject) => { - let providerResult = this.getProvider(connectionUri); + const providerResult = this.getProvider(connectionUri); if (providerResult) { providerResult.provider.cancelRestorePlan(connectionUri, restoreInfo).then(result => { resolve(result); @@ -116,7 +115,7 @@ export class RestoreService implements IRestoreService { reject(error); }); } else { - reject(Constants.InvalidProvider); + reject(invalidProvider); } }); diff --git a/src/sql/common/telemetryKeys.ts b/src/sql/platform/telemetry/telemetryKeys.ts similarity index 100% rename from src/sql/common/telemetryKeys.ts rename to src/sql/platform/telemetry/telemetryKeys.ts diff --git a/src/sql/common/telemetryUtilities.ts b/src/sql/platform/telemetry/telemetryUtilities.ts similarity index 100% rename from src/sql/common/telemetryUtilities.ts rename to src/sql/platform/telemetry/telemetryUtilities.ts diff --git a/src/sql/workbench/api/node/mainThreadNotebookDocumentsAndEditors.ts b/src/sql/workbench/api/node/mainThreadNotebookDocumentsAndEditors.ts index fb6522e5e6..41a1a04c2d 100644 --- a/src/sql/workbench/api/node/mainThreadNotebookDocumentsAndEditors.ts +++ b/src/sql/workbench/api/node/mainThreadNotebookDocumentsAndEditors.ts @@ -2,7 +2,6 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; import * as azdata from 'azdata'; import * as path from 'path'; @@ -29,12 +28,12 @@ import { ICellModel, NotebookContentChange, INotebookModel } from 'sql/workbench import { NotebookChangeType, CellTypes } from 'sql/workbench/parts/notebook/models/contracts'; import { ICapabilitiesService } from 'sql/platform/capabilities/common/capabilitiesService'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; -import { notebookModeId } from 'sql/common/constants'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { viewColumnToEditorGroup } from 'vs/workbench/api/common/shared/editor'; import { IConnectionManagementService } from 'sql/platform/connection/common/connectionManagement'; import { IObjectExplorerService } from 'sql/workbench/services/objectExplorer/common/objectExplorerService'; import { getCurrentGlobalConnection } from 'sql/workbench/common/taskUtilities'; +import { notebookModeId } from 'sql/parts/common/customInputConverter'; class MainThreadNotebookEditor extends Disposable { private _contentChangedEmitter = new Emitter(); diff --git a/src/sql/workbench/browser/modal/modal.ts b/src/sql/workbench/browser/modal/modal.ts index 1ab282c1dd..1085a6f7df 100644 --- a/src/sql/workbench/browser/modal/modal.ts +++ b/src/sql/workbench/browser/modal/modal.ts @@ -16,8 +16,8 @@ import { IContextKeyService, RawContextKey, IContextKey } from 'vs/platform/cont import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { Button } from 'sql/base/browser/ui/button/button'; -import * as TelemetryUtils from 'sql/common/telemetryUtilities'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; +import * as TelemetryUtils from 'sql/platform/telemetry/telemetryUtilities'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; import { localize } from 'vs/nls'; import { MessageLevel } from 'sql/workbench/api/common/sqlExtHostTypes'; import * as os from 'os'; diff --git a/src/sql/workbench/common/actions.ts b/src/sql/workbench/common/actions.ts index a0adf2d228..a655922648 100644 --- a/src/sql/workbench/common/actions.ts +++ b/src/sql/workbench/common/actions.ts @@ -12,7 +12,6 @@ import { IScriptingService } from 'sql/platform/scripting/common/scriptingServic import { IRestoreDialogController } from 'sql/platform/restore/common/restoreService'; import { IAngularEventingService, AngularEventType } from 'sql/platform/angularEventing/common/angularEventingService'; import { IInsightsDialogService } from 'sql/workbench/services/insights/common/insightsDialogService'; -import * as Constants from 'sql/common/constants'; import { Task } from 'sql/platform/tasks/common/tasks'; import { IObjectExplorerService } from 'sql/workbench/services/objectExplorer/common/objectExplorerService'; import { IErrorMessageService } from 'sql/platform/errorMessage/common/errorMessageService'; @@ -223,10 +222,12 @@ export class ScriptDeleteAction extends Action { } } +export const BackupFeatureName = 'backup'; + export class BackupAction extends Task { - public static readonly ID = Constants.BackupFeatureName; + public static readonly ID = BackupFeatureName; public static readonly LABEL = nls.localize('backupAction.backup', 'Backup'); - public static readonly ICON = Constants.BackupFeatureName; + public static readonly ICON = BackupFeatureName; constructor() { super({ @@ -257,10 +258,12 @@ export class BackupAction extends Task { } } +export const RestoreFeatureName = 'restore'; + export class RestoreAction extends Task { - public static readonly ID = Constants.RestoreFeatureName; + public static readonly ID = RestoreFeatureName; public static readonly LABEL = nls.localize('restoreAction.restore', 'Restore'); - public static readonly ICON = Constants.RestoreFeatureName; + public static readonly ICON = RestoreFeatureName; constructor() { super({ diff --git a/src/sql/workbench/parts/dashboard/dashboard.module.ts b/src/sql/workbench/parts/dashboard/dashboard.module.ts index 2b64b1f470..8fa5c1c889 100644 --- a/src/sql/workbench/parts/dashboard/dashboard.module.ts +++ b/src/sql/workbench/parts/dashboard/dashboard.module.ts @@ -20,8 +20,8 @@ import { Registry } from 'vs/platform/registry/common/platform'; /* Telemetry */ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import * as TelemetryUtils from 'sql/common/telemetryUtilities'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; +import * as TelemetryUtils from 'sql/platform/telemetry/telemetryUtilities'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; /* Services */ import { BreadcrumbService } from 'sql/workbench/parts/dashboard/services/breadcrumb.service'; diff --git a/src/sql/workbench/parts/dashboard/widgets/insights/views/charts/chartInsight.component.ts b/src/sql/workbench/parts/dashboard/widgets/insights/views/charts/chartInsight.component.ts index a21b96a3b7..ea12b525b6 100644 --- a/src/sql/workbench/parts/dashboard/widgets/insights/views/charts/chartInsight.component.ts +++ b/src/sql/workbench/parts/dashboard/widgets/insights/views/charts/chartInsight.component.ts @@ -6,8 +6,8 @@ import { Component, Input, Inject, ChangeDetectorRef, forwardRef, ElementRef, ViewChild } from '@angular/core'; import { BaseChartDirective } from 'ng2-charts'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; -import * as TelemetryUtils from 'sql/common/telemetryUtilities'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; +import * as TelemetryUtils from 'sql/platform/telemetry/telemetryUtilities'; import { IInsightsView, IInsightData } from 'sql/workbench/parts/dashboard/widgets/insights/interfaces'; import { memoize, unmemoize } from 'sql/base/common/decorators'; import { mixin } from 'sql/base/common/objects'; diff --git a/src/sql/workbench/parts/notebook/models/cell.ts b/src/sql/workbench/parts/notebook/models/cell.ts index bc7702cad1..a41db5e9a0 100644 --- a/src/sql/workbench/parts/notebook/models/cell.ts +++ b/src/sql/workbench/parts/notebook/models/cell.ts @@ -20,7 +20,6 @@ import { ICellModelOptions, IModelFactory, FutureInternal, CellExecutionState } import { IConnectionManagementService } from 'sql/platform/connection/common/connectionManagement'; import { IConnectionProfile } from 'sql/platform/connection/common/interfaces'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; -import { MssqlProviderId } from 'sql/common/constants'; import { Schemas } from 'vs/base/common/network'; let modelId = 0; @@ -390,8 +389,8 @@ export class CellModel implements ICellModel { let endpoint = this.getKnoxEndpoint(model.activeConnection); let host = endpoint && endpoint.ipAddress ? endpoint.ipAddress : model.activeConnection.serverName; let html = result.data['text/html']; - html =this.rewriteUrlUsingRegex(/(https?:\/\/mssql-master.*\/proxy)(.*)/g, html, host); - html =this.rewriteUrlUsingRegex(/(https?:\/\/master.*master-svc.*\/proxy)(.*)/g, html, host); + html = this.rewriteUrlUsingRegex(/(https?:\/\/mssql-master.*\/proxy)(.*)/g, html, host); + html = this.rewriteUrlUsingRegex(/(https?:\/\/master.*master-svc.*\/proxy)(.*)/g, html, host); (output).data['text/html'] = html; } } @@ -485,7 +484,7 @@ export class CellModel implements ICellModel { // TODO: this will be refactored out into the notebooks extension as a contribution point private getKnoxEndpoint(activeConnection: IConnectionProfile): notebookUtils.IEndpoint { let endpoint; - if (this._connectionManagementService && activeConnection && activeConnection.providerName === MssqlProviderId) { + if (this._connectionManagementService && activeConnection && activeConnection.providerName === 'mssql') { let serverInfo: ServerInfo = this._connectionManagementService.getServerInfo(activeConnection.id); if (serverInfo && serverInfo.options && serverInfo.options['clusterEndpoints']) { let endpoints: notebookUtils.IEndpoint[] = serverInfo.options['clusterEndpoints']; diff --git a/src/sql/workbench/parts/webview/electron-browser/webViewDialog.ts b/src/sql/workbench/parts/webview/electron-browser/webViewDialog.ts index 813377eb7d..76b334063f 100644 --- a/src/sql/workbench/parts/webview/electron-browser/webViewDialog.ts +++ b/src/sql/workbench/parts/webview/electron-browser/webViewDialog.ts @@ -8,7 +8,7 @@ import 'vs/css!sql/media/icons/common-icons'; import { Button } from 'sql/base/browser/ui/button/button'; import { Modal } from 'sql/workbench/browser/modal/modal'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; import { attachButtonStyler, attachModalDialogStyler } from 'sql/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { Event, Emitter } from 'vs/base/common/event'; diff --git a/src/sql/workbench/services/connection/browser/connectionDialogWidget.ts b/src/sql/workbench/services/connection/browser/connectionDialogWidget.ts index adc6963309..fd07ac4da7 100644 --- a/src/sql/workbench/services/connection/browser/connectionDialogWidget.ts +++ b/src/sql/workbench/services/connection/browser/connectionDialogWidget.ts @@ -17,7 +17,7 @@ import { ConnectionProfile } from 'sql/platform/connection/common/connectionProf import { TabbedPanel, PanelTabIdentifier } from 'sql/base/browser/ui/panel/panel'; import { RecentConnectionTreeController, RecentConnectionActionsProvider } from 'sql/parts/connection/connectionDialog/recentConnectionTreeController'; import { SavedConnectionTreeController } from 'sql/parts/connection/connectionDialog/savedConnectionTreeController'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; import { ClearRecentConnectionsAction } from 'sql/parts/connection/common/connectionActions'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; diff --git a/src/sql/workbench/services/dashboard/browser/newDashboardTabDialog.ts b/src/sql/workbench/services/dashboard/browser/newDashboardTabDialog.ts index 5543eff159..13feb71f87 100644 --- a/src/sql/workbench/services/dashboard/browser/newDashboardTabDialog.ts +++ b/src/sql/workbench/services/dashboard/browser/newDashboardTabDialog.ts @@ -23,7 +23,7 @@ import { KeyCode } from 'vs/base/common/keyCodes'; import { Button } from 'sql/base/browser/ui/button/button'; import { Modal } from 'sql/workbench/browser/modal/modal'; import { attachModalDialogStyler, attachButtonStyler } from 'sql/platform/theme/common/styler'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; import { NewDashboardTabViewModel, IDashboardUITab } from 'sql/workbench/services/dashboard/common/newDashboardTabViewModel'; import { IDashboardTab } from 'sql/platform/dashboard/common/dashboardRegistry'; import { IClipboardService } from 'sql/platform/clipboard/common/clipboardService'; diff --git a/src/sql/workbench/services/errorMessage/browser/errorMessageDialog.ts b/src/sql/workbench/services/errorMessage/browser/errorMessageDialog.ts index 27e983cc9d..6ea9d85ea9 100644 --- a/src/sql/workbench/services/errorMessage/browser/errorMessageDialog.ts +++ b/src/sql/workbench/services/errorMessage/browser/errorMessageDialog.ts @@ -8,7 +8,7 @@ import 'vs/css!sql/media/icons/common-icons'; import 'vs/css!./media/errorMessageDialog'; import { Button } from 'sql/base/browser/ui/button/button'; import { Modal } from 'sql/workbench/browser/modal/modal'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; import { attachButtonStyler, attachModalDialogStyler } from 'sql/platform/theme/common/styler'; import Severity from 'vs/base/common/severity'; diff --git a/src/sql/workbench/services/fileBrowser/browser/fileBrowserDialog.ts b/src/sql/workbench/services/fileBrowser/browser/fileBrowserDialog.ts index 5308382452..8750505619 100644 --- a/src/sql/workbench/services/fileBrowser/browser/fileBrowserDialog.ts +++ b/src/sql/workbench/services/fileBrowser/browser/fileBrowserDialog.ts @@ -13,7 +13,7 @@ import { SelectBox } from 'sql/base/browser/ui/selectBox/selectBox'; import * as DialogHelper from 'sql/workbench/browser/modal/dialogHelper'; import { Modal } from 'sql/workbench/browser/modal/modal'; import { attachModalDialogStyler, attachButtonStyler } from 'sql/platform/theme/common/styler'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; import { FileNode } from 'sql/workbench/services/fileBrowser/common/fileNode'; import { FileBrowserTreeView } from 'sql/workbench/services/fileBrowser/browser/fileBrowserTreeView'; import { FileBrowserViewModel } from 'sql/workbench/services/fileBrowser/common/fileBrowserViewModel'; diff --git a/src/sql/workbench/services/insights/browser/insightsDialogView.ts b/src/sql/workbench/services/insights/browser/insightsDialogView.ts index 7ac8346312..1ccd6e1609 100644 --- a/src/sql/workbench/services/insights/browser/insightsDialogView.ts +++ b/src/sql/workbench/services/insights/browser/insightsDialogView.ts @@ -11,7 +11,7 @@ import { IInsightsConfigDetails } from 'sql/workbench/parts/dashboard/widgets/in import { attachButtonStyler, attachModalDialogStyler, attachTableStyler, attachPanelStyler } from 'sql/platform/theme/common/styler'; import { TaskRegistry } from 'sql/platform/tasks/common/tasks'; import { ConnectionProfile } from 'sql/platform/connection/common/connectionProfile'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; import { IInsightsDialogModel, ListResource, IInsightDialogActionContext, insertValueRegex } from 'sql/workbench/services/insights/common/insightsDialogService'; import { TableDataView } from 'sql/base/browser/ui/table/tableDataView'; import { RowSelectionModel } from 'sql/base/browser/ui/table/plugins/rowSelectionModel.plugin'; diff --git a/src/sql/workbench/services/objectExplorer/common/objectExplorerService.ts b/src/sql/workbench/services/objectExplorer/common/objectExplorerService.ts index e34cfe8b8a..1a1b336f76 100644 --- a/src/sql/workbench/services/objectExplorer/common/objectExplorerService.ts +++ b/src/sql/workbench/services/objectExplorer/common/objectExplorerService.ts @@ -14,8 +14,8 @@ import { IConnectionProfile } from 'sql/platform/connection/common/interfaces'; import { Event, Emitter } from 'vs/base/common/event'; import * as azdata from 'azdata'; import * as nls from 'vs/nls'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; -import * as TelemetryUtils from 'sql/common/telemetryUtilities'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; +import * as TelemetryUtils from 'sql/platform/telemetry/telemetryUtilities'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { warn, error } from 'sql/base/common/log'; import { ServerTreeView } from 'sql/parts/objectExplorer/viewlet/serverTreeView'; diff --git a/src/sql/workbench/services/resourceProvider/browser/resourceProviderService.ts b/src/sql/workbench/services/resourceProvider/browser/resourceProviderService.ts index 2e8405e1bf..c1d4916563 100644 --- a/src/sql/workbench/services/resourceProvider/browser/resourceProviderService.ts +++ b/src/sql/workbench/services/resourceProvider/browser/resourceProviderService.ts @@ -3,18 +3,17 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IConnectionProfile } from 'sql/platform/connection/common/interfaces'; import { IResourceProviderService, IHandleFirewallRuleResult } from 'sql/workbench/services/resourceProvider/common/resourceProviderService'; -import * as Constants from 'sql/common/constants'; -import * as TelemetryKeys from 'sql/common/telemetryKeys'; -import * as TelemetryUtils from 'sql/common/telemetryUtilities'; +import * as TelemetryKeys from 'sql/platform/telemetry/telemetryKeys'; +import * as TelemetryUtils from 'sql/platform/telemetry/telemetryUtilities'; import { FirewallRuleDialogController } from 'sql/platform/accounts/browser/firewallRuleDialogController'; import * as azdata from 'azdata'; +import { invalidProvider } from 'sql/base/common/errors'; export class ResourceProviderService implements IResourceProviderService { @@ -46,7 +45,7 @@ export class ResourceProviderService implements IResourceProviderService { */ public createFirewallRule(selectedAccount: azdata.Account, firewallruleInfo: azdata.FirewallRuleInfo, resourceProviderId: string): Promise { return new Promise((resolve, reject) => { - let provider = this._providers[resourceProviderId]; + const provider = this._providers[resourceProviderId]; if (provider) { TelemetryUtils.addTelemetry(this._telemetryService, TelemetryKeys.FirewallRuleRequested, { provider: resourceProviderId }); provider.createFirewallRule(selectedAccount, firewallruleInfo).then(result => { @@ -55,7 +54,7 @@ export class ResourceProviderService implements IResourceProviderService { reject(error); }); } else { - reject(Constants.InvalidProvider); + reject(invalidProvider()); } }); } diff --git a/src/sqltest/common/telemetryUtilities.test.ts b/src/sqltest/common/telemetryUtilities.test.ts index 813de75f58..db960fad07 100644 --- a/src/sqltest/common/telemetryUtilities.test.ts +++ b/src/sqltest/common/telemetryUtilities.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import * as TelemetryUtils from 'sql/common/telemetryUtilities'; +import * as TelemetryUtils from 'sql/platform/telemetry/telemetryUtilities'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { TelemetryServiceStub } from 'sqltest/stubs/telemetryServiceStub'; import * as TypeMoq from 'typemoq'; @@ -100,4 +100,4 @@ suite('SQL Telemetry Utilities tests', () => { done(err); }); }); -}); \ No newline at end of file +}); diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index 534d3a500a..375878f1a2 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -178,7 +178,8 @@ import { ServerGroupController } from 'sql/workbench/services/serverGroup/browse import { IServerGroupController } from 'sql/platform/serverGroup/common/serverGroupController'; import { IAngularEventingService } from 'sql/platform/angularEventing/common/angularEventingService'; import { AngularEventingService } from 'sql/platform/angularEventing/node/angularEventingService'; -import { ICapabilitiesService, CapabilitiesService } from 'sql/platform/capabilities/common/capabilitiesService'; +import { ICapabilitiesService } from 'sql/platform/capabilities/common/capabilitiesService'; +import { CapabilitiesService } from 'sql/platform/capabilities/common/capabilitiesServiceImpl'; import { ICredentialsService, CredentialsService } from 'sql/platform/credentials/common/credentialsService'; import { ISerializationService, SerializationService } from 'sql/platform/serialization/common/serializationService'; import { IMetadataService, MetadataService } from 'sql/platform/metadata/common/metadataService';