// Copyright 2015 The Project Buendia Authors // // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy // of the License at: http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software distrib- // uted under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES // OR CONDITIONS OF ANY KIND, either express or implied. See the License for // specific language governing permissions and limitations under the License. package org.projectbuendia.client.utils; import com.google.common.base.Preconditions; import java.util.Objects; import javax.annotation.concurrent.Immutable; /** An object that represents a version consisting of any number of numbers separated by dots. */ @Immutable public class LexicographicVersion implements Comparable<LexicographicVersion> { private final String mRaw; private final int[] mParts; /** Returns an instance of {@link LexicographicVersion} parsed from the specified string. */ public static LexicographicVersion parse(String raw) { Preconditions.checkNotNull(raw); Preconditions.checkArgument(!raw.equals("")); String[] stringParts = raw.split("\\."); int[] parts = new int[stringParts.length]; for (int i = 0; i < stringParts.length; i++) { try { parts[i] = Integer.parseInt(stringParts[i]); } catch (NumberFormatException e) { throw new IllegalArgumentException( "'" + raw + "' is not a valid version string.", e); } } return new LexicographicVersion(raw, parts); } @Override public String toString() { return mRaw; } public boolean greaterThan(LexicographicVersion other) { return compareTo(other) > 0; } @Override public int compareTo(LexicographicVersion other) { Preconditions.checkNotNull(other); if (this == other) { return 0; } int minPartsLength = Math.min(mParts.length, other.mParts.length); for (int i = 0; i < minPartsLength; i++) { if (mParts[i] < other.mParts[i]) { return -1; } else if (mParts[i] > other.mParts[i]) { return 1; } } return mParts.length - other.mParts.length; } public boolean greaterThanOrEqualTo(LexicographicVersion other) { return compareTo(other) >= 0; } public boolean lessThan(LexicographicVersion other) { return compareTo(other) < 0; } public boolean lessThanOrEqualTo(LexicographicVersion other) { return compareTo(other) <= 0; } @Override public boolean equals(Object other) { if (this == other) { return true; } if (!(other instanceof LexicographicVersion)) { return false; } return compareTo((LexicographicVersion) other) == 0; } @Override public int hashCode() { return Objects.hash(mParts); } private LexicographicVersion(String raw, int[] parts) { mRaw = raw; mParts = parts; } }