Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add utility methods #41

Merged
merged 1 commit into from
Mar 30, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,12 @@
*/
package io.jenkins.lib.versionnumber;

import hudson.util.VersionNumber;

import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.util.VersionNumber;
import java.util.Collections;
import java.util.Map;
import java.util.NavigableMap;
import java.util.TreeMap;

/**
* Java Version Specification.
Expand All @@ -47,6 +50,39 @@ public class JavaSpecificationVersion extends VersionNumber {
public static final JavaSpecificationVersion JAVA_12 = new JavaSpecificationVersion("12");
public static final JavaSpecificationVersion JAVA_13 = new JavaSpecificationVersion("13");

private static final NavigableMap<Integer, Integer> RELEASE_TO_CLASS;
private static final NavigableMap<Integer, Integer> CLASS_TO_RELEASE;

static {
NavigableMap<Integer, Integer> releaseToClass = new TreeMap<>();
releaseToClass.put(1, 45);
releaseToClass.put(2, 46);
releaseToClass.put(3, 47);
releaseToClass.put(4, 48);
releaseToClass.put(5, 49);
releaseToClass.put(6, 50);
releaseToClass.put(7, 51);
releaseToClass.put(8, 52);
releaseToClass.put(9, 53);
releaseToClass.put(10, 54);
releaseToClass.put(11, 55);
releaseToClass.put(12, 56);
releaseToClass.put(13, 57);
releaseToClass.put(14, 58);
releaseToClass.put(15, 59);
releaseToClass.put(16, 60);
releaseToClass.put(17, 61);
releaseToClass.put(18, 62);
releaseToClass.put(19, 63);
RELEASE_TO_CLASS = Collections.unmodifiableNavigableMap(releaseToClass);

NavigableMap<Integer, Integer> classToRelease = new TreeMap<>();
for (Map.Entry<Integer, Integer> entry : releaseToClass.entrySet()) {
classToRelease.put(entry.getValue(), entry.getKey());
}
CLASS_TO_RELEASE = Collections.unmodifiableNavigableMap(classToRelease);
}

/**
* Constructor which automatically normalizes version strings.
* @param version Java specification version, should follow JEP-223 or the previous format.
Expand All @@ -57,6 +93,49 @@ public JavaSpecificationVersion(@NonNull String version)
super(normalizeVersion(version));
}

/**
* Given a release version, get the corresponding {@link JavaSpecificationVersion}.
*
* @param releaseVersion The release version; e.g., 8, 11, or 17.
* @return The {@link JavaSpecificationVersion}; e.g., 1.8, 11, or 17.
*/
public static JavaSpecificationVersion fromReleaseVersion(int releaseVersion) {
if (releaseVersion > 8) {
return new JavaSpecificationVersion(Integer.toString(releaseVersion));
} else {
return new JavaSpecificationVersion("1." + releaseVersion);
}
}

/**
* Get the corresponding release version.
*
* @return The release version; e.g., 8, 11, or 17.
*/
public int toReleaseVersion() {
int first = getDigitAt(0);
return first == 1 ? getDigitAt(1) : first;
}

/**
* Given a class file version, get the corresponding {@link JavaSpecificationVersion}.
*
* @param classVersion The class version; e.g., 52, 55, or 61.
* @return The {@link JavaSpecificationVersion}; e.g., 1.8, 11, or 17.
*/
public static JavaSpecificationVersion fromClassVersion(int classVersion) {
return fromReleaseVersion(CLASS_TO_RELEASE.get(classVersion));
}

/**
* Get the corresponding class file version.
*
* @return The class file version; e.g., 52, 55, or 61.
*/
public int toClassVersion() {
return RELEASE_TO_CLASS.get(toReleaseVersion());
}

@NonNull
private static String normalizeVersion(@NonNull String input)
throws NumberFormatException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,13 @@
*/
package io.jenkins.lib.versionnumber;

import org.junit.Assert;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThrows;
import static org.junit.Assert.assertTrue;

import org.junit.Test;
import org.jvnet.hudson.test.For;
import io.jenkins.lib.versionnumber.JavaSpecificationVersion;

