/* * Copyright 2013 The Skfiy Open Association. * * 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 * distributed 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 the specific language governing permissions and * limitations under the License. */ package org.skfiy.typhon; /** * 版本对象. 通过{@code currentVersion() }方法可获取应用当前的版本号. * {@link #compareTo(org.skfiy.typhon.Version) }方法提供比较版本号操作, * 但是该方法只会比较{@code major, minor, incremental }部分, {@code qualifier } * 部分并不会参与比较. 当Version实例{@code major, minor, incremental }部分相同 * 及使{@code qualifier }部分不相同, 这2个Version也会认为是相等的. * * @author Kevin Zou <kevinz@skfiy.org> */ public final class Version implements Comparable<Version> { private static final Version CURRENT_VERSION = new Version(); private final int[] vers = {0, 0, 0}; private String qualifier; /** * 获取系统默认版本号创建{@code Version }实例. * 默认版本号通过{@link Globals#PROP_VERSION }属性键在{@link System }中获取. */ private Version() { this(System.getProperty(Globals.PROP_VERSION)); } /** * 通过已存在的版本号创建{@code Version }实例. * * @param ver 已经存在的字符版本号 */ public Version(String ver) { if (ver.indexOf("-") > 1) { String[] vals = ver.split("-"); ver = vals[0]; qualifier = vals[1]; } String[] vals = ver.split("\\."); for (int i = 0; i < vals.length; i++) { vers[i] = Integer.valueOf(vals[i]); } } /** * 构造{@code Version }实例. * * @param major 主版本号,一个无符号的整数 * @param minor 次版本号,一个无符号的整数 * @param incremental 增量版本号,一个无符号的整数 * @param qualifier 版本限定符,可为空 */ public Version(int major, int minor, int incremental, String qualifier) { if (major < 0 || minor < 0 || incremental < 0) { throw new IllegalArgumentException( "major, minor, incremental 版本号标识必须为一个无符号的整数"); } vers[0] = major; vers[1] = minor; vers[2] = incremental; this.qualifier = qualifier; } /** * 主版本号. * * @return 一个无符号的整数 */ public int getMajor() { return vers[0]; } /** * 次版本号. * * @return 一个无符号的整数 */ public int getMinor() { return vers[1]; } /** * 增量版本号. * * @return 一个无符号的整数 */ public int getIncremental() { return vers[2]; } /** * 版本限定符. * * @return 一个字符串,可能为{@code null } */ public String getQualifier() { return qualifier; } @Override public int compareTo(Version o) { if (o == null) { return -1; } int r = Integer.compare(getMajor(), o.getMajor()); if (r != 0) { return r; } r = Integer.compare(getMinor(), o.getMinor()); if (r != 0) { return r; } r = Integer.compare(getIncremental(), o.getIncremental()); return r; } @Override public boolean equals(Object obj) { if (obj instanceof Version) { return compareTo((Version) obj) == 0; } return false; } @Override public int hashCode() { return getMajor() + getMinor() + getIncremental(); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(getMajor()); sb.append(".").append(getMinor()); if (getIncremental() > 0) { sb.append(".").append(getIncremental()); } if (getQualifier() != null && !getQualifier().isEmpty()) { sb.append("-").append(getQualifier()); } return sb.toString(); } /** * 获取当前应用的版本实例. * * @return Version实例 */ public static Version currentVersion() { return CURRENT_VERSION; } }