Skip to content

Commit ef44da3

Browse files
committed
fix graalvm asset not getting found + enhanced tests
1 parent 6321596 commit ef44da3

File tree

7 files changed

+93
-56
lines changed

7 files changed

+93
-56
lines changed

src/main/java/io/github/fvarrui/javapackager/packagers/Packager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ private void init() throws Exception {
136136
// Custom JDK path doesn't support native image
137137
// since there is currently no check to see if the JDK is GraalVM
138138
if(task.isNativeImage())
139-
throw new Exception("Custom JDK does not support native-image! Select "+ Const.graalvm+" as JDK vendor to fix this.");
139+
throw new Exception("Custom JDK does not support native-image! Set jdkPath to null instead of \""+task.getJdkPath()+"\" to fix this.");
140140
}
141141
if (!task.getJdkPath().exists()) {
142142
throw new Exception("JDK path doesn't exist: " + task.getJdkPath());

src/main/java/io/github/fvarrui/javapackager/utils/updater/Github.java

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -34,32 +34,10 @@ public static SearchResult searchUpdate(String repoName, String currentVersion,
3434
latestVersion = latestVersion.replaceAll("[^0-9.]", ""); // Before passing over remove everything except numbers and dots
3535
if (new UtilsVersion().isLatestBigger(currentVersion, latestVersion)) {
3636
updateAvailable = true;
37-
// Contains JsonObjects sorted by their asset-names lengths, from smallest to longest.
38-
// The following does that sorting.
39-
List<JsonObject> sortedArtifactObjects = new ArrayList<>();
40-
for (JsonElement e :
41-
latestRelease.getAsJsonArray("assets")) {
42-
JsonObject obj = e.getAsJsonObject();
43-
String name = obj.get("name").getAsString();
44-
if (sortedArtifactObjects.size() == 0) sortedArtifactObjects.add(obj);
45-
else {
46-
int finalIndex = 0;
47-
boolean isSmaller = false;
48-
for (int i = 0; i < sortedArtifactObjects.size(); i++) {
49-
String n = sortedArtifactObjects.get(i).get("name").getAsString();
50-
if (name.length() < n.length()) {
51-
isSmaller = true;
52-
finalIndex = i;
53-
break;
54-
}
55-
}
56-
if (!isSmaller) sortedArtifactObjects.add(obj);
57-
else sortedArtifactObjects.add(finalIndex, obj);
58-
}
59-
}
6037

6138
// Find asset-name containing our provided asset-name
62-
for (JsonObject obj : sortedArtifactObjects) {
39+
for (JsonElement el : latestRelease.getAsJsonArray("assets")) {
40+
JsonObject obj = el.getAsJsonObject();
6341
String name = obj.get("name").getAsString();
6442
if (assetNamePredicate.test(name)) {
6543
downloadFile = name;
@@ -70,8 +48,8 @@ public static SearchResult searchUpdate(String repoName, String currentVersion,
7048

7149
if (downloadUrl == null) {
7250
List<String> names = new ArrayList<>();
73-
for (JsonObject obj :
74-
sortedArtifactObjects) {
51+
for (JsonElement el : latestRelease.getAsJsonArray("assets")) {
52+
JsonObject obj = el.getAsJsonObject();
7553
String n = obj.get("name").getAsString();
7654
names.add(n);
7755
}
@@ -80,7 +58,8 @@ public static SearchResult searchUpdate(String repoName, String currentVersion,
8058

8159
// Determine sha256
8260
String expectedShaAssetName = downloadFile + ".sha256";
83-
for (JsonObject obj : sortedArtifactObjects) {
61+
for (JsonElement el : latestRelease.getAsJsonArray("assets")) {
62+
JsonObject obj = el.getAsJsonObject();
8463
String name = obj.get("name").getAsString();
8564
if (name.equals(expectedShaAssetName)) {
8665
sha256 = IOUtils.toString(new URL(obj.get("browser_download_url").getAsString()), StandardCharsets.UTF_8);

src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdater.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,22 +61,27 @@ public TaskJavaUpdater(Platform platform) {
6161
public void execute(String javaVersion, String javaVendor) throws Exception {
6262
Objects.requireNonNull(javaVersion);
6363
Objects.requireNonNull(javaVendor);
64+
Logger.info("Checking Java installation (looking for Java "+javaVersion+" by "+javaVendor+")...");
6465
if (javaVendor.equals(Const.graalvm)) {
65-
Logger.info("Checking java installation...");
6666

6767
String currentVersion = getBuildID(javaVersion, javaVendor);
6868
String osName = (platform.equals(Platform.linux) ? "linux" :
6969
platform.equals(Platform.mac) ? "darwin" :
7070
platform.equals(Platform.windows) ? "windows" :
7171
null);
7272
Objects.requireNonNull(osName);
73-
Pattern pattern = Pattern.compile("(java)(\\d+)"); // matches java11 or java17 for example
73+
7474
SearchResult result = Github.searchUpdate("graalvm/graalvm-ce-builds", currentVersion,
7575
assetName -> assetName.contains(osName)
7676
&& assetName.contains("amd64")
77-
&& new UtilsVersion().isLatestBiggerOrEqual(javaVersion, pattern.matcher(assetName).group())
7877
&& !assetName.endsWith(".sha256")
79-
&& !assetName.endsWith(".jar"));
78+
&& !assetName.endsWith(".jar")
79+
&& assetName.contains("java")
80+
&& new UtilsVersion().isLatestBiggerOrEqual(javaVersion,
81+
assetName.substring(assetName.indexOf("java"), assetName.indexOf("java") + 8)) // javaXXX
82+
//DOESNT WORK: Pattern pattern = Pattern.compile("(java\\d+)"); // matches java11 or java17 for example
83+
//&& new UtilsVersion().isLatestBiggerOrEqual(javaVersion, pattern.matcher(assetName).group())
84+
);
8085
if (result.exception != null) throw result.exception;
8186
if (!result.isUpdateAvailable) {
8287
Logger.info("Your Java installation is on the latest version!");
@@ -93,7 +98,6 @@ && new UtilsVersion().isLatestBiggerOrEqual(javaVersion, pattern.matcher(assetNa
9398
javaVersion, javaVendor);
9499

95100
} else if (javaVendor.equals(Const.adoptium)) {
96-
Logger.info("Checking java installation...");
97101

98102
AdoptV3API.OperatingSystemArchitectureType osArchitectureType = AdoptV3API.OperatingSystemArchitectureType.X64;
99103
int currentBuildId = Integer.parseInt(getBuildID(javaVersion, javaVendor));

src/test/java/io/github/fvarrui/javapackager/RealTest.java

Lines changed: 50 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
public class RealTest {
1313

1414
@Test
15-
void helloWorldMaven() throws Exception {
15+
void helloWorldMaven() throws Exception {
1616
publishPluginLocally();
1717
// PACKAGE MAVEN HELLO WORLD WITH CURRENT JAVA PACKAGER
1818
InvocationRequest request = new DefaultInvocationRequest();
@@ -25,55 +25,45 @@ void helloWorldMaven() throws Exception {
2525
request.addArg("-e");
2626
Invoker invoker = new DefaultInvoker();
2727
InvocationResult result = invoker.execute(request);
28-
if(result.getExitCode() != 0 || result.getExecutionException() != null)
28+
if (result.getExitCode() != 0 || result.getExecutionException() != null)
2929
throw new RuntimeException("Maven exit code != 0, see the cause below for details.", result.getExecutionException());
3030
}
3131

3232
@Test
33-
void helloWorldGradle() throws Exception {
33+
void helloWorldGradle() throws Exception {
3434
publishPluginLocally();
3535
// PACKAGE GRADLE HELLO WORLD WITH CURRENT JAVA PACKAGER
36-
if (getBuilder(getGradlew().getAbsolutePath(),
37-
"clean", "package", "-x", "test", "-x", "javadoc", "--stacktrace")
38-
.directory(new File(System.getProperty("user.dir") + "/test/hello-world-gradle"))
39-
.inheritIO().start().waitFor()
40-
!= 0) throw new Exception("Failed! Exit code is not 0, see details further below:");
36+
MyProcess p = new MyProcess(getGradlew().getAbsolutePath(),
37+
"clean", "package", "-x", "test", "-x", "javadoc", "--stacktrace");
38+
p.builder.directory(new File(System.getProperty("user.dir") + "/test/hello-world-gradle"));
39+
p.execNow();
4140
}
4241

4342
@Test
4443
void publishPluginLocally() throws Exception {
4544
System.out.println("Building and publishing plugin locally...");
4645
// PUBLISH CURRENT JAVA PACKAGER TO LOCAL MAVEN REPO TO BE USED BY THE HELLO WORLD PROJECTS
47-
if (getBuilder(getGradlew().getAbsolutePath(), "build", "publishToMavenLocal", "-x", "validatePlugins", "-x", "test", "-x", "javadoc", "--stacktrace")
48-
.start().waitFor()
49-
!= 0) throw new Exception("Failed! Exit code is not 0, see details further below:");
46+
MyProcess p = new MyProcess(getGradlew().getAbsolutePath(), "build", "publishToMavenLocal", "-x", "validatePlugins", "-x", "test", "-x", "javadoc", "--stacktrace");
47+
p.execNow();
5048
System.out.println("Successfully built and published plugin locally.");
5149
}
5250

53-
private File getGradlew(){
51+
private File getGradlew() {
5452
return new File(System.getProperty("user.dir") +
5553
"/gradlew" + (Platform.getCurrentPlatform() == Platform.windows ? ".bat" : ".sh"));
5654
}
5755

5856
private File findMavenHome() {
5957
File startDir;
60-
if(Platform.getCurrentPlatform() == Platform.windows){
58+
if (Platform.getCurrentPlatform() == Platform.windows) {
6159
startDir = new File(System.getProperty("user.home") + "\\.m2\\wrapper\\dists");
6260
return startDir.listFiles()[0].listFiles()[0].listFiles()[0];
63-
} else{ // LINUX OR MAC
61+
} else { // LINUX OR MAC
6462
// TODO
6563
throw new RuntimeException("Failed to determine maven home folder! Linux is currently not supported.");
6664
}
6765
}
6866

69-
private ProcessBuilder getBuilder(String... arguments) throws IOException {
70-
ProcessBuilder builder = new ProcessBuilder().command(arguments)
71-
.inheritIO();
72-
Map<String, String> environment = builder.environment();
73-
setValueIgnoreCase(environment, "JAVA_HOME", System.getProperty("java.home"));
74-
return builder;
75-
}
76-
7767
private String getValueIgnoreCase(Map<String, String> map, String key) {
7868
for (String _key : map.keySet()) {
7969
if (_key != null && _key.equalsIgnoreCase(key))
@@ -91,4 +81,42 @@ private void setValueIgnoreCase(Map<String, String> map, String key, String valu
9181
}
9282
}
9383

84+
class MyProcess {
85+
public ProcessBuilder builder;
86+
87+
public MyProcess(String... arguments) {
88+
this(new ProcessBuilder().command(arguments));
89+
}
90+
91+
public MyProcess(ProcessBuilder builder) {
92+
this.builder = builder;
93+
builder.inheritIO();
94+
Map<String, String> environment = builder.environment();
95+
setValueIgnoreCase(environment, "JAVA_HOME", System.getProperty("java.home"));
96+
}
97+
98+
public String commandToString() {
99+
StringBuilder sb = new StringBuilder();
100+
for (String s : builder.command()) {
101+
sb.append(s).append(" ");
102+
}
103+
return sb.toString();
104+
}
105+
106+
public void execNow() throws IOException, InterruptedException {
107+
try {
108+
StackTraceElement[] stackTrace = new Exception().getStackTrace();
109+
StackTraceElement stackEl = stackTrace[1];
110+
System.out.println(stackEl.toString()+" -> "+commandToString());
111+
Process p = builder.start();
112+
int result = p.waitFor();
113+
if (result != 0)
114+
throw new IOException("Process exited with " + result + " instead of 0! Something probably went wrong.");
115+
} catch (Throwable e) {
116+
System.err.println("Error during execution of: " + commandToString());
117+
throw e;
118+
}
119+
}
120+
}
121+
94122
}

src/test/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdaterTest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
import io.github.fvarrui.javapackager.model.Platform;
44
import org.junit.jupiter.api.Test;
55

6-
import static org.junit.jupiter.api.Assertions.*;
6+
import static org.junit.jupiter.api.Assertions.assertNotNull;
7+
import static org.junit.jupiter.api.Assertions.assertTrue;
78

89
class TaskJavaUpdaterTest {
910
@Test
@@ -14,6 +15,7 @@ void testWindows() throws Exception {
1415
assertTrue(taskJavaUpdater.jdkPath.listFiles().length != 0);
1516
System.out.println(taskJavaUpdater.jdkPath);
1617
}
18+
1719
@Test
1820
void testLinux() throws Exception {
1921
TaskJavaUpdater taskJavaUpdater = new TaskJavaUpdater(Platform.linux);
@@ -22,6 +24,7 @@ void testLinux() throws Exception {
2224
assertTrue(taskJavaUpdater.jdkPath.listFiles().length != 0);
2325
System.out.println(taskJavaUpdater.jdkPath);
2426
}
27+
2528
@Test
2629
void testMac() throws Exception {
2730
TaskJavaUpdater taskJavaUpdater = new TaskJavaUpdater(Platform.mac);
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.github.fvarrui.javapackager.utils.updater;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import static org.junit.jupiter.api.Assertions.assertFalse;
6+
import static org.junit.jupiter.api.Assertions.assertTrue;
7+
8+
class UtilsVersionTest {
9+
10+
@Test
11+
void isLatestBigger() {
12+
assertTrue(new UtilsVersion().isLatestBigger("v1.0.0", "v1.0.1"));
13+
assertFalse(new UtilsVersion().isLatestBigger("v1.0.0", "v1.0.0"));
14+
}
15+
16+
@Test
17+
void isLatestBiggerOrEqual() {
18+
assertTrue(new UtilsVersion().isLatestBiggerOrEqual("v1.0.0", "v1.0.1"));
19+
assertTrue(new UtilsVersion().isLatestBiggerOrEqual("v1.0.0", "v1.0.0"));
20+
}
21+
}

test/hello-world-gradle/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ javapackager {
3636
generateInstaller = true
3737
vmArgs = ["-Djava.library.path=."]
3838
administratorRequired = false
39+
nativeImage = true
40+
sharedLibrary = true
3941
}
4042

4143
task packageForWindows(type: GradlePackageTask, dependsOn: build) {

0 commit comments

Comments
 (0)