Skip to content

Commit cb65009

Browse files
Calculate package version range for upgrade (#910)
* chore: add telemetry pre notification response * feat: check version range on in-scope groupIds * chore: lint * chore: update `operationName` on notification display Co-authored-by: Miller Wang <69189193+wangmingliang-ms@users.noreply.github.com> * chore: separate the check flows * fix: return an object rather than array * chore: lint * chore: rename opName for clarity * fix: Java version data --------- Co-authored-by: Miller Wang <69189193+wangmingliang-ms@users.noreply.github.com>
1 parent eb89297 commit cb65009

File tree

3 files changed

+84
-19
lines changed

3 files changed

+84
-19
lines changed

src/upgrade/assessmentManager.ts

Lines changed: 73 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,65 @@
44
import * as semver from 'semver';
55
import { Jdtls } from "../java/jdtls";
66
import { NodeKind, type INodeData } from "../java/nodeData";
7-
import { type DependencyCheckItem, UpgradeReason, type UpgradeIssue } from "./type";
7+
import { type DependencyCheckItem, type UpgradeIssue, type PackageDescription, UpgradeReason } from "./type";
88
import { DEPENDENCY_JAVA_RUNTIME } from "./dependency.metadata";
99
import { Upgrade } from '../constants';
1010
import { buildPackageId } from './utility';
1111
import metadataManager from './metadataManager';
1212
import { sendInfo } from 'vscode-extension-telemetry-wrapper';
1313

14+
function packageNodeToDescription(node: INodeData): PackageDescription | null {
15+
const version = node.metaData?.["maven.version"];
16+
const groupId = node.metaData?.["maven.groupId"];
17+
const artifactId = node.metaData?.["maven.artifactId"];
18+
if (!version || !groupId || !artifactId) {
19+
return null;
20+
}
21+
22+
return { version, groupId, artifactId };
23+
}
24+
25+
function getVersionRange(versions: Set<string>) : string {
26+
const versionList = [...versions].sort((a, b) => semver.compare(a, b));
27+
if (versionList.length === 1) {
28+
return versionList[0];
29+
}
30+
return `${versionList[0]}|${versionList[versionList.length - 1]}`;
31+
}
32+
33+
function collectVersionRange(pkgs: PackageDescription[]): Record<string, string> {
34+
const versionMap: Record<string, Set<string>> = {};
35+
for (const pkg of pkgs) {
36+
const groupId = pkg.groupId;
37+
if (!versionMap[groupId]) {
38+
versionMap[groupId] = new Set();
39+
}
40+
versionMap[groupId].add(pkg.version);
41+
}
42+
43+
return Object.fromEntries(Object.entries(versionMap).map(([groupId, versions]) => [groupId, getVersionRange(versions)]));
44+
}
45+
1446
function getJavaIssues(data: INodeData): UpgradeIssue[] {
1547
const javaVersion = data.metaData?.MaxSourceVersion as number | undefined;
1648
const { name, supportedVersion } = DEPENDENCY_JAVA_RUNTIME;
1749
if (!javaVersion) {
1850
return [];
1951
}
2052
const currentSemVer = semver.coerce(javaVersion);
53+
54+
const [javaRuntimeGroupId, javaRuntimeArtifactId] = Upgrade.PACKAGE_ID_FOR_JAVA_RUNTIME.split(":");
55+
sendInfo("", {
56+
operationName: "java.dependency.assessmentManager.getJavaVersionRange",
57+
versionRangeByGroupId: JSON.stringify(
58+
collectVersionRange([{
59+
groupId: javaRuntimeGroupId,
60+
artifactId: javaRuntimeArtifactId,
61+
version: String(javaVersion),
62+
}]),
63+
),
64+
});
65+
2166
if (currentSemVer && !semver.satisfies(currentSemVer, supportedVersion)) {
2267
return [{
2368
...DEPENDENCY_JAVA_RUNTIME,
@@ -31,7 +76,7 @@ function getJavaIssues(data: INodeData): UpgradeIssue[] {
3176
}
3277

3378
function getUpgradeForDependency(versionString: string, supportedVersionDefinition: DependencyCheckItem, packageId: string): UpgradeIssue | null {
34-
const { reason } = supportedVersionDefinition;
79+
const reason = supportedVersionDefinition.reason;
3580
switch (reason) {
3681
case UpgradeReason.DEPRECATED: {
3782
return {
@@ -59,17 +104,21 @@ function getUpgradeForDependency(versionString: string, supportedVersionDefiniti
59104
return null;
60105
}
61106

62-
function getDependencyIssue(data: INodeData): UpgradeIssue | null {
63-
const versionString = data.metaData?.["maven.version"];
64-
const groupId = data.metaData?.["maven.groupId"];
65-
const artifactId = data.metaData?.["maven.artifactId"];
107+
function getPackageUpgradeMetadata(pkg: PackageDescription): DependencyCheckItem | null {
108+
const { groupId, artifactId } = pkg;
66109
const packageId = buildPackageId(groupId, artifactId);
67-
const supportedVersionDefinition = metadataManager.getMetadataById(packageId);
68-
if (!versionString || !groupId || !supportedVersionDefinition) {
110+
return metadataManager.getMetadataById(packageId) ?? null;
111+
}
112+
113+
function getDependencyIssue(pkg: PackageDescription): UpgradeIssue | null {
114+
const supportedVersionDefinition = getPackageUpgradeMetadata(pkg);
115+
const version = pkg.version;
116+
if (!version || !supportedVersionDefinition) {
69117
return null;
70118
}
71-
72-
return getUpgradeForDependency(versionString, supportedVersionDefinition, packageId);
119+
const { groupId, artifactId } = pkg;
120+
const packageId = buildPackageId(groupId, artifactId);
121+
return getUpgradeForDependency(version, supportedVersionDefinition, packageId);
73122
}
74123

75124
async function getDependencyIssues(projectNode: INodeData): Promise<UpgradeIssue[]> {
@@ -78,13 +127,23 @@ async function getDependencyIssues(projectNode: INodeData): Promise<UpgradeIssue
78127
projectStructureData
79128
.filter(x => x.kind === NodeKind.Container)
80129
.map(async (packageContainer) => {
81-
const packages = await Jdtls.getPackageData({
130+
const packageNodes = await Jdtls.getPackageData({
82131
kind: NodeKind.Container,
83132
projectUri: projectNode.uri,
84133
path: packageContainer.path,
85134
});
86-
87-
return packages.map(getDependencyIssue).filter((x): x is UpgradeIssue => Boolean(x));
135+
const packages = packageNodes.map(packageNodeToDescription).filter((x): x is PackageDescription => Boolean(x));
136+
137+
const issues = packages.map(getDependencyIssue).filter((x): x is UpgradeIssue => Boolean(x));
138+
const versionRangeByGroupId = collectVersionRange(packages.filter(getPackageUpgradeMetadata));
139+
if (Object.keys(versionRangeByGroupId).length > 0) {
140+
sendInfo("", {
141+
operationName: "java.dependency.assessmentManager.getDependencyVersionRange",
142+
versionRangeByGroupId: JSON.stringify(versionRangeByGroupId),
143+
});
144+
}
145+
146+
return issues;
88147
})
89148
);
90149

@@ -95,7 +154,7 @@ async function getDependencyIssues(projectNode: INodeData): Promise<UpgradeIssue
95154
}
96155

97156
sendInfo("", {
98-
operationName: "java.dependency.assessmentManager.getDependencyIssues",
157+
operationName: "java.dependency.assessmentManager.getDependencyIssues.packageDataFailure",
99158
});
100159
return [];
101160
})
@@ -113,10 +172,6 @@ async function getWorkspaceIssues(workspaceFolderUri: string): Promise<UpgradeIs
113172
const projects = await Jdtls.getProjects(workspaceFolderUri);
114173
const projectsIssues = await Promise.allSettled(projects.map(async (projectNode) => {
115174
const issues = await getProjectIssues(projectNode);
116-
sendInfo("", {
117-
operationName: "java.dependency.assessmentManager.getWorkspaceIssues",
118-
issuesFoundForPackageId: JSON.stringify(issues.map(x => `${x.packageId}:${x.currentVersion}`)),
119-
});
120175
return issues;
121176
}));
122177

src/upgrade/display/notificationManager.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ class NotificationManager implements IUpgradeIssuesRenderer {
5353
const prompt = buildFixPrompt(issue);
5454
const notificationMessage = buildNotificationMessage(issue, hasExtension);
5555
const upgradeButtonText = hasExtension ? BUTTON_TEXT_UPGRADE : BUTTON_TEXT_INSTALL_AND_UPGRADE;
56+
57+
sendInfo(operationId, {
58+
operationName: "java.dependency.upgradeNotification.show",
59+
});
5660
const selection = await window.showInformationMessage(
5761
notificationMessage,
5862
upgradeButtonText,

src/upgrade/type.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,10 @@ export type UpgradeIssue = {
2828

2929
export interface IUpgradeIssuesRenderer {
3030
render(issues: UpgradeIssue[]): void;
31-
}
31+
}
32+
33+
export type PackageDescription = {
34+
groupId: string;
35+
artifactId: string;
36+
version: string;
37+
};

0 commit comments

Comments
 (0)