jdk/src/java.base/share/classes/jdk/Version.java
author redestad
Tue, 03 May 2016 15:50:54 +0200
changeset 37781 71ed5645f17c
parent 37593 824750ada3d6
permissions -rw-r--r--
8155775: Re-examine naming of privileged methods to access System properties Reviewed-by: mullan
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
35701
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
     1
/*
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
     2
 * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
     4
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    10
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    15
 * accompanied this code).
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    16
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    20
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    23
 * questions.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    24
 */
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    25
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    26
package jdk;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    27
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    28
import java.math.BigInteger;
36226
37fb5281509b 8151140: Replace use of lambda/method ref in jdk.Version constructor
chegar
parents: 35701
diff changeset
    29
import java.util.ArrayList;
35701
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    30
import java.util.regex.Matcher;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    31
import java.util.regex.Pattern;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    32
import java.util.stream.Collectors;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    33
import java.util.Collections;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    34
import java.util.List;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    35
import java.util.Optional;
37593
824750ada3d6 8154231: Simplify access to System properties from JDK code
redestad
parents: 36226
diff changeset
    36
import sun.security.action.GetPropertyAction;
35701
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    37
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    38
/**
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    39
 * A representation of the JDK version-string which contains a version
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    40
 * number optionally followed by pre-release and build information.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    41
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    42
 * <h2><a name="verNum">Version numbers</a></h2>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    43
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    44
 * A <em>version number</em>, {@code $VNUM}, is a non-empty sequence of
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    45
 * non-negative integer numerals, without leading or trailing zeroes,
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    46
 * separated by period characters (U+002E); i.e., it matches the regular
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    47
 * expression {@code ^[1-9][0-9]*(((\.0)*\.[1-9][0-9]*)*)*$}. The sequence may
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    48
 * be of arbitrary length but the first three elements are assigned specific
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    49
 * meanings, as follows:
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    50
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    51
 * <blockquote><pre>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    52
 *     $MAJOR.$MINOR.$SECURITY
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    53
 * </pre></blockquote>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    54
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    55
 * <ul>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    56
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    57
 * <li><p> <a name="major">{@code $MAJOR}</a> --- The major version number,
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    58
 * incremented for a major release that contains significant new features as
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    59
 * specified in a new edition of the Java&#160;SE Platform Specification,
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    60
 * <em>e.g.</em>, <a href="https://jcp.org/en/jsr/detail?id=337">JSR 337</a>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    61
 * for Java&#160;SE&#160;8. Features may be removed in a major release, given
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    62
 * advance notice at least one major release ahead of time, and incompatible
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    63
 * changes may be made when justified. The {@code $MAJOR} version number of
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    64
 * JDK&#160;8 was {@code 8}; the {@code $MAJOR} version number of JDK&#160;9
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    65
 * is {@code 9}. </p></li>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    66
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    67
 * <li><p> <a name="minor">{@code $MINOR}</a> --- The minor version number,
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    68
 * incremented for a minor update release that may contain compatible bug
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    69
 * fixes, revisions to standard APIs mandated by a <a
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    70
 * href="https://jcp.org/en/procedures/jcp2#5.3">Maintenance Release</a> of
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    71
 * the relevant Platform Specification, and implementation features outside
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    72
 * the scope of that Specification such as new JDK-specific APIs, additional
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    73
 * service providers, new garbage collectors, and ports to new hardware
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    74
 * architectures. {@code $MINOR} is reset to zero when {@code $MAJOR} is
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    75
 * incremented. </p></li>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    76
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    77
 * <li><p> <a name="security">{@code $SECURITY}</a> --- The security level,
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    78
 * incremented for a security-update release that contains critical fixes
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    79
 * including those necessary to improve security. {@code $SECURITY} is reset
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    80
 * to zero <strong>only</strong> when {@code $MAJOR} is incremented. A higher
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    81
 * value of {@code $SECURITY} for a given {@code $MAJOR} value, therefore,
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    82
 * always indicates a more secure release, regardless of the value of {@code
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    83
 * $MINOR}. </p></li>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    84
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    85
 * </ul>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    86
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    87
 * <p> The fourth and later elements of a version number are free for use by
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    88
 * downstream consumers of the JDK code base.  Such a consumer may,
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    89
 * <em>e.g.</em>, use the fourth element to identify patch releases which
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    90
 * contain a small number of critical non-security fixes in addition to the
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    91
 * security fixes in the corresponding security release. </p>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    92
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    93
 * <p> The version number does not include trailing zero elements;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    94
 * <em>i.e.</em>, {@code $SECURITY} is omitted if it has the value zero, and
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    95
 * {@code $MINOR} is omitted if both {@code $MINOR} and {@code $SECURITY} have
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    96
 * the value zero. </p>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    97
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    98
 * <p> The sequence of numerals in a version number is compared to another
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
    99
 * such sequence in numerical, pointwise fashion; <em>e.g.</em>, {@code 9.9.1}
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   100
 * is less than {@code 9.10.0}. If one sequence is shorter than another then
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   101
 * the missing elements of the shorter sequence are considered to be zero;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   102
 * <em>e.g.</em>, {@code 9.1.2} is equal to {@code 9.1.2.0} but less than
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   103
 * {@code 9.1.2.1}. </p>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   104
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   105
 * <h2><a name="verStr">Version strings</a></h2>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   106
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   107
 * <p> A <em>version string</em> {@code $VSTR} consists of a version number
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   108
 * {@code $VNUM}, as described above, optionally followed by pre-release and
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   109
 * build information, in the format </p>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   110
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   111
 * <blockquote><pre>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   112
 *     $VNUM(-$PRE)?(\+($BUILD)?(-$OPT)?)?
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   113
 * </pre></blockquote>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   114
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   115
 * <p> where: </p>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   116
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   117
 * <ul>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   118
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   119
 * <li><p> <a name="pre">{@code $PRE}</a>, matching {@code ([a-zA-Z0-9]+)} ---
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   120
 * A pre-release identifier.  Typically {@code ea}, for an early-access
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   121
 * release that's under active development and potentially unstable, or {@code
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   122
 * internal}, for an internal developer build.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   123
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   124
 * <li><p> <a name="build">{@code $BUILD}</a>, matching {@code
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   125
 * (0|[1-9][0-9]*)} --- The build number, incremented for each promoted build.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   126
 * {@code $BUILD} is reset to {@code 1} when any portion of {@code $VNUM} is
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   127
 * incremented. </p>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   128
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   129
 * <li><p> <a name="opt">{@code $OPT}</a>, matching {@code ([-a-zA-Z0-9\.]+)}
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   130
 * --- Additional build information, if desired.  In the case of an {@code
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   131
 * internal} build this will often contain the date and time of the
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   132
 * build. </p>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   133
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   134
 * </ul>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   135
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   136
 * <p> When comparing two version strings the value of {@code $OPT}, if
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   137
 * present, may or may not be significant depending on the chosen comparison
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   138
 * method.  The comparison methods {@link #compareTo(Version) compareTo()} and
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   139
 * {@link #compareToIgnoreOpt(Version) compareToIgnoreOpt{}} should be used
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   140
 * consistently with the corresponding methods {@link #equals(Object) equals()}
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   141
 * and {@link #equalsIgnoreOpt(Object) equalsIgnoreOpt()}.  </p>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   142
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   143
 * <p> A <em>short version string</em> ({@code $SVSTR}), often useful in less
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   144
 * formal contexts, is simply {@code $VNUM} optionally ended with {@code
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   145
 * -$PRE}. </p>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   146
 *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   147
 * @since  9
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   148
 */
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   149
public final class Version
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   150
    implements Comparable<Version>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   151
{
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   152
    private final List<Integer>     version;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   153
    private final Optional<String>  pre;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   154
    private final Optional<Integer> build;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   155
    private final Optional<String>  optional;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   156
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   157
    private static Version current;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   158
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   159
    // $VNUM(-$PRE)?(\+($BUILD)?(\-$OPT)?)?
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   160
    // RE limits the format of version strings
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   161
    // ([1-9][0-9]*(?:(?:\.0)*\.[1-9][0-9]*)*)(?:-([a-zA-Z0-9]+))?(?:(\+)(0|[1-9][0-9]*)?)?(?:-([-a-zA-Z0-9.]+))?
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   162
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   163
    private static final String VNUM
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   164
        = "(?<VNUM>[1-9][0-9]*(?:(?:\\.0)*\\.[1-9][0-9]*)*)";
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   165
    private static final String VNUM_GROUP  = "VNUM";
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   166
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   167
    private static final String PRE      = "(?:-(?<PRE>[a-zA-Z0-9]+))?";
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   168
    private static final String PRE_GROUP   = "PRE";
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   169
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   170
    private static final String BUILD
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   171
        = "(?:(?<PLUS>\\+)(?<BUILD>0|[1-9][0-9]*)?)?";
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   172
    private static final String PLUS_GROUP  = "PLUS";
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   173
    private static final String BUILD_GROUP = "BUILD";
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   174
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   175
    private static final String OPT      = "(?:-(?<OPT>[-a-zA-Z0-9.]+))?";
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   176
    private static final String OPT_GROUP   = "OPT";
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   177
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   178
    private static final String VSTR_FORMAT
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   179
        = "^" + VNUM + PRE + BUILD + OPT + "$";
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   180
    private static final Pattern VSTR_PATTERN = Pattern.compile(VSTR_FORMAT);
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   181
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   182
    /**
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   183
     * Constructs a valid JDK <a href="verStr">version string</a> containing a
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   184
     * <a href="#verNum">version number</a> followed by pre-release and build
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   185
     * information.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   186
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   187
     * @param  s
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   188
     *         A string to be interpreted as a version
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   189
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   190
     * @throws  IllegalArgumentException
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   191
     *          If the given string cannot be interpreted a valid version
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   192
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   193
     * @throws  NullPointerException
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   194
     *          If {@code s} is {@code null}
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   195
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   196
     * @throws  NumberFormatException
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   197
     *          If an element of the version number or the build number cannot
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   198
     *          be represented as an {@link Integer}
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   199
     */
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   200
    private Version(String s) {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   201
        if (s == null)
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   202
            throw new NullPointerException();
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   203
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   204
        Matcher m = VSTR_PATTERN.matcher(s);
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   205
        if (!m.matches())
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   206
            throw new IllegalArgumentException("Invalid version string: '"
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   207
                                               + s + "'");
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   208
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   209
        // $VNUM is a dot-separated list of integers of arbitrary length
36226
37fb5281509b 8151140: Replace use of lambda/method ref in jdk.Version constructor
chegar
parents: 35701
diff changeset
   210
        List<Integer> list = new ArrayList<>();
37fb5281509b 8151140: Replace use of lambda/method ref in jdk.Version constructor
chegar
parents: 35701
diff changeset
   211
        for (String i : m.group(VNUM_GROUP).split("\\."))
37fb5281509b 8151140: Replace use of lambda/method ref in jdk.Version constructor
chegar
parents: 35701
diff changeset
   212
            list.add(Integer.parseInt(i));
37fb5281509b 8151140: Replace use of lambda/method ref in jdk.Version constructor
chegar
parents: 35701
diff changeset
   213
        version = Collections.unmodifiableList(list);
35701
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   214
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   215
        pre = Optional.ofNullable(m.group(PRE_GROUP));
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   216
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   217
        String b = m.group(BUILD_GROUP);
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   218
        // $BUILD is an integer
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   219
        build = (b == null)
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   220
             ? Optional.<Integer>empty()
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   221
             : Optional.ofNullable(Integer.parseInt(b));
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   222
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   223
        optional = Optional.ofNullable(m.group(OPT_GROUP));
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   224
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   225
        // empty '+'
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   226
        if ((m.group(PLUS_GROUP) != null) && !build.isPresent()) {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   227
            if (optional.isPresent()) {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   228
                if (pre.isPresent())
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   229
                    throw new IllegalArgumentException("'+' found with"
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   230
                        + " pre-release and optional components:'" + s + "'");
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   231
            } else {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   232
                throw new IllegalArgumentException("'+' found with neither"
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   233
                    + " build or optional components: '" + s + "'");
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   234
            }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   235
        }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   236
    }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   237
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   238
    /**
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   239
     * Parses the given string as a valid JDK <a
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   240
     * href="#verStr">version string</a> containing a <a
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   241
     * href="#verNum">version number</a> followed by pre-release and
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   242
     * build information.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   243
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   244
     * @param  s
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   245
     *         A string to interpret as a version
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   246
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   247
     * @throws  IllegalArgumentException
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   248
     *          If the given string cannot be interpreted a valid version
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   249
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   250
     * @throws  NullPointerException
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   251
     *          If the given string is {@code null}
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   252
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   253
     * @throws  NumberFormatException
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   254
     *          If an element of the version number or the build number cannot
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   255
     *          be represented as an {@link Integer}
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   256
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   257
     * @return  This version
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   258
     */
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   259
    public static Version parse(String s) {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   260
        return new Version(s);
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   261
    }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   262
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   263
    /**
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   264
     * Returns {@code System.getProperty("java.version")} as a Version.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   265
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   266
     * @throws  SecurityException
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   267
     *          If a security manager exists and its {@link
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   268
     *          SecurityManager#checkPropertyAccess(String)
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   269
     *          checkPropertyAccess} method does not allow access to the
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   270
     *          system property "java.version"
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   271
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   272
     * @return  {@code System.getProperty("java.version")} as a Version
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   273
     */
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   274
    public static Version current() {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   275
        if (current == null) {
37781
71ed5645f17c 8155775: Re-examine naming of privileged methods to access System properties
redestad
parents: 37593
diff changeset
   276
            current = parse(
71ed5645f17c 8155775: Re-examine naming of privileged methods to access System properties
redestad
parents: 37593
diff changeset
   277
                    GetPropertyAction.privilegedGetProperty("java.version"));
35701
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   278
        }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   279
        return current;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   280
    }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   281
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   282
    /**
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   283
     * Returns the <a href="#major">major</a> version number.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   284
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   285
     * @return  The major version number
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   286
     */
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   287
    public int major() {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   288
        return version.get(0);
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   289
    }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   290
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   291
    /**
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   292
     * Returns the <a href="#minor">minor</a> version number or zero if it was
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   293
     * not set.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   294
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   295
     * @return  The minor version number or zero if it was not set
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   296
     */
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   297
    public int minor() {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   298
        return (version.size() > 1 ? version.get(1) : 0);
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   299
    }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   300
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   301
    /**
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   302
     * Returns the <a href="#security">security</a> version number or zero if
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   303
     * it was not set.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   304
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   305
     * @return  The security version number or zero if it was not set
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   306
     */
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   307
    public int security() {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   308
        return (version.size() > 2 ? version.get(2) : 0);
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   309
    }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   310
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   311
    /**
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   312
     * Returns an unmodifiable {@link java.util.List List} of the
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   313
     * integer numerals contained in the <a href="#verNum">version
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   314
     * number</a>.  The {@code List} always contains at least one
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   315
     * element corresponding to the <a href="#major">major version
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   316
     * number</a>.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   317
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   318
     * @return  An unmodifiable list of the integer numerals
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   319
     *          contained in the version number
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   320
     */
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   321
    public List<Integer> version() {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   322
        return version;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   323
    }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   324
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   325
    /**
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   326
     * Returns the optional <a href="#pre">pre-release</a> information.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   327
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   328
     * @return  The optional pre-release information as a String
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   329
     */
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   330
    public Optional<String> pre() {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   331
        return pre;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   332
    }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   333
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   334
    /**
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   335
     * Returns the <a href="#build">build number</a>.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   336
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   337
     * @return The optional build number.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   338
     */
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   339
    public Optional<Integer> build() {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   340
        return build;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   341
    }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   342
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   343
    /**
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   344
     * Returns <a href="#opt">optional</a> additional identifying build
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   345
     * information.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   346
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   347
     * @return  Additional build information as a String
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   348
     */
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   349
    public Optional<String> optional() {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   350
        return optional;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   351
    }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   352
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   353
    /**
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   354
     * Compares this version to another.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   355
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   356
     * <p> Each of the components in the <a href="#verStr">version</a> is
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   357
     * compared in the follow order of precedence: version numbers,
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   358
     * pre-release identifiers, build numbers, optional build information. </p>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   359
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   360
     * <p> Comparison begins by examining the sequence of version numbers.  If
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   361
     * one sequence is shorter than another, then the missing elements of the
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   362
     * shorter sequence are considered to be zero. </p>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   363
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   364
     * <p> A version with a pre-release identifier is always considered to be
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   365
     * less than a version without one.  Pre-release identifiers are compared
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   366
     * numerically when they consist only of digits, and lexicographically
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   367
     * otherwise.  Numeric identifiers are considered to be less than
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   368
     * non-numeric identifiers.  </p>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   369
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   370
     * <p> A version without a build number is always less than one with a
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   371
     * build number; otherwise build numbers are compared numerically. </p>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   372
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   373
     * <p> The optional build information is compared lexicographically.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   374
     * During this comparison, a version with optional build information is
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   375
     * considered to be greater than a version without one. </p>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   376
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   377
     * <p> A version is not comparable to any other type of object.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   378
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   379
     * @param  ob
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   380
     *         The object to be compared
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   381
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   382
     * @return  A negative integer, zero, or a positive integer if this
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   383
     *          {@code Version} is less than, equal to, or greater than the
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   384
     *          given {@code Version}
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   385
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   386
     * @throws  NullPointerException
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   387
     *          If the given object is {@code null}
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   388
     */
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   389
    @Override
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   390
    public int compareTo(Version ob) {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   391
        return compare(ob, false);
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   392
    }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   393
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   394
    /**
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   395
     * Compares this version to another disregarding optional build
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   396
     * information.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   397
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   398
     * <p> Two versions are compared by examining the version string as
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   399
     * described in {@link #compareTo(Version)} with the exception that the
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   400
     * optional build information is always ignored. </p>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   401
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   402
     * <p> A version is not comparable to any other type of object.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   403
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   404
     * @param  ob
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   405
     *         The object to be compared
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   406
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   407
     * @return  A negative integer, zero, or a positive integer if this
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   408
     *          {@code Version} is less than, equal to, or greater than the
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   409
     *          given {@code Version}
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   410
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   411
     * @throws  NullPointerException
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   412
     *          If the given object is {@code null}
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   413
     */
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   414
    public int compareToIgnoreOpt(Version ob) {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   415
        return compare(ob, true);
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   416
    }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   417
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   418
    private int compare(Version ob, boolean ignoreOpt) {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   419
        if (ob == null)
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   420
            throw new NullPointerException("Invalid argument");
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   421
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   422
        int ret = compareVersion(ob);
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   423
        if (ret != 0)
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   424
            return ret;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   425
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   426
        ret = comparePre(ob);
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   427
        if (ret != 0)
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   428
            return ret;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   429
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   430
        ret = compareBuild(ob);
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   431
        if (ret != 0)
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   432
            return ret;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   433
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   434
        if (!ignoreOpt)
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   435
            return compareOpt(ob);
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   436
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   437
        return 0;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   438
    }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   439
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   440
    private int compareVersion(Version ob) {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   441
        int size = version.size();
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   442
        int oSize = ob.version().size();
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   443
        int min = Math.min(size, oSize);
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   444
        for (int i = 0; i < min; i++) {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   445
            Integer val = version.get(i);
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   446
            Integer oVal = ob.version().get(i);
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   447
            if (val != oVal)
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   448
                return val - oVal;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   449
        }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   450
        if (size != oSize)
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   451
            return size - oSize;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   452
        return 0;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   453
    }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   454
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   455
    private int comparePre(Version ob) {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   456
        Optional<String> oPre = ob.pre();
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   457
        if (!pre.isPresent()) {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   458
            if (oPre.isPresent())
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   459
                return 1;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   460
        } else {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   461
            if (!oPre.isPresent())
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   462
                return -1;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   463
            String val = pre.get();
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   464
            String oVal = oPre.get();
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   465
            if (val.matches("\\d+")) {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   466
                return (oVal.matches("\\d+")
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   467
                        ? (new BigInteger(val)).compareTo(new BigInteger(oVal))
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   468
                        : -1);
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   469
            } else {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   470
                return (oVal.matches("\\d+")
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   471
                        ? 1
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   472
                        : val.compareTo(oVal));
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   473
            }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   474
        }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   475
        return 0;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   476
    }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   477
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   478
    private int compareBuild(Version ob) {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   479
        Optional<Integer> oBuild = ob.build();
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   480
        if (oBuild.isPresent()) {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   481
            return (build.isPresent()
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   482
                   ? build.get().compareTo(oBuild.get())
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   483
                   : 1);
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   484
        } else if (build.isPresent()) {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   485
            return -1;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   486
        }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   487
        return 0;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   488
    }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   489
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   490
    private int compareOpt(Version ob) {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   491
        Optional<String> oOpt = ob.optional();
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   492
        if (!optional.isPresent()) {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   493
            if (oOpt.isPresent())
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   494
                return -1;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   495
        } else {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   496
            if (!oOpt.isPresent())
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   497
                return 1;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   498
            return optional.get().compareTo(oOpt.get());
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   499
        }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   500
        return 0;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   501
    }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   502
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   503
    /**
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   504
     * Returns a string representation of this version.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   505
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   506
     * @return  The version string
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   507
     */
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   508
    @Override
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   509
    public String toString() {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   510
        StringBuilder sb
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   511
            = new StringBuilder(version.stream()
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   512
                                .map(Object::toString)
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   513
                                .collect(Collectors.joining(".")));
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   514
        pre.ifPresent(v -> sb.append("-").append(v));
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   515
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   516
        if (build.isPresent()) {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   517
            sb.append("+").append(build.get());
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   518
            if (optional.isPresent())
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   519
                sb.append("-").append(optional.get());
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   520
        } else {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   521
            if (optional.isPresent()) {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   522
                sb.append(pre.isPresent() ? "-" : "+-");
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   523
                sb.append(optional.get());
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   524
            }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   525
        }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   526
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   527
        return sb.toString();
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   528
    }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   529
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   530
    /**
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   531
     * Determines whether this {@code Version} is equal to another object.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   532
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   533
     * <p> Two {@code Version}s are equal if and only if they represent the
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   534
     * same version string.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   535
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   536
     * <p> This method satisfies the general contract of the {@link
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   537
     * Object#equals(Object) Object.equals} method. </p>
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   538
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   539
     * @param  ob
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   540
     *         The object to which this {@code Version} is to be compared
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   541
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   542
     * @return  {@code true} if, and only if, the given object is a {@code
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   543
     *          Version} that is identical to this {@code Version}
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   544
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   545
     */
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   546
    @Override
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   547
    public boolean equals(Object ob) {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   548
        boolean ret = equalsIgnoreOpt(ob);
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   549
        if (!ret)
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   550
            return false;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   551
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   552
        Version that = (Version)ob;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   553
        return (this.optional().equals(that.optional()));
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   554
    }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   555
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   556
    /**
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   557
     * Determines whether this {@code Version} is equal to another
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   558
     * disregarding optional build information.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   559
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   560
     * <p> Two {@code Version}s are equal if and only if they represent the
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   561
     * same version string disregarding the optional build information.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   562
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   563
     * @param  ob
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   564
     *         The object to which this {@code Version} is to be compared
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   565
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   566
     * @return  {@code true} if, and only if, the given object is a {@code
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   567
     *          Version} that is identical to this {@code Version}
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   568
     *          ignoring the optinal build information
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   569
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   570
     */
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   571
    public boolean equalsIgnoreOpt(Object ob) {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   572
        if (this == ob)
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   573
            return true;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   574
        if (!(ob instanceof Version))
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   575
            return false;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   576
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   577
        Version that = (Version)ob;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   578
        return (this.version().equals(that.version())
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   579
                && this.pre().equals(that.pre())
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   580
                && this.build().equals(that.build()));
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   581
    }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   582
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   583
    /**
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   584
     * Returns the hash code of this version.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   585
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   586
     * <p> This method satisfies the general contract of the {@link
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   587
     * Object#hashCode Object.hashCode} method.
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   588
     *
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   589
     * @return  The hashcode of this version
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   590
     */
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   591
    @Override
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   592
    public int hashCode() {
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   593
        int h = 1;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   594
        int p = 17;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   595
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   596
        h = p * h + version.hashCode();
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   597
        h = p * h + pre.hashCode();
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   598
        h = p * h + build.hashCode();
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   599
        h = p * h + optional.hashCode();
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   600
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   601
        return h;
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   602
    }
d5a24d2b0494 8072379: Implement jdk.Version
iris
parents:
diff changeset
   603
}