44import * as semver from 'semver' ;
55import { Jdtls } from "../java/jdtls" ;
66import { 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" ;
88import { DEPENDENCY_JAVA_RUNTIME } from "./dependency.metadata" ;
99import { Upgrade } from '../constants' ;
1010import { buildPackageId } from './utility' ;
1111import metadataManager from './metadataManager' ;
1212import { 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+
1446function 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
3378function 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
75124async 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
0 commit comments