diff --git a/src/main/java/com/gluonhq/substrate/SubstrateDispatcher.java b/src/main/java/com/gluonhq/substrate/SubstrateDispatcher.java index bf01fe4a..14053a75 100644 --- a/src/main/java/com/gluonhq/substrate/SubstrateDispatcher.java +++ b/src/main/java/com/gluonhq/substrate/SubstrateDispatcher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2022, Gluon + * Copyright (c) 2019, 2023, Gluon * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -40,6 +40,7 @@ import com.gluonhq.substrate.util.Logger; import com.gluonhq.substrate.util.ProcessRunner; import com.gluonhq.substrate.util.Strings; +import com.gluonhq.substrate.util.Version; import java.io.BufferedReader; import java.io.IOException; @@ -378,8 +379,8 @@ public SubstrateDispatcher(Path buildRoot, ProjectConfiguration config) throws I System.out.println("Configuration: " + this.config); } - this.config.checkGraalVMVersion(); - this.config.checkGraalVMJavaVersion(); + Version javaVersion = this.config.checkGraalVMJavaVersion(); + this.config.checkGraalVMVersion(javaVersion); this.config.checkGraalVMVendor(); Triplet targetTriplet = config.getTargetTriplet(); diff --git a/src/main/java/com/gluonhq/substrate/model/InternalProjectConfiguration.java b/src/main/java/com/gluonhq/substrate/model/InternalProjectConfiguration.java index 7e5de20e..d560f674 100644 --- a/src/main/java/com/gluonhq/substrate/model/InternalProjectConfiguration.java +++ b/src/main/java/com/gluonhq/substrate/model/InternalProjectConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2022, Gluon + * Copyright (c) 2019, 2023, Gluon * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -474,25 +474,40 @@ public boolean usesJDK11() { * Check if the GraalVM provided by the configuration is supported * @throws IOException if the GraalVM version is older than the minimum supported version */ - public void checkGraalVMVersion() throws IOException { - Version graalVersion = getGraalVersion(); - if (graalVersion.compareTo(new Version(Constants.GRAALVM_MIN_VERSION)) < 0) { - throw new IOException("Current GraalVM version (" + graalVersion + ") not supported.\n" + - "Please upgrade to " + Constants.GRAALVM_MIN_VERSION + " or higher"); + public void checkGraalVMVersion(Version javaVersion) throws IOException { + if (isOldGraalVMVersioningScheme(javaVersion)) { + Version graalVersion = getGraalVersion(); + if (graalVersion.compareTo(new Version(Constants.GRAALVM_MIN_VERSION)) < 0) { + throw new IOException("Current GraalVM version (" + graalVersion + ") not supported.\n" + + "Please upgrade to " + Constants.GRAALVM_MIN_VERSION + " or higher"); + } else { + // TODO: check the GraalVM version whenever Constants.GRAALVM_MIN_VERSION is bumped and uses the new versioning system + } + } + } + + public boolean isOldGraalVMVersioningScheme(Version javaVersion) { + if (javaVersion.getMajor() == 17) { + // JDK 17 versions before 17.0.7 used the old versioning scheme + return javaVersion.compareTo(new Version(17, 0, 7)) < 0; } + // all other releases before JDK 20 use the old versioning + // staring from JDK 20, all releases follow the new versioning + return javaVersion.getMajor() < 20; } /** * Check if the GraalVM's java provided by the configuration is supported * @throws IOException if the GraalVM's java version is older than the minimum supported version */ - public void checkGraalVMJavaVersion() throws IOException { + public Version checkGraalVMJavaVersion() throws IOException { Version javaVersion = getGraalVMJavaVersion(); if (javaVersion.compareTo(new Version(Constants.GRAALVM_JAVA_MIN_VERSION)) < 0) { throw new IOException("Current GraalVM's java version (" + javaVersion + ") not supported.\n" + "Please upgrade to " + Constants.GRAALVM_JAVA_MIN_VERSION + " or higher"); } usesJDK11 = javaVersion.getMajor() == 11; + return javaVersion; } /** diff --git a/src/test/java/com/gluonhq/substrate/model/InternalProjectConfigurationTest.java b/src/test/java/com/gluonhq/substrate/model/InternalProjectConfigurationTest.java new file mode 100644 index 00000000..dedc03bf --- /dev/null +++ b/src/test/java/com/gluonhq/substrate/model/InternalProjectConfigurationTest.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2023, Gluon + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL GLUON BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.gluonhq.substrate.model; + +import com.gluonhq.substrate.ProjectConfiguration; +import com.gluonhq.substrate.util.Version; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +import static org.gradle.internal.impldep.org.junit.Assert.assertEquals; + +class InternalProjectConfigurationTest { + + @ParameterizedTest + @MethodSource("versioningSchemeParameters") + void testIsOldGraalVMVersioningScheme(String version, boolean usesOldScheme) { + Version javaVersion = new Version(version); + InternalProjectConfiguration config = new InternalProjectConfiguration(new ProjectConfiguration("", "")); + assertEquals(usesOldScheme, config.isOldGraalVMVersioningScheme(javaVersion)); + } + + static Stream versioningSchemeParameters() { + return Stream.of( + Arguments.of("11.0.0", true), + Arguments.of("12.0.0", true), + Arguments.of("13.0.0", true), + Arguments.of("14.0.0", true), + Arguments.of("15.0.0", true), + Arguments.of("16.0.0", true), + Arguments.of("17.0.0", true), + Arguments.of("17.0.6", true), + Arguments.of("17.0.7", false), + Arguments.of("17.0.8", false), + Arguments.of("17.0.9", false), + Arguments.of("18.0.0", true), + Arguments.of("19.0.0", true), + Arguments.of("20.0.1", false), + Arguments.of("21.0.0", false), + Arguments.of("21.0.1", false), + Arguments.of("21.0.2", false), + Arguments.of("22.0.0", false), + Arguments.of("22.0.1", false), + Arguments.of("22.0.2", false) + ); + } +}