/* * 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 * {@literal <=} 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 {@literal <=} 255. * @param minor minor version, non-negative number {@literal <=} 255. * @param milli milli version, non-negative number {@literal <=} 255. * @param micro micro version, non-negative number {@literal <=} 255. * @exception throws an IllegalArgumentException when either arguments are * negative or {@literal >} 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 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; } }