java/de/jflex/version/Version.java (97 lines of code) (raw):
/*
* Copyright (C) 2014-2018 Gerwin Klein <lsf@jflex.de>
* Copyright (C) 2008-2019 Steve Rowe <sarowe@gmail.com>
* Copyright (C) 2017-2021 Google, LLC.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
package de.jflex.version;
import com.google.common.base.Objects;
import com.google.common.base.Splitter;
import java.util.Comparator;
import java.util.List;
public class Version {
public static final Comparator<Version> EXACT_VERSION_COMPARATOR = new ExactVersionComparator();
public static final Comparator<Version> MAJOR_MINOR_COMPARATOR =
new MajorMinorVersionComparator();
public final int major;
public final int minor;
public final int patch;
public Version(String version) {
List<String> parts = Splitter.on(".").splitToList(version);
this.major = Integer.parseInt(parts.get(0));
this.minor = parts.size() > 1 ? Integer.parseInt(parts.get(1)) : -1;
this.patch = parts.size() > 2 ? Integer.parseInt(parts.get(2)) : -1;
}
public Version(int major, int minor) {
this(major, minor, -1);
}
public Version(int major, int minor, int patch) {
this.major = major;
this.minor = minor;
this.patch = patch;
}
@Override
public boolean equals(Object o) {
if (!(o instanceof Version)) {
return false;
}
Version other = (Version) o;
return MAJOR_MINOR_COMPARATOR.compare(this, other) == 0;
}
@Override
public int hashCode() {
return Objects.hashCode(this.major, this.minor, this.patch);
}
@Override
public String toString() {
return makeString('.', true);
}
public int getMajor() {
return major;
}
public int getMinor() {
return minor;
}
public String toMajorMinorString() {
return makeString('.', false);
}
public String unicodeClassName() {
return "Unicode_" + makeString('_', false);
}
public String underscoreVersion() {
return makeString('_', true);
}
public boolean isAtLeast(String thresholdVersion) {
return Version.EXACT_VERSION_COMPARATOR.compare(this, new Version(thresholdVersion)) >= 0;
}
private String makeString(char sep, boolean includePatch) {
StringBuilder v = new StringBuilder();
v.append(major);
if (minor != -1) {
v.append(sep);
v.append(minor);
}
if (includePatch && minor != -1 && patch != -1) {
v.append(sep);
v.append(patch);
}
return v.toString();
}
static class MajorMinorVersionComparator implements Comparator<Version> {
@Override
public int compare(Version left, Version right) {
if (left.major != right.major) {
return Integer.compare(left.major, right.major);
}
if (left.minor != right.minor) {
return Integer.compare(left.minor, right.minor);
}
return 0;
}
}
private static class ExactVersionComparator implements Comparator<Version> {
@Override
public int compare(Version left, Version right) {
int majorMinorComp = MAJOR_MINOR_COMPARATOR.compare(left, right);
if (majorMinorComp == 0) {
return Integer.compare(left.patch, right.patch);
} else {
return majorMinorComp;
}
}
}
}