-
Notifications
You must be signed in to change notification settings - Fork 97
Expand file tree
/
Copy pathupgradeManager.ts
More file actions
133 lines (108 loc) · 5.55 KB
/
upgradeManager.ts
File metadata and controls
133 lines (108 loc) · 5.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
import { commands, type ExtensionContext, type Event, workspace, type WorkspaceFolder } from "vscode";
import { Jdtls } from "../java/jdtls";
import { languageServerApiManager } from "../languageServerApi/languageServerApiManager";
import { ExtensionName } from "../constants";
import { instrumentOperation, instrumentOperationAsVsCodeCommand, sendInfo } from "vscode-extension-telemetry-wrapper";
import { Commands } from "../commands";
import notificationManager from "./display/notificationManager";
import { Settings } from "../settings";
import assessmentManager, { getDirectDependencies } from "./assessmentManager";
import { checkOrInstallAppModExtensionForUpgrade, checkOrPopupToInstallAppModExtensionForModernization } from "./utility";
import { contextManager } from "../contextManager";
import { LanguageServerMode } from "../languageServerApi/LanguageServerMode";
const DEFAULT_UPGRADE_PROMPT = "Upgrade Java project dependency to latest version.";
function shouldRunCheckup() {
return Settings.getEnableDependencyCheckup();
}
class UpgradeManager {
private static watcherSetup = false;
private static scanned = false;
public static initialize(context: ExtensionContext) {
notificationManager.initialize(context);
// Upgrade project
context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_UPGRADE_WITH_COPILOT, async (promptText?: string) => {
await checkOrInstallAppModExtensionForUpgrade(ExtensionName.APP_MODERNIZATION_UPGRADE_FOR_JAVA);
const promptToUse = promptText ?? DEFAULT_UPGRADE_PROMPT;
await commands.executeCommand(Commands.GOTO_AGENT_MODE, { prompt: promptToUse, useCustomAgent: true });
}));
// Show modernization view
context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_MODERNIZE_JAVA_PROJECT, async () => {
await checkOrPopupToInstallAppModExtensionForModernization(
ExtensionName.APP_MODERNIZATION_FOR_JAVA,
`${ExtensionName.APP_MODERNIZATION_EXTENSION_NAME} extension is required to modernize Java projects. Would you like to install it and modernize this project?`,
"Install Extension and Modernize");
await commands.executeCommand("workbench.view.extension.azureJavaMigrationExplorer");
}));
// Defer the expensive scan operation to not block extension activation
setImmediate(() => UpgradeManager.scan("initialization", false));
}
public static scan(triggerReason: string, forceRescan: boolean) {
return instrumentOperation("java.dependency.scan", async (_operationId: string) => {
sendInfo(_operationId, { triggerReason });
if (!shouldRunCheckup()) {
return;
}
if (forceRescan) {
UpgradeManager.scanned = false;
}
const readyResult = await languageServerApiManager.ready();
this.setupWatcherForServerModeChange();
if (!readyResult) {
sendInfo(_operationId, { skipReason: "languageServerNotReady" });
return;
}
const hasJavaError: boolean = await Jdtls.checkImportStatus();
if (hasJavaError) {
sendInfo(_operationId, { skipReason: "hasJavaError" });
return;
}
if (UpgradeManager.scanned) {
return;
}
UpgradeManager.scanned = true;
workspace.workspaceFolders?.forEach((folder) =>
UpgradeManager.runDependencyCheckup(folder)
);
})();
}
private static async runDependencyCheckup(folder: WorkspaceFolder) {
return instrumentOperation("java.dependency.runDependencyCheckup", async (_operationId: string) => {
const projects = await Jdtls.getProjects(folder.uri.toString());
const projectDirectDepsResults = await Promise.allSettled(
projects.map(async (projectNode) => ({
projectNode,
dependencies: await getDirectDependencies(projectNode),
}))
);
const allProjectDirectDeps = projectDirectDepsResults.flatMap(result =>
result.status === "fulfilled" ? [result.value] : []
);
if (allProjectDirectDeps.every((x) => x.dependencies.length === 0)) {
sendInfo(_operationId, { skipReason: "notMavenGradleProject" });
return;
}
const workspaceIssues = await assessmentManager.getWorkspaceIssues(allProjectDirectDeps);
if (workspaceIssues.length > 0) {
notificationManager.render(workspaceIssues);
}
})();
}
private static setupWatcherForServerModeChange() {
if (UpgradeManager.watcherSetup) {
return;
}
const extensionApi = languageServerApiManager.getExtensionApi();
if (extensionApi.onDidServerModeChange) {
const onDidServerModeChange: Event<string> = extensionApi.onDidServerModeChange;
contextManager.context.subscriptions.push(onDidServerModeChange((mode: LanguageServerMode) => {
if (mode !== LanguageServerMode.LightWeight) {
setImmediate(() => UpgradeManager.scan(`languageServerModeChangeTo${mode}`, false));
}
}));
UpgradeManager.watcherSetup = true;
}
}
}
export default UpgradeManager;