src/demo/share/jpackager/JNLPConverter/src/jnlp/converter/parser/VersionID.java
author herrick
Fri, 12 Oct 2018 19:00:51 -0400
branchJDK-8200758-branch
changeset 56963 eaca4369b068
permissions -rw-r--r--
8198472: Add support for creating bundles from JNLP files Submitten-by: almatvee Reviewed-by: herrick, kcr, prr, asemenyuk
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
56963
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
     1
/*
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
     2
 * Copyright (c) 2006, 2018, Oracle and/or its affiliates. All rights reserved.
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
     4
 *
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
     7
 * published by the Free Software Foundation.
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
     8
 *
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    13
 * accompanied this code).
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    14
 *
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    18
 *
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    21
 * questions.
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    22
 */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    23
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    24
package jnlp.converter.parser;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    25
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    26
import java.util.ArrayList;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    27
import java.util.Arrays;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    28
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    29
/**
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    30
 *  VersionID contains a JNLP version ID.
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    31
 *
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    32
 *  The VersionID also contains a prefix indicator that can
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    33
 *  be used when stored with a VersionString
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    34
 *
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    35
 */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    36
public class VersionID implements Comparable<VersionID> {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    37
    private final String[] _tuple;           // Array of Integer or String objects
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    38
    private final boolean  _usePrefixMatch;  // star (*) prefix
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    39
    private final boolean  _useGreaterThan;  // plus (+) greather-than
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    40
    private final boolean  _isCompound;      // and (&) operator
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    41
    private final VersionID _rest;           // remaining part after the &
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    42
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    43
    /**
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    44
     * Creates a VersionID object from a given <code>String</code>.
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    45
     * @param str version string to parse
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    46
     */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    47
    public VersionID(String str) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    48
        if (str == null || str.length() == 0) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    49
            _tuple = new String[0];
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    50
            _useGreaterThan = false;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    51
            _usePrefixMatch = false;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    52
            _isCompound = false;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    53
            _rest = null;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    54
            return;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    55
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    56
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    57
        // Check for compound
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    58
        int amp = str.indexOf("&");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    59
        if (amp >= 0) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    60
            _isCompound = true;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    61
            VersionID firstPart = new VersionID(str.substring(0, amp));
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    62
            _rest = new VersionID(str.substring(amp+1));
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    63
            _tuple = firstPart._tuple;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    64
            _usePrefixMatch = firstPart._usePrefixMatch;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    65
            _useGreaterThan = firstPart._useGreaterThan;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    66
        } else {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    67
            _isCompound = false;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    68
            _rest = null;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    69
            // Check for postfix
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    70
            if (str.endsWith("+")) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    71
                _useGreaterThan = true;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    72
                _usePrefixMatch = false;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    73
                str = str.substring(0, str.length() - 1);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    74
            } else if (str.endsWith("*")) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    75
                _useGreaterThan = false;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    76
                _usePrefixMatch = true;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    77
                str = str.substring(0, str.length() - 1);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    78
            } else {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    79
                _useGreaterThan = false;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    80
                _usePrefixMatch = false;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    81
            }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    82
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    83
            ArrayList<String> list = new ArrayList<>();
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    84
            int start = 0;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    85
            for (int i = 0; i < str.length(); i++) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    86
                // Split at each separator character
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    87
                if (".-_".indexOf(str.charAt(i)) != -1) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    88
                    if (start < i) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    89
                        String value = str.substring(start, i);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    90
                        list.add(value);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    91
                    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    92
                    start = i + 1;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    93
                }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    94
            }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    95
            if (start < str.length()) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    96
                list.add(str.substring(start, str.length()));
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    97
            }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    98
            _tuple = list.toArray(new String[0]);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    99
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   100
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   101
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   102
    /** @return true if no flags are set */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   103
    public boolean isSimpleVersion() {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   104
        return !_useGreaterThan && !_usePrefixMatch && !_isCompound;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   105
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   106
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   107
    /** Match 'this' versionID against vid.
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   108
     *  The _usePrefixMatch/_useGreaterThan flag is used to determine if a
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   109
     *  prefix match of an exact match should be performed
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   110
     *  if _isCompound, must match _rest also.
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   111
     */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   112
    public boolean match(VersionID vid) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   113
        if (_isCompound) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   114
            if (!_rest.match(vid)) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   115
                return false;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   116
            }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   117
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   118
        return (_usePrefixMatch) ? this.isPrefixMatchTuple(vid) :
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   119
            (_useGreaterThan) ? vid.isGreaterThanOrEqualTuple(this) :
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   120
                matchTuple(vid);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   121
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   122
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   123
    /** Compares if two version IDs are equal */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   124
    @Override
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   125
    public boolean equals(Object o) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   126
        if (matchTuple(o)) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   127
             VersionID ov = (VersionID) o;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   128
             if (_rest == null || _rest.equals(ov._rest)) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   129
                if ((_useGreaterThan == ov._useGreaterThan) &&
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   130
                    (_usePrefixMatch == ov._usePrefixMatch)) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   131
                        return true;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   132
                }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   133
            }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   134
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   135
        return false;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   136
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   137
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   138
    /** Computes a hash code for a VersionID */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   139
    @Override
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   140
    public int hashCode() {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   141
        boolean first = true;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   142
        int hashCode = 0;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   143
        for (String tuple : _tuple) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   144
            if (first) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   145
                first = false;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   146
                hashCode = tuple.hashCode();
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   147
            } else {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   148
                hashCode = hashCode ^ tuple.hashCode();
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   149
            }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   150
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   151
        return hashCode;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   152
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   153
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   154
    /** Compares if two version IDs are equal */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   155
    private boolean matchTuple(Object o) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   156
        // Check for null and type
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   157
        if (o == null || !(o instanceof VersionID)) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   158
            return false;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   159
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   160
        VersionID vid = (VersionID) o;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   161
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   162
        // Normalize arrays
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   163
        String[] t1 = normalize(_tuple, vid._tuple.length);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   164
        String[] t2 = normalize(vid._tuple, _tuple.length);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   165
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   166
        // Check contents
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   167
        for (int i = 0; i < t1.length; i++) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   168
            Object o1 = getValueAsObject(t1[i]);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   169
            Object o2 = getValueAsObject(t2[i]);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   170
            if (!o1.equals(o2)) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   171
                return false;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   172
            }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   173
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   174
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   175
        return true;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   176
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   177
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   178
    private Object getValueAsObject(String value) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   179
        if (value.length() > 0 && value.charAt(0) != '-') {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   180
            try {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   181
                return Integer.valueOf(value);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   182
            } catch (NumberFormatException nfe) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   183
                /* fall through */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   184
            }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   185
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   186
        return value;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   187
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   188
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   189
    public boolean isGreaterThan(VersionID vid) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   190
        if (vid == null) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   191
            return false;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   192
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   193
        return isGreaterThanOrEqualHelper(vid, false, true);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   194
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   195
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   196
    public boolean isGreaterThanOrEqual(VersionID vid) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   197
        if (vid == null) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   198
            return false;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   199
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   200
        return isGreaterThanOrEqualHelper(vid, true, true);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   201
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   202
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   203
    boolean isGreaterThanOrEqualTuple(VersionID vid) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   204
        return isGreaterThanOrEqualHelper(vid, true, false);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   205
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   206
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   207
    /** Compares if 'this' is greater than vid */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   208
    private boolean isGreaterThanOrEqualHelper(VersionID vid,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   209
        boolean allowEqual, boolean useRest) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   210
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   211
        if (useRest && _isCompound) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   212
            if (!_rest.isGreaterThanOrEqualHelper(vid, allowEqual, true)) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   213
                return false;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   214
            }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   215
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   216
        // Normalize the two strings
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   217
        String[] t1 = normalize(_tuple, vid._tuple.length);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   218
        String[] t2 = normalize(vid._tuple, _tuple.length);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   219
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   220
        for (int i = 0; i < t1.length; i++) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   221
            // Compare current element
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   222
            Object e1 = getValueAsObject(t1[i]);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   223
            Object e2 = getValueAsObject(t2[i]);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   224
            if (e1.equals(e2)) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   225
                // So far so good
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   226
            } else {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   227
                if (e1 instanceof Integer && e2 instanceof Integer) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   228
                    // if both can be parsed as ints, compare ints
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   229
                    return ((Integer)e1).intValue() > ((Integer)e2).intValue();
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   230
                } else {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   231
                    if (e1 instanceof Integer)  {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   232
                        return false; // e1 (numeric) < e2 (non-numeric)
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   233
                    } else if (e2 instanceof Integer) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   234
                        return true; // e1 (non-numeric) > e2 (numeric)
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   235
                    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   236
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   237
                    String s1 = t1[i];
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   238
                    String s2 = t2[i];
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   239
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   240
                    return s1.compareTo(s2) > 0;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   241
                }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   242
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   243
            }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   244
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   245
        // If we get here, they are equal
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   246
        return allowEqual;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   247
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   248
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   249
    /** Checks if 'this' is a prefix of vid */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   250
    private boolean isPrefixMatchTuple(VersionID vid) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   251
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   252
        // Make sure that vid is at least as long as the prefix
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   253
        String[] t2 = normalize(vid._tuple, _tuple.length);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   254
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   255
        for (int i = 0; i < _tuple.length; i++) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   256
            Object e1 = _tuple[i];
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   257
            Object e2 = t2[i];
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   258
            if (e1.equals(e2)) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   259
                // So far so good
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   260
            } else {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   261
                // Not a prefix
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   262
                return false;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   263
            }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   264
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   265
        return true;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   266
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   267
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   268
    /** Normalize an array to a certain lengh */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   269
    private String[] normalize(String[] list, int minlength) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   270
        if (list.length < minlength) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   271
            // Need to do padding
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   272
            String[] newlist = new String[minlength];
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   273
            System.arraycopy(list, 0, newlist, 0, list.length);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   274
            Arrays.fill(newlist, list.length, newlist.length, "0");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   275
            return newlist;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   276
        } else {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   277
            return list;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   278
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   279
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   280
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   281
    @Override
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   282
    public int compareTo(VersionID o) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   283
        if (o == null || !(o instanceof VersionID)) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   284
            return -1;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   285
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   286
        VersionID vid = o;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   287
        return equals(vid) ? 0 : (isGreaterThanOrEqual(vid) ? 1 : -1);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   288
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   289
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   290
    /** Show it as a string */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   291
    @Override
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   292
    public String toString() {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   293
        StringBuilder sb = new StringBuilder();
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   294
        for (int i = 0; i < _tuple.length - 1; i++) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   295
            sb.append(_tuple[i]);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   296
            sb.append('.');
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   297
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   298
        if (_tuple.length > 0) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   299
            sb.append(_tuple[_tuple.length - 1]);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   300
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   301
        if (_useGreaterThan) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   302
            sb.append('+');
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   303
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   304
        if (_usePrefixMatch) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   305
            sb.append('*');
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   306
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   307
        if (_isCompound) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   308
            sb.append("&");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   309
            sb.append(_rest);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   310
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   311
        return sb.toString();
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   312
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   313
}