@@ -42,13 +42,13 @@ public Integer install(
4242 @ CommandLine .Parameters (paramLabel = "existingJdkPath" , index = "1" , description = "Pre installed JDK path" , arity = "0..1" ) String path )
4343 throws IOException {
4444 JdkManager jdkMan = jdkProvidersMixin .getJdkManager ();
45- dev .jbang .devkitman .Jdk jdk = jdkMan .getInstalledJdk (versionOrId , JdkProvider .Predicates .canUpdate );
45+ dev .jbang .devkitman .Jdk jdk = jdkMan .getInstalledJdk (versionOrId , JdkProvider .Predicates .canInstall );
4646 if (force || jdk == null ) {
4747 if (!Util .isNullOrBlankString (path )) {
4848 jdkMan .linkToExistingJdk (Paths .get (path ), versionOrId );
4949 } else {
5050 if (jdk == null ) {
51- jdk = jdkMan .getJdk (versionOrId , JdkProvider .Predicates .canUpdate );
51+ jdk = jdkMan .getJdk (versionOrId , JdkProvider .Predicates .canInstall );
5252 if (jdk == null ) {
5353 throw new IllegalArgumentException ("JDK is not available for installation: " + versionOrId );
5454 }
@@ -67,14 +67,15 @@ public Integer install(
6767 @ CommandLine .Command (name = "list" , aliases = "l" , description = "Lists installed JDKs." )
6868 public Integer list (
6969 @ CommandLine .Option (names = {
70- "--available" }, description = "Shows versions available for installation" ) boolean available ,
70+ "--available" , "-a" }, description = "Shows versions available for installation" ) boolean available ,
7171 @ CommandLine .Option (names = {
72- "--show-details" }, description = "Shows detailed information for each JDK (only when format=text)" ) boolean details ,
72+ "--show-details" , "--details" ,
73+ "-d" }, description = "Shows detailed information for each JDK (only when format=text)" ) boolean details ,
7374 @ CommandLine .Option (names = {
7475 "--format" }, description = "Specify output format ('text' or 'json')" ) FormatMixin .Format format ) {
7576 JdkManager jdkMan = jdkProvidersMixin .getJdkManager ();
7677 dev .jbang .devkitman .Jdk defaultJdk = jdkMan .getDefaultJdk ();
77- int defMajorVersion = defaultJdk != null ? defaultJdk .majorVersion () : 0 ;
78+ String defVersion = defaultJdk != null ? defaultJdk .version () : "" ;
7879 PrintStream out = System .out ;
7980 List <? extends dev .jbang .devkitman .Jdk > jdks ;
8081 if (available ) {
@@ -86,11 +87,12 @@ public Integer list(
8687 .map (jdk -> new JdkOut (jdk .id (), jdk .version (), jdk .provider ().name (),
8788 jdk .isInstalled () ? ((dev .jbang .devkitman .Jdk .InstalledJdk ) jdk ).home () : null ,
8889 details ? jdk .equals (defaultJdk )
89- : jdk .majorVersion () == defMajorVersion ))
90+ : jdk .version ().equals (defVersion ),
91+ jdk .tags ()))
9092 .collect (Collectors .toList ());
9193 if (!details ) {
92- // Only keep a list of unique major versions
93- Set <JdkOut > uniqueJdks = new TreeSet <>(Comparator .comparingInt (j -> j .version ));
94+ // Only keep a list of unique versions
95+ Set <JdkOut > uniqueJdks = new TreeSet <>(Comparator .< JdkOut > comparingInt (j -> j .version ). reversed ( ));
9496 uniqueJdks .addAll (jdkOuts );
9597 jdkOuts = new ArrayList <>(uniqueJdks );
9698 }
@@ -106,12 +108,17 @@ public Integer list(
106108 out .print (" " );
107109 out .print (jdk .version );
108110 out .print (" (" );
109- out .print (jdk .fullVersion );
110111 if (details ) {
112+ out .print (jdk .fullVersion );
111113 out .print (", " + jdk .providerName + ", " + jdk .id );
112114 if (jdk .javaHomeDir != null ) {
113115 out .print (", " + jdk .javaHomeDir );
114116 }
117+ if (!jdk .tags .isEmpty ()) {
118+ out .print (", " + jdk .tags );
119+ }
120+ } else {
121+ out .print (available ? jdk .id : jdk .fullVersion );
115122 }
116123 out .print (")" );
117124 if (!available ) {
@@ -134,20 +141,40 @@ static class JdkOut implements Comparable<JdkOut> {
134141 String fullVersion ;
135142 String providerName ;
136143 String javaHomeDir ;
144+ String realHomeDir ;
137145 @ SerializedName ("default" )
138146 Boolean isDefault ;
147+ Set <String > tags ;
139148
140- public JdkOut (String id , String version , String providerName , Path home , boolean isDefault ) {
149+ public JdkOut (String id , String version , String providerName , Path home , boolean isDefault , Set < String > tags ) {
141150 this .id = id ;
142151 this .version = JavaUtil .parseJavaVersion (version );
143152 this .fullVersion = version ;
144153 this .providerName = providerName ;
145154 if (home != null ) {
146155 this .javaHomeDir = home .toString ();
156+ this .realHomeDir = home .toString ();
157+ try {
158+ this .realHomeDir = home .toRealPath ().toString ();
159+ } catch (IOException e ) {
160+ // Ignore
161+ }
147162 }
148163 if (isDefault ) {
149164 this .isDefault = true ;
150165 }
166+ this .tags = tags != null ? trimTags (tags ) : Collections .emptySet ();
167+ }
168+
169+ private Set <String > trimTags (Set <String > tags ) {
170+ Set <String > trimmedTags = new HashSet <>();
171+ for (String tag : tags ) {
172+ if (!tag .equalsIgnoreCase ("ga" )
173+ && !tag .equalsIgnoreCase ("jdk" )) {
174+ trimmedTags .add (tag .toLowerCase ());
175+ }
176+ }
177+ return trimmedTags ;
151178 }
152179
153180 @ Override
@@ -162,15 +189,20 @@ public int compareTo(JdkOut o) {
162189
163190 @ CommandLine .Command (name = "uninstall" , aliases = "u" , description = "Uninstalls an existing JDK." )
164191 public Integer uninstall (
165- @ CommandLine .Parameters (paramLabel = "version " , index = "0" , description = "The version to install" , arity = "1" ) String versionOrId ) {
192+ @ CommandLine .Parameters (paramLabel = "versionOrId " , index = "0" , description = "The version to install" , arity = "1" ) String versionOrId ) {
166193 JdkManager jdkMan = jdkProvidersMixin .getJdkManager ();
194+ // This will first select for JDKs from providers that can actually install JDKs
167195 dev .jbang .devkitman .Jdk .InstalledJdk jdk = jdkMan .getInstalledJdk (versionOrId ,
168- JdkProvider .Predicates .canUpdate );
196+ JdkProvider .Predicates .canInstall );
169197 if (jdk == null ) {
170- throw new ExitException (EXIT_INVALID_INPUT , "JDK " + versionOrId + " is not installed" );
198+ // If necessary we select JDKs from providers that can update JDKs
199+ jdk = jdkMan .getInstalledJdk (versionOrId , JdkProvider .Predicates .canUpdate );
200+ if (jdk == null ) {
201+ throw new ExitException (EXIT_INVALID_INPUT , "JDK " + versionOrId + " is not installed" );
202+ }
171203 }
172- jdkMan . uninstallJdk ( jdk );
173- Util .infoMsg ("Uninstalled JDK:\n " + versionOrId );
204+ jdk . uninstall ( );
205+ Util .infoMsg ("Uninstalled JDK:\n " + jdk . id () );
174206 return EXIT_OK ;
175207 }
176208
@@ -193,7 +225,7 @@ public Integer javaEnv(
193225 JdkManager jdkMan = jdkProvidersMixin .getJdkManager ();
194226 dev .jbang .devkitman .Jdk jdk = null ;
195227 if (versionOrId != null && JavaUtil .isRequestedVersion (versionOrId )) {
196- jdk = jdkMan .getJdk (versionOrId , JdkProvider .Predicates .canUpdate );
228+ jdk = jdkMan .getJdk (versionOrId , JdkProvider .Predicates .canInstall );
197229 }
198230 if (jdk == null || !jdk .isInstalled ()) {
199231 jdk = jdkMan .getOrInstallJdk (versionOrId );
@@ -273,7 +305,12 @@ public Integer exec(
273305
274306 @ CommandLine .Command (name = "default" , description = "Sets the default JDK to be used by JBang." )
275307 public Integer defaultJdk (
276- @ CommandLine .Parameters (paramLabel = "version" , index = "0" , description = "The version of the JDK to select" , arity = "0..1" ) String versionOrId ) {
308+ @ CommandLine .Parameters (paramLabel = "versionOrId" , index = "0" , description = "The version of the JDK to select" , arity = "0..1" ) String versionOrId ,
309+ @ CommandLine .Option (names = {
310+ "--show-details" , "--details" ,
311+ "-d" }, description = "Shows detailed information for each JDK (only when format=text)" ) boolean details ,
312+ @ CommandLine .Option (names = {
313+ "--format" }, description = "Specify output format ('text' or 'json')" ) FormatMixin .Format format ) {
277314 JdkManager jdkMan = jdkProvidersMixin .getJdkManager ();
278315 if (!jdkMan .hasDefaultProvider ()) {
279316 Util .warnMsg ("Cannot perform operation, the 'default' provider was not found" );
@@ -288,13 +325,41 @@ public Integer defaultJdk(
288325 Util .infoMsg ("Default JDK already set to " + defjdk .majorVersion ());
289326 }
290327 } else {
291- if (defjdk == null ) {
292- Util .infoMsg ("No default JDK set, use 'jbang jdk default <version>' to set one." );
328+ List <dev .jbang .devkitman .Jdk .InstalledJdk > jdks = jdkMan .listDefaultJdks ();
329+ List <JdkOut > jdkOuts = jdks .stream ()
330+ .map (jdk -> new JdkOut (jdk .id (), jdk .version (), jdk .provider ().name (), jdk .home (),
331+ jdk .id ().equals ("default" ), jdk .tags ()))
332+ .collect (Collectors .toList ());
333+ PrintStream out = System .out ;
334+ if (format == FormatMixin .Format .json ) {
335+ Gson parser = new GsonBuilder ().disableHtmlEscaping ().setPrettyPrinting ().create ();
336+ parser .toJson (jdkOuts , out );
293337 } else {
294- Util .infoMsg ("Default JDK is currently set to " + defjdk .majorVersion ());
338+ if (!jdkOuts .isEmpty ()) {
339+ out .println ("Default JDKs:" );
340+ jdkOuts .forEach (jdk -> {
341+ out .print (" " );
342+ if (Boolean .TRUE .equals (jdk .isDefault )) {
343+ out .print ("*" );
344+ } else {
345+ out .print (jdk .version );
346+ }
347+ out .print (" -> " );
348+ out .print (jdk .realHomeDir );
349+ if (details ) {
350+ out .print (" (" + jdk .fullVersion + ", " + jdk .id );
351+ if (!jdk .tags .isEmpty ()) {
352+ out .print (", " + jdk .tags );
353+ }
354+ out .print (")" );
355+ }
356+ out .println ();
357+ });
358+ } else {
359+ out .println ("No default JDK set, use 'jbang jdk default <version>' to set one." );
360+ }
295361 }
296362 }
297363 return EXIT_OK ;
298364 }
299-
300365}
0 commit comments