src/java.base/share/classes/sun/util/locale/BaseLocale.java
author michaelm
Thu, 14 Nov 2019 15:01:49 +0000
branchunixdomainchannels
changeset 59082 5e250ee9259e
parent 54412 41356f083e93
permissions -rw-r--r--
unixdomainchannels: fix some sockaddr_un address handling
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
     1
/*
48763
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
     2
 * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved.
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
     4
 *
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    10
 *
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    15
 * accompanied this code).
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    16
 *
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    20
 *
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    23
 * questions.
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    24
 */
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    25
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    26
/*
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    27
 *******************************************************************************
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    28
 * Copyright (C) 2009-2010, International Business Machines Corporation and    *
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    29
 * others. All Rights Reserved.                                                *
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    30
 *******************************************************************************
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    31
 */
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    32
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    33
package sun.util.locale;
48763
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
    34
54412
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    35
import jdk.internal.misc.VM;
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    36
import jdk.internal.vm.annotation.Stable;
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    37
27067
0e748d185207 8036936: Use local locales
naoto
parents: 26219
diff changeset
    38
import java.lang.ref.SoftReference;
26219
1a19360ff122 8054714: Use StringJoiner where it makes the code cleaner
igerasim
parents: 25859
diff changeset
    39
import java.util.StringJoiner;
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    40
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    41
public final class BaseLocale {
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    42
54412
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    43
    public static @Stable BaseLocale[] constantBaseLocales;
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    44
    public static final byte ENGLISH = 0,
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    45
            FRENCH = 1,
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    46
            GERMAN = 2,
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    47
            ITALIAN = 3,
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    48
            JAPANESE = 4,
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    49
            KOREAN = 5,
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    50
            CHINESE = 6,
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    51
            SIMPLIFIED_CHINESE = 7,
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    52
            TRADITIONAL_CHINESE = 8,
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    53
            FRANCE = 9,
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    54
            GERMANY = 10,
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    55
            ITALY = 11,
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    56
            JAPAN = 12,
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    57
            KOREA = 13,
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    58
            UK = 14,
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    59
            US = 15,
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    60
            CANADA = 16,
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    61
            CANADA_FRENCH = 17,
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    62
            ROOT = 18,
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    63
            NUM_CONSTANTS = 19;
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    64
    static {
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    65
        VM.initializeFromArchive(BaseLocale.class);
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    66
        BaseLocale[] baseLocales = constantBaseLocales;
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    67
        if (baseLocales == null) {
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    68
            baseLocales = new BaseLocale[NUM_CONSTANTS];
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    69
            baseLocales[ENGLISH] = createInstance("en", "");
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    70
            baseLocales[FRENCH] = createInstance("fr", "");
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    71
            baseLocales[GERMAN] = createInstance("de", "");
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    72
            baseLocales[ITALIAN] = createInstance("it", "");
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    73
            baseLocales[JAPANESE] = createInstance("ja", "");
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    74
            baseLocales[KOREAN] = createInstance("ko", "");
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    75
            baseLocales[CHINESE] = createInstance("zh", "");
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    76
            baseLocales[SIMPLIFIED_CHINESE] = createInstance("zh", "CN");
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    77
            baseLocales[TRADITIONAL_CHINESE] = createInstance("zh", "TW");
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    78
            baseLocales[FRANCE] = createInstance("fr", "FR");
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    79
            baseLocales[GERMANY] = createInstance("de", "DE");
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    80
            baseLocales[ITALY] = createInstance("it", "IT");
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    81
            baseLocales[JAPAN] = createInstance("ja", "JP");
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    82
            baseLocales[KOREA] = createInstance("ko", "KR");
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    83
            baseLocales[UK] = createInstance("en", "GB");
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    84
            baseLocales[US] = createInstance("en", "US");
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    85
            baseLocales[CANADA] = createInstance("en", "CA");
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    86
            baseLocales[CANADA_FRENCH] = createInstance("fr", "CA");
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    87
            baseLocales[ROOT] = createInstance("", "");
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    88
            constantBaseLocales = baseLocales;
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    89
        }
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    90
    }
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
    91
54412
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
    92
    public static final String SEP = "_";
9224
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
    93
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
    94
    private final String language;
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
    95
    private final String script;
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
    96
    private final String region;
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
    97
    private final String variant;
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
    98
34774
03b4e6dc367b 8145680: Remove unnecessary explicit initialization of volatile variables in java.base
redestad
parents: 27067
diff changeset
    99
    private volatile int hash;
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   100
48763
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   101
    // This method must be called with normalize = false only when creating the
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   102
    // Locale.* constants and non-normalized BaseLocale$Keys used for lookup.
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   103
    private BaseLocale(String language, String script, String region, String variant,
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   104
                       boolean normalize) {
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   105
        if (normalize) {
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   106
            this.language = LocaleUtils.toLowerString(language).intern();
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   107
            this.script = LocaleUtils.toTitleString(script).intern();
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   108
            this.region = LocaleUtils.toUpperString(region).intern();
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   109
            this.variant = variant.intern();
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   110
        } else {
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   111
            this.language = language;
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   112
            this.script = script;
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   113
            this.region = region;
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   114
            this.variant = variant;
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   115
        }
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   116
    }
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   117
9224
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   118
    // Called for creating the Locale.* constants. No argument
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   119
    // validation is performed.
54412
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   120
    private static BaseLocale createInstance(String language, String region) {
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   121
        return new BaseLocale(language, "", region, "", false);
9224
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   122
    }
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   123
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   124
    public static BaseLocale getInstance(String language, String script,
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   125
                                         String region, String variant) {
54412
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   126
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   127
        if (script == null) {
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   128
            script = "";
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   129
        }
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   130
        if (region == null) {
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   131
            region = "";
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   132
        }
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   133
        if (language == null) {
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   134
            language = null;
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   135
        }
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   136
        if (variant == null) {
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   137
            variant = "";
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   138
        }
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   139
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   140
        // Non-allocating for most uses
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   141
        language = LocaleUtils.toLowerString(language);
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   142
        region = LocaleUtils.toUpperString(region);
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   143
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   144
        // Check for constant base locales first
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   145
        if (script.isEmpty() && variant.isEmpty()) {
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   146
            for (BaseLocale baseLocale : constantBaseLocales) {
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   147
                if (baseLocale.getLanguage().equals(language)
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   148
                        && baseLocale.getRegion().equals(region)) {
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   149
                    return baseLocale;
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   150
                }
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   151
            }
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   152
        }
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   153
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   154
        // JDK uses deprecated ISO639.1 language codes for he, yi and id
54412
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   155
        if (!language.isEmpty()) {
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   156
            if (language.equals("he")) {
6655
b4130d85e450 6986612: pit jdk7 b112: java.util.Locale getDisplayVariant() sqe test getDisplayVariantTests.java fails
naoto
parents: 6501
diff changeset
   157
                language = "iw";
54412
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   158
            } else if (language.equals("yi")) {
6655
b4130d85e450 6986612: pit jdk7 b112: java.util.Locale getDisplayVariant() sqe test getDisplayVariantTests.java fails
naoto
parents: 6501
diff changeset
   159
                language = "ji";
54412
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   160
            } else if (language.equals("id")) {
6655
b4130d85e450 6986612: pit jdk7 b112: java.util.Locale getDisplayVariant() sqe test getDisplayVariantTests.java fails
naoto
parents: 6501
diff changeset
   161
                language = "in";
b4130d85e450 6986612: pit jdk7 b112: java.util.Locale getDisplayVariant() sqe test getDisplayVariantTests.java fails
naoto
parents: 6501
diff changeset
   162
            }
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   163
        }
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   164
48763
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   165
        Key key = new Key(language, script, region, variant, false);
54412
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   166
        return Cache.CACHE.get(key);
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   167
    }
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   168
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   169
    public String getLanguage() {
9224
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   170
        return language;
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   171
    }
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   172
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   173
    public String getScript() {
9224
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   174
        return script;
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   175
    }
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   176
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   177
    public String getRegion() {
9224
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   178
        return region;
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   179
    }
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   180
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   181
    public String getVariant() {
9224
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   182
        return variant;
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   183
    }
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   184
9224
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   185
    @Override
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   186
    public boolean equals(Object obj) {
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   187
        if (this == obj) {
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   188
            return true;
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   189
        }
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   190
        if (!(obj instanceof BaseLocale)) {
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   191
            return false;
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   192
        }
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   193
        BaseLocale other = (BaseLocale)obj;
9224
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   194
        return language == other.language
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   195
               && script == other.script
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   196
               && region == other.region
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   197
               && variant == other.variant;
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   198
    }
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   199
9224
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   200
    @Override
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   201
    public String toString() {
26219
1a19360ff122 8054714: Use StringJoiner where it makes the code cleaner
igerasim
parents: 25859
diff changeset
   202
        StringJoiner sj = new StringJoiner(", ");
48763
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   203
        if (!language.isEmpty()) {
26219
1a19360ff122 8054714: Use StringJoiner where it makes the code cleaner
igerasim
parents: 25859
diff changeset
   204
            sj.add("language=" + language);
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   205
        }
48763
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   206
        if (!script.isEmpty()) {
26219
1a19360ff122 8054714: Use StringJoiner where it makes the code cleaner
igerasim
parents: 25859
diff changeset
   207
            sj.add("script=" + script);
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   208
        }
48763
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   209
        if (!region.isEmpty()) {
26219
1a19360ff122 8054714: Use StringJoiner where it makes the code cleaner
igerasim
parents: 25859
diff changeset
   210
            sj.add("region=" + region);
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   211
        }
48763
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   212
        if (!variant.isEmpty()) {
26219
1a19360ff122 8054714: Use StringJoiner where it makes the code cleaner
igerasim
parents: 25859
diff changeset
   213
            sj.add("variant=" + variant);
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   214
        }
26219
1a19360ff122 8054714: Use StringJoiner where it makes the code cleaner
igerasim
parents: 25859
diff changeset
   215
        return sj.toString();
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   216
    }
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   217
9224
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   218
    @Override
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   219
    public int hashCode() {
9224
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   220
        int h = hash;
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   221
        if (h == 0) {
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   222
            // Generating a hash value from language, script, region and variant
9224
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   223
            h = language.hashCode();
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   224
            h = 31 * h + script.hashCode();
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   225
            h = 31 * h + region.hashCode();
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   226
            h = 31 * h + variant.hashCode();
34774
03b4e6dc367b 8145680: Remove unnecessary explicit initialization of volatile variables in java.base
redestad
parents: 27067
diff changeset
   227
            if (h != 0) {
03b4e6dc367b 8145680: Remove unnecessary explicit initialization of volatile variables in java.base
redestad
parents: 27067
diff changeset
   228
                hash = h;
03b4e6dc367b 8145680: Remove unnecessary explicit initialization of volatile variables in java.base
redestad
parents: 27067
diff changeset
   229
            }
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   230
        }
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   231
        return h;
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   232
    }
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   233
27067
0e748d185207 8036936: Use local locales
naoto
parents: 26219
diff changeset
   234
    private static final class Key {
48763
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   235
        /**
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   236
         * Keep a SoftReference to the Key data if normalized (actually used
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   237
         * as a cache key) and not initialized via the constant creation path.
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   238
         *
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   239
         * This allows us to avoid creating SoftReferences on lookup Keys
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   240
         * (which are short-lived) and for Locales created via
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   241
         * Locale#createConstant.
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   242
         */
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   243
        private final SoftReference<BaseLocale> holderRef;
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   244
        private final BaseLocale holder;
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   245
9224
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   246
        private final boolean normalized;
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   247
        private final int hash;
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   248
48763
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   249
        private Key(String language, String script, String region,
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   250
                    String variant, boolean normalize) {
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   251
            BaseLocale locale = new BaseLocale(language, script, region, variant, normalize);
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   252
            this.normalized = normalize;
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   253
            if (normalized) {
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   254
                this.holderRef = new SoftReference<>(locale);
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   255
                this.holder = null;
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   256
            } else {
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   257
                this.holderRef = null;
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   258
                this.holder = locale;
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   259
            }
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   260
            this.hash = hashCode(locale);
9224
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   261
        }
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   262
48763
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   263
        public int hashCode() {
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   264
            return hash;
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   265
        }
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   266
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   267
        private int hashCode(BaseLocale locale) {
9224
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   268
            int h = 0;
48763
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   269
            String lang = locale.getLanguage();
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   270
            int len = lang.length();
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   271
            for (int i = 0; i < len; i++) {
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   272
                h = 31*h + LocaleUtils.toLower(lang.charAt(i));
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   273
            }
48763
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   274
            String scrt = locale.getScript();
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   275
            len = scrt.length();
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   276
            for (int i = 0; i < len; i++) {
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   277
                h = 31*h + LocaleUtils.toLower(scrt.charAt(i));
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   278
            }
48763
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   279
            String regn = locale.getRegion();
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   280
            len = regn.length();
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   281
            for (int i = 0; i < len; i++) {
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   282
                h = 31*h + LocaleUtils.toLower(regn.charAt(i));
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   283
            }
48763
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   284
            String vart = locale.getVariant();
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   285
            len = vart.length();
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   286
            for (int i = 0; i < len; i++) {
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   287
                h = 31*h + vart.charAt(i);
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   288
            }
48763
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   289
            return h;
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   290
        }
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   291
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   292
        private BaseLocale getBaseLocale() {
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   293
            return (holder == null) ? holderRef.get() : holder;
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   294
        }
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   295
9224
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   296
        @Override
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   297
        public boolean equals(Object obj) {
27067
0e748d185207 8036936: Use local locales
naoto
parents: 26219
diff changeset
   298
            if (this == obj) {
0e748d185207 8036936: Use local locales
naoto
parents: 26219
diff changeset
   299
                return true;
0e748d185207 8036936: Use local locales
naoto
parents: 26219
diff changeset
   300
            }
0e748d185207 8036936: Use local locales
naoto
parents: 26219
diff changeset
   301
            if (obj instanceof Key && this.hash == ((Key)obj).hash) {
48763
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   302
                BaseLocale other = ((Key) obj).getBaseLocale();
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   303
                BaseLocale locale = this.getBaseLocale();
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   304
                if (other != null && locale != null
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   305
                    && LocaleUtils.caseIgnoreMatch(other.getLanguage(), locale.getLanguage())
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   306
                    && LocaleUtils.caseIgnoreMatch(other.getScript(), locale.getScript())
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   307
                    && LocaleUtils.caseIgnoreMatch(other.getRegion(), locale.getRegion())
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   308
                    // variant is case sensitive in JDK!
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   309
                    && other.getVariant().equals(locale.getVariant())) {
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   310
                    return true;
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   311
                }
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   312
            }
27067
0e748d185207 8036936: Use local locales
naoto
parents: 26219
diff changeset
   313
            return false;
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   314
        }
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   315
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   316
        public static Key normalize(Key key) {
9224
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   317
            if (key.normalized) {
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   318
                return key;
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   319
            }
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   320
48763
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   321
            // Only normalized keys may be softly referencing the data holder
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   322
            assert (key.holder != null && key.holderRef == null);
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   323
            BaseLocale locale = key.holder;
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   324
            return new Key(locale.getLanguage(), locale.getScript(),
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   325
                    locale.getRegion(), locale.getVariant(), true);
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   326
        }
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   327
    }
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   328
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   329
    private static class Cache extends LocaleObjectCache<Key, BaseLocale> {
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   330
54412
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   331
        private static final Cache CACHE = new Cache();
41356f083e93 8221701: Archive constant BaseLocales
redestad
parents: 48763
diff changeset
   332
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   333
        public Cache() {
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   334
        }
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   335
9224
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   336
        @Override
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   337
        protected Key normalizeKey(Key key) {
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   338
            return Key.normalize(key);
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   339
        }
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   340
9224
75c0420badef 7028818: (lc) Lazily initialize locale extension
okutsu
parents: 6655
diff changeset
   341
        @Override
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   342
        protected BaseLocale createObject(Key key) {
48763
3d17a524da95 8196869: Optimize Locale creation
redestad
parents: 47216
diff changeset
   343
            return Key.normalize(key).getBaseLocale();
6501
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   344
        }
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   345
    }
684810d882b3 6875847: Java Locale Enhancement
naoto
parents:
diff changeset
   346
}