/* * This file is part of Skript. * * Skript is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Skript is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Skript. If not, see <http://www.gnu.org/licenses/>. * * * Copyright 2011-2014 Peter Güttinger * */ package ch.njol.skript.util; import java.io.Serializable; import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.jdt.annotation.Nullable; /** * @author Peter Güttinger */ public class Version implements Serializable, Comparable<Version> { private final static long serialVersionUID = 8687040355286333293L; private final int[] version = new int[3]; /** * Everything after the version, e.g. "alpha", "b", "rc 1", "build 2314", "-SNAPSHOT" etc. or null if nothing. */ @Nullable private final String postfix; public Version(final int... version) { if (version.length < 1 || version.length > 3) throw new IllegalArgumentException("Versions must have a minimum of 2 and a maximum of 3 numbers (" + version.length + " numbers given)"); for (int i = 0; i < version.length; i++) this.version[i] = version[i]; postfix = null; } public Version(final int major, final int minor, final @Nullable String postfix) { version[0] = major; version[1] = minor; this.postfix = postfix == null || postfix.isEmpty() ? null : postfix; } @SuppressWarnings("null") public final static Pattern versionPattern = Pattern.compile("(\\d+)\\.(\\d+)(?:\\.(\\d+))?\\s*(.*)"); public Version(final String version) { final Matcher m = versionPattern.matcher(version.trim()); if (!m.matches()) throw new IllegalArgumentException("'" + version + "' is not a valid version string"); for (int i = 0; i < 3; i++) { if (m.group(i + 1) != null) this.version[i] = Utils.parseInt("" + m.group(i + 1)); } postfix = m.group(m.groupCount()).isEmpty() ? null : m.group(m.groupCount()); } @Override public boolean equals(final @Nullable Object obj) { if (this == obj) return true; if (!(obj instanceof Version)) return false; return compareTo((Version) obj) == 0; } @Override public int hashCode() { final String pf = postfix; return Arrays.hashCode(version) * 31 + (pf == null ? 0 : pf.hashCode()); } @Override public int compareTo(final @Nullable Version other) { if (other == null) return 1; for (int i = 0; i < version.length; i++) { if (version[i] > other.version[i]) return 1; if (version[i] < other.version[i]) return -1; } final String pf = postfix; if (pf == null) return other.postfix == null ? 0 : 1; else return other.postfix == null ? -1 : pf.compareTo(other.postfix); } public int compareTo(final int... other) { assert other.length >= 2 && other.length <= 3; for (int i = 0; i < version.length; i++) { if (version[i] > (i >= other.length ? 0 : other[i])) return 1; if (version[i] < (i >= other.length ? 0 : other[i])) return -1; } return 0; } public boolean isSmallerThan(final Version other) { return compareTo(other) < 0; } public boolean isLargerThan(final Version other) { return compareTo(other) > 0; } /** * @return Whether this is a stable version, i.e. a simple version number without any additional details (like alpha/beta/etc.) */ public boolean isStable() { return postfix == null; } public int getMajor() { return version[0]; } public int getMinor() { return version[1]; } public int getRevisin() { return version.length == 2 ? 0 : version[2]; } @Override public String toString() { final String pf = postfix; return version[0] + "." + version[1] + (version[2] == 0 ? "" : "." + version[2]) + (pf == null ? "" : pf.startsWith("-") ? pf : " " + pf); } public final static int compare(final String v1, final String v2) { return new Version(v1).compareTo(new Version(v2)); } }