Skip to content

Commit ef0c480

Browse files
committed
feat: added the possibility to list distributions
1 parent a19e601 commit ef0c480

12 files changed

Lines changed: 481 additions & 33 deletions

File tree

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package dev.jbang.devkitman;
2+
3+
import java.util.List;
4+
import java.util.Objects;
5+
6+
public interface JdkDistroQuery {
7+
List<JdkDistro> listDistros();
8+
9+
class JdkDistro {
10+
private final String name;
11+
12+
public JdkDistro(String name) {
13+
this.name = name;
14+
}
15+
16+
public String name() {
17+
return name;
18+
}
19+
20+
@Override
21+
public final boolean equals(Object o) {
22+
if (!(o instanceof JdkDistro))
23+
return false;
24+
25+
JdkDistro jdkDistro = (JdkDistro) o;
26+
return Objects.equals(name, jdkDistro.name);
27+
}
28+
29+
@Override
30+
public int hashCode() {
31+
return Objects.hashCode(name);
32+
}
33+
34+
@Override
35+
public String toString() {
36+
return name;
37+
}
38+
}
39+
}

src/main/java/dev/jbang/devkitman/JdkInstaller.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
* JDKs on the user's system. They should be able to install and uninstall them
1212
* at the user's request.
1313
*/
14-
public interface JdkInstaller {
14+
public interface JdkInstaller extends JdkDistroQuery {
1515

1616
/**
1717
* This method returns a set of JDKs that are available for installation.

src/main/java/dev/jbang/devkitman/JdkManager.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import dev.jbang.devkitman.jdkproviders.LinkedJdkProvider;
1919
import dev.jbang.devkitman.util.JavaUtils;
2020

21-
public class JdkManager {
21+
public class JdkManager implements JdkDistroQuery {
2222
public static final int DEFAULT_JAVA_VERSION = 21;
2323
public final int defaultJavaVersion;
2424

@@ -765,4 +765,12 @@ public boolean isCurrentJdkManaged() {
765765
return providers(JdkProvider.Predicates.canUpdate)
766766
.anyMatch(p -> p.getInstalledByPath(currentJdk) != null);
767767
}
768+
769+
@Override
770+
public List<JdkDistroQuery.JdkDistro> listDistros() {
771+
return providers(JdkProvider.Predicates.canInstall)
772+
.flatMap(p -> p instanceof JdkDistroQuery ? ((JdkDistroQuery) p).listDistros().stream() : Stream.empty())
773+
.distinct()
774+
.collect(Collectors.toList());
775+
}
768776
}

src/main/java/dev/jbang/devkitman/jdkinstallers/FoojayJdkInstaller.java

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,12 @@ public class FoojayJdkInstaller implements JdkInstaller {
2929
protected final JdkProvider jdkProvider;
3030
protected final Function<JdkResult, String> jdkId;
3131
protected RemoteAccessProvider remoteAccessProvider;
32-
protected String distro = DEFAULT_DISTRO;
32+
protected String distros = DEFAULT_DISTROS;
3333

3434
public static final String FOOJAY_JDK_VERSIONS_URL = "https://api.foojay.io/disco/v3.0/packages?";
35+
public static final String FOOJAY_JDK_DISTROS_URL = "https://api.foojay.io/disco/v3.0/distributions?include_versions=false&include_synonyms=false";
3536

36-
public static final String DEFAULT_DISTRO = "temurin,aoj";
37+
public static final String DEFAULT_DISTROS = "temurin,aoj";
3738

3839
private static final Logger LOGGER = Logger.getLogger(FoojayJdkInstaller.class.getName());
3940

@@ -55,6 +56,15 @@ public static class VersionsResponse {
5556
public List<JdkResult> result;
5657
}
5758

59+
public static class DistroResult {
60+
public String name;
61+
public String api_parameter;
62+
}
63+
64+
public static class DistrosResponse {
65+
public List<DistroResult> result;
66+
}
67+
5868
public FoojayJdkInstaller(@NonNull JdkProvider jdkProvider) {
5969
this.jdkProvider = jdkProvider;
6070
this.jdkId = jdk -> determineId(jdk) + "-" + jdkProvider.name();
@@ -77,8 +87,8 @@ public FoojayJdkInstaller(@NonNull JdkProvider jdkProvider, @NonNull Function<Jd
7787
return this;
7888
}
7989

80-
public @NonNull FoojayJdkInstaller distro(String distro) {
81-
this.distro = distro != null && !distro.isEmpty() ? distro : DEFAULT_DISTRO;
90+
public @NonNull FoojayJdkInstaller distros(String distros) {
91+
this.distros = distros != null && !distros.isEmpty() ? distros : DEFAULT_DISTROS;
8292
return this;
8393
}
8494

@@ -95,8 +105,8 @@ public Stream<Jdk.AvailableJdk> listAvailable() {
95105
}
96106

97107
private VersionsResponse readPackagesForList() throws IOException {
98-
return readJsonFromUrl(
99-
getVersionsUrl(0, true, OsUtils.getOS(), OsUtils.getArch(), distro, "ga,ea"));
108+
return readVersionsFromUrl(
109+
getVersionsUrl(0, true, OsUtils.getOS(), OsUtils.getArch(), distros, "ga,ea"));
100110
}
101111

102112
@Override
@@ -129,11 +139,11 @@ private VersionsResponse readPackagesForList() throws IOException {
129139
}
130140

131141
private VersionsResponse readPackagesForVersion(Integer minVersion, boolean openVersion) throws IOException {
132-
VersionsResponse res = readJsonFromUrl(
133-
getVersionsUrl(minVersion, openVersion, OsUtils.getOS(), OsUtils.getArch(), distro, "ga"));
142+
VersionsResponse res = readVersionsFromUrl(
143+
getVersionsUrl(minVersion, openVersion, OsUtils.getOS(), OsUtils.getArch(), distros, "ga"));
134144
if (res.result.isEmpty()) {
135-
res = readJsonFromUrl(
136-
getVersionsUrl(minVersion, openVersion, OsUtils.getOS(), OsUtils.getArch(), distro, "ea"));
145+
res = readVersionsFromUrl(
146+
getVersionsUrl(minVersion, openVersion, OsUtils.getOS(), OsUtils.getArch(), distros, "ea"));
137147
}
138148
return res;
139149
}
@@ -176,7 +186,7 @@ private Stream<Jdk.AvailableJdk> processPackages(List<JdkResult> jdks, Comparato
176186
return tags;
177187
}
178188

179-
private VersionsResponse readJsonFromUrl(String url) throws IOException {
189+
private VersionsResponse readVersionsFromUrl(String url) throws IOException {
180190
return RemoteAccessProvider.readJsonFromUrl(remoteAccessProvider(), url, VersionsResponse.class);
181191
}
182192

@@ -209,7 +219,7 @@ private List<JdkResult> filterEA(List<JdkResult> jdks) {
209219
.compare(o1.java_version, o2.java_version);
210220

211221
private Comparator<JdkResult> majorVersionSort() {
212-
List<String> ds = Arrays.asList(distro.split(","));
222+
List<String> ds = Arrays.asList(distros.split(","));
213223
Comparator<JdkResult> jdkResultDistroComparator = Comparator.comparingInt(o -> ds.indexOf(o.distribution));
214224
return Comparator
215225
.comparingInt((JdkResult jdk) -> -jdk.major_version)
@@ -256,13 +266,27 @@ public void uninstall(Jdk.@NonNull InstalledJdk jdk) {
256266
JavaUtils.safeDeleteJdk(jdk.home());
257267
}
258268

269+
@Override
270+
public List<JdkDistro> listDistros() {
271+
try {
272+
DistrosResponse response = RemoteAccessProvider.readJsonFromUrl(remoteAccessProvider(),
273+
FOOJAY_JDK_DISTROS_URL, DistrosResponse.class);
274+
return response.result.stream()
275+
.map(d -> new JdkDistro(d.api_parameter))
276+
.collect(Collectors.toList());
277+
} catch (IOException e) {
278+
LOGGER.log(Level.FINE, "Couldn't list available JDKs", e);
279+
return Collections.emptyList();
280+
}
281+
}
282+
259283
private static String getVersionsUrl(int minVersion, boolean openVersion, OsUtils.OS os, OsUtils.Arch arch,
260-
String distro, String status) {
261-
return FOOJAY_JDK_VERSIONS_URL + getUrlParams(minVersion, openVersion, os, arch, distro, status);
284+
String distros, String status) {
285+
return FOOJAY_JDK_VERSIONS_URL + getUrlParams(minVersion, openVersion, os, arch, distros, status);
262286
}
263287

264288
private static String getUrlParams(int version, boolean openVersion, OsUtils.OS os, OsUtils.Arch arch,
265-
String distro, String status) {
289+
String distros, String status) {
266290
Map<String, String> params = new HashMap<>();
267291
if (version > 0) {
268292
String v = String.valueOf(version);
@@ -272,14 +296,14 @@ private static String getUrlParams(int version, boolean openVersion, OsUtils.OS
272296
params.put("version", v);
273297
}
274298

275-
if (distro == null) {
299+
if (distros == null) {
276300
if (version == 0 || version == 8 || version == 11 || version >= 17) {
277-
distro = "temurin";
301+
distros = "temurin";
278302
} else {
279-
distro = "aoj";
303+
distros = "aoj";
280304
}
281305
}
282-
params.put("distro", distro);
306+
params.put("distro", distros);
283307

284308
String archiveType;
285309
if (os == OsUtils.OS.windows) {
@@ -357,7 +381,7 @@ public static class Discovery implements JdkInstallers.Discovery {
357381
@Override
358382
public @NonNull JdkInstaller create(Config config) {
359383
FoojayJdkInstaller installer = new FoojayJdkInstaller(config.jdkProvider());
360-
installer.distro(config.properties().getOrDefault("distro", null));
384+
installer.distros(config.properties().getOrDefault("distro", null));
361385
HttpClientBuilder httpClientBuilder = NetUtils.createCachingHttpClientBuilder(config.cachePath());
362386
RemoteAccessProvider rap = RemoteAccessProvider.createDefaultRemoteAccessProvider(httpClientBuilder);
363387
installer.remoteAccessProvider(rap);

src/main/java/dev/jbang/devkitman/jdkinstallers/MetadataJdkInstaller.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,30 @@ public static class MetadataResult {
6464
public Integer size;
6565
}
6666

67+
public static final List<JdkDistro> JDK_DISTROS = Arrays.asList(
68+
new JdkDistro("adoptopenjdk"),
69+
new JdkDistro("bisheng"),
70+
new JdkDistro("corretto"),
71+
new JdkDistro("dragonwell"),
72+
new JdkDistro("graalvm"),
73+
new JdkDistro("graalvm-community"),
74+
new JdkDistro("ibm"),
75+
new JdkDistro("java-se-ri"),
76+
new JdkDistro("jetbrains"),
77+
new JdkDistro("kona"),
78+
new JdkDistro("liberica"),
79+
new JdkDistro("mandrel"),
80+
new JdkDistro("microsoft"),
81+
new JdkDistro("openjdk"),
82+
new JdkDistro("oracle"),
83+
new JdkDistro("oracle-graalvm"),
84+
new JdkDistro("redhat"),
85+
new JdkDistro("sapmachine"),
86+
new JdkDistro("semeru"),
87+
new JdkDistro("temurin"),
88+
new JdkDistro("trava"),
89+
new JdkDistro("zulu"));
90+
6791
public MetadataJdkInstaller(@NonNull JdkProvider jdkProvider) {
6892
this.jdkProvider = jdkProvider;
6993
this.jdkId = jdk -> determineId(jdk) + "-" + jdkProvider.name();
@@ -332,6 +356,11 @@ public void uninstall(Jdk.@NonNull InstalledJdk jdk) {
332356
JavaUtils.safeDeleteJdk(jdk.home());
333357
}
334358

359+
@Override
360+
public List<JdkDistro> listDistros() {
361+
return JDK_DISTROS;
362+
}
363+
335364
/**
336365
* Constructs the metadata API URL for the given parameters Format:
337366
* /metadata/{release_type}/{os}/{arch}/{image_type}/{jvm_impl}/{vendor}.json

src/main/java/dev/jbang/devkitman/jdkproviders/JBangJdkProvider.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22

33
import java.nio.file.Path;
44
import java.nio.file.Paths;
5+
import java.util.List;
56
import java.util.stream.Stream;
67

78
import org.jspecify.annotations.NonNull;
89
import org.jspecify.annotations.Nullable;
910

1011
import dev.jbang.devkitman.Jdk;
1112
import dev.jbang.devkitman.JdkDiscovery;
13+
import dev.jbang.devkitman.JdkDistroQuery;
1214
import dev.jbang.devkitman.JdkInstaller;
1315
import dev.jbang.devkitman.JdkInstallers;
1416
import dev.jbang.devkitman.JdkProvider;
@@ -21,7 +23,7 @@
2123
* provided by the Java Metadata API. They get installed in the user's JBang
2224
* folder.
2325
*/
24-
public class JBangJdkProvider extends BaseFoldersJdkProvider {
26+
public class JBangJdkProvider extends BaseFoldersJdkProvider implements JdkDistroQuery {
2527
protected JdkInstaller jdkInstaller;
2628

2729
public static final String DEFAULT_INSTALLER = "foojay";
@@ -71,6 +73,11 @@ public void uninstall(Jdk.@NonNull InstalledJdk jdk) {
7173
jdkInstaller.uninstall(jdk);
7274
}
7375

76+
@Override
77+
public List<JdkDistro> listDistros() {
78+
return jdkInstaller.listDistros();
79+
}
80+
7481
@Override
7582
public boolean canUpdate() {
7683
return true;

src/main/java/dev/jbang/devkitman/util/RemoteAccessProvider.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import com.google.gson.Gson;
1212
import com.google.gson.GsonBuilder;
13+
import com.google.gson.Strictness;
1314

1415
public interface RemoteAccessProvider {
1516

@@ -26,7 +27,7 @@ default <T> T resultFromUrl(String url, FunctionWithError<InputStream, T> stream
2627
static <T> T readJsonFromUrl(RemoteAccessProvider rap, String url, Class<T> klass) throws IOException {
2728
return rap.resultFromUrl(url, is -> {
2829
try (InputStream ignored = is) {
29-
Gson parser = new GsonBuilder().create();
30+
Gson parser = new GsonBuilder().setStrictness(Strictness.LENIENT).create();
3031
return parser.fromJson(new InputStreamReader(is), klass);
3132
} catch (IOException e) {
3233
throw new RuntimeException(e);

src/test/java/dev/jbang/devkitman/BaseTest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,9 @@ public <T> T resultFromUrl(
226226
if (url.startsWith(FoojayJdkInstaller.FOOJAY_JDK_VERSIONS_URL)) {
227227
return streamToObject.apply(
228228
getClass().getResourceAsStream("/testFoojayInstall.json"));
229+
} else if (url.startsWith(FoojayJdkInstaller.FOOJAY_JDK_DISTROS_URL)) {
230+
return streamToObject.apply(
231+
getClass().getResourceAsStream("/testFoojayDistros.json"));
229232
} else if (url.startsWith(MetadataJdkInstaller.METADATA_BASE_URL)) {
230233
return streamToObject.apply(
231234
getClass().getResourceAsStream("/testMetadataInstall.json"));
@@ -236,7 +239,7 @@ public <T> T resultFromUrl(
236239

237240
JBangJdkProvider jbang = new JBangJdkProvider(config.installPath());
238241
FoojayJdkInstaller installer = new FoojayJdkInstaller(jbang)
239-
.distro("jbang")
242+
.distros("jbang")
240243
.remoteAccessProvider(rap);
241244
installer.remoteAccessProvider(rap);
242245
jbang.installer(installer);

src/test/java/dev/jbang/devkitman/TestJdkManager.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,4 +487,13 @@ void testUninstallAll() {
487487
jdks = jm.listInstalledJdks();
488488
assertThat(jdks, empty());
489489
}
490+
491+
@Test
492+
public void testListDistros() {
493+
JdkManager jm = jdkManager();
494+
List<JdkDistroQuery.JdkDistro> distros = jm.listDistros();
495+
assertThat(distros.size(), equalTo(30));
496+
assertThat(distros.toString(), equalTo(
497+
"[zulu, trava, temurin, semeru_certified, semeru, sap_machine, redhat, oracle_open_jdk, oracle, openlogic, ojdk_build, microsoft, mandrel, liberica_native, liberica, kona, jetbrains, graalvm_community, graalvm_ce8, graalvm_ce19, graalvm_ce17, graalvm_ce16, graalvm_ce11, graalvm, gluon_graalvm, dragonwell, corretto, bisheng, aoj_openj9, aoj]"));
498+
}
490499
}

0 commit comments

Comments
 (0)