Skip to content
This repository has been archived by the owner on Nov 6, 2020. It is now read-only.

Some refactoring #152

Merged
merged 5 commits into from
Mar 13, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions gulpfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ gulp.task('test-coverage', function() {
,'!out/src/extension.js'
,'!out/src/extensionmanager.js'
,'!out/src/team-extension.js'
,'!out/src/clients/baseclient.js'
,'!out/src/clients/buildclient.js'
,'!out/src/clients/coreapiclient.js'
,'!out/src/clients/feedbackclient.js'
Expand Down
58 changes: 58 additions & 0 deletions src/clients/baseclient.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
"use strict";

import { StatusBarItem } from "vscode";
import { Logger } from "../helpers/logger";
import { Telemetry } from "../services/telemetry";
import { TeamServerContext} from "../contexts/servercontext";
import { CommandNames } from "../helpers/constants";
import { Strings } from "../helpers/strings";
import { Utils } from "../helpers/utils";
import { VsCodeUtils } from "../helpers/vscodeutils";

export abstract class BaseClient {
protected _serverContext: TeamServerContext;
protected _statusBarItem: StatusBarItem;

constructor(context: TeamServerContext, statusBarItem: StatusBarItem) {
this._serverContext = context;
this._statusBarItem = statusBarItem;
}

protected handleError(err: Error, offlineText: string, polling: boolean, infoMessage?: string) : void {
let offline: boolean = Utils.IsOffline(err);
let msg: string = Utils.GetMessageForStatusCode(err, err.message);
let logPrefix: string = (infoMessage === undefined) ? "" : infoMessage + " ";

//When polling, we never display an error, we only log it (no telemetry either)
if (polling === true) {
Logger.LogError(logPrefix + msg);
if (offline === true) {
if (this._statusBarItem !== undefined) {
this._statusBarItem.text = offlineText;
this._statusBarItem.tooltip = Strings.StatusCodeOffline + " " + Strings.ClickToRetryConnection;
this._statusBarItem.command = CommandNames.RefreshPollingStatus;
}
} else {
//Could happen if PAT doesn't have proper permissions
if (this._statusBarItem !== undefined) {
this._statusBarItem.text = offlineText;
this._statusBarItem.tooltip = msg;
}
}
//If we aren't polling, we always log an error and, optionally, send telemetry
} else {
let logMessage: string = logPrefix + msg;
if (offline === true) {
Logger.LogError(logMessage);
} else {
Logger.LogError(logMessage);
Telemetry.SendException(err);
}
VsCodeUtils.ShowErrorMessage(msg);
}
}
}
45 changes: 4 additions & 41 deletions src/clients/buildclient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,14 @@ import { TeamServerContext} from "../contexts/servercontext";
import { CommandNames, TelemetryEvents, WellKnownRepositoryTypes } from "../helpers/constants";
import { Strings } from "../helpers/strings";
import { Utils } from "../helpers/utils";
import { VsCodeUtils } from "../helpers/vscodeutils";
import { IRepositoryContext, RepositoryType } from "../contexts/repositorycontext";
import { BaseClient } from "./baseclient";

export class BuildClient {
private _serverContext: TeamServerContext;
private _statusBarItem: StatusBarItem;
export class BuildClient extends BaseClient {
private _buildSummaryUrl: string;

constructor(context: TeamServerContext, statusBarItem: StatusBarItem) {
this._serverContext = context;
this._statusBarItem = statusBarItem;
super(context, statusBarItem);
}

//Gets any available build status information and adds it to the status bar
Expand Down Expand Up @@ -69,7 +66,7 @@ export class BuildClient {
}
}
} catch (err) {
this.handleError(err, polling, "Failed to get current build status");
this.handleError(err, BuildClient.GetOfflineBuildStatusText(), polling, "Failed to get current build status");
}
}

Expand Down Expand Up @@ -114,40 +111,6 @@ export class BuildClient {
Utils.OpenUrl(url);
}

private handleError(reason: any, polling: boolean, infoMessage?: string) : void {
let offline: boolean = Utils.IsOffline(reason);
let msg: string = Utils.GetMessageForStatusCode(reason, reason.message);
let logPrefix: string = (infoMessage === undefined) ? "" : infoMessage + " ";

//When polling, we never display an error, we only log it (no telemetry either)
if (polling === true) {
Logger.LogError(logPrefix + msg);
if (offline === true) {
if (this._statusBarItem !== undefined) {
this._statusBarItem.text = BuildClient.GetOfflineBuildStatusText();
this._statusBarItem.tooltip = Strings.StatusCodeOffline + " " + Strings.ClickToRetryConnection;
this._statusBarItem.command = CommandNames.RefreshPollingStatus;
}
} else {
//Could happen if PAT doesn't have proper permissions
if (this._statusBarItem !== undefined) {
this._statusBarItem.text = BuildClient.GetOfflineBuildStatusText();
this._statusBarItem.tooltip = msg;
}
}
//If we aren't polling, we always log an error and, optionally, send telemetry
} else {
let logMessage: string = logPrefix + msg;
if (offline === true) {
Logger.LogError(logMessage);
} else {
Logger.LogError(logMessage);
Telemetry.SendException(logMessage);
}
VsCodeUtils.ShowErrorMessage(msg);
}
}

public static GetOfflineBuildStatusText() : string {
return `$(icon octicon-package) ` + `???`;
}
Expand Down
2 changes: 1 addition & 1 deletion src/clients/feedbackclient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ export class FeedbackClient {
} catch (err) {
let message: string = Utils.GetMessageForStatusCode(0, err.message, "Failed getting SendFeedback selection");
Logger.LogError(message);
Telemetry.SendException(message);
Telemetry.SendException(err);
}
}
}
48 changes: 6 additions & 42 deletions src/clients/gitclient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,14 @@ import { IRepositoryContext, RepositoryType } from "../contexts/repositorycontex
import { TeamServerContext} from "../contexts/servercontext";
import { GitVcService, PullRequestScore } from "../services/gitvc";
import { Telemetry } from "../services/telemetry";
import { BaseClient } from "./baseclient";

