Print this page
rev 5615 : 6336885: RFE: Locale Data Deployment Enhancements
4609153: Provide locale data for Indic locales
5104387: Support for gl_ES locale (galician language)
6337471: desktop/system locale preferences support
7056139: (cal) SPI support for locale-dependent Calendar parameters
7058206: Provide CalendarData SPI for week params and display field value names
7073852: Support multiple scripts for digits and decimal symbols per locale
7079560: [Fmt-Da] Context dependent month names support in SimpleDateFormat
7171324: getAvailableLocales() of locale sensitive services should return the actual availability of locales
7151414: (cal) Support calendar type identification
7168528: LocaleServiceProvider needs to be aware of Locale extensions
7171372: (cal) locale's default Calendar should be created if unknown calendar is specified
Summary: JEP 127: Improve Locale Data Packaging and Adopt Unicode CLDR Data (part 1 w/o Jigsaw. by Naoto Sato and Masayoshi Okutsu)
Split |
Close |
Expand all |
Collapse all |
--- old/src/share/classes/sun/util/resources/OpenListResourceBundle.java
+++ new/src/share/classes/sun/util/resources/OpenListResourceBundle.java
1 1 /*
2 2 * Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved.
3 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 4 *
5 5 * This code is free software; you can redistribute it and/or modify it
6 6 * under the terms of the GNU General Public License version 2 only, as
7 7 * published by the Free Software Foundation. Oracle designates this
8 8 * particular file as subject to the "Classpath" exception as provided
9 9 * by Oracle in the LICENSE file that accompanied this code.
10 10 *
11 11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 14 * version 2 for more details (a copy is included in the LICENSE file that
15 15 * accompanied this code).
16 16 *
17 17 * You should have received a copy of the GNU General Public License version
18 18 * 2 along with this work; if not, write to the Free Software Foundation,
19 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 20 *
21 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 22 * or visit www.oracle.com if you need additional information or have any
23 23 * questions.
24 24 */
25 25
26 26 /*
27 27 * (C) Copyright Taligent, Inc. 1996, 1997 - All Rights Reserved
28 28 * (C) Copyright IBM Corp. 1996 - 1998 - All Rights Reserved
29 29 *
30 30 * The original version of this source code and documentation
31 31 * is copyrighted and owned by Taligent, Inc., a wholly-owned
32 32 * subsidiary of IBM. These materials are provided under terms
33 33 * of a License Agreement between Taligent and Sun. This technology
34 34 * is protected by multiple US and International patents.
↓ open down ↓ |
34 lines elided |
↑ open up ↑ |
35 35 *
36 36 * This notice and attribution to Taligent may not be removed.
37 37 * Taligent is a registered trademark of Taligent, Inc.
38 38 *
39 39 */
40 40
41 41 package sun.util.resources;
42 42
43 43 import java.util.Enumeration;
44 44 import java.util.HashMap;
45 +import java.util.HashSet;
45 46 import java.util.Map;
46 47 import java.util.ResourceBundle;
47 48 import java.util.Set;
48 49 import sun.util.ResourceBundleEnumeration;
49 50
50 51 /**
51 52 * Subclass of <code>ResourceBundle</code> which mimics
52 53 * <code>ListResourceBundle</code>, but provides more hooks
53 54 * for specialized subclass behavior. For general description,
54 55 * see {@link java.util.ListResourceBundle}.
55 56 * <p>
56 57 * This class leaves handleGetObject non-final, and
57 58 * adds a method createMap which allows subclasses to
58 59 * use specialized Map implementations.
59 60 */
60 61 public abstract class OpenListResourceBundle extends ResourceBundle {
61 62 /**
62 63 * Sole constructor. (For invocation by subclass constructors, typically
63 64 * implicit.)
64 65 */
65 66 protected OpenListResourceBundle() {
66 67 }
67 68
68 69 // Implements java.util.ResourceBundle.handleGetObject; inherits javadoc specification.
69 70 public Object handleGetObject(String key) {
70 71 if (key == null) {
71 72 throw new NullPointerException();
72 73 }
73 74
74 75 loadLookupTablesIfNecessary();
75 76 return lookup.get(key); // this class ignores locales
76 77 }
77 78
78 79 /**
79 80 * Implementation of ResourceBundle.getKeys.
80 81 */
81 82 public Enumeration<String> getKeys() {
82 83 ResourceBundle parent = this.parent;
83 84 return new ResourceBundleEnumeration(handleGetKeys(),
84 85 (parent != null) ? parent.getKeys() : null);
85 86 }
↓ open down ↓ |
31 lines elided |
↑ open up ↑ |
86 87
87 88 /**
88 89 * Returns a set of keys provided in this resource bundle
89 90 */
90 91 public Set<String> handleGetKeys() {
91 92 loadLookupTablesIfNecessary();
92 93
93 94 return lookup.keySet();
94 95 }
95 96
97 + @Override
98 + public Set<String> keySet() {
99 + if (keyset != null) {
100 + return keyset;
101 + }
102 + Set<String> ks = new HashSet<>();
103 + ks.addAll(handleGetKeys());
104 + if (parent != null) {
105 + ks.addAll(parent.keySet());
106 + }
107 + synchronized (this) {
108 + if (keyset == null) {
109 + keyset = ks;
110 + }
111 + }
112 + return keyset;
113 + }
114 +
96 115 /**
97 116 * Returns the parent bundle
98 117 */
99 118 public OpenListResourceBundle getParent() {
100 119 return (OpenListResourceBundle)parent;
101 120 }
102 121
103 122 /**
104 123 * See ListResourceBundle class description.
105 124 */
106 125 abstract protected Object[][] getContents();
107 126
108 127 /**
109 128 * Load lookup tables if they haven't been loaded already.
110 129 */
↓ open down ↓ |
5 lines elided |
↑ open up ↑ |
111 130 void loadLookupTablesIfNecessary() {
112 131 if (lookup == null) {
113 132 loadLookup();
114 133 }
115 134 }
116 135
117 136 /**
118 137 * We lazily load the lookup hashtable. This function does the
119 138 * loading.
120 139 */
121 - private synchronized void loadLookup() {
122 - if (lookup != null) {
123 - return;
124 - }
125 -
140 + private void loadLookup() {
126 141 Object[][] contents = getContents();
127 142 Map<String, Object> temp = createMap(contents.length);
128 143 for (int i = 0; i < contents.length; ++i) {
129 144 // key must be non-null String, value must be non-null
130 145 String key = (String) contents[i][0];
131 146 Object value = contents[i][1];
132 147 if (key == null || value == null) {
133 148 throw new NullPointerException();
134 149 }
135 150 temp.put(key, value);
136 151 }
137 - lookup = temp;
152 + synchronized (this) {
153 + if (lookup == null) {
154 + lookup = temp;
155 + }
156 + }
138 157 }
139 158
140 159 /**
141 160 * Lets subclasses provide specialized Map implementations.
142 161 * Default uses HashMap.
143 162 */
144 163 protected Map<String, Object> createMap(int size) {
145 164 return new HashMap<>(size);
146 165 }
147 166
148 - private Map<String, Object> lookup = null;
167 + private volatile Map<String, Object> lookup = null;
168 + private volatile Set<String> keyset;
149 169 }
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX