package beast.util; import beast.app.util.Version; /** * Note: this class has a natural ordering that is not necessarily * consistent with equals(). The definition of equals() tests for * equality of version strings, while (for example) compareTo() returns * 0 for versions with version strings "2.0" and "2". * * @author Tim Vaughan <tgvaughan@gmail.com> */ public class PackageVersion extends Version implements Comparable<PackageVersion> { String versionString; public PackageVersion(String versionString) { this.versionString = versionString; } @Override public String getVersion() { return versionString; } @Override public String getVersionString() { return versionString; } @Override public String getDateString() { return null; } @Override public String[] getCredits() { return null; } @Override public String toString() { return versionString; } @Override public int compareTo(PackageVersion otherVersion) { return compareVersionStrings(this.versionString, otherVersion.versionString); } /** * Compare package version strings. * * @param versionA first version string * @param versionB second version string * @return -1, 0 or 1 if versionA is less than, equal to or greater than versionB */ private int compareVersionStrings(String versionA, String versionB) { String[] partsA = versionA.split("\\."); String[] partsB = versionB.split("\\."); int n = Math.max(partsA.length, partsB.length); for (int i=0; i<n; i++) { int partAint, partBint; String partAstr, partBstr; if (i<partsA.length) { partAint = Integer.parseInt("0" + partsA[i].replaceAll("(^[0-9]*).*$", "$1")); partAstr = partsA[i].replaceAll("^[0-9]*(.*)$", "$1"); } else { partAint = 0; partAstr = ""; } if (i<partsB.length) { partBint = Integer.parseInt("0" + partsB[i].replaceAll("(^[0-9]*).*$", "$1")); partBstr = partsB[i].replaceAll("^[0-9]*(.*)$", "$1"); } else { partBint = 0; partBstr = ""; } if (partAint<partBint) return -1; if (partAint>partBint) return 1; // 1.0 > 1.0-alpha if (partAstr.isEmpty() && !partBstr.isEmpty()) return 1; // 1.0-alpha < 1.0 if (!partAstr.isEmpty() && partBstr.isEmpty()) return -1; int strComp = partAstr.compareTo(partBstr); if (strComp != 0) return strComp; } return 0; } /** * Compare with object o. * * @param o object with which to test for equality. * @return true iff the version strings are exactly equal. */ @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; PackageVersion that = (PackageVersion) o; return versionString.equals(that.versionString); } @Override public int hashCode() { return versionString.hashCode(); } }