Skip to content

Commit 3da7c1a

Browse files
committed
fix: resolve SdkmanJdkProvider folder resolution
1 parent fa20762 commit 3da7c1a

2 files changed

Lines changed: 78 additions & 2 deletions

File tree

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,39 @@
22

33
import java.nio.file.Path;
44
import java.nio.file.Paths;
5+
import java.util.regex.Pattern;
56

67
import org.jspecify.annotations.NonNull;
78

89
import dev.jbang.devkitman.JdkDiscovery;
910
import dev.jbang.devkitman.JdkProvider;
11+
import dev.jbang.devkitman.util.FileUtils;
12+
import dev.jbang.devkitman.util.JavaUtils;
1013

1114
/**
1215
* This JDK provider detects any JDKs that have been installed using the SDKMAN
1316
* package manager.
1417
*/
1518
public class SdkmanJdkProvider extends BaseFoldersJdkProvider {
16-
private static final Path JDKS_ROOT = Paths.get(System.getProperty("user.home")).resolve(".sdkman/candidates/java");
19+
private static final Pattern VALID_SDKMAN_FOLDER_ID = Pattern.compile("^[a-zA-Z0-9._+-]+$");
1720

1821
public SdkmanJdkProvider() {
19-
super(JDKS_ROOT);
22+
super(Paths.get(System.getProperty("user.home")).resolve(Paths.get(".sdkman", "candidates", "java")));
2023
}
2124

2225
@Override
2326
public @NonNull String description() {
2427
return "The JDKs installed using the SDKMAN package manager.";
2528
}
2629

30+
@Override
31+
protected boolean acceptFolder(@NonNull Path jdkFolder) {
32+
return jdkFolder.startsWith(jdksRoot)
33+
&& VALID_SDKMAN_FOLDER_ID.matcher(jdkFolder.getFileName().toString()).matches()
34+
&& !FileUtils.isSameFolderLink(jdkFolder)
35+
&& JavaUtils.hasJavacCmd(jdkFolder);
36+
}
37+
2738
public static class Discovery implements JdkDiscovery {
2839
public static final String PROVIDER_ID = "sdkman";
2940

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package dev.jbang.devkitman.jdkproviders;
2+
3+
import static org.hamcrest.MatcherAssert.assertThat;
4+
import static org.hamcrest.Matchers.*;
5+
6+
import java.nio.file.Path;
7+
import java.nio.file.Paths;
8+
import java.util.List;
9+
import java.util.stream.Collectors;
10+
11+
import org.junit.jupiter.api.Test;
12+
import org.junit.jupiter.params.ParameterizedTest;
13+
import org.junit.jupiter.params.provider.CsvSource;
14+
15+
import dev.jbang.devkitman.BaseTest;
16+
import dev.jbang.devkitman.Jdk;
17+
import dev.jbang.devkitman.util.FileUtils;
18+
19+
public class SdkmanJdkProviderTest extends BaseTest {
20+
@ParameterizedTest
21+
@CsvSource({
22+
"25.0.1-tem,25.0.1,25+",
23+
"21-tem,21.0.7,21+",
24+
"25.0.2-zulu,25.0.2,25+",
25+
"25.0.2.fx-zulu,25.0.2,25+",
26+
"21.0.10-librca,21.0.10,21+",
27+
"25-graal,25,25+",
28+
"26.ea.13-graal,26.ea.13,26+",
29+
"22.1.0.1.r17-gln,22.1.0.1.r17,22+"
30+
})
31+
void testSdkmanProviderFindsInstalledJdkByVersionPattern(
32+
String folderName, String releaseVersion, String requestedVersion) {
33+
Path jdkHome = installSdkmanJdk(folderName, releaseVersion);
34+
Jdk.InstalledJdk jdk = jdkManager("sdkman").getInstalledJdk(requestedVersion);
35+
36+
assertThat(jdk, notNullValue());
37+
assertThat(jdk.provider(), instanceOf(SdkmanJdkProvider.class));
38+
assertThat(jdk.home(), is(jdkHome));
39+
assertThat(jdk.id(), is(folderName));
40+
}
41+
42+
@Test
43+
void testSdkmanProviderIgnoresCurrentSymlink() {
44+
installSdkmanJdk("25.0.1-tem", "25.0.1");
45+
Path jdkHome = sdkmanJdksRoot().resolve("25.0.1-tem");
46+
FileUtils.createLink(sdkmanJdksRoot().resolve("current"), jdkHome);
47+
48+
List<String> ids = jdkManager("sdkman").listInstalledJdks()
49+
.stream()
50+
.map(Jdk::id)
51+
.collect(Collectors.toList());
52+
assertThat(ids, hasSize(1));
53+
assertThat(ids, contains("25.0.1-tem"));
54+
}
55+
56+
private Path sdkmanJdksRoot() {
57+
return Paths.get(System.getProperty("user.home")).resolve(".sdkman/candidates/java");
58+
}
59+
60+
private Path installSdkmanJdk(String folderName, String releaseVersion) {
61+
Path jdkHome = sdkmanJdksRoot().resolve(folderName);
62+
initMockJdkDir(jdkHome, releaseVersion);
63+
return jdkHome;
64+
}
65+
}

0 commit comments

Comments
 (0)