From 5a075590001e948cc63eaa5b374c79023f9f196b Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Sun, 27 Nov 2022 18:24:50 +0100 Subject: [PATCH] boot version validation logic now works with a list of releases that contain all releases instead of the latest one only --- .../ide/vscode/commons/java/Version.java | 22 +++- .../generations/VersionValidationUtils.java | 77 +++++++++---- .../generations/VersionValidators.java | 25 ++-- .../test/VersionValidationUtilsTest.java | 108 ++++++++++++++++++ 4 files changed, 200 insertions(+), 32 deletions(-) create mode 100644 headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/validation/test/VersionValidationUtilsTest.java diff --git a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/Version.java b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/Version.java index 2aeef0550..72e1ca556 100644 --- a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/Version.java +++ b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/Version.java @@ -10,6 +10,8 @@ *******************************************************************************/ package org.springframework.ide.vscode.commons.java; +import java.util.Objects; + public final class Version implements Comparable { private int major; @@ -74,6 +76,24 @@ public final class Version implements Comparable { } else { return major - o.major; } - } + } + + @Override + public int hashCode() { + return Objects.hash(major, minor, patch, qualifier); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Version other = (Version) obj; + return major == other.major && minor == other.minor && patch == other.patch + && Objects.equals(qualifier, other.qualifier); + } } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/VersionValidationUtils.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/VersionValidationUtils.java index bd46e1a73..7d473c0c7 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/VersionValidationUtils.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/VersionValidationUtils.java @@ -11,7 +11,6 @@ package org.springframework.ide.vscode.boot.validation.generations; import java.sql.Date; -import java.util.Collections; import java.util.List; import org.springframework.ide.vscode.boot.validation.generations.json.Generation; @@ -32,29 +31,67 @@ public class VersionValidationUtils { return currentDate.before(commercialEndDate); } - public static Version getNewerPatchVersion(ResolvedSpringProject springProject, Version version) throws Exception { - Version result = null; - List releases = springProject.getReleases(); - int found = Collections.binarySearch(releases, version); - int index = found < 0 ? -found - 1 : found + 1; - for (int i = index; i < releases.size() && releases.get(i).getMajor() == version.getMajor() && releases.get(i).getMinor() == version.getMinor(); i++) { - result = releases.get(i); - } - return result; - } - - public static Version getNewerMinorVersion(ResolvedSpringProject springProject, Version version) throws Exception { - return getNewerPatchVersion(springProject, new Version(version.getMajor(), version.getMinor() + 1, 0, null)); - } - - public static Version getNewerMajorVersion(ResolvedSpringProject springProject, Version version) throws Exception { - return getNewerPatchVersion(springProject, new Version(version.getMajor() + 1, 0, 0, null)); - } - public static Version getLatestSupportedRelease(ResolvedSpringProject springProject) throws Exception { List rls = springProject.getReleases(); return rls.isEmpty() ? null : rls.get(rls.size() - 1); } + + public static Version getNewestPatchRelease(List releases, Version version) { + Version result = version; + + for (Version release : releases) { + if (release.getMajor() == result.getMajor() + && release.getMinor() == result.getMinor() + && release.getPatch() > result.getPatch()) { + result = release; + } + } + + return result; + } + + public static Version getNewestMinorRelease(List releases, Version version) { + Version result = version; + + for (Version release : releases) { + if (release.getMajor() == result.getMajor() + && (release.getMinor() > result.getMinor() + || (release.getMinor() == result.getMinor() && release.getPatch() > result.getPatch()))) { + result = release; + } + } + + return result; + } + + public static Version getNewestMajorRelease(List releases, Version version) { + Version result = version; + + for (Version release : releases) { + if (release.getMajor() > result.getMajor() + || (release.getMajor() == result.getMajor() && release.getMinor() > result.getMinor()) + || (release.getMajor() == result.getMajor() && release.getMinor() == result.getMinor() && release.getPatch() > result.getPatch())) { + result = release; + } + } + + return result; + } + + public static Version getNewerLatestPatchRelease(List releases, Version version) { + Version newestPatch = getNewestPatchRelease(releases, version); + return newestPatch.equals(version) ? null : newestPatch; + } + + public static Version getNewerLatestMinorRelease(List releases, Version version) { + Version newestMinor = getNewestMinorRelease(releases, version); + return newestMinor.getMinor() == version.getMinor() ? null : newestMinor; + } + + public static Version getNewerLatestMajorRelease(List releases, Version version) { + Version newestMajor = getNewestMajorRelease(releases, version); + return newestMajor.getMajor() == version.getMajor() ? null : newestMajor; + } } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/VersionValidators.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/VersionValidators.java index 5ffa120cc..7fdc7e5a7 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/VersionValidators.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/VersionValidators.java @@ -141,21 +141,22 @@ public class VersionValidators { } } - private static class UpdateLatestMinorVersion extends AbstractDiagnosticValidator { + private static class UpdateLatestPatchVersion extends AbstractDiagnosticValidator { - public UpdateLatestMinorVersion(DiagnosticSeverityProvider diagnosticSeverityProvider) { + public UpdateLatestPatchVersion(DiagnosticSeverityProvider diagnosticSeverityProvider) { super(diagnosticSeverityProvider); } @Override public Diagnostic validate(ResolvedSpringProject springProject, IJavaProject javaProject, Generation javaProjectGen, Version javaProjectVersion) throws Exception { - Version latest = VersionValidationUtils.getNewerMinorVersion(springProject, javaProjectVersion); + Version latest = VersionValidationUtils.getNewerLatestPatchRelease(springProject.getReleases(), javaProjectVersion); + if (latest != null) { - VersionValidationProblemType problemType = VersionValidationProblemType.UPDATE_LATEST_MINOR_VERSION; + VersionValidationProblemType problemType = VersionValidationProblemType.UPDATE_LATEST_PATCH_VERSION; StringBuffer message = new StringBuffer(); - message.append("Newer minor version of Spring Boot available: "); + message.append("Newer patch version of Spring Boot available: "); message.append(latest.toString()); CodeAction ca = new CodeAction(); @@ -172,21 +173,22 @@ public class VersionValidators { } } - private static class UpdateLatestPatchVersion extends AbstractDiagnosticValidator { + private static class UpdateLatestMinorVersion extends AbstractDiagnosticValidator { - public UpdateLatestPatchVersion(DiagnosticSeverityProvider diagnosticSeverityProvider) { + public UpdateLatestMinorVersion(DiagnosticSeverityProvider diagnosticSeverityProvider) { super(diagnosticSeverityProvider); } @Override public Diagnostic validate(ResolvedSpringProject springProject, IJavaProject javaProject, Generation javaProjectGen, Version javaProjectVersion) throws Exception { - Version latest = VersionValidationUtils.getNewerPatchVersion(springProject, javaProjectVersion); + Version latest = VersionValidationUtils.getNewerLatestMinorRelease(springProject.getReleases(), javaProjectVersion); + if (latest != null) { - VersionValidationProblemType problemType = VersionValidationProblemType.UPDATE_LATEST_PATCH_VERSION; + VersionValidationProblemType problemType = VersionValidationProblemType.UPDATE_LATEST_MINOR_VERSION; StringBuffer message = new StringBuffer(); - message.append("Newer patch version of Spring Boot available: "); + message.append("Newer minor version of Spring Boot available: "); message.append(latest.toString()); CodeAction ca = new CodeAction(); @@ -212,7 +214,8 @@ public class VersionValidators { @Override public Diagnostic validate(ResolvedSpringProject springProject, IJavaProject javaProject, Generation javaProjectGen, Version javaProjectVersion) throws Exception { - Version latest = VersionValidationUtils.getNewerMajorVersion(springProject, javaProjectVersion); + Version latest = VersionValidationUtils.getNewerLatestMajorRelease(springProject.getReleases(), javaProjectVersion); + if (latest != null) { VersionValidationProblemType problemType = VersionValidationProblemType.UPDATE_LATEST_MAJOR_VERSION; diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/validation/test/VersionValidationUtilsTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/validation/test/VersionValidationUtilsTest.java new file mode 100644 index 000000000..e1038449f --- /dev/null +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/validation/test/VersionValidationUtilsTest.java @@ -0,0 +1,108 @@ +/******************************************************************************* + * Copyright (c) 2022 VMware, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VMware, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.boot.validation.test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +import java.util.Arrays; +import java.util.List; + +import org.junit.jupiter.api.Test; +import org.springframework.ide.vscode.boot.validation.generations.VersionValidationUtils; +import org.springframework.ide.vscode.commons.java.Version; + +public class VersionValidationUtilsTest { + + final List releases = Arrays.asList( + new Version(1,5,3,"RELEASE"), + new Version(1,5,10,"RELEASE"), + new Version(1,5,12,"RELEASE"), + new Version(2,0,0,null), + new Version(2,0,3,null), + new Version(2,1,6,null), + new Version(2,4,15,null), + new Version(2,5,21,null), + new Version(2,6,10,null), + new Version(2,6,18,null), + new Version(2,7,3,null), + new Version(2,7,6,null), + new Version(3,0,0,null) + ); + + @Test + void testFindNewestPatchRelease() { + assertEquals(new Version(1,5,12,"RELEASE"), VersionValidationUtils.getNewestPatchRelease(releases, new Version(1,5,3, "RELEASE"))); + assertEquals(new Version(1,4,3, null), VersionValidationUtils.getNewestPatchRelease(releases, new Version(1,4,3, null))); + assertEquals(new Version(2,1,6,null), VersionValidationUtils.getNewestPatchRelease(releases, new Version(2,1,3, null))); + assertEquals(new Version(2,6,18,null), VersionValidationUtils.getNewestPatchRelease(releases, new Version(2,6,5, null))); + assertEquals(new Version(3,0,0, null), VersionValidationUtils.getNewestPatchRelease(releases, new Version(3,0,0, null))); + assertEquals(new Version(3,0,1, null), VersionValidationUtils.getNewestPatchRelease(releases, new Version(3,0,1, null))); + } + + @Test + void testGetNewerLatestPatchRelease() { + assertEquals(new Version(1,5,12,"RELEASE"), VersionValidationUtils.getNewerLatestPatchRelease(releases, new Version(1,5,3, "RELEASE"))); + assertNull(VersionValidationUtils.getNewerLatestPatchRelease(releases, new Version(1,4,3, null))); + assertEquals(new Version(2,1,6,null), VersionValidationUtils.getNewerLatestPatchRelease(releases, new Version(2,1,3, null))); + assertEquals(new Version(2,6,18,null), VersionValidationUtils.getNewerLatestPatchRelease(releases, new Version(2,6,5, null))); + assertNull(VersionValidationUtils.getNewerLatestPatchRelease(releases, new Version(2,6,18, null))); + assertNull(VersionValidationUtils.getNewerLatestPatchRelease(releases, new Version(3,0,0, null))); + assertNull(VersionValidationUtils.getNewerLatestPatchRelease(releases, new Version(3,0,1, null))); + } + + @Test + void testFindNewestMinorRelease() { + assertEquals(new Version(1,5,12,"RELEASE"), VersionValidationUtils.getNewestMinorRelease(releases, new Version(1,5,3, "RELEASE"))); + assertEquals(new Version(1,5,12,"RELEASE"), VersionValidationUtils.getNewestMinorRelease(releases, new Version(1,4,3, "RELEASE"))); + assertEquals(new Version(2,7,6,null), VersionValidationUtils.getNewestMinorRelease(releases, new Version(2,1,3, null))); + assertEquals(new Version(2,7,6,null), VersionValidationUtils.getNewestMinorRelease(releases, new Version(2,6,5, null))); + assertEquals(new Version(2,7,6, null), VersionValidationUtils.getNewestMinorRelease(releases, new Version(2,7,3, null))); + assertEquals(new Version(2,7,6, null), VersionValidationUtils.getNewestMinorRelease(releases, new Version(2,7,6, null))); + assertEquals(new Version(3,0,0, null), VersionValidationUtils.getNewestMinorRelease(releases, new Version(3,0,0, null))); + assertEquals(new Version(3,0,1, null), VersionValidationUtils.getNewestMinorRelease(releases, new Version(3,0,1, null))); + } + + @Test + void testGetNewerLatestMinorRelease() { + assertNull(VersionValidationUtils.getNewerLatestMinorRelease(releases, new Version(1,5,3, "RELEASE"))); + assertEquals(new Version(1,5,12,"RELEASE"), VersionValidationUtils.getNewerLatestMinorRelease(releases, new Version(1,4,3, "RELEASE"))); + assertEquals(new Version(2,7,6,null), VersionValidationUtils.getNewerLatestMinorRelease(releases, new Version(2,1,3, null))); + assertEquals(new Version(2,7,6,null), VersionValidationUtils.getNewerLatestMinorRelease(releases, new Version(2,6,5, null))); + assertNull(VersionValidationUtils.getNewerLatestMinorRelease(releases, new Version(2,7,3, null))); + assertNull(VersionValidationUtils.getNewerLatestMinorRelease(releases, new Version(2,7,6, null))); + assertNull(VersionValidationUtils.getNewerLatestMinorRelease(releases, new Version(3,0,0, null))); + assertNull(VersionValidationUtils.getNewerLatestMinorRelease(releases, new Version(3,0,1, null))); + } + + @Test + void testFindNewestMajorRelease() { + assertEquals(new Version(3,0,0,null), VersionValidationUtils.getNewestMajorRelease(releases, new Version(1,5,3, "RELEASE"))); + assertEquals(new Version(3,0,0,null), VersionValidationUtils.getNewestMajorRelease(releases, new Version(1,4,3, null))); + assertEquals(new Version(3,0,0,null), VersionValidationUtils.getNewestMajorRelease(releases, new Version(2,1,3, null))); + assertEquals(new Version(3,0,0,null), VersionValidationUtils.getNewestMajorRelease(releases, new Version(2,6,5, null))); + assertEquals(new Version(3,0,0, null), VersionValidationUtils.getNewestMajorRelease(releases, new Version(3,0,0, null))); + assertEquals(new Version(3,0,1, null), VersionValidationUtils.getNewestMajorRelease(releases, new Version(3,0,1, null))); + assertEquals(new Version(4,1,3, null), VersionValidationUtils.getNewestMajorRelease(releases, new Version(4,1,3, null))); + } + + @Test + void testGetNewerLatestMajorRelease() { + assertEquals(new Version(3,0,0,null), VersionValidationUtils.getNewerLatestMajorRelease(releases, new Version(1,5,3, "RELEASE"))); + assertEquals(new Version(3,0,0,null), VersionValidationUtils.getNewerLatestMajorRelease(releases, new Version(1,4,3, null))); + assertEquals(new Version(3,0,0,null), VersionValidationUtils.getNewerLatestMajorRelease(releases, new Version(2,1,3, null))); + assertEquals(new Version(3,0,0,null), VersionValidationUtils.getNewerLatestMajorRelease(releases, new Version(2,6,5, null))); + assertNull(VersionValidationUtils.getNewerLatestMajorRelease(releases, new Version(3,0,0, null))); + assertNull(VersionValidationUtils.getNewerLatestMajorRelease(releases, new Version(3,0,1, null))); + assertNull(VersionValidationUtils.getNewerLatestMajorRelease(releases, new Version(4,1,3, null))); + } + +}