boot version validation logic now works with a list of releases that contain all releases instead of the latest one only

This commit is contained in:
Martin Lippert
2022-11-27 18:24:50 +01:00
parent e4a2ee7905
commit 5a07559000
4 changed files with 200 additions and 32 deletions

View File

@@ -10,6 +10,8 @@
*******************************************************************************/
package org.springframework.ide.vscode.commons.java;
import java.util.Objects;
public final class Version implements Comparable<Version> {
private int major;
@@ -74,6 +76,24 @@ public final class Version implements Comparable<Version> {
} 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);
}
}

View File

@@ -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<Version> 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<Version> rls = springProject.getReleases();
return rls.isEmpty() ? null : rls.get(rls.size() - 1);
}
public static Version getNewestPatchRelease(List<Version> 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<Version> 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<Version> 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<Version> releases, Version version) {
Version newestPatch = getNewestPatchRelease(releases, version);
return newestPatch.equals(version) ? null : newestPatch;
}
public static Version getNewerLatestMinorRelease(List<Version> releases, Version version) {
Version newestMinor = getNewestMinorRelease(releases, version);
return newestMinor.getMinor() == version.getMinor() ? null : newestMinor;
}
public static Version getNewerLatestMajorRelease(List<Version> releases, Version version) {
Version newestMajor = getNewestMajorRelease(releases, version);
return newestMajor.getMajor() == version.getMajor() ? null : newestMajor;
}
}

View File

@@ -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;

View File

@@ -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<Version> 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)));
}
}