/**
* Tests for {@link JavaSpecificationVersion}.
Expand Down Expand Up @@ -61,33 +64,61 @@ public void shouldResolveIncorrectSpecs() {

@Test
public void shouldCompareVersionsProperly() {
Assert.assertTrue(JavaSpecificationVersion.JAVA_5.isOlderThan(JavaSpecificationVersion.JAVA_6));
Assert.assertTrue(JavaSpecificationVersion.JAVA_6.isOlderThan(JavaSpecificationVersion.JAVA_7));
Assert.assertTrue(JavaSpecificationVersion.JAVA_7.isOlderThan(JavaSpecificationVersion.JAVA_8));
Assert.assertTrue(JavaSpecificationVersion.JAVA_8.isOlderThan(JavaSpecificationVersion.JAVA_9));
Assert.assertTrue(JavaSpecificationVersion.JAVA_8.isNewerThan(JavaSpecificationVersion.JAVA_7));
Assert.assertTrue(JavaSpecificationVersion.JAVA_9.isOlderThan(JavaSpecificationVersion.JAVA_10));
Assert.assertTrue(JavaSpecificationVersion.JAVA_10.isOlderThan(JavaSpecificationVersion.JAVA_11));
Assert.assertTrue(JavaSpecificationVersion.JAVA_10.isNewerThan(JavaSpecificationVersion.JAVA_8));
assertTrue(JavaSpecificationVersion.JAVA_5.isOlderThan(JavaSpecificationVersion.JAVA_6));
assertTrue(JavaSpecificationVersion.JAVA_6.isOlderThan(JavaSpecificationVersion.JAVA_7));
assertTrue(JavaSpecificationVersion.JAVA_7.isOlderThan(JavaSpecificationVersion.JAVA_8));
assertTrue(JavaSpecificationVersion.JAVA_8.isOlderThan(JavaSpecificationVersion.JAVA_9));
assertTrue(JavaSpecificationVersion.JAVA_8.isNewerThan(JavaSpecificationVersion.JAVA_7));
assertTrue(JavaSpecificationVersion.JAVA_9.isOlderThan(JavaSpecificationVersion.JAVA_10));
assertTrue(JavaSpecificationVersion.JAVA_10.isOlderThan(JavaSpecificationVersion.JAVA_11));
assertTrue(JavaSpecificationVersion.JAVA_10.isNewerThan(JavaSpecificationVersion.JAVA_8));
}

@Test
public void shouldRetrieveSpecVersionForTheCurrentJVM() {
System.out.println("Current JVM Specification Version: " + JavaSpecificationVersion.forCurrentJVM());
assertNotNull(JavaSpecificationVersion.forCurrentJVM());
}

@Test
public void invalidVersions() {
assertThrows(NumberFormatException.class, () -> new JavaSpecificationVersion("1.1.1"));
assertThrows(NumberFormatException.class, () -> new JavaSpecificationVersion("fubar"));
}

@Test
public void releaseVersion() {
assertEquals(new JavaSpecificationVersion("1.8"), JavaSpecificationVersion.fromReleaseVersion(8));
assertEquals(new JavaSpecificationVersion("11"), JavaSpecificationVersion.fromReleaseVersion(11));
assertEquals(new JavaSpecificationVersion("17"), JavaSpecificationVersion.fromReleaseVersion(17));

assertEquals(8, new JavaSpecificationVersion("1.8").toReleaseVersion());
assertEquals(11, new JavaSpecificationVersion("11").toReleaseVersion());
assertEquals(17, new JavaSpecificationVersion("17").toReleaseVersion());
}

@Test
public void classVersion() {
assertEquals(new JavaSpecificationVersion("1.8"), JavaSpecificationVersion.fromClassVersion(52));
assertEquals(new JavaSpecificationVersion("11"), JavaSpecificationVersion.fromClassVersion(55));
assertEquals(new JavaSpecificationVersion("17"), JavaSpecificationVersion.fromClassVersion(61));

assertEquals(52, new JavaSpecificationVersion("1.8").toClassVersion());
assertEquals(55, new JavaSpecificationVersion("11").toClassVersion());
assertEquals(61, new JavaSpecificationVersion("17").toClassVersion());
}

public void assertSpecEquals(JavaSpecificationVersion version, String value) {
JavaSpecificationVersion actualSpec = new JavaSpecificationVersion(value);
Assert.assertEquals("Wrong Java version", version, actualSpec);
assertEquals("Wrong Java version", version, actualSpec);
}

public void assertOlder(JavaSpecificationVersion version1, JavaSpecificationVersion version2) {
Assert.assertTrue(String.format("Version %s should be older than %s", version1, version2),
assertTrue(String.format("Version %s should be older than %s", version1, version2),
version1.isOlderThan(version2));
}

public void assertNewer(JavaSpecificationVersion version1, JavaSpecificationVersion version2) {
Assert.assertTrue(String.format("Version %s should be newer than %s", version1, version2),
assertTrue(String.format("Version %s should be newer than %s", version1, version2),
version1.isNewerThan(version2));
}
}