var path = require("path");
import * as path from "path";

export class GitClient {
private _serverContext: TeamServerContext;
private _statusBarItem: StatusBarItem;
export class GitClient extends BaseClient {

constructor(context: TeamServerContext, statusBarItem: StatusBarItem) {
this._serverContext = context;
this._statusBarItem = statusBarItem;
super(context, statusBarItem);
}

//Initial method to display, select and navigate to my pull requests
Expand All @@ -45,7 +43,7 @@ export class GitClient {
Utils.OpenUrl(discUrl);
}
} catch (err) {
this.handleError(err, "Error selecting pull request from QuickPick");
this.handleError(err, GitClient.GetOfflinePullRequestStatusText(), false, "Error selecting pull request from QuickPick");
}
}

Expand Down Expand Up @@ -122,7 +120,7 @@ export class GitClient {
//Remove the default Strings.BrowseYourPullRequests item from the calculation
this._statusBarItem.text = GitClient.GetPullRequestStatusText(requests.length - 1);
} catch (err) {
this.handleError(err, "Attempting to poll my pull requests", true);
this.handleError(err, GitClient.GetOfflinePullRequestStatusText(), true, "Attempting to poll my pull requests");
}
}

Expand Down Expand Up @@ -179,40 +177,6 @@ export class GitClient {
return { label: scoreLabel + " (" + displayName + ") " + title, description: description, id: id };
}

private handleError(reason: any, infoMessage?: string, polling?: boolean) : void {
let offline: boolean = Utils.IsOffline(reason);
let msg: string = Utils.GetMessageForStatusCode(reason, reason.message);
let logPrefix: string = (infoMessage === undefined) ? "" : infoMessage + " ";

//When polling, we never display an error, we only log it (no telemetry either)
if (polling === true) {
Logger.LogError(logPrefix + msg);
if (offline === true) {
if (this._statusBarItem !== undefined) {
this._statusBarItem.text = GitClient.GetOfflinePullRequestStatusText();
this._statusBarItem.tooltip = Strings.StatusCodeOffline + " " + Strings.ClickToRetryConnection;
this._statusBarItem.command = CommandNames.RefreshPollingStatus;
}
} else {
//Could happen if PAT doesn't have proper permissions
if (this._statusBarItem !== undefined) {
this._statusBarItem.text = GitClient.GetOfflinePullRequestStatusText();
this._statusBarItem.tooltip = msg;
}
}
//If we aren't polling, we always log an error and, optionally, send telemetry
} else {
let logMessage: string = logPrefix + msg;
if (offline === true) {
Logger.LogError(logMessage);
} else {
Logger.LogError(logMessage);
Telemetry.SendException(logMessage);
}
VsCodeUtils.ShowErrorMessage(msg);
}
}

public static GetOfflinePullRequestStatusText() : string {
return `$(icon octicon-git-pull-request) ` + `???`;
}
Expand Down
60 changes: 12 additions & 48 deletions src/clients/witclient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,19 @@ import { Logger } from "../helpers/logger";
import { SimpleWorkItem, WorkItemTrackingService } from "../services/workitemtracking";
import { Telemetry } from "../services/telemetry";
import { TeamServerContext} from "../contexts/servercontext";
import { BaseQuickPickItem, VsCodeUtils, WorkItemQueryQuickPickItem } from "../helpers/vscodeutils";
import { CommandNames, TelemetryEvents, WitQueries, WitTypes } from "../helpers/constants";
import { BaseQuickPickItem, WorkItemQueryQuickPickItem } from "../helpers/vscodeutils";
import { TelemetryEvents, WitQueries, WitTypes } from "../helpers/constants";
import { Strings } from "../helpers/strings";
import { Utils } from "../helpers/utils";
import { IPinnedQuery } from "../helpers/settings";
import { BaseClient } from "./baseclient";

