diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/ArtifactVersionDependencyVersion.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/ArtifactVersionDependencyVersion.java index 8ff9408ef9b..4c2b9df6d3c 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/ArtifactVersionDependencyVersion.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/ArtifactVersionDependencyVersion.java @@ -80,7 +80,7 @@ class ArtifactVersionDependencyVersion extends AbstractDependencyVersion { return this.artifactVersion.toString(); } - private Optional extractArtifactVersionDependencyVersion( + protected Optional extractArtifactVersionDependencyVersion( DependencyVersion other) { ArtifactVersionDependencyVersion artifactVersion = null; if (other instanceof ArtifactVersionDependencyVersion) { diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/CalendarVersionDependencyVersion.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/CalendarVersionDependencyVersion.java new file mode 100644 index 00000000000..a237ac3af4c --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/CalendarVersionDependencyVersion.java @@ -0,0 +1,63 @@ +/* + * Copyright 2012-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.build.bom.bomr.version; + +import java.util.regex.Pattern; + +import org.apache.maven.artifact.versioning.ArtifactVersion; +import org.apache.maven.artifact.versioning.ComparableVersion; +import org.apache.maven.artifact.versioning.DefaultArtifactVersion; + +/** + * A specialization of {@link ArtifactVersionDependencyVersion} for calendar versions. + * Calendar versions are always considered to be newer than + * {@link ReleaseTrainDependencyVersion release train versions}. + * + * @author Andy Wilkinson + */ +class CalendarVersionDependencyVersion extends ArtifactVersionDependencyVersion { + + private static final Pattern CALENDAR_VERSION_PATTERN = Pattern.compile("\\d{4}\\.\\d+\\.\\d+(-.+)?"); + + protected CalendarVersionDependencyVersion(ArtifactVersion artifactVersion) { + super(artifactVersion); + } + + protected CalendarVersionDependencyVersion(ArtifactVersion artifactVersion, ComparableVersion comparableVersion) { + super(artifactVersion, comparableVersion); + } + + @Override + public boolean isNewerThan(DependencyVersion other) { + if (other instanceof ReleaseTrainDependencyVersion) { + return true; + } + return super.isNewerThan(other); + } + + static CalendarVersionDependencyVersion parse(String version) { + if (!CALENDAR_VERSION_PATTERN.matcher(version).matches()) { + return null; + } + ArtifactVersion artifactVersion = new DefaultArtifactVersion(version); + if (artifactVersion.getQualifier() != null && artifactVersion.getQualifier().equals(version)) { + return null; + } + return new CalendarVersionDependencyVersion(artifactVersion); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/DependencyVersion.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/DependencyVersion.java index a344a5c0e68..a2a1acb57ee 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/DependencyVersion.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/DependencyVersion.java @@ -53,10 +53,10 @@ public interface DependencyVersion extends Comparable { boolean isSameMinorAndNewerThan(DependencyVersion other); static DependencyVersion parse(String version) { - List> parsers = Arrays.asList(ArtifactVersionDependencyVersion::parse, - ReleaseTrainDependencyVersion::parse, NumericQualifierDependencyVersion::parse, - CombinedPatchAndQualifierDependencyVersion::parse, LeadingZeroesDependencyVersion::parse, - UnstructuredDependencyVersion::parse); + List> parsers = Arrays.asList(CalendarVersionDependencyVersion::parse, + ArtifactVersionDependencyVersion::parse, ReleaseTrainDependencyVersion::parse, + NumericQualifierDependencyVersion::parse, CombinedPatchAndQualifierDependencyVersion::parse, + LeadingZeroesDependencyVersion::parse, UnstructuredDependencyVersion::parse); for (Function parser : parsers) { DependencyVersion result = parser.apply(version); if (result != null) { diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/ReleaseTrainDependencyVersion.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/ReleaseTrainDependencyVersion.java index b3626d19846..92e8a10f9d8 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/ReleaseTrainDependencyVersion.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/ReleaseTrainDependencyVersion.java @@ -64,6 +64,9 @@ final class ReleaseTrainDependencyVersion implements DependencyVersion { @Override public boolean isNewerThan(DependencyVersion other) { + if (other instanceof CalendarVersionDependencyVersion) { + return false; + } if (!(other instanceof ReleaseTrainDependencyVersion)) { return true; } @@ -78,6 +81,9 @@ final class ReleaseTrainDependencyVersion implements DependencyVersion { @Override public boolean isSameMinorAndNewerThan(DependencyVersion other) { + if (other instanceof CalendarVersionDependencyVersion) { + return false; + } if (!(other instanceof ReleaseTrainDependencyVersion)) { return true; } diff --git a/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/CalendarVersionDependencyVersionTests.java b/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/CalendarVersionDependencyVersionTests.java new file mode 100644 index 00000000000..ad675e39225 --- /dev/null +++ b/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/CalendarVersionDependencyVersionTests.java @@ -0,0 +1,138 @@ +/* + * Copyright 2012-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.build.bom.bomr.version; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link CalendarVersionDependencyVersion}. + * + * @author Andy Wilkinson + */ +public class CalendarVersionDependencyVersionTests { + + @Test + void parseWhenVersionIsNotACalendarVersionShouldReturnNull() { + assertThat(version("1.2.3")).isNull(); + } + + @Test + void parseWhenVersionIsACalendarVersionShouldReturnAVersion() { + assertThat(version("2020.0.0")).isNotNull(); + } + + @Test + void isNewerThanWhenInputIsEarlierYearShouldReturnTrue() { + assertThat(version("2020.1.2").isNewerThan(version("2019.9.0"))).isTrue(); + } + + @Test + void isNewerThanWhenInputIsOlderMinorShouldReturnTrue() { + assertThat(version("2020.1.2").isNewerThan(version("2020.0.2"))).isTrue(); + } + + @Test + void isNewerThanWhenInputIsOlderMicroShouldReturnTrue() { + assertThat(version("2020.1.2").isNewerThan(version("2020.1.1"))).isTrue(); + } + + @Test + void isNewerThanWhenInputIsLaterYearShouldReturnFalse() { + assertThat(version("2020.1.2").isNewerThan(version("2021.2.1"))).isFalse(); + } + + @Test + void isSameMajorAndNewerThanWhenMinorIsOlderShouldReturnTrue() { + assertThat(version("2020.10.2").isSameMajorAndNewerThan(version("2020.9.0"))).isTrue(); + } + + @Test + void isSameMajorAndNewerThanWhenMajorIsOlderShouldReturnFalse() { + assertThat(version("2020.0.2").isSameMajorAndNewerThan(version("2019.9.0"))).isFalse(); + } + + @Test + void isSameMajorAndNewerThanWhenMicroIsNewerShouldReturnTrue() { + assertThat(version("2020.1.2").isSameMajorAndNewerThan(version("2020.1.1"))).isTrue(); + } + + @Test + void isSameMajorAndNewerThanWhenMinorIsNewerShouldReturnFalse() { + assertThat(version("2020.1.2").isSameMajorAndNewerThan(version("2020.2.1"))).isFalse(); + } + + @Test + void isSameMajorAndNewerThanWhenMajorIsNewerShouldReturnFalse() { + assertThat(version("2019.1.2").isSameMajorAndNewerThan(version("2020.0.1"))).isFalse(); + } + + @Test + void isSameMinorAndNewerThanWhenMicroIsOlderShouldReturnTrue() { + assertThat(version("2020.10.2").isSameMinorAndNewerThan(version("2020.10.1"))).isTrue(); + } + + @Test + void isSameMinorAndNewerThanWhenMinorIsOlderShouldReturnFalse() { + assertThat(version("2020.1.2").isSameMinorAndNewerThan(version("2020.0.1"))).isFalse(); + } + + @Test + void isSameMinorAndNewerThanWhenVersionsAreTheSameShouldReturnFalse() { + assertThat(version("2020.1.2").isSameMinorAndNewerThan(version("2020.1.2"))).isFalse(); + } + + @Test + void isSameMinorAndNewerThanWhenMicroIsNewerShouldReturnFalse() { + assertThat(version("2020.1.2").isSameMinorAndNewerThan(version("2020.1.3"))).isFalse(); + } + + @Test + void isSameMinorAndNewerThanWhenMinorIsNewerShouldReturnFalse() { + assertThat(version("2020.1.2").isSameMinorAndNewerThan(version("2020.0.1"))).isFalse(); + } + + @Test + void isSameMinorAndNewerThanWhenMajorIsNewerShouldReturnFalse() { + assertThat(version("2020.1.2").isSameMinorAndNewerThan(version("2019.0.1"))).isFalse(); + } + + @Test + void calendarVersionIsNewerThanReleaseTrainVersion() { + assertThat(version("2020.0.0").isNewerThan(releaseTrainVersion("Aluminium-RELEASE"))).isTrue(); + } + + @Test + void calendarVersionIsNotSameMajorAsReleaseTrainVersion() { + assertThat(version("2020.0.0").isSameMajorAndNewerThan(releaseTrainVersion("Aluminium-RELEASE"))).isFalse(); + } + + @Test + void calendarVersionIsNotSameMinorAsReleaseTrainVersion() { + assertThat(version("2020.0.0").isSameMinorAndNewerThan(releaseTrainVersion("Aluminium-RELEASE"))).isFalse(); + } + + private ReleaseTrainDependencyVersion releaseTrainVersion(String version) { + return ReleaseTrainDependencyVersion.parse(version); + } + + private CalendarVersionDependencyVersion version(String version) { + return CalendarVersionDependencyVersion.parse(version); + } + +} diff --git a/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/DependencyVersionTests.java b/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/DependencyVersionTests.java index 567a55e4208..12fc79a8664 100644 --- a/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/DependencyVersionTests.java +++ b/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/DependencyVersionTests.java @@ -29,7 +29,7 @@ public class DependencyVersionTests { @Test void parseWhenValidMavenVersionShouldReturnArtifactVersionDependencyVersion() { - assertThat(DependencyVersion.parse("1.2.3.Final")).isInstanceOf(ArtifactVersionDependencyVersion.class); + assertThat(DependencyVersion.parse("1.2.3.Final")).isExactlyInstanceOf(ArtifactVersionDependencyVersion.class); } @Test @@ -52,4 +52,19 @@ public class DependencyVersionTests { assertThat(DependencyVersion.parse("4.0.0M4")).isInstanceOf(CombinedPatchAndQualifierDependencyVersion.class); } + @Test + void parseWhenCalendarVersionShouldReturnArticatVersionDependencyVersion() { + assertThat(DependencyVersion.parse("2020.0.0")).isInstanceOf(CalendarVersionDependencyVersion.class); + } + + @Test + void parseWhenCalendarVersionWithModifierShouldReturnArticatVersionDependencyVersion() { + assertThat(DependencyVersion.parse("2020.0.0-M1")).isInstanceOf(CalendarVersionDependencyVersion.class); + } + + @Test + void calendarVersionShouldBeNewerThanAReleaseCalendarVersion() { + + } + } diff --git a/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/ReleaseTrainDependencyVersionTests.java b/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/ReleaseTrainDependencyVersionTests.java index 6010bfd0750..7fb81de63ae 100644 --- a/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/ReleaseTrainDependencyVersionTests.java +++ b/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/ReleaseTrainDependencyVersionTests.java @@ -92,8 +92,27 @@ public class ReleaseTrainDependencyVersionTests { assertThat(version("Kay-SR6").isSameMinorAndNewerThan(version("Kay-SR7"))).isFalse(); } + @Test + void releaseTrainVersionIsNotNewerThanCalendarVersion() { + assertThat(version("Kay-SR6").isNewerThan(calendarVersion("2020.0.0"))).isFalse(); + } + + @Test + void releaseTrainVersionIsNotSameMajorAsCalendarTrainVersion() { + assertThat(version("Kay-SR6").isSameMajorAndNewerThan(calendarVersion("2020.0.0"))).isFalse(); + } + + @Test + void releaseTrainVersionIsNotSameMinorAsCalendarVersion() { + assertThat(version("Kay-SR6").isSameMinorAndNewerThan(calendarVersion("2020.0.0"))).isFalse(); + } + private static ReleaseTrainDependencyVersion version(String input) { return ReleaseTrainDependencyVersion.parse(input); } + private CalendarVersionDependencyVersion calendarVersion(String version) { + return CalendarVersionDependencyVersion.parse(version); + } + }