Skip to content

Commit ea52c38

Browse files
author
Ye Zhu
committed
Move getDirectDeps into upgradeManager and just check the dependencies in the assessmentManager
1 parent d112421 commit ea52c38

File tree

3 files changed

+66
-82
lines changed

3 files changed

+66
-82
lines changed

src/upgrade/assessmentManager.ts

Lines changed: 17 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -150,43 +150,19 @@ async function getDependencyIssues(dependencies: PackageDescription[]): Promise<
150150
return issues;
151151
}
152152

153-
async function getProjectIssues(projectNode: INodeData): Promise<UpgradeIssue[]> {
153+
async function getWorkspaceIssues(projectDeps:{projectNode: INodeData, dependencies: PackageDescription[]}[]): Promise<UpgradeIssue[]> {
154+
154155
const issues: UpgradeIssue[] = [];
155-
const dependencies = await getDirectDependencies(projectNode);
156-
if (dependencies.length === 0) {
157-
sendInfo("", {
158-
operationName: "java.dependency.assessmentManager.getProjectIssues.noDirectDependencies"
159-
});
160-
return issues;
156+
const dependenciesSet: Set<PackageDescription> = new Set();
157+
for (const { projectNode, dependencies } of projectDeps) {
158+
issues.push(...getJavaIssues(projectNode));
159+
dependencies.forEach(dep => dependenciesSet.add(dep));
161160
}
162-
issues.push(...await getCVEIssues(dependencies));
163-
issues.push(...getJavaIssues(projectNode));
164-
issues.push(...await getDependencyIssues(dependencies));
165-
161+
issues.push(...await getCVEIssues(Array.from(dependenciesSet)));
162+
issues.push(...await getDependencyIssues(Array.from(dependenciesSet)));
166163
return issues;
167164
}
168165

169-
async function getWorkspaceIssues(workspaceFolderUri: string): Promise<UpgradeIssue[]> {
170-
const projects = await Jdtls.getProjects(workspaceFolderUri);
171-
const projectsIssues = await Promise.allSettled(projects.map(async (projectNode) => {
172-
const issues = await getProjectIssues(projectNode);
173-
return issues;
174-
}));
175-
176-
const workspaceIssues = projectsIssues.map(x => {
177-
if (x.status === "fulfilled") {
178-
return x.value;
179-
}
180-
181-
sendInfo("", {
182-
operationName: "java.dependency.assessmentManager.getWorkspaceIssues",
183-
});
184-
return [];
185-
}).flat();
186-
187-
return workspaceIssues;
188-
}
189-
190166
/**
191167
* Find all pom.xml files in a directory using glob
192168
*/
@@ -328,7 +304,7 @@ async function parseDirectDependenciesFromGradle(projectPath: string): Promise<S
328304
return directDeps;
329305
}
330306

331-
async function getDirectDependencies(projectNode: INodeData): Promise<PackageDescription[]> {
307+
export async function getDirectDependencies(projectNode: INodeData): Promise<PackageDescription[]> {
332308
const projectStructureData = await Jdtls.getPackageData({ kind: NodeKind.Project, projectUri: projectNode.uri });
333309
// Only include Maven or Gradle containers (not JRE or other containers)
334310
const dependencyContainers = projectStructureData.filter(x =>
@@ -339,8 +315,6 @@ async function getDirectDependencies(projectNode: INodeData): Promise<PackageDes
339315
if (dependencyContainers.length === 0) {
340316
return [];
341317
}
342-
// Determine build type from dependency containers
343-
const isMaven = dependencyContainers.some(x => x.path?.startsWith(ContainerPath.Maven));
344318

345319
const allPackages = await Promise.allSettled(
346320
dependencyContainers.map(async (packageContainer) => {
@@ -368,11 +342,13 @@ async function getDirectDependencies(projectNode: INodeData): Promise<PackageDes
368342

369343
if (!dependencies) {
370344
sendInfo("", {
371-
operationName: "java.dependency.assessmentManager.getDirectDependencies.noDependencyInfo",
372-
buildType: isMaven ? "maven" : "gradle",
345+
operationName: "java.dependency.assessmentManager.getDirectDependencies.noDependencyInfo"
373346
});
374347
return [];
375348
}
349+
350+
// Determine build type from dependency containers
351+
const isMaven = dependencyContainers.some(x => x.path?.startsWith(ContainerPath.Maven));
376352
// Get direct dependency identifiers from build files
377353
let directDependencyIds: Set<string> | null = null;
378354
if (projectNode.uri && dependencyContainers.length > 0) {
@@ -390,10 +366,10 @@ async function getDirectDependencies(projectNode: INodeData): Promise<PackageDes
390366

391367
if (!directDependencyIds) {
392368
sendInfo("", {
393-
operationName: "java.dependency.assessmentManager.getDirectDependencies.noDirectDependencyInfo",
394-
buildType: isMaven ? "maven" : "gradle",
369+
operationName: "java.dependency.assessmentManager.getDirectDependencies.noDirectDependencyInfo"
395370
});
396-
return [];
371+
//TODO: fallback to return all dependencies if we cannot parse direct dependencies or just return empty?
372+
return dependencies;
397373
}
398374
// Filter to only direct dependencies if we have build file info
399375
if (directDependencyIds && directDependencyIds.size > 0) {
@@ -402,16 +378,7 @@ async function getDirectDependencies(projectNode: INodeData): Promise<PackageDes
402378
);
403379
}
404380

405-
// Deduplicate by GAV coordinates
406-
const seen = new Set<string>();
407-
return dependencies.filter(pkg => {
408-
const key = `${pkg.groupId}:${pkg.artifactId}:${pkg.version}`;
409-
if (seen.has(key)) {
410-
return false;
411-
}
412-
seen.add(key);
413-
return true;
414-
});
381+
return dependencies;
415382
}
416383

417384
async function getCVEIssues(dependencies: PackageDescription[]): Promise<UpgradeIssue[]> {

src/upgrade/display/notificationManager.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,16 @@ class NotificationManager implements IUpgradeIssuesRenderer {
4141
if (issues.length === 0) {
4242
return;
4343
}
44-
const issue = issues[0];
44+
45+
// Filter to only CVE issues and cast to CveUpgradeIssue[]
46+
const cveIssues = issues.filter(
47+
(i): i is CveUpgradeIssue => i.reason === UpgradeReason.CVE
48+
);
49+
const nonCVEIssues = issues.filter(
50+
(i) => i.reason !== UpgradeReason.CVE
51+
);
52+
const hasCVEIssue = cveIssues.length > 0;
53+
const issue = hasCVEIssue ? cveIssues[0] : nonCVEIssues[0];
4554

4655
if (!this.shouldShow()) {
4756
return;
@@ -56,12 +65,8 @@ class NotificationManager implements IUpgradeIssuesRenderer {
5665
const prompt = buildFixPrompt(issue);
5766

5867
let notificationMessage = "";
59-
let cveIssues: CveUpgradeIssue[] = [];
60-
if (issue.reason === UpgradeReason.CVE) {
61-
// Filter to only CVE issues and cast to CveUpgradeIssue[]
62-
cveIssues = issues.filter(
63-
(i): i is CveUpgradeIssue => i.reason === UpgradeReason.CVE
64-
);
68+
69+
if (hasCVEIssue) {
6570
notificationMessage = buildCVENotificationMessage(cveIssues, hasExtension);
6671
} else {
6772
notificationMessage = buildNotificationMessage(issue, hasExtension);
@@ -72,7 +77,7 @@ class NotificationManager implements IUpgradeIssuesRenderer {
7277
operationName: "java.dependency.upgradeNotification.show",
7378
});
7479

75-
const buttons = issue.reason === UpgradeReason.CVE
80+
const buttons = hasCVEIssue
7681
? [fixCVEButtonText, BUTTON_TEXT_NOT_NOW]
7782
: [upgradeButtonText, BUTTON_TEXT_NOT_NOW];
7883

src/upgrade/upgradeManager.ts

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,8 @@ import { instrumentOperation, instrumentOperationAsVsCodeCommand, sendInfo } fro
1010
import { Commands } from "../commands";
1111
import notificationManager from "./display/notificationManager";
1212
import { Settings } from "../settings";
13-
import assessmentManager from "./assessmentManager";
13+
import assessmentManager, { getDirectDependencies } from "./assessmentManager";
1414
import { checkOrInstallAppModExtensionForUpgrade, checkOrPopupToInstallAppModExtensionForModernization } from "./utility";
15-
import { NodeKind } from "../../extension.bundle";
16-
import { ContainerPath } from "../views/containerNode";
1715

1816
const DEFAULT_UPGRADE_PROMPT = "Upgrade Java project dependency to latest version.";
1917

@@ -55,28 +53,42 @@ class UpgradeManager {
5553
}
5654

5755
private static async runDependencyCheckup(folder: WorkspaceFolder) {
58-
return (instrumentOperation("java.dependency.runDependencyCheckup",
59-
async (_operationId: string) => {
60-
if (!(await languageServerApiManager.ready())) {
61-
sendInfo(_operationId, { "skipReason": "languageServerNotReady" });
62-
return;
63-
}
64-
65-
const hasJavaError: boolean = await Jdtls.checkImportStatus();
66-
if (hasJavaError) {
67-
sendInfo(_operationId, { "skipReason": "hasJavaError" });
68-
return;
69-
}
70-
71-
const uri = folder.uri.toString();
72-
const workspaceIssues = await assessmentManager.getWorkspaceIssues(uri);
73-
74-
if (workspaceIssues.length > 0) {
75-
// only show one issue in notifications
76-
notificationManager.render(workspaceIssues);
77-
}
56+
return instrumentOperation("java.dependency.runDependencyCheckup", async (_operationId: string) => {
57+
if (!(await languageServerApiManager.ready())) {
58+
sendInfo(_operationId, { skipReason: "languageServerNotReady" });
59+
return;
7860
}
79-
))();
61+
62+
const hasJavaError: boolean = await Jdtls.checkImportStatus();
63+
if (hasJavaError) {
64+
sendInfo(_operationId, { skipReason: "hasJavaError" });
65+
return;
66+
}
67+
68+
const projects = await Jdtls.getProjects(folder.uri.toString());
69+
const projectDirectDepsResults = await Promise.allSettled(
70+
projects.map(async (projectNode) => ({
71+
projectNode,
72+
dependencies: await getDirectDependencies(projectNode),
73+
}))
74+
);
75+
76+
const allProjectDirectDeps = projectDirectDepsResults
77+
.filter((result): result is PromiseFulfilledResult<{ projectNode: typeof projects[0]; dependencies: Awaited<ReturnType<typeof getDirectDependencies>> }> =>
78+
result.status === "fulfilled"
79+
)
80+
.map((result) => result.value);
81+
82+
if (allProjectDirectDeps.every((x) => x.dependencies.length === 0)) {
83+
sendInfo(_operationId, { skipReason: "notMavenGradleProject" });
84+
return;
85+
}
86+
87+
const workspaceIssues = await assessmentManager.getWorkspaceIssues(allProjectDirectDeps);
88+
if (workspaceIssues.length > 0) {
89+
notificationManager.render(workspaceIssues);
90+
}
91+
})();
8092
}
8193
}
8294

0 commit comments

Comments
 (0)