/* |
|
* Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. |
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
|
* |
|
* This code is free software; you can redistribute it and/or modify it |
|
* under the terms of the GNU General Public License version 2 only, as |
|
* published by the Free Software Foundation. Oracle designates this |
|
* particular file as subject to the "Classpath" exception as provided |
|
* by Oracle in the LICENSE file that accompanied this code. |
|
* |
|
* This code 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 |
|
* version 2 for more details (a copy is included in the LICENSE file that |
|
* accompanied this code). |
|
* |
|
* You should have received a copy of the GNU General Public License version |
|
* 2 along with this work; if not, write to the Free Software Foundation, |
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
* |
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
* or visit www.oracle.com if you need additional information or have any |
|
* questions. |
|
*/ |
|
/* |
|
******************************************************************************* |
|
* (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * |
|
* * |
|
* The original version of this source code and documentation is copyrighted * |
|
* and owned by IBM, These materials are provided under terms of a License * |
|
* Agreement between IBM and Sun. This technology is protected by multiple * |
|
* US and International patents. This notice and attribution to IBM may not * |
|
* to removed. * |
|
******************************************************************************* |
|
*/ |
|
package sun.text.normalizer; |
|
import java.util.HashMap; |
|
/** |
|
* Class to store version numbers of the form major.minor.milli.micro. |
|
* @author synwee |
|
* @stable ICU 2.6 |
|
*/ |
|
public final class VersionInfo |
|
{ |
|
// public methods ------------------------------------------------------ |
|
/** |
|
* Returns an instance of VersionInfo with the argument version. |
|
* @param version version String in the format of "major.minor.milli.micro" |
|
* or "major.minor.milli" or "major.minor" or "major", |
|
* where major, minor, milli, micro are non-negative numbers |
|
* <= 255. If the trailing version numbers are |
|
* not specified they are taken as 0s. E.g. Version "3.1" is |
|
* equivalent to "3.1.0.0". |
|
* @return an instance of VersionInfo with the argument version. |
|
* @exception throws an IllegalArgumentException when the argument version |
|
* is not in the right format |
|
* @stable ICU 2.6 |
|
*/ |
|
public static VersionInfo getInstance(String version) |
|
{ |
|
int length = version.length(); |
|
int array[] = {0, 0, 0, 0}; |
|
int count = 0; |
|
int index = 0; |
|
while (count < 4 && index < length) { |
|
char c = version.charAt(index); |
|
if (c == '.') { |
|
count ++; |
|
} |
|
else { |
|
c -= '0'; |
|
if (c < 0 || c > 9) { |
|
throw new IllegalArgumentException(INVALID_VERSION_NUMBER_); |
|
} |
|
array[count] *= 10; |
|
array[count] += c; |
|
} |
|
index ++; |
|
} |
|
if (index != length) { |
|
throw new IllegalArgumentException( |
|
"Invalid version number: String '" + version + "' exceeds version format"); |
|
} |
|
for (int i = 0; i < 4; i ++) { |
|
if (array[i] < 0 || array[i] > 255) { |
|
throw new IllegalArgumentException(INVALID_VERSION_NUMBER_); |
|
} |
|
} |
|
return getInstance(array[0], array[1], array[2], array[3]); |
|
} |
|
/** |
|
* Returns an instance of VersionInfo with the argument version. |
|
* @param major major version, non-negative number <= 255. |
|
* @param minor minor version, non-negative number <= 255. |
|
* @param milli milli version, non-negative number <= 255. |
|
* @param micro micro version, non-negative number <= 255. |
|
* @exception throws an IllegalArgumentException when either arguments are |
|
* negative or > 255 |
|
* @stable ICU 2.6 |
|
*/ |
|
public static VersionInfo getInstance(int major, int minor, int milli, |
|
int micro) |
|
{ |
|
// checks if it is in the hashmap |
|
// else |
|
if (major < 0 || major > 255 || minor < 0 || minor > 255 || |
|
milli < 0 || milli > 255 || micro < 0 || micro > 255) { |
|
throw new IllegalArgumentException(INVALID_VERSION_NUMBER_); |
|
} |
|
int version = getInt(major, minor, milli, micro); |
|
Integer key = Integer.valueOf(version); |
|
Object result = MAP_.get(key); |
|
if (result == null) { |
|
result = new VersionInfo(version); |
|
MAP_.put(key, result); |
|
} |
|
return (VersionInfo)result; |
|
} |
|
/** |
|
* Compares other with this VersionInfo. |
|
* @param other VersionInfo to be compared |
|
* @return 0 if the argument is a VersionInfo object that has version |
|
* information equals to this object. |
|
* Less than 0 if the argument is a VersionInfo object that has |
|
* version information greater than this object. |
|
* Greater than 0 if the argument is a VersionInfo object that |
|
* has version information less than this object. |
|
* @stable ICU 2.6 |
|
*/ |
|
public int compareTo(VersionInfo other) |
|
{ |
|
return m_version_ - other.m_version_; |
|
} |
|
// private data members ---------------------------------------------- |
|
/** |
|
* Version number stored as a byte for each of the major, minor, milli and |
|
* micro numbers in the 32 bit int. |
|
* Most significant for the major and the least significant contains the |
|
* micro numbers. |
|
*/ |
|
private int m_version_; |
|
/** |
|
* Map of singletons |
|
*/ |
|
private static final HashMap<Integer, Object> MAP_ = new HashMap<>(); |
|
/** |
|
* Error statement string |
|
*/ |
|
private static final String INVALID_VERSION_NUMBER_ = |
|
"Invalid version number: Version number may be negative or greater than 255"; |
|
// private constructor ----------------------------------------------- |
|
/** |
|
* Constructor with int |
|
* @param compactversion a 32 bit int with each byte representing a number |
|
*/ |
|
private VersionInfo(int compactversion) |
|
{ |
|
m_version_ = compactversion; |
|
} |
|
/** |
|
* Gets the int from the version numbers |
|
* @param major non-negative version number |
|
* @param minor non-negativeversion number |
|
* @param milli non-negativeversion number |
|
* @param micro non-negativeversion number |
|
*/ |
|
private static int getInt(int major, int minor, int milli, int micro) |
|
{ |
|
return (major << 24) | (minor << 16) | (milli << 8) | micro; |
|
} |
|
} |