diff --git a/src/main/java/dev/jbang/devkitman/jdkproviders/SdkmanJdkProvider.java b/src/main/java/dev/jbang/devkitman/jdkproviders/SdkmanJdkProvider.java index 471a8f0..fe421eb 100644 --- a/src/main/java/dev/jbang/devkitman/jdkproviders/SdkmanJdkProvider.java +++ b/src/main/java/dev/jbang/devkitman/jdkproviders/SdkmanJdkProvider.java @@ -7,16 +7,18 @@ import dev.jbang.devkitman.JdkDiscovery; import dev.jbang.devkitman.JdkProvider; +import dev.jbang.devkitman.util.FileUtils; +import dev.jbang.devkitman.util.JavaUtils; /** * This JDK provider detects any JDKs that have been installed using the SDKMAN * package manager. */ public class SdkmanJdkProvider extends BaseFoldersJdkProvider { - private static final Path JDKS_ROOT = Paths.get(System.getProperty("user.home")).resolve(".sdkman/candidates/java"); + private static final Path JDKS_ROOT = Paths.get(".sdkman", "candidates", "java"); public SdkmanJdkProvider() { - super(JDKS_ROOT); + super(Paths.get(System.getProperty("user.home")).resolve(JDKS_ROOT)); } @Override @@ -24,6 +26,13 @@ public SdkmanJdkProvider() { return "The JDKs installed using the SDKMAN package manager."; } + @Override + protected boolean acceptFolder(@NonNull Path jdkFolder) { + return jdkFolder.startsWith(jdksRoot) + && !FileUtils.isSameFolderLink(jdkFolder) + && JavaUtils.hasJavacCmd(jdkFolder); + } + public static class Discovery implements JdkDiscovery { public static final String PROVIDER_ID = "sdkman"; diff --git a/src/test/java/dev/jbang/devkitman/jdkproviders/SdkmanJdkProviderTest.java b/src/test/java/dev/jbang/devkitman/jdkproviders/SdkmanJdkProviderTest.java new file mode 100644 index 0000000..7cb9e42 --- /dev/null +++ b/src/test/java/dev/jbang/devkitman/jdkproviders/SdkmanJdkProviderTest.java @@ -0,0 +1,68 @@ +package dev.jbang.devkitman.jdkproviders; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.notNullValue; + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.stream.Collectors; + +import org.hamcrest.Matchers; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import dev.jbang.devkitman.BaseTest; +import dev.jbang.devkitman.Jdk; +import dev.jbang.devkitman.util.FileUtils; + +public class SdkmanJdkProviderTest extends BaseTest { + @ParameterizedTest + @CsvSource({ + "25.0.1-tem,25.0.1,25+", + "21-tem,21.0.7,21+", + "25.0.2-zulu,25.0.2,25+", + "25.0.2.fx-zulu,25.0.2,25+", + "21.0.10-librca,21.0.10,21+", + "25-graal,25,25+", + "26.ea.13-graal,26.ea.13,26+", + "22.1.0.1.r17-gln,22.1.0.1.r17,22+" + }) + void testSdkmanProviderFindsInstalledJdkByVersionPattern( + String folderName, String releaseVersion, String requestedVersion) { + Path jdkHome = installSdkmanJdk(folderName, releaseVersion); + Jdk.InstalledJdk jdk = jdkManager("sdkman").getInstalledJdk(requestedVersion); + + assertThat(jdk, notNullValue()); + assertThat(jdk.provider(), instanceOf(SdkmanJdkProvider.class)); + assertThat(jdk.home(), Matchers.is(jdkHome)); + assertThat(jdk.id(), Matchers.is(folderName)); + } + + @Test + void testSdkmanProviderIgnoresCurrentSymlink() { + installSdkmanJdk("25.0.1-tem", "25.0.1"); + Path jdkHome = sdkmanJdksRoot().resolve("25.0.1-tem"); + FileUtils.createLink(sdkmanJdksRoot().resolve("current"), jdkHome); + + List ids = jdkManager("sdkman").listInstalledJdks() + .stream() + .map(Jdk::id) + .collect(Collectors.toList()); + assertThat(ids, hasSize(1)); + assertThat(ids, Matchers.contains("25.0.1-tem")); + } + + private Path sdkmanJdksRoot() { + return Paths.get(System.getProperty("user.home")).resolve(".sdkman/candidates/java"); + } + + private Path installSdkmanJdk(String folderName, String releaseVersion) { + Path jdkHome = sdkmanJdksRoot().resolve(folderName); + initMockJdkDir(jdkHome, releaseVersion); + return jdkHome; + } +}