export class WitClient {
private _serverContext: TeamServerContext;
private _statusBarItem: StatusBarItem;
export class WitClient extends BaseClient {
private _pinnedQuery: IPinnedQuery;
private _myQueriesFolder: string;

constructor(context: TeamServerContext, pinnedQuery: IPinnedQuery, statusBarItem: StatusBarItem) {
this._serverContext = context;
this._statusBarItem = statusBarItem;
super(context, statusBarItem);
this._pinnedQuery = pinnedQuery;
}

Expand All @@ -51,7 +49,7 @@ export class WitClient {
Utils.OpenUrl(newItemUrl);
}
} catch (err) {
this.handleError(err, "Error creating new work item");
this.handleError(err, WitClient.GetOfflinePinnedQueryStatusText(), false, "Error creating new work item");
}
}

Expand Down Expand Up @@ -82,7 +80,7 @@ export class WitClient {
}
}
} catch (err) {
this.handleError(err, "Error showing work item queries");
this.handleError(err, WitClient.GetOfflinePinnedQueryStatusText(), false, "Error showing work item queries");
}
}

Expand All @@ -93,7 +91,7 @@ export class WitClient {
let queryText: string = await this.getPinnedQueryText();
await this.showWorkItems(queryText);
} catch (err) {
this.handleError(err, "Error showing pinned query work items");
this.handleError(err, WitClient.GetOfflinePinnedQueryStatusText(), false, "Error showing pinned query work items");
}
}

Expand All @@ -103,7 +101,7 @@ export class WitClient {
try {
await this.showWorkItems(WitQueries.MyWorkItems);
} catch (err) {
this.handleError(err, "Error showing my work items");
this.handleError(err, WitClient.GetOfflinePinnedQueryStatusText(), false, "Error showing my work items");
}
}

Expand Down Expand Up @@ -144,7 +142,7 @@ export class WitClient {
let svc: WorkItemTrackingService = new WorkItemTrackingService(this._serverContext);
return svc.GetQueryResultCount(this._serverContext.RepoInfo.TeamProject, queryText);
} catch (err) {
this.handleError(err, "Error getting pinned query result count");
this.handleError(err, WitClient.GetOfflinePinnedQueryStatusText(), false, "Error getting pinned query result count");
}
}

Expand Down Expand Up @@ -240,40 +238,6 @@ export class WitClient {
return workItemTypes;
}

private handleError(reason: any, infoMessage?: string, polling?: boolean) : void {
let offline: boolean = Utils.IsOffline(reason);
let msg: string = Utils.GetMessageForStatusCode(reason, reason.message);
let logPrefix: string = (infoMessage === undefined) ? "" : infoMessage + " ";

//When polling, we never display an error, we only log it (no telemetry either)
if (polling === true) {
Logger.LogError(logPrefix + msg);
if (offline === true) {
if (this._statusBarItem !== undefined) {
this._statusBarItem.text = WitClient.GetOfflinePinnedQueryStatusText();
this._statusBarItem.tooltip = Strings.StatusCodeOffline + " " + Strings.ClickToRetryConnection;
this._statusBarItem.command = CommandNames.RefreshPollingStatus;
}
} else {
//Could happen if PAT doesn't have proper permissions
if (this._statusBarItem !== undefined) {
this._statusBarItem.text = WitClient.GetOfflinePinnedQueryStatusText();
this._statusBarItem.tooltip = msg;
}
}
//If we aren't polling, we always log an error and, optionally, send telemetry
} else {
let logMessage: string = logPrefix + msg;
if (offline === true) {
Logger.LogError(logMessage);
} else {
Logger.LogError(logMessage);
Telemetry.SendException(logMessage);
}
VsCodeUtils.ShowErrorMessage(msg);
}
}

private logTelemetryForWorkItem(wit: string): void {
switch (wit) {
case WitTypes.Bug:
Expand All @@ -291,8 +255,8 @@ export class WitClient {
this.GetPinnedQueryResultCount().then((items) => {
this._statusBarItem.tooltip = Strings.ViewYourPinnedQuery;
this._statusBarItem.text = WitClient.GetPinnedQueryStatusText(items);
}).catch((reason) => {
this.handleError(reason, "Failed to get pinned query count during polling", true);
}).catch((err) => {
this.handleError(err, WitClient.GetOfflinePinnedQueryStatusText(), true, "Failed to get pinned query count during polling");
});
}

Expand Down
Loading