package com.nicewuerfel.blockown; import java.util.Arrays; public final class PluginVersion implements Comparable<PluginVersion> { private final int[] versionArr; private final String versionString; private final ReleaseChannel releaseChannel; /** * Instantiates a new PluginVersion object. * * @param versionString a String containing the version similar to "version 3.1.23.1" all * non-numeric characters will be removed from the String * @param releaseChannel the release type of this version */ public PluginVersion(String versionString, ReleaseChannel releaseChannel) { if (versionString == null) { throw new NullPointerException("versionString null"); } versionString = removeNonNumeric(versionString); this.releaseChannel = releaseChannel; if (versionString.isEmpty()) { throw new IllegalArgumentException(); } String[] split = versionString.split("\\."); versionArr = new int[split.length]; StringBuilder sb = new StringBuilder(split.length * 3); try { for (int i = 0; i < split.length; i++) { if (split[i].isEmpty()) { throw new IllegalArgumentException(); } versionArr[i] = Integer.parseInt(split[i]); sb.append(versionArr[i] + "."); } } catch (NumberFormatException e) { throw new IllegalArgumentException(); } sb.deleteCharAt(sb.length() - 1); this.versionString = sb.toString(); } /** * Gets the version in the form i[.i]* * * @return the version */ public String getVersion() { return versionString; } public ReleaseChannel getReleaseChannel() { return releaseChannel; } private String removeNonNumeric(String inputString) { StringBuilder output = new StringBuilder(); for (char c : inputString.toCharArray()) { if (Character.isDigit(c) || c == '.') { output.append(c); } } return output.toString(); } @Override public int compareTo(PluginVersion v2) { int index = 0; while (index < versionArr.length && index < v2.versionArr.length) { if (versionArr[index] > v2.versionArr[index]) { return 1; } else if (versionArr[index] < v2.versionArr[index]) { return -1; } index++; } // if both array index limits have been reached, check for release type if (index == v2.versionArr.length && index == versionArr.length) { if (releaseChannel == null) { return -1; } else if (v2.releaseChannel == null) { return 1; } else { return releaseChannel.compareTo(v2.releaseChannel); } } else { // if only one version array's limit has been reached, the other version // may be newer int index2 = index; while (index2 < versionArr.length) { if (versionArr[index2] != 0) { return 1; } index2++; } index2 = index; while (index2 < v2.versionArr.length) { if (v2.versionArr[index2] != 0) { return -1; } index2++; } // If there additional array elements are 0's only, the version // numbers are // the same, check for release type if (releaseChannel == null) { return -1; } else if (v2.releaseChannel == null) { return 1; } else { return releaseChannel.compareTo(v2.releaseChannel); } } } /** * Checks whether version is significantly newer than version2. * * @param version2 the other version * @param significance 0-based significance * @return True, if any of the version numbers with index equal or smaller i is bigger than the * version number of version2 with the same index */ public boolean isSignificantlyNewerThan(PluginVersion version2, int significance) { int index = 0; while (index <= significance && index < versionArr.length && index < version2.versionArr.length) { if (versionArr[index] > version2.versionArr[index]) { return true; } index++; } while (index <= significance && index < versionArr.length) { if (versionArr[index] != 0) { return true; } index++; } return false; } @Override public int hashCode() { final int prime = 61; int result = 7; result = prime * result + ((releaseChannel == null) ? 0 : releaseChannel.hashCode()); boolean nonZeroFound = false; for (int i = versionArr.length - 1; i >= 0; i--) { if (versionArr[i] != 0) { nonZeroFound = true; } if (nonZeroFound) { result = prime * result + versionArr[i]; } } return result; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } PluginVersion other = (PluginVersion) obj; if (this.compareTo(other) != 0) { return false; } return true; } @Override public String toString() { return "PluginVersion [versionArr=" + Arrays.toString(versionArr) + ", releaseChannel=" + releaseChannel + "]"; } }