Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions src/main/java/dev/jbang/devkitman/JdkDistroQuery.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package dev.jbang.devkitman;

import java.util.List;
import java.util.Objects;

public interface JdkDistroQuery {
List<JdkDistro> listDistros();

class JdkDistro {
private final String name;

public JdkDistro(String name) {
this.name = name;
}

public String name() {
return name;
}

@Override
public final boolean equals(Object o) {
if (!(o instanceof JdkDistro))
return false;

JdkDistro jdkDistro = (JdkDistro) o;
return Objects.equals(name, jdkDistro.name);
}

@Override
public int hashCode() {
return Objects.hashCode(name);
}

@Override
public String toString() {
return name;
}
}
}
2 changes: 1 addition & 1 deletion src/main/java/dev/jbang/devkitman/JdkInstaller.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
* JDKs on the user's system. They should be able to install and uninstall them
* at the user's request.
*/
public interface JdkInstaller {
public interface JdkInstaller extends JdkDistroQuery {

/**
* This method returns a set of JDKs that are available for installation.
Expand Down
10 changes: 9 additions & 1 deletion src/main/java/dev/jbang/devkitman/JdkManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import dev.jbang.devkitman.jdkproviders.LinkedJdkProvider;
import dev.jbang.devkitman.util.JavaUtils;

public class JdkManager {
public class JdkManager implements JdkDistroQuery {
public static final int DEFAULT_JAVA_VERSION = 21;
public final int defaultJavaVersion;

Expand Down Expand Up @@ -765,4 +765,12 @@ public boolean isCurrentJdkManaged() {
return providers(JdkProvider.Predicates.canUpdate)
.anyMatch(p -> p.getInstalledByPath(currentJdk) != null);
}

@Override
public List<JdkDistroQuery.JdkDistro> listDistros() {
return providers(JdkProvider.Predicates.canInstall)
.flatMap(p -> p instanceof JdkDistroQuery ? ((JdkDistroQuery) p).listDistros().stream() : Stream.empty())
.distinct()
.collect(Collectors.toList());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,12 @@ public class FoojayJdkInstaller implements JdkInstaller {
protected final JdkProvider jdkProvider;
protected final Function<JdkResult, String> jdkId;
protected RemoteAccessProvider remoteAccessProvider;
protected String distro = DEFAULT_DISTRO;
protected String distros = DEFAULT_DISTROS;

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

public static final String DEFAULT_DISTRO = "temurin,aoj";
public static final String DEFAULT_DISTROS = "temurin,aoj";

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

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

public static class DistroResult {
public String name;
public String api_parameter;
}

public static class DistrosResponse {
public List<DistroResult> result;
}

public FoojayJdkInstaller(@NonNull JdkProvider jdkProvider) {
this.jdkProvider = jdkProvider;
this.jdkId = jdk -> determineId(jdk) + "-" + jdkProvider.name();
Expand All @@ -77,8 +87,8 @@ public FoojayJdkInstaller(@NonNull JdkProvider jdkProvider, @NonNull Function<Jd
return this;
}

public @NonNull FoojayJdkInstaller distro(String distro) {
this.distro = distro != null && !distro.isEmpty() ? distro : DEFAULT_DISTRO;
public @NonNull FoojayJdkInstaller distros(String distros) {
this.distros = distros != null && !distros.isEmpty() ? distros : DEFAULT_DISTROS;
return this;
}

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

private VersionsResponse readPackagesForList() throws IOException {
return readJsonFromUrl(
getVersionsUrl(0, true, OsUtils.getOS(), OsUtils.getArch(), distro, "ga,ea"));
return readVersionsFromUrl(
getVersionsUrl(0, true, OsUtils.getOS(), OsUtils.getArch(), distros, "ga,ea"));
}

@Override
Expand Down Expand Up @@ -129,11 +139,11 @@ private VersionsResponse readPackagesForList() throws IOException {
}

private VersionsResponse readPackagesForVersion(Integer minVersion, boolean openVersion) throws IOException {
VersionsResponse res = readJsonFromUrl(
getVersionsUrl(minVersion, openVersion, OsUtils.getOS(), OsUtils.getArch(), distro, "ga"));
VersionsResponse res = readVersionsFromUrl(
getVersionsUrl(minVersion, openVersion, OsUtils.getOS(), OsUtils.getArch(), distros, "ga"));
if (res.result.isEmpty()) {
res = readJsonFromUrl(
getVersionsUrl(minVersion, openVersion, OsUtils.getOS(), OsUtils.getArch(), distro, "ea"));
res = readVersionsFromUrl(
getVersionsUrl(minVersion, openVersion, OsUtils.getOS(), OsUtils.getArch(), distros, "ea"));
}
return res;
}
Expand Down Expand Up @@ -176,7 +186,7 @@ private Stream<Jdk.AvailableJdk> processPackages(List<JdkResult> jdks, Comparato
return tags;
}

private VersionsResponse readJsonFromUrl(String url) throws IOException {
private VersionsResponse readVersionsFromUrl(String url) throws IOException {
return RemoteAccessProvider.readJsonFromUrl(remoteAccessProvider(), url, VersionsResponse.class);
}

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

private Comparator<JdkResult> majorVersionSort() {
List<String> ds = Arrays.asList(distro.split(","));
List<String> ds = Arrays.asList(distros.split(","));
Comparator<JdkResult> jdkResultDistroComparator = Comparator.comparingInt(o -> ds.indexOf(o.distribution));
return Comparator
.comparingInt((JdkResult jdk) -> -jdk.major_version)
Expand Down Expand Up @@ -256,13 +266,27 @@ public void uninstall(Jdk.@NonNull InstalledJdk jdk) {
JavaUtils.safeDeleteJdk(jdk.home());
}

@Override
public List<JdkDistro> listDistros() {
try {
DistrosResponse response = RemoteAccessProvider.readJsonFromUrl(remoteAccessProvider(),
FOOJAY_JDK_DISTROS_URL, DistrosResponse.class);
return response.result.stream()
.map(d -> new JdkDistro(d.api_parameter))
.collect(Collectors.toList());
} catch (IOException e) {
LOGGER.log(Level.FINE, "Couldn't list available JDKs", e);
return Collections.emptyList();
}
}

private static String getVersionsUrl(int minVersion, boolean openVersion, OsUtils.OS os, OsUtils.Arch arch,
String distro, String status) {
return FOOJAY_JDK_VERSIONS_URL + getUrlParams(minVersion, openVersion, os, arch, distro, status);
String distros, String status) {
return FOOJAY_JDK_VERSIONS_URL + getUrlParams(minVersion, openVersion, os, arch, distros, status);
}

private static String getUrlParams(int version, boolean openVersion, OsUtils.OS os, OsUtils.Arch arch,
String distro, String status) {
String distros, String status) {
Map<String, String> params = new HashMap<>();
if (version > 0) {
String v = String.valueOf(version);
Expand All @@ -272,14 +296,14 @@ private static String getUrlParams(int version, boolean openVersion, OsUtils.OS
params.put("version", v);
}

if (distro == null) {
if (distros == null) {
if (version == 0 || version == 8 || version == 11 || version >= 17) {
distro = "temurin";
distros = "temurin";
} else {
distro = "aoj";
distros = "aoj";
}
}
params.put("distro", distro);
params.put("distro", distros);

String archiveType;
if (os == OsUtils.OS.windows) {
Expand Down Expand Up @@ -357,7 +381,7 @@ public static class Discovery implements JdkInstallers.Discovery {
@Override
public @NonNull JdkInstaller create(Config config) {
FoojayJdkInstaller installer = new FoojayJdkInstaller(config.jdkProvider());
installer.distro(config.properties().getOrDefault("distro", null));
installer.distros(config.properties().getOrDefault("distro", null));
HttpClientBuilder httpClientBuilder = NetUtils.createCachingHttpClientBuilder(config.cachePath());
RemoteAccessProvider rap = RemoteAccessProvider.createDefaultRemoteAccessProvider(httpClientBuilder);
installer.remoteAccessProvider(rap);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,30 @@ public static class MetadataResult {
public Integer size;
}

public static final List<JdkDistro> JDK_DISTROS = Arrays.asList(
new JdkDistro("adoptopenjdk"),
new JdkDistro("bisheng"),
new JdkDistro("corretto"),
new JdkDistro("dragonwell"),
new JdkDistro("graalvm"),
new JdkDistro("graalvm-community"),
new JdkDistro("ibm"),
new JdkDistro("java-se-ri"),
new JdkDistro("jetbrains"),
new JdkDistro("kona"),
new JdkDistro("liberica"),
new JdkDistro("mandrel"),
new JdkDistro("microsoft"),
new JdkDistro("openjdk"),
new JdkDistro("oracle"),
new JdkDistro("oracle-graalvm"),
new JdkDistro("redhat"),
new JdkDistro("sapmachine"),
new JdkDistro("semeru"),
new JdkDistro("temurin"),
new JdkDistro("trava"),
new JdkDistro("zulu"));

public MetadataJdkInstaller(@NonNull JdkProvider jdkProvider) {
this.jdkProvider = jdkProvider;
this.jdkId = jdk -> determineId(jdk) + "-" + jdkProvider.name();
Expand Down Expand Up @@ -332,6 +356,11 @@ public void uninstall(Jdk.@NonNull InstalledJdk jdk) {
JavaUtils.safeDeleteJdk(jdk.home());
}

@Override
public List<JdkDistro> listDistros() {
return JDK_DISTROS;
}

/**
* Constructs the metadata API URL for the given parameters Format:
* /metadata/{release_type}/{os}/{arch}/{image_type}/{jvm_impl}/{vendor}.json
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@

import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Stream;

import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.Nullable;

import dev.jbang.devkitman.Jdk;
import dev.jbang.devkitman.JdkDiscovery;
import dev.jbang.devkitman.JdkDistroQuery;
import dev.jbang.devkitman.JdkInstaller;
import dev.jbang.devkitman.JdkInstallers;
import dev.jbang.devkitman.JdkProvider;
Expand All @@ -21,7 +23,7 @@
* provided by the Java Metadata API. They get installed in the user's JBang
* folder.
*/
public class JBangJdkProvider extends BaseFoldersJdkProvider {
public class JBangJdkProvider extends BaseFoldersJdkProvider implements JdkDistroQuery {
protected JdkInstaller jdkInstaller;

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

@Override
public List<JdkDistro> listDistros() {
return jdkInstaller.listDistros();
}

@Override
public boolean canUpdate() {
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.Strictness;

public interface RemoteAccessProvider {

Expand All @@ -26,7 +27,7 @@ default <T> T resultFromUrl(String url, FunctionWithError<InputStream, T> stream
static <T> T readJsonFromUrl(RemoteAccessProvider rap, String url, Class<T> klass) throws IOException {
return rap.resultFromUrl(url, is -> {
try (InputStream ignored = is) {
Gson parser = new GsonBuilder().create();
Gson parser = new GsonBuilder().setStrictness(Strictness.LENIENT).create();
return parser.fromJson(new InputStreamReader(is), klass);
} catch (IOException e) {
throw new RuntimeException(e);
Expand Down
5 changes: 4 additions & 1 deletion src/test/java/dev/jbang/devkitman/BaseTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,9 @@ public <T> T resultFromUrl(
if (url.startsWith(FoojayJdkInstaller.FOOJAY_JDK_VERSIONS_URL)) {
return streamToObject.apply(
getClass().getResourceAsStream("/testFoojayInstall.json"));
} else if (url.startsWith(FoojayJdkInstaller.FOOJAY_JDK_DISTROS_URL)) {
return streamToObject.apply(
getClass().getResourceAsStream("/testFoojayDistros.json"));
} else if (url.startsWith(MetadataJdkInstaller.METADATA_BASE_URL)) {
return streamToObject.apply(
getClass().getResourceAsStream("/testMetadataInstall.json"));
Expand All @@ -236,7 +239,7 @@ public <T> T resultFromUrl(

JBangJdkProvider jbang = new JBangJdkProvider(config.installPath());
FoojayJdkInstaller installer = new FoojayJdkInstaller(jbang)
.distro("jbang")
.distros("jbang")
.remoteAccessProvider(rap);
installer.remoteAccessProvider(rap);
jbang.installer(installer);
Expand Down
9 changes: 9 additions & 0 deletions src/test/java/dev/jbang/devkitman/TestJdkManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -487,4 +487,13 @@ void testUninstallAll() {
jdks = jm.listInstalledJdks();
assertThat(jdks, empty());
}

@Test
public void testListDistros() {
JdkManager jm = jdkManager();
List<JdkDistroQuery.JdkDistro> distros = jm.listDistros();
assertThat(distros.size(), equalTo(30));
assertThat(distros.toString(), equalTo(
"[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]"));
}
}
Loading