From 8e64c8ec22d15674aac358d68b8803b104bc914a Mon Sep 17 00:00:00 2001 From: Slawomir Jaranowski Date: Tue, 13 Dec 2022 23:20:32 +0100 Subject: [PATCH] [MENFORCER-440] Allow 8 as JDK version for requireJavaVersion --- enforcer-rules/pom.xml | 5 +++ .../enforcer/AbstractVersionEnforcer.java | 2 +- .../plugins/enforcer/RequireJavaVersion.java | 24 ++++++++++++ .../src/site/apt/requireJavaVersion.apt.vm | 2 + .../enforcer/TestRequireJavaVersion.java | 38 ++++++++++++++++--- 5 files changed, 64 insertions(+), 7 deletions(-) diff --git a/enforcer-rules/pom.xml b/enforcer-rules/pom.xml index a974cd42..1116ce06 100644 --- a/enforcer-rules/pom.xml +++ b/enforcer-rules/pom.xml @@ -102,6 +102,11 @@ 2.2 test + + org.junit.jupiter + junit-jupiter-params + test + org.junit.jupiter junit-jupiter-engine diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractVersionEnforcer.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractVersionEnforcer.java index 5883ad1c..609de91d 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractVersionEnforcer.java +++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractVersionEnforcer.java @@ -159,7 +159,7 @@ public final String getVersion() { * * @param theVersion the required version to set */ - public final void setVersion(String theVersion) { + public void setVersion(String theVersion) { this.version = theVersion; } } diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireJavaVersion.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireJavaVersion.java index 624f1128..c682cc67 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireJavaVersion.java +++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireJavaVersion.java @@ -21,6 +21,8 @@ import java.util.Arrays; import java.util.Iterator; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.apache.commons.lang3.SystemUtils; import org.apache.maven.artifact.versioning.ArtifactVersion; import org.apache.maven.artifact.versioning.DefaultArtifactVersion; @@ -35,6 +37,28 @@ * @author Brian Fox */ public class RequireJavaVersion extends AbstractVersionEnforcer { + + private static final Pattern JDK8_VERSION_PATTERN = Pattern.compile("([\\[(,]?)(1\\.8|8)([]),]?)"); + + @Override + public void setVersion(String theVersion) { + + if ("8".equals(theVersion)) { + super.setVersion("1.8"); + return; + } + + Matcher matcher = JDK8_VERSION_PATTERN.matcher(theVersion); + + StringBuffer result = new StringBuffer(); + while (matcher.find()) { + matcher.appendReplacement(result, "$11.8$3"); + } + matcher.appendTail(result); + + super.setVersion(result.toString()); + } + @Override public void execute(EnforcerRuleHelper helper) throws EnforcerRuleException { String javaVersion = SystemUtils.JAVA_VERSION; diff --git a/enforcer-rules/src/site/apt/requireJavaVersion.apt.vm b/enforcer-rules/src/site/apt/requireJavaVersion.apt.vm index 1c0921f1..9b32b513 100644 --- a/enforcer-rules/src/site/apt/requireJavaVersion.apt.vm +++ b/enforcer-rules/src/site/apt/requireJavaVersion.apt.vm @@ -32,6 +32,8 @@ Require Java Version * message - an optional message to the user if the rule fails. * {{{../apidocs/org/apache/maven/plugins/enforcer/AbstractVersionEnforcer.html#version}version}} - {{{./versionRanges.html}range}} of allowed JDKs. + + For JDK 1.8 you can also use simple <<<8>>> as - it will be internally changed to <<<1.8>>> [] diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireJavaVersion.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireJavaVersion.java index 48bf29b6..d32441ef 100644 --- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireJavaVersion.java +++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireJavaVersion.java @@ -21,24 +21,28 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; +import java.util.stream.Stream; import org.apache.commons.lang3.SystemUtils; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; /** * The Class TestRequireJavaVersion. * * @author Brian Fox */ -public class TestRequireJavaVersion { +class TestRequireJavaVersion { /** * Test fix jdk version. */ @Test - public void testFixJDKVersion() { + void testFixJDKVersion() { // test that we only take the first 3 versions for // comparison assertThat(RequireJavaVersion.normalizeJDKVersion("1.5.0_11")).isEqualTo("1.5.0-11"); @@ -69,7 +73,7 @@ public void testFixJDKVersion() { * @throws EnforcerRuleException the enforcer rule exception */ @Test - public void settingsTheJavaVersionAsNormalizedVersionShouldNotFail() throws EnforcerRuleException { + void settingsTheJavaVersionAsNormalizedVersionShouldNotFail() throws EnforcerRuleException { String normalizedJDKVersion = RequireJavaVersion.normalizeJDKVersion(SystemUtils.JAVA_VERSION); RequireJavaVersion rule = new RequireJavaVersion(); @@ -83,7 +87,7 @@ public void settingsTheJavaVersionAsNormalizedVersionShouldNotFail() throws Enfo } @Test - public void excludingTheCurrentJavaVersionViaRangeThisShouldFailWithException() { + void excludingTheCurrentJavaVersionViaRangeThisShouldFailWithException() { assertThrows(EnforcerRuleException.class, () -> { String thisVersion = RequireJavaVersion.normalizeJDKVersion(SystemUtils.JAVA_VERSION); @@ -101,7 +105,7 @@ public void excludingTheCurrentJavaVersionViaRangeThisShouldFailWithException() @Test @Disabled // TODO: Think about the intention of this test? What should it prove? - public void thisShouldNotCrash() throws EnforcerRuleException { + void thisShouldNotCrash() throws EnforcerRuleException { RequireJavaVersion rule = new RequireJavaVersion(); rule.setVersion(SystemUtils.JAVA_VERSION); @@ -114,8 +118,30 @@ public void thisShouldNotCrash() throws EnforcerRuleException { * Test id. */ @Test - public void testId() { + void testId() { RequireJavaVersion rule = new RequireJavaVersion(); assertThat(rule.getCacheId()).isEqualTo("0"); } + + static Stream fixJava8ShortVersion() { + return Stream.of( + Arguments.of("1.8", "1.8"), + Arguments.of("8", "1.8"), + Arguments.of("8,)", "1.8,)"), + Arguments.of("[8,)", "[1.8,)"), + Arguments.of("(1.7,8]", "(1.7,1.8]"), + Arguments.of("[1.8,)", "[1.8,)"), + Arguments.of("(1.8,8]", "(1.8,1.8]"), + Arguments.of("(8,)", "(1.8,)"), + Arguments.of("[8]", "[1.8]"), + Arguments.of("(9,11],[8]", "(9,11],[1.8]")); + } + + @ParameterizedTest + @MethodSource + void fixJava8ShortVersion(String input, String expected) { + RequireJavaVersion requireJavaVersion = new RequireJavaVersion(); + requireJavaVersion.setVersion(input); + assertThat(requireJavaVersion.getVersion()).isEqualTo(expected); + } }