Skip to content

Commit 8aeb565

Browse files
committed
feat: allow setting jdk default per version
Added a flag `--for-version` (or `-v`) to the `jdk default` command to allow setting the default Jdk to use for a specific major version. This is necessary now that we allow multiple Jdks of the same major version to be installed simultaneously.
1 parent 768980a commit 8aeb565

File tree

2 files changed

+55
-30
lines changed

2 files changed

+55
-30
lines changed

src/main/java/dev/jbang/cli/Jdk.java

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -77,19 +77,29 @@ public Integer list(
7777
dev.jbang.devkitman.Jdk defaultJdk = jdkMan.getDefaultJdk();
7878
String defVersion = defaultJdk != null ? defaultJdk.version() : "";
7979
PrintStream out = System.out;
80-
List<? extends dev.jbang.devkitman.Jdk> jdks;
80+
List<JdkOut> jdkOuts;
8181
if (available) {
82-
jdks = jdkMan.listAvailableJdks();
82+
List<dev.jbang.devkitman.Jdk.AvailableJdk> jdks = jdkMan.listAvailableJdks();
83+
jdkOuts = jdks.stream()
84+
.map(jdk -> new JdkOut(jdk.id(), jdk.version(), jdk.provider().name(),
85+
null, null,
86+
details ? jdk.equals(defaultJdk)
87+
: jdk.version().equals(defVersion),
88+
jdk.tags()))
89+
.collect(Collectors.toList());
8390
} else {
84-
jdks = jdkMan.listInstalledJdks();
91+
List<dev.jbang.devkitman.Jdk.InstalledJdk> jdks = jdkMan.listInstalledJdks();
92+
jdkOuts = jdks.stream()
93+
.map(jdk -> new JdkOut(jdk.id(), jdk.version(), jdk.provider().name(),
94+
jdk.home(),
95+
jdk instanceof dev.jbang.devkitman.Jdk.LinkedJdk
96+
? ((dev.jbang.devkitman.Jdk.LinkedJdk) jdk).linked().id()
97+
: null,
98+
details ? jdk.equals(defaultJdk)
99+
: jdk.version().equals(defVersion),
100+
jdk.tags()))
101+
.collect(Collectors.toList());
85102
}
86-
List<JdkOut> jdkOuts = jdks.stream()
87-
.map(jdk -> new JdkOut(jdk.id(), jdk.version(), jdk.provider().name(),
88-
jdk.isInstalled() ? ((dev.jbang.devkitman.Jdk.InstalledJdk) jdk).home() : null,
89-
details ? jdk.equals(defaultJdk)
90-
: jdk.version().equals(defVersion),
91-
jdk.tags()))
92-
.collect(Collectors.toList());
93103
if (!details) {
94104
// Only keep a list of unique versions
95105
Set<JdkOut> uniqueJdks = new TreeSet<>(Comparator.<JdkOut>comparingInt(j -> j.version).reversed());
@@ -142,11 +152,13 @@ static class JdkOut implements Comparable<JdkOut> {
142152
String providerName;
143153
String javaHomeDir;
144154
String realHomeDir;
155+
String linkedId;
145156
@SerializedName("default")
146157
Boolean isDefault;
147158
Set<String> tags;
148159

149-
public JdkOut(String id, String version, String providerName, Path home, boolean isDefault, Set<String> tags) {
160+
public JdkOut(String id, String version, String providerName, Path home, String linkedId, boolean isDefault,
161+
Set<String> tags) {
150162
this.id = id;
151163
this.version = JavaUtil.parseJavaVersion(version);
152164
this.fullVersion = version;
@@ -160,6 +172,7 @@ public JdkOut(String id, String version, String providerName, Path home, boolean
160172
// Ignore
161173
}
162174
}
175+
this.linkedId = linkedId;
163176
if (isDefault) {
164177
this.isDefault = true;
165178
}
@@ -306,6 +319,9 @@ public Integer exec(
306319
@CommandLine.Command(name = "default", description = "Sets the default JDK to be used by JBang.")
307320
public Integer defaultJdk(
308321
@CommandLine.Parameters(paramLabel = "versionOrId", index = "0", description = "The version of the JDK to select", arity = "0..1") String versionOrId,
322+
@CommandLine.Option(names = {
323+
"--for-version",
324+
"-v" }, description = "Sets the default for the specified major version") boolean forVersion,
309325
@CommandLine.Option(names = {
310326
"--show-details", "--details",
311327
"-d" }, description = "Shows detailed information for each JDK (only when format=text)") boolean details,
@@ -316,19 +332,25 @@ public Integer defaultJdk(
316332
Util.warnMsg("Cannot perform operation, the 'default' provider was not found");
317333
return EXIT_INVALID_INPUT;
318334
}
319-
dev.jbang.devkitman.Jdk.InstalledJdk defjdk = jdkMan.getDefaultJdk();
320335
if (versionOrId != null) {
321336
dev.jbang.devkitman.Jdk.InstalledJdk jdk = jdkMan.getOrInstallJdk(versionOrId);
337+
dev.jbang.devkitman.Jdk.InstalledJdk defjdk = forVersion
338+
? jdkMan.getDefaultJdkForVersion(jdk.majorVersion())
339+
: jdkMan.getDefaultJdk();
322340
if (defjdk == null || (!jdk.equals(defjdk) && !Objects.equals(jdk.home(), defjdk.home()))) {
323-
jdkMan.setDefaultJdk(jdk);
341+
if (forVersion) {
342+
jdkMan.setDefaultJdkForVersion(jdk);
343+
} else {
344+
jdkMan.setDefaultJdk(jdk);
345+
}
324346
} else {
325347
Util.infoMsg("Default JDK already set to " + defjdk.majorVersion());
326348
}
327349
} else {
328-
List<dev.jbang.devkitman.Jdk.InstalledJdk> jdks = jdkMan.listDefaultJdks();
350+
List<dev.jbang.devkitman.Jdk.LinkedJdk> jdks = jdkMan.listDefaultJdks();
329351
List<JdkOut> jdkOuts = jdks.stream()
330352
.map(jdk -> new JdkOut(jdk.id(), jdk.version(), jdk.provider().name(), jdk.home(),
331-
jdk.id().equals("default"), jdk.tags()))
353+
jdk.linked().id(), jdk.id().equals("default"), jdk.tags()))
332354
.collect(Collectors.toList());
333355
PrintStream out = System.out;
334356
if (format == FormatMixin.Format.json) {
@@ -345,13 +367,15 @@ public Integer defaultJdk(
345367
out.print(jdk.version);
346368
}
347369
out.print(" -> ");
348-
out.print(jdk.realHomeDir);
370+
out.print(jdk.linkedId);
349371
if (details) {
350-
out.print(" (" + jdk.fullVersion + ", " + jdk.id);
372+
out.print(" (" + jdk.realHomeDir + ", " + jdk.fullVersion + ", " + jdk.id);
351373
if (!jdk.tags.isEmpty()) {
352374
out.print(", " + jdk.tags);
353375
}
354376
out.print(")");
377+
} else {
378+
out.print(" (" + jdk.fullVersion + ")");
355379
}
356380
out.println();
357381
});

src/test/java/dev/jbang/cli/TestJdk.java

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ void testHasJdksInstalled() throws Exception {
5353

5454
assertThat(result.result, equalTo(SUCCESS_EXIT));
5555
assertThat(result.normalizedOut(),
56-
equalTo("Installed JDKs (<=default):\n 11 (11.0.7) <\n 12 (12.0.7)\n 13 (13.0.7)\n"));
56+
equalTo("Installed JDKs (<=default):\n 13 (13.0.7)\n 12 (12.0.7)\n 11 (11.0.7) <\n"));
5757
}
5858

5959
@Test
@@ -70,7 +70,7 @@ void testHasJdksInstalledWithJavaHome() throws Exception {
7070

7171
assertThat(result.result, equalTo(SUCCESS_EXIT));
7272
assertThat(result.normalizedOut(),
73-
equalTo("Installed JDKs (<=default):\n 11 (11.0.7) <\n 12 (12.0.7)\n 13 (13.0.7)\n"));
73+
equalTo("Installed JDKs (<=default):\n 13 (13.0.7)\n 12 (12.0.7)\n 11 (11.0.7) <\n"));
7474
}
7575

7676
@Test
@@ -86,30 +86,30 @@ void testJdksAvailable() throws Exception {
8686
void testDefault() throws Exception {
8787
Arrays.asList(11, 12, 13).forEach(this::createMockJdk);
8888

89-
CaptureResult<Integer> result = checkedRun(jdk -> jdk.defaultJdk("12", false, FormatMixin.Format.text));
89+
CaptureResult<Integer> result = checkedRun(jdk -> jdk.defaultJdk("12", false, false, FormatMixin.Format.text));
9090

9191
assertThat(result.result, equalTo(SUCCESS_EXIT));
9292
assertThat(result.normalizedErr(), startsWith("[jbang] Default JDK set to 12"));
9393

94-
result = checkedRun(jdk -> jdk.defaultJdk(null, false, FormatMixin.Format.text));
94+
result = checkedRun(jdk -> jdk.defaultJdk(null, false, false, FormatMixin.Format.text));
9595

9696
assertThat(result.result, equalTo(SUCCESS_EXIT));
97-
assertThat(result.normalizedErr(), equalTo("[jbang] Default JDK is currently set to 12\n"));
97+
assertThat(result.normalizedOut(), containsString("* -> 12-jbang"));
9898
}
9999

100100
@Test
101101
void testDefaultPlus() throws Exception {
102102
Arrays.asList(11, 14, 17).forEach(this::createMockJdk);
103103

104-
CaptureResult<Integer> result = checkedRun(jdk -> jdk.defaultJdk("16+", false, FormatMixin.Format.text));
104+
CaptureResult<Integer> result = checkedRun(jdk -> jdk.defaultJdk("16+", false, false, FormatMixin.Format.text));
105105

106106
assertThat(result.result, equalTo(SUCCESS_EXIT));
107107
assertThat(result.normalizedErr(), startsWith("[jbang] Default JDK set to 17"));
108108

109-
result = checkedRun(jdk -> jdk.defaultJdk(null, false, FormatMixin.Format.text));
109+
result = checkedRun(jdk -> jdk.defaultJdk(null, false, false, FormatMixin.Format.text));
110110

111111
assertThat(result.result, equalTo(SUCCESS_EXIT));
112-
assertThat(result.normalizedErr(), equalTo("[jbang] Default JDK is currently set to 17\n"));
112+
assertThat(result.normalizedOut(), containsString("* -> 17-jbang"));
113113
}
114114

115115
@Test
@@ -233,17 +233,18 @@ void testDefaultWithJavaHome() throws Exception {
233233
initMockJdkDir(jdkPath, "12.0.7");
234234
environmentVariables.set("JAVA_HOME", jdkPath.toString());
235235

236-
CaptureResult<Integer> result = checkedRun((Jdk jdk) -> jdk.defaultJdk("12", false, FormatMixin.Format.text),
237-
"jdk", "--jdk-providers",
238-
"default,javahome,jbang");
236+
CaptureResult<Integer> result = checkedRun(
237+
(Jdk jdk) -> jdk.defaultJdk("12", false, false, FormatMixin.Format.text),
238+
"jdk", "--jdk-providers", "default,javahome,jbang");
239239

240240
assertThat(result.result, equalTo(SUCCESS_EXIT));
241241
assertThat(result.normalizedErr(), startsWith("[jbang] Default JDK set to 12"));
242242

243-
result = checkedRun(jdk -> jdk.defaultJdk(null, false, FormatMixin.Format.text));
243+
result = checkedRun((Jdk jdk) -> jdk.defaultJdk(null, false, false, FormatMixin.Format.text),
244+
"jdk", "--jdk-providers", "default,javahome,jbang");
244245

245246
assertThat(result.result, equalTo(SUCCESS_EXIT));
246-
assertThat(result.normalizedErr(), equalTo("[jbang] Default JDK is currently set to 12\n"));
247+
assertThat(result.normalizedOut(), containsString("* -> javahome"));
247248
}
248249

249250
@Test

0 commit comments

Comments
 (0)