package org.multibit.utils; import java.util.Comparator; /** * Class to compare MultiBit version numbers. Version numbers are ordered as * follows 0.4.0 0.4.1-SNAPSHOT 0.4.1alpha1 0.4.1beta1 0.4.1beta2 0.4.1rc1 0.4.1 */ public class VersionComparator implements Comparator<String> { private static int MAXIMIMUM_NUMBER_PER_CATEGORY = 1000; private static String ALPHA_STRING = "alpha"; private static String BETA_STRING = "beta"; private static String RELEASE_CANDIDATE_STRING = "rc"; private static String SNAPSHOT_STRING = "-snapshot"; @Override public int compare(String first, String second) { Long firstOrdinal = calculateOrdinal(first); Long secondOrdinal = calculateOrdinal(second); return firstOrdinal.compareTo(secondOrdinal); } Long calculateOrdinal(String version) throws NumberFormatException { long ordinal = 0; version = version.toLowerCase(); int isAlpha = version.indexOf(ALPHA_STRING) > -1 ? 1 : 0; int isBeta = version.indexOf(BETA_STRING) > -1 ? 1 : 0; int isReleaseCandidate = version.indexOf(RELEASE_CANDIDATE_STRING) > -1 ? 1 : 0; int isSnapshot = version.indexOf(SNAPSHOT_STRING) > -1 ? 1 : 0; version = version.replaceFirst(ALPHA_STRING, "."); version = version.replaceFirst(BETA_STRING, "."); version = version.replaceFirst(RELEASE_CANDIDATE_STRING, "."); version = version.replaceFirst(SNAPSHOT_STRING, "."); String[] tokens = version.split("\\."); if (tokens.length > 0) { ordinal = ordinal + (parseInt(tokens[0]) * MAXIMIMUM_NUMBER_PER_CATEGORY * MAXIMIMUM_NUMBER_PER_CATEGORY * MAXIMIMUM_NUMBER_PER_CATEGORY); } if (tokens.length > 1) { ordinal = ordinal + (parseInt(tokens[1]) * MAXIMIMUM_NUMBER_PER_CATEGORY * MAXIMIMUM_NUMBER_PER_CATEGORY); } if (tokens.length > 2) { ordinal = ordinal + (parseInt(tokens[2]) * MAXIMIMUM_NUMBER_PER_CATEGORY); } if (tokens.length > 3) { ordinal = ordinal + parseInt(tokens[3]); } ordinal = ordinal - MAXIMIMUM_NUMBER_PER_CATEGORY / 5 * (isSnapshot * 4 + isAlpha * 3 + isBeta * 2 + isReleaseCandidate); return ordinal; } private int parseInt(String intString) { int toReturn = 0; try { toReturn = Integer.parseInt(intString); } catch (NumberFormatException nfe) { // Do nothing. } return toReturn; } }