| package us.myles.ViaVersion.update; | |
| import org.apache.commons.lang.StringUtils; | |
| import java.util.regex.Matcher; | |
| import java.util.regex.Pattern; | |
| public class Version implements Comparable<Version> { | |
| private static Pattern semVer = Pattern.compile("(?<a>0|[1-9]\\d*)\\.(?<b>0|[1-9]\\d*)(?:\\.(?<c>0|[1-9]\\d*))?(?:-(?<tag>[A-z0-9.-]*))?"); | |
| private int[] parts = new int[3]; | |
| private String tag; | |
| public Version(String value) { | |
| if (value == null) | |
| throw new IllegalArgumentException("Version can not be null"); | |
| Matcher matcher = semVer.matcher(value); | |
| if (!matcher.matches()) | |
| throw new IllegalArgumentException("Invalid version format"); | |
| parts[0] = Integer.parseInt(matcher.group("a")); | |
| parts[1] = Integer.parseInt(matcher.group("b")); | |
| parts[2] = matcher.group("c") == null ? 0 : Integer.parseInt(matcher.group("c")); | |
| tag = matcher.group("tag") == null ? "" : matcher.group("tag"); | |
| } | |
| public static int compare(Version verA, Version verB) { | |
| if (verA == verB) return 0; | |
| if (verA == null) return -1; | |
| if (verB == null) return 1; | |
| int max = Math.max(verA.parts.length, verB.parts.length); | |
| for (int i = 0; i < max; i += 1) { | |
| int partA = i < verA.parts.length ? verA.parts[i] : 0; | |
| int partB = i < verB.parts.length ? verB.parts[i] : 0; | |
| if (partA < partB) return -1; | |
| if (partA > partB) return 1; | |
| } | |
| // Simple tag check | |
| if (verA.tag.length() == 0 && verB.tag.length() > 0) | |
| return 1; | |
| if (verA.tag.length() > 0 && verB.tag.length() == 0) | |
| return -1; | |
| return 0; | |
| } | |
| public static boolean equals(Version verA, Version verB) { | |
| return verA == verB || verA != null && verB != null && compare(verA, verB) == 0; | |
| } | |
| @Override | |
| public String toString() { | |
| String[] split = new String[parts.length]; | |
| for (int i = 0; i < parts.length; i += 1) | |
| split[i] = String.valueOf(parts[i]); | |
| return StringUtils.join(split, ".") + (tag.length() != 0 ? "-" + tag : ""); | |
| } | |
| @Override | |
| public int compareTo(Version that) { | |
| return compare(this, that); | |
| } | |
| @Override | |
| public boolean equals(Object that) { | |
| return that instanceof Version && equals(this, (Version) that); | |
| } | |
| public String getTag() { | |
| return tag; | |
| } | |
| } |