From 36638ed3077c3b7dce5a77344d99f55380e00357 Mon Sep 17 00:00:00 2001 From: FluoriteCafe-work <202210574+FluoriteCafe-work@users.noreply.github.com> Date: Thu, 25 Sep 2025 11:47:25 +0800 Subject: [PATCH 1/9] chore: add telemetry pre notification response --- src/upgrade/display/notificationManager.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/upgrade/display/notificationManager.ts b/src/upgrade/display/notificationManager.ts index c597e746..a925bfd2 100644 --- a/src/upgrade/display/notificationManager.ts +++ b/src/upgrade/display/notificationManager.ts @@ -53,6 +53,10 @@ class NotificationManager implements IUpgradeIssuesRenderer { const prompt = buildFixPrompt(issue); const notificationMessage = buildNotificationMessage(issue, hasExtension); const upgradeButtonText = hasExtension ? BUTTON_TEXT_UPGRADE : BUTTON_TEXT_INSTALL_AND_UPGRADE; + + sendInfo(operationId, { + operationName: "java.dependency.upgradeNotification.runUpgradeNotification", + }); const selection = await window.showInformationMessage( notificationMessage, upgradeButtonText, From c90eb577f0eac1a6f3f4dd6568c23fe8b227fa36 Mon Sep 17 00:00:00 2001 From: FluoriteCafe-work <202210574+FluoriteCafe-work@users.noreply.github.com> Date: Thu, 25 Sep 2025 15:09:56 +0800 Subject: [PATCH 2/9] feat: check version range on in-scope groupIds --- src/upgrade/assessmentManager.ts | 36 +++++++++++++++++++++++++------- src/upgrade/type.ts | 4 +++- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/upgrade/assessmentManager.ts b/src/upgrade/assessmentManager.ts index 1a361460..a6c91c65 100644 --- a/src/upgrade/assessmentManager.ts +++ b/src/upgrade/assessmentManager.ts @@ -4,13 +4,21 @@ import * as semver from 'semver'; import { Jdtls } from "../java/jdtls"; import { NodeKind, type INodeData } from "../java/nodeData"; -import { type DependencyCheckItem, UpgradeReason, type UpgradeIssue } from "./type"; +import { type DependencyCheckItem, UpgradeReason, type UpgradeIssue, type VersionSet } from "./type"; import { DEPENDENCY_JAVA_RUNTIME } from "./dependency.metadata"; import { Upgrade } from '../constants'; import { buildPackageId } from './utility'; import metadataManager from './metadataManager'; import { sendInfo } from 'vscode-extension-telemetry-wrapper'; +function getVersionRange(versions: Set) :string { + const versionList = [...versions].sort((a, b) => semver.compare(a, b)); + if (versionList.length === 1) { + return versionList[0]; + } + return `${versionList[0]}|${versionList[versionList.length-1]}`; +} + function getJavaIssues(data: INodeData): UpgradeIssue[] { const javaVersion = data.metaData?.MaxSourceVersion as number | undefined; const { name, supportedVersion } = DEPENDENCY_JAVA_RUNTIME; @@ -59,7 +67,7 @@ function getUpgradeForDependency(versionString: string, supportedVersionDefiniti return null; } -function getDependencyIssue(data: INodeData): UpgradeIssue | null { +function getDependencyIssue(data: INodeData, versionSet: VersionSet): UpgradeIssue | null { const versionString = data.metaData?.["maven.version"]; const groupId = data.metaData?.["maven.groupId"]; const artifactId = data.metaData?.["maven.artifactId"]; @@ -69,6 +77,11 @@ function getDependencyIssue(data: INodeData): UpgradeIssue | null { return null; } + if (!versionSet[groupId]) { + versionSet[groupId]= new Set(); + } + versionSet[groupId].add(versionString); + return getUpgradeForDependency(versionString, supportedVersionDefinition, packageId); } @@ -84,7 +97,20 @@ async function getDependencyIssues(projectNode: INodeData): Promise Boolean(x)); + const versionSet: VersionSet = {}; + const issues = packages.map(pkg => getDependencyIssue(pkg, versionSet)).filter((x): x is UpgradeIssue => Boolean(x)); + if (Object.entries(versionSet).length > 0) { + sendInfo("", { + operationName: "java.dependency.assessmentManager.getDependencyIssues", + versionRangeByGroupId: JSON.stringify( + Object.fromEntries( + Object.entries(versionSet).map(([groupId, versionSet]) => [groupId, getVersionRange(versionSet)]), + ), + ), + }); + } + + return issues; }) ); @@ -113,10 +139,6 @@ async function getWorkspaceIssues(workspaceFolderUri: string): Promise { const issues = await getProjectIssues(projectNode); - sendInfo("", { - operationName: "java.dependency.assessmentManager.getWorkspaceIssues", - issuesFoundForPackageId: JSON.stringify(issues.map(x => `${x.packageId}:${x.currentVersion}`)), - }); return issues; })); diff --git a/src/upgrade/type.ts b/src/upgrade/type.ts index 82105fb0..d769b516 100644 --- a/src/upgrade/type.ts +++ b/src/upgrade/type.ts @@ -28,4 +28,6 @@ export type UpgradeIssue = { export interface IUpgradeIssuesRenderer { render(issues: UpgradeIssue[]): void; -} \ No newline at end of file +} + +export type VersionSet = Record>; \ No newline at end of file From a81ad083b79605a8738d9495899b4611ee6cdf8e Mon Sep 17 00:00:00 2001 From: FluoriteCafe-work <202210574+FluoriteCafe-work@users.noreply.github.com> Date: Thu, 25 Sep 2025 15:12:18 +0800 Subject: [PATCH 3/9] chore: lint --- src/upgrade/assessmentManager.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/upgrade/assessmentManager.ts b/src/upgrade/assessmentManager.ts index a6c91c65..7dba0cb0 100644 --- a/src/upgrade/assessmentManager.ts +++ b/src/upgrade/assessmentManager.ts @@ -11,12 +11,12 @@ import { buildPackageId } from './utility'; import metadataManager from './metadataManager'; import { sendInfo } from 'vscode-extension-telemetry-wrapper'; -function getVersionRange(versions: Set) :string { +function getVersionRange(versions: Set) : string { const versionList = [...versions].sort((a, b) => semver.compare(a, b)); if (versionList.length === 1) { return versionList[0]; } - return `${versionList[0]}|${versionList[versionList.length-1]}`; + return `${versionList[0]}|${versionList[versionList.length - 1]}`; } function getJavaIssues(data: INodeData): UpgradeIssue[] { @@ -78,7 +78,7 @@ function getDependencyIssue(data: INodeData, versionSet: VersionSet): UpgradeIss } if (!versionSet[groupId]) { - versionSet[groupId]= new Set(); + versionSet[groupId] = new Set(); } versionSet[groupId].add(versionString); @@ -97,14 +97,14 @@ async function getDependencyIssues(projectNode: INodeData): Promise getDependencyIssue(pkg, versionSet)).filter((x): x is UpgradeIssue => Boolean(x)); - if (Object.entries(versionSet).length > 0) { + const versionsByGroupId: VersionSet = {}; + const issues = packages.map(pkg => getDependencyIssue(pkg, versionsByGroupId)).filter((x): x is UpgradeIssue => Boolean(x)); + if (Object.entries(versionsByGroupId).length > 0) { sendInfo("", { operationName: "java.dependency.assessmentManager.getDependencyIssues", versionRangeByGroupId: JSON.stringify( Object.fromEntries( - Object.entries(versionSet).map(([groupId, versionSet]) => [groupId, getVersionRange(versionSet)]), + Object.entries(versionsByGroupId).map(([groupId, versions]) => [groupId, getVersionRange(versions)]), ), ), }); From fec1e09be64cf3ed37be324f1bbecee569f91c57 Mon Sep 17 00:00:00 2001 From: Ray Sun <202210574+FluoriteCafe-work@users.noreply.github.com> Date: Mon, 29 Sep 2025 17:01:07 +0800 Subject: [PATCH 4/9] chore: update `operationName` on notification display Co-authored-by: Miller Wang <69189193+wangmingliang-ms@users.noreply.github.com> --- src/upgrade/display/notificationManager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/upgrade/display/notificationManager.ts b/src/upgrade/display/notificationManager.ts index a925bfd2..22e4a9ef 100644 --- a/src/upgrade/display/notificationManager.ts +++ b/src/upgrade/display/notificationManager.ts @@ -55,7 +55,7 @@ class NotificationManager implements IUpgradeIssuesRenderer { const upgradeButtonText = hasExtension ? BUTTON_TEXT_UPGRADE : BUTTON_TEXT_INSTALL_AND_UPGRADE; sendInfo(operationId, { - operationName: "java.dependency.upgradeNotification.runUpgradeNotification", + operationName: "java.dependency.upgradeNotification.show", }); const selection = await window.showInformationMessage( notificationMessage, From 44a0b06e0a7decc9994482816afb4685f93904fa Mon Sep 17 00:00:00 2001 From: FluoriteCafe-work <202210574+FluoriteCafe-work@users.noreply.github.com> Date: Mon, 29 Sep 2025 17:31:13 +0800 Subject: [PATCH 5/9] chore: separate the check flows --- src/upgrade/assessmentManager.ts | 69 +++++++++++++++++++++----------- src/upgrade/type.ts | 6 ++- 2 files changed, 50 insertions(+), 25 deletions(-) diff --git a/src/upgrade/assessmentManager.ts b/src/upgrade/assessmentManager.ts index 7dba0cb0..bc342e7c 100644 --- a/src/upgrade/assessmentManager.ts +++ b/src/upgrade/assessmentManager.ts @@ -4,13 +4,25 @@ import * as semver from 'semver'; import { Jdtls } from "../java/jdtls"; import { NodeKind, type INodeData } from "../java/nodeData"; -import { type DependencyCheckItem, UpgradeReason, type UpgradeIssue, type VersionSet } from "./type"; +import { UpgradeReason } from "./type"; +import type { DependencyCheckItem, UpgradeIssue, PackageDescription } from "./type"; import { DEPENDENCY_JAVA_RUNTIME } from "./dependency.metadata"; import { Upgrade } from '../constants'; import { buildPackageId } from './utility'; import metadataManager from './metadataManager'; import { sendInfo } from 'vscode-extension-telemetry-wrapper'; +function packageNodeToDescription(node: INodeData): PackageDescription | null { + const version = node.metaData?.["maven.version"]; + const groupId = node.metaData?.["maven.groupId"]; + const artifactId = node.metaData?.["maven.artifactId"]; + if (!version || !groupId || !artifactId) { + return null; + } + + return { version, groupId, artifactId }; +} + function getVersionRange(versions: Set) : string { const versionList = [...versions].sort((a, b) => semver.compare(a, b)); if (versionList.length === 1) { @@ -19,6 +31,19 @@ function getVersionRange(versions: Set) : string { return `${versionList[0]}|${versionList[versionList.length - 1]}`; } +function collectVersionRange(pkgs: PackageDescription[]): [string, string][] { + const versionMap: Record> = {}; + for (const pkg of pkgs) { + const groupId = pkg.groupId; + if (!versionMap[groupId]) { + versionMap[groupId] = new Set(); + } + versionMap[groupId].add(pkg.version); + } + + return Object.entries(versionMap).map(([groupId, versions]) => [groupId, getVersionRange(versions)]); +} + function getJavaIssues(data: INodeData): UpgradeIssue[] { const javaVersion = data.metaData?.MaxSourceVersion as number | undefined; const { name, supportedVersion } = DEPENDENCY_JAVA_RUNTIME; @@ -39,7 +64,7 @@ function getJavaIssues(data: INodeData): UpgradeIssue[] { } function getUpgradeForDependency(versionString: string, supportedVersionDefinition: DependencyCheckItem, packageId: string): UpgradeIssue | null { - const { reason } = supportedVersionDefinition; + const reason = supportedVersionDefinition.reason; switch (reason) { case UpgradeReason.DEPRECATED: { return { @@ -67,22 +92,21 @@ function getUpgradeForDependency(versionString: string, supportedVersionDefiniti return null; } -function getDependencyIssue(data: INodeData, versionSet: VersionSet): UpgradeIssue | null { - const versionString = data.metaData?.["maven.version"]; - const groupId = data.metaData?.["maven.groupId"]; - const artifactId = data.metaData?.["maven.artifactId"]; +function getPackageUpgradeMetadata(pkg: PackageDescription): DependencyCheckItem | null { + const { groupId, artifactId } = pkg; const packageId = buildPackageId(groupId, artifactId); - const supportedVersionDefinition = metadataManager.getMetadataById(packageId); - if (!versionString || !groupId || !supportedVersionDefinition) { - return null; - } + return metadataManager.getMetadataById(packageId) ?? null; +} - if (!versionSet[groupId]) { - versionSet[groupId] = new Set(); +function getDependencyIssue(pkg: PackageDescription): UpgradeIssue | null { + const supportedVersionDefinition = getPackageUpgradeMetadata(pkg); + const version = pkg.version; + if (!version || !supportedVersionDefinition) { + return null; } - versionSet[groupId].add(versionString); - - return getUpgradeForDependency(versionString, supportedVersionDefinition, packageId); + const { groupId, artifactId } = pkg; + const packageId = buildPackageId(groupId, artifactId); + return getUpgradeForDependency(version, supportedVersionDefinition, packageId); } async function getDependencyIssues(projectNode: INodeData): Promise { @@ -91,22 +115,19 @@ async function getDependencyIssues(projectNode: INodeData): Promise x.kind === NodeKind.Container) .map(async (packageContainer) => { - const packages = await Jdtls.getPackageData({ + const packageNodes = await Jdtls.getPackageData({ kind: NodeKind.Container, projectUri: projectNode.uri, path: packageContainer.path, }); + const packages = packageNodes.map(packageNodeToDescription).filter((x): x is PackageDescription => Boolean(x)); - const versionsByGroupId: VersionSet = {}; - const issues = packages.map(pkg => getDependencyIssue(pkg, versionsByGroupId)).filter((x): x is UpgradeIssue => Boolean(x)); - if (Object.entries(versionsByGroupId).length > 0) { + const issues = packages.map(getDependencyIssue).filter((x): x is UpgradeIssue => Boolean(x)); + const versionRangeByGroupId = collectVersionRange(packages.filter(getPackageUpgradeMetadata)); + if (versionRangeByGroupId.length > 0) { sendInfo("", { operationName: "java.dependency.assessmentManager.getDependencyIssues", - versionRangeByGroupId: JSON.stringify( - Object.fromEntries( - Object.entries(versionsByGroupId).map(([groupId, versions]) => [groupId, getVersionRange(versions)]), - ), - ), + versionRangeByGroupId: JSON.stringify(versionRangeByGroupId), }); } diff --git a/src/upgrade/type.ts b/src/upgrade/type.ts index d769b516..3698a998 100644 --- a/src/upgrade/type.ts +++ b/src/upgrade/type.ts @@ -30,4 +30,8 @@ export interface IUpgradeIssuesRenderer { render(issues: UpgradeIssue[]): void; } -export type VersionSet = Record>; \ No newline at end of file +export type PackageDescription = { + groupId: string; + artifactId: string; + version: string; +} \ No newline at end of file From f7ca235db6037685ef63736306efaa3d7a72957d Mon Sep 17 00:00:00 2001 From: FluoriteCafe-work <202210574+FluoriteCafe-work@users.noreply.github.com> Date: Mon, 29 Sep 2025 17:46:01 +0800 Subject: [PATCH 6/9] fix: return an object rather than array --- src/upgrade/assessmentManager.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/upgrade/assessmentManager.ts b/src/upgrade/assessmentManager.ts index bc342e7c..059fe9b4 100644 --- a/src/upgrade/assessmentManager.ts +++ b/src/upgrade/assessmentManager.ts @@ -31,7 +31,7 @@ function getVersionRange(versions: Set) : string { return `${versionList[0]}|${versionList[versionList.length - 1]}`; } -function collectVersionRange(pkgs: PackageDescription[]): [string, string][] { +function collectVersionRange(pkgs: PackageDescription[]): Record { const versionMap: Record> = {}; for (const pkg of pkgs) { const groupId = pkg.groupId; @@ -41,7 +41,7 @@ function collectVersionRange(pkgs: PackageDescription[]): [string, string][] { versionMap[groupId].add(pkg.version); } - return Object.entries(versionMap).map(([groupId, versions]) => [groupId, getVersionRange(versions)]); + return Object.fromEntries(Object.entries(versionMap).map(([groupId, versions]) => [groupId, getVersionRange(versions)])); } function getJavaIssues(data: INodeData): UpgradeIssue[] { @@ -124,7 +124,7 @@ async function getDependencyIssues(projectNode: INodeData): Promise Boolean(x)); const versionRangeByGroupId = collectVersionRange(packages.filter(getPackageUpgradeMetadata)); - if (versionRangeByGroupId.length > 0) { + if (Object.keys(versionRangeByGroupId).length > 0) { sendInfo("", { operationName: "java.dependency.assessmentManager.getDependencyIssues", versionRangeByGroupId: JSON.stringify(versionRangeByGroupId), From a5d25c780715400956fc67ba2d92ba979be98e8a Mon Sep 17 00:00:00 2001 From: FluoriteCafe-work <202210574+FluoriteCafe-work@users.noreply.github.com> Date: Thu, 9 Oct 2025 10:52:25 +0800 Subject: [PATCH 7/9] chore: lint --- src/upgrade/assessmentManager.ts | 3 +-- src/upgrade/type.ts | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/upgrade/assessmentManager.ts b/src/upgrade/assessmentManager.ts index 059fe9b4..d588d516 100644 --- a/src/upgrade/assessmentManager.ts +++ b/src/upgrade/assessmentManager.ts @@ -4,8 +4,7 @@ import * as semver from 'semver'; import { Jdtls } from "../java/jdtls"; import { NodeKind, type INodeData } from "../java/nodeData"; -import { UpgradeReason } from "./type"; -import type { DependencyCheckItem, UpgradeIssue, PackageDescription } from "./type"; +import { type DependencyCheckItem, type UpgradeIssue, type PackageDescription, UpgradeReason } from "./type"; import { DEPENDENCY_JAVA_RUNTIME } from "./dependency.metadata"; import { Upgrade } from '../constants'; import { buildPackageId } from './utility'; diff --git a/src/upgrade/type.ts b/src/upgrade/type.ts index 3698a998..f64c1fdc 100644 --- a/src/upgrade/type.ts +++ b/src/upgrade/type.ts @@ -34,4 +34,4 @@ export type PackageDescription = { groupId: string; artifactId: string; version: string; -} \ No newline at end of file +}; \ No newline at end of file From 123db3f6623e5aa45b058c14e741a45fdada8b78 Mon Sep 17 00:00:00 2001 From: FluoriteCafe-work <202210574+FluoriteCafe-work@users.noreply.github.com> Date: Thu, 9 Oct 2025 15:10:24 +0800 Subject: [PATCH 8/9] chore: rename opName for clarity --- src/upgrade/assessmentManager.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/upgrade/assessmentManager.ts b/src/upgrade/assessmentManager.ts index d588d516..e932a7c5 100644 --- a/src/upgrade/assessmentManager.ts +++ b/src/upgrade/assessmentManager.ts @@ -125,7 +125,7 @@ async function getDependencyIssues(projectNode: INodeData): Promise 0) { sendInfo("", { - operationName: "java.dependency.assessmentManager.getDependencyIssues", + operationName: "java.dependency.assessmentManager.getDependencyVersionRange", versionRangeByGroupId: JSON.stringify(versionRangeByGroupId), }); } @@ -141,7 +141,7 @@ async function getDependencyIssues(projectNode: INodeData): Promise Date: Thu, 9 Oct 2025 15:15:16 +0800 Subject: [PATCH 9/9] fix: Java version data --- src/upgrade/assessmentManager.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/upgrade/assessmentManager.ts b/src/upgrade/assessmentManager.ts index e932a7c5..7135a57b 100644 --- a/src/upgrade/assessmentManager.ts +++ b/src/upgrade/assessmentManager.ts @@ -50,6 +50,19 @@ function getJavaIssues(data: INodeData): UpgradeIssue[] { return []; } const currentSemVer = semver.coerce(javaVersion); + + const [javaRuntimeGroupId, javaRuntimeArtifactId] = Upgrade.PACKAGE_ID_FOR_JAVA_RUNTIME.split(":"); + sendInfo("", { + operationName: "java.dependency.assessmentManager.getJavaVersionRange", + versionRangeByGroupId: JSON.stringify( + collectVersionRange([{ + groupId: javaRuntimeGroupId, + artifactId: javaRuntimeArtifactId, + version: String(javaVersion), + }]), + ), + }); + if (currentSemVer && !semver.satisfies(currentSemVer, supportedVersion)) { return [{ ...DEPENDENCY_JAVA_RUNTIME,