Refactor node loading logic for tree controllers (#8980)

* Refactor node loading logic for tree controllers

* Add comment
This commit is contained in:
Charles Gagnon
2020-01-28 17:12:15 -08:00
committed by GitHub
parent 32a89676f1
commit 5618799305
2 changed files with 39 additions and 25 deletions

View File

@@ -5,6 +5,7 @@
import * as vscode from 'vscode'; import * as vscode from 'vscode';
import * as azdata from 'azdata'; import * as azdata from 'azdata';
import * as nls from 'vscode-nls';
import { TreeNode } from './treeNode'; import { TreeNode } from './treeNode';
import { IControllerTreeChangeHandler } from './controllerTreeChangeHandler'; import { IControllerTreeChangeHandler } from './controllerTreeChangeHandler';
import { AddControllerNode } from './addControllerNode'; import { AddControllerNode } from './addControllerNode';
@@ -13,6 +14,8 @@ import { showErrorMessage } from '../utils';
import { LoadingControllerNode } from './loadingControllerNode'; import { LoadingControllerNode } from './loadingControllerNode';
import { AuthType } from '../constants'; import { AuthType } from '../constants';
const localize = nls.loadMessageBundle();
const CredentialNamespace = 'clusterControllerCredentials'; const CredentialNamespace = 'clusterControllerCredentials';
interface IControllerInfoSlim { interface IControllerInfoSlim {
@@ -43,7 +46,9 @@ export class ControllerTreeDataProvider implements vscode.TreeDataProvider<TreeN
return this.root.getChildren(); return this.root.getChildren();
} }
await this.loadSavedControllers(); // Kick off loading the saved controllers but then immediately return the loading node so
// the user isn't left with an empty tree while we load the nodes
this.loadSavedControllers().catch(err => { vscode.window.showErrorMessage(localize('bdc.controllerTreeDataProvider.error', "Unexpected error loading saved controllers: {0}", err)); });
return [new LoadingControllerNode()]; return [new LoadingControllerNode()];
} }

View File

@@ -31,30 +31,9 @@ export class CmsResourceTreeProvider implements TreeDataProvider<TreeNode>, ICms
} }
if (!this.isSystemInitialized) { if (!this.isSystemInitialized) {
try { // Kick off loading the saved servers but then immediately return the loading node so
// Call to collect all locally saved CMS servers // the user isn't left with an empty tree while we load the nodes
// to determine whether the system has been initialized. this.loadSavedServers().catch(err => this._appContext.apiWrapper.showErrorMessage(localize('cms.resource.tree.treeProvider.loadError', "Unexpected error occured while loading saved servers {0}", err)));
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;
}
return [CmsResourceMessageTreeNode.create(CmsResourceTreeProvider.loadingLabel, undefined)]; return [CmsResourceMessageTreeNode.create(CmsResourceTreeProvider.loadingLabel, undefined)];
} }
try { try {
@@ -93,6 +72,36 @@ export class CmsResourceTreeProvider implements TreeDataProvider<TreeNode>, ICms
return element.getTreeItem(); return element.getTreeItem();
} }
private async loadSavedServers(): Promise<void> {
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; public isSystemInitialized: boolean = false;
private _onDidChangeTreeData = new EventEmitter<TreeNode>(); private _onDidChangeTreeData = new EventEmitter<TreeNode>();