diff --git a/extensions/big-data-cluster/src/bigDataCluster/tree/controllerTreeDataProvider.ts b/extensions/big-data-cluster/src/bigDataCluster/tree/controllerTreeDataProvider.ts index e639a6c9c0..46fe5a2e2f 100644 --- a/extensions/big-data-cluster/src/bigDataCluster/tree/controllerTreeDataProvider.ts +++ b/extensions/big-data-cluster/src/bigDataCluster/tree/controllerTreeDataProvider.ts @@ -5,6 +5,7 @@ import * as vscode from 'vscode'; import * as azdata from 'azdata'; +import * as nls from 'vscode-nls'; import { TreeNode } from './treeNode'; import { IControllerTreeChangeHandler } from './controllerTreeChangeHandler'; import { AddControllerNode } from './addControllerNode'; @@ -13,6 +14,8 @@ import { showErrorMessage } from '../utils'; import { LoadingControllerNode } from './loadingControllerNode'; import { AuthType } from '../constants'; +const localize = nls.loadMessageBundle(); + const CredentialNamespace = 'clusterControllerCredentials'; interface IControllerInfoSlim { @@ -43,7 +46,9 @@ export class ControllerTreeDataProvider implements vscode.TreeDataProvider { vscode.window.showErrorMessage(localize('bdc.controllerTreeDataProvider.error', "Unexpected error loading saved controllers: {0}", err)); }); return [new LoadingControllerNode()]; } diff --git a/extensions/cms/src/cmsResource/tree/treeProvider.ts b/extensions/cms/src/cmsResource/tree/treeProvider.ts index 3316417466..3ed4e0495e 100644 --- a/extensions/cms/src/cmsResource/tree/treeProvider.ts +++ b/extensions/cms/src/cmsResource/tree/treeProvider.ts @@ -31,30 +31,9 @@ export class CmsResourceTreeProvider implements TreeDataProvider, ICms } if (!this.isSystemInitialized) { - try { - // Call to collect all locally saved CMS servers - // to determine whether the system has been initialized. - const cachedServers = this._appContext.cmsUtils.getSavedServers(); - if (cachedServers && cachedServers.length > 0) { - const servers: CmsResourceTreeNode[] = []; - cachedServers.forEach(async (server) => { - servers.push(new CmsResourceTreeNode( - server.name, - server.description, - server.ownerUri, - server.connection, - this._appContext, this, null)); - await this.appContext.cmsUtils.cacheRegisteredCmsServer(server.name, server.description, - server.ownerUri, server.connection); - }); - return servers; - } - this.isSystemInitialized = true; - this._onDidChangeTreeData.fire(undefined); - } catch (error) { - // System not initialized yet - this.isSystemInitialized = false; - } + // Kick off loading the saved servers but then immediately return the loading node so + // the user isn't left with an empty tree while we load the nodes + this.loadSavedServers().catch(err => this._appContext.apiWrapper.showErrorMessage(localize('cms.resource.tree.treeProvider.loadError', "Unexpected error occured while loading saved servers {0}", err))); return [CmsResourceMessageTreeNode.create(CmsResourceTreeProvider.loadingLabel, undefined)]; } try { @@ -93,6 +72,36 @@ export class CmsResourceTreeProvider implements TreeDataProvider, ICms return element.getTreeItem(); } + private async loadSavedServers(): Promise { + try { + // Optimistically set to true so we don't double-load if something refreshes the tree while + // we're loading. + this.isSystemInitialized = true; + // Call to collect all locally saved CMS servers + // to determine whether the system has been initialized. + const cachedServers = this._appContext.cmsUtils.getSavedServers(); + if (cachedServers && cachedServers.length > 0) { + const servers: CmsResourceTreeNode[] = []; + for (let i = 0; i < cachedServers.length; ++i) { + const server = cachedServers[i]; + servers.push(new CmsResourceTreeNode( + server.name, + server.description, + server.ownerUri, + server.connection, + this._appContext, this, null)); + await this.appContext.cmsUtils.cacheRegisteredCmsServer(server.name, server.description, + server.ownerUri, server.connection); + } + } + this._onDidChangeTreeData.fire(undefined); + } catch (error) { + // Reset so we can try loading again + this.isSystemInitialized = false; + throw error; //re-throw and let caller handler error + } + } + public isSystemInitialized: boolean = false; private _onDidChangeTreeData = new EventEmitter();