author | redestad |
Thu, 13 Dec 2018 15:31:05 +0100 | |
changeset 53018 | 8bf9268df0e2 |
parent 50974 | 24bf1bd23725 |
child 54412 | 41356f083e93 |
permissions | -rw-r--r-- |
13583 | 1 |
/* |
49904
cadca99d52e7
8181157: CLDR Timezone name fallback implementation
naoto
parents:
48251
diff
changeset
|
2 |
* Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. |
13583 | 3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 |
* |
|
5 |
* This code is free software; you can redistribute it and/or modify it |
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
|
7 |
* published by the Free Software Foundation. Oracle designates this |
|
8 |
* particular file as subject to the "Classpath" exception as provided |
|
9 |
* by Oracle in the LICENSE file that accompanied this code. |
|
10 |
* |
|
11 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
|
12 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
13 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
14 |
* version 2 for more details (a copy is included in the LICENSE file that |
|
15 |
* accompanied this code). |
|
16 |
* |
|
17 |
* You should have received a copy of the GNU General Public License version |
|
18 |
* 2 along with this work; if not, write to the Free Software Foundation, |
|
19 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
20 |
* |
|
21 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
22 |
* or visit www.oracle.com if you need additional information or have any |
|
23 |
* questions. |
|
24 |
*/ |
|
25 |
||
26 |
package sun.util.locale.provider; |
|
27 |
||
28 |
import java.security.AccessController; |
|
47345
0a1fc9f3779c
8189264: (sl) ServiceLoader does not wrap Errors thrown by provider classes when running with a security manager
alanb
parents:
47216
diff
changeset
|
29 |
import java.security.AccessControlException; |
30047
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
30 |
import java.security.PrivilegedAction; |
47442
560ee83bfce5
8189272: CLDR and JRE LocaleProviderAdapters silently swallow exceptions
naoto
parents:
47345
diff
changeset
|
31 |
import java.security.PrivilegedActionException; |
26360
697f70835528
8038436: Re-examine the mechanism to determine available localedata and cldrdata
naoto
parents:
25996
diff
changeset
|
32 |
import java.security.PrivilegedExceptionAction; |
13583 | 33 |
import java.text.spi.BreakIteratorProvider; |
34 |
import java.text.spi.CollatorProvider; |
|
35 |
import java.text.spi.DateFormatProvider; |
|
36 |
import java.text.spi.DateFormatSymbolsProvider; |
|
37 |
import java.text.spi.DecimalFormatSymbolsProvider; |
|
38 |
import java.text.spi.NumberFormatProvider; |
|
25996
4aa9eb909760
8055088: Optimization for locale resources loading isn't working
okutsu
parents:
25859
diff
changeset
|
39 |
import java.util.Collections; |
13583 | 40 |
import java.util.HashSet; |
31263 | 41 |
import java.util.List; |
13583 | 42 |
import java.util.Locale; |
31263 | 43 |
import java.util.ResourceBundle; |
26360
697f70835528
8038436: Re-examine the mechanism to determine available localedata and cldrdata
naoto
parents:
25996
diff
changeset
|
44 |
import java.util.ServiceLoader; |
47345
0a1fc9f3779c
8189264: (sl) ServiceLoader does not wrap Errors thrown by provider classes when running with a security manager
alanb
parents:
47216
diff
changeset
|
45 |
import java.util.ServiceConfigurationError; |
13583 | 46 |
import java.util.Set; |
47 |
import java.util.StringTokenizer; |
|
48 |
import java.util.concurrent.ConcurrentHashMap; |
|
49 |
import java.util.concurrent.ConcurrentMap; |
|
50 |
import java.util.spi.CalendarDataProvider; |
|
14502
d63fed06fed4
8000986: Split java.util.spi.CalendarDataProvider into week parameters and field names portions
okutsu
parents:
14418
diff
changeset
|
51 |
import java.util.spi.CalendarNameProvider; |
13583 | 52 |
import java.util.spi.CurrencyNameProvider; |
53 |
import java.util.spi.LocaleNameProvider; |
|
54 |
import java.util.spi.LocaleServiceProvider; |
|
55 |
import java.util.spi.TimeZoneNameProvider; |
|
42360 | 56 |
import sun.text.spi.JavaTimeDateTimePatternProvider; |
13583 | 57 |
import sun.util.resources.LocaleData; |
16481
8e30386cc014
8008576: Calendar mismatch using Host LocaleProviderAdapter
naoto
parents:
15260
diff
changeset
|
58 |
import sun.util.spi.CalendarProvider; |
13583 | 59 |
|
60 |
/** |
|
61 |
* LocaleProviderAdapter implementation for the legacy JRE locale data. |
|
62 |
* |
|
63 |
* @author Naoto Sato |
|
64 |
* @author Masayoshi Okutsu |
|
65 |
*/ |
|
15260 | 66 |
public class JRELocaleProviderAdapter extends LocaleProviderAdapter implements ResourceBundleBasedAdapter { |
13583 | 67 |
|
68 |
private final ConcurrentMap<String, Set<String>> langtagSets |
|
69 |
= new ConcurrentHashMap<>(); |
|
70 |
||
71 |
private final ConcurrentMap<Locale, LocaleResources> localeResourcesMap |
|
72 |
= new ConcurrentHashMap<>(); |
|
73 |
||
74 |
// LocaleData specific to this LocaleProviderAdapter. |
|
75 |
private volatile LocaleData localeData; |
|
76 |
||
77 |
/** |
|
78 |
* Returns the type of this LocaleProviderAdapter |
|
79 |
*/ |
|
80 |
@Override |
|
81 |
public LocaleProviderAdapter.Type getAdapterType() { |
|
14024
694c379c2958
7196799: CLDR adapter can not be invoked when region code is specified in Locale
naoto
parents:
13583
diff
changeset
|
82 |
return Type.JRE; |
13583 | 83 |
} |
84 |
||
85 |
/** |
|
86 |
* Getter method for Locale Service Providers |
|
87 |
*/ |
|
88 |
@Override |
|
89 |
@SuppressWarnings("unchecked") |
|
90 |
public <P extends LocaleServiceProvider> P getLocaleServiceProvider(Class<P> c) { |
|
91 |
switch (c.getSimpleName()) { |
|
92 |
case "BreakIteratorProvider": |
|
93 |
return (P) getBreakIteratorProvider(); |
|
94 |
case "CollatorProvider": |
|
95 |
return (P) getCollatorProvider(); |
|
96 |
case "DateFormatProvider": |
|
97 |
return (P) getDateFormatProvider(); |
|
98 |
case "DateFormatSymbolsProvider": |
|
99 |
return (P) getDateFormatSymbolsProvider(); |
|
100 |
case "DecimalFormatSymbolsProvider": |
|
101 |
return (P) getDecimalFormatSymbolsProvider(); |
|
102 |
case "NumberFormatProvider": |
|
103 |
return (P) getNumberFormatProvider(); |
|
104 |
case "CurrencyNameProvider": |
|
105 |
return (P) getCurrencyNameProvider(); |
|
106 |
case "LocaleNameProvider": |
|
107 |
return (P) getLocaleNameProvider(); |
|
108 |
case "TimeZoneNameProvider": |
|
109 |
return (P) getTimeZoneNameProvider(); |
|
110 |
case "CalendarDataProvider": |
|
111 |
return (P) getCalendarDataProvider(); |
|
14502
d63fed06fed4
8000986: Split java.util.spi.CalendarDataProvider into week parameters and field names portions
okutsu
parents:
14418
diff
changeset
|
112 |
case "CalendarNameProvider": |
d63fed06fed4
8000986: Split java.util.spi.CalendarDataProvider into week parameters and field names portions
okutsu
parents:
14418
diff
changeset
|
113 |
return (P) getCalendarNameProvider(); |
16481
8e30386cc014
8008576: Calendar mismatch using Host LocaleProviderAdapter
naoto
parents:
15260
diff
changeset
|
114 |
case "CalendarProvider": |
8e30386cc014
8008576: Calendar mismatch using Host LocaleProviderAdapter
naoto
parents:
15260
diff
changeset
|
115 |
return (P) getCalendarProvider(); |
42360 | 116 |
case "JavaTimeDateTimePatternProvider": |
117 |
return (P) getJavaTimeDateTimePatternProvider(); |
|
13583 | 118 |
default: |
119 |
throw new InternalError("should not come down here"); |
|
120 |
} |
|
121 |
} |
|
122 |
||
34774
03b4e6dc367b
8145680: Remove unnecessary explicit initialization of volatile variables in java.base
redestad
parents:
31263
diff
changeset
|
123 |
private volatile BreakIteratorProvider breakIteratorProvider; |
03b4e6dc367b
8145680: Remove unnecessary explicit initialization of volatile variables in java.base
redestad
parents:
31263
diff
changeset
|
124 |
private volatile CollatorProvider collatorProvider; |
03b4e6dc367b
8145680: Remove unnecessary explicit initialization of volatile variables in java.base
redestad
parents:
31263
diff
changeset
|
125 |
private volatile DateFormatProvider dateFormatProvider; |
03b4e6dc367b
8145680: Remove unnecessary explicit initialization of volatile variables in java.base
redestad
parents:
31263
diff
changeset
|
126 |
private volatile DateFormatSymbolsProvider dateFormatSymbolsProvider; |
03b4e6dc367b
8145680: Remove unnecessary explicit initialization of volatile variables in java.base
redestad
parents:
31263
diff
changeset
|
127 |
private volatile DecimalFormatSymbolsProvider decimalFormatSymbolsProvider; |
03b4e6dc367b
8145680: Remove unnecessary explicit initialization of volatile variables in java.base
redestad
parents:
31263
diff
changeset
|
128 |
private volatile NumberFormatProvider numberFormatProvider; |
13583 | 129 |
|
34774
03b4e6dc367b
8145680: Remove unnecessary explicit initialization of volatile variables in java.base
redestad
parents:
31263
diff
changeset
|
130 |
private volatile CurrencyNameProvider currencyNameProvider; |
03b4e6dc367b
8145680: Remove unnecessary explicit initialization of volatile variables in java.base
redestad
parents:
31263
diff
changeset
|
131 |
private volatile LocaleNameProvider localeNameProvider; |
49904
cadca99d52e7
8181157: CLDR Timezone name fallback implementation
naoto
parents:
48251
diff
changeset
|
132 |
protected volatile TimeZoneNameProvider timeZoneNameProvider; |
48251
57148c79bd75
8176841: Additional Unicode Language-Tag Extensions
naoto
parents:
47442
diff
changeset
|
133 |
protected volatile CalendarDataProvider calendarDataProvider; |
50974
24bf1bd23725
8204603: Short week days, NaN value and timezone name are inconsistent between CLDR and Java in zh_CN, zh_TW locales.
rgoel
parents:
49904
diff
changeset
|
134 |
protected volatile CalendarNameProvider calendarNameProvider; |
13583 | 135 |
|
34774
03b4e6dc367b
8145680: Remove unnecessary explicit initialization of volatile variables in java.base
redestad
parents:
31263
diff
changeset
|
136 |
private volatile CalendarProvider calendarProvider; |
42360 | 137 |
private volatile JavaTimeDateTimePatternProvider javaTimeDateTimePatternProvider; |
16481
8e30386cc014
8008576: Calendar mismatch using Host LocaleProviderAdapter
naoto
parents:
15260
diff
changeset
|
138 |
|
13583 | 139 |
/* |
140 |
* Getter methods for java.text.spi.* providers |
|
141 |
*/ |
|
142 |
@Override |
|
143 |
public BreakIteratorProvider getBreakIteratorProvider() { |
|
144 |
if (breakIteratorProvider == null) { |
|
30047
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
145 |
BreakIteratorProvider provider = AccessController.doPrivileged( |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
146 |
(PrivilegedAction<BreakIteratorProvider>) () -> |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
147 |
new BreakIteratorProviderImpl( |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
148 |
getAdapterType(), |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
149 |
getLanguageTagSet("FormatData"))); |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
150 |
|
13583 | 151 |
synchronized (this) { |
152 |
if (breakIteratorProvider == null) { |
|
153 |
breakIteratorProvider = provider; |
|
154 |
} |
|
155 |
} |
|
156 |
} |
|
157 |
return breakIteratorProvider; |
|
158 |
} |
|
159 |
||
160 |
@Override |
|
161 |
public CollatorProvider getCollatorProvider() { |
|
162 |
if (collatorProvider == null) { |
|
30047
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
163 |
CollatorProvider provider = AccessController.doPrivileged( |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
164 |
(PrivilegedAction<CollatorProvider>) () -> |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
165 |
new CollatorProviderImpl( |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
166 |
getAdapterType(), |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
167 |
getLanguageTagSet("CollationData"))); |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
168 |
|
13583 | 169 |
synchronized (this) { |
170 |
if (collatorProvider == null) { |
|
171 |
collatorProvider = provider; |
|
172 |
} |
|
173 |
} |
|
174 |
} |
|
175 |
return collatorProvider; |
|
176 |
} |
|
177 |
||
178 |
@Override |
|
179 |
public DateFormatProvider getDateFormatProvider() { |
|
180 |
if (dateFormatProvider == null) { |
|
30047
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
181 |
DateFormatProvider provider = AccessController.doPrivileged( |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
182 |
(PrivilegedAction<DateFormatProvider>) () -> |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
183 |
new DateFormatProviderImpl( |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
184 |
getAdapterType(), |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
185 |
getLanguageTagSet("FormatData"))); |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
186 |
|
13583 | 187 |
synchronized (this) { |
188 |
if (dateFormatProvider == null) { |
|
189 |
dateFormatProvider = provider; |
|
190 |
} |
|
191 |
} |
|
192 |
} |
|
193 |
return dateFormatProvider; |
|
194 |
} |
|
195 |
||
196 |
@Override |
|
197 |
public DateFormatSymbolsProvider getDateFormatSymbolsProvider() { |
|
198 |
if (dateFormatSymbolsProvider == null) { |
|
30047
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
199 |
DateFormatSymbolsProvider provider = AccessController.doPrivileged( |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
200 |
(PrivilegedAction<DateFormatSymbolsProvider>) () -> |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
201 |
new DateFormatSymbolsProviderImpl( |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
202 |
getAdapterType(), |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
203 |
getLanguageTagSet("FormatData"))); |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
204 |
|
13583 | 205 |
synchronized (this) { |
206 |
if (dateFormatSymbolsProvider == null) { |
|
207 |
dateFormatSymbolsProvider = provider; |
|
208 |
} |
|
209 |
} |
|
210 |
} |
|
211 |
return dateFormatSymbolsProvider; |
|
212 |
} |
|
213 |
||
214 |
@Override |
|
215 |
public DecimalFormatSymbolsProvider getDecimalFormatSymbolsProvider() { |
|
216 |
if (decimalFormatSymbolsProvider == null) { |
|
30047
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
217 |
DecimalFormatSymbolsProvider provider = AccessController.doPrivileged( |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
218 |
(PrivilegedAction<DecimalFormatSymbolsProvider>) () -> |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
219 |
new DecimalFormatSymbolsProviderImpl( |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
220 |
getAdapterType(), |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
221 |
getLanguageTagSet("FormatData"))); |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
222 |
|
13583 | 223 |
synchronized (this) { |
224 |
if (decimalFormatSymbolsProvider == null) { |
|
225 |
decimalFormatSymbolsProvider = provider; |
|
226 |
} |
|
227 |
} |
|
228 |
} |
|
229 |
return decimalFormatSymbolsProvider; |
|
230 |
} |
|
231 |
||
232 |
@Override |
|
233 |
public NumberFormatProvider getNumberFormatProvider() { |
|
234 |
if (numberFormatProvider == null) { |
|
30047
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
235 |
NumberFormatProvider provider = AccessController.doPrivileged( |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
236 |
(PrivilegedAction<NumberFormatProvider>) () -> |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
237 |
new NumberFormatProviderImpl( |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
238 |
getAdapterType(), |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
239 |
getLanguageTagSet("FormatData"))); |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
240 |
|
13583 | 241 |
synchronized (this) { |
242 |
if (numberFormatProvider == null) { |
|
243 |
numberFormatProvider = provider; |
|
244 |
} |
|
245 |
} |
|
246 |
} |
|
247 |
return numberFormatProvider; |
|
248 |
} |
|
249 |
||
250 |
/** |
|
251 |
* Getter methods for java.util.spi.* providers |
|
252 |
*/ |
|
253 |
@Override |
|
254 |
public CurrencyNameProvider getCurrencyNameProvider() { |
|
255 |
if (currencyNameProvider == null) { |
|
30047
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
256 |
CurrencyNameProvider provider = AccessController.doPrivileged( |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
257 |
(PrivilegedAction<CurrencyNameProvider>) () -> |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
258 |
new CurrencyNameProviderImpl( |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
259 |
getAdapterType(), |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
260 |
getLanguageTagSet("CurrencyNames"))); |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
261 |
|
13583 | 262 |
synchronized (this) { |
263 |
if (currencyNameProvider == null) { |
|
264 |
currencyNameProvider = provider; |
|
265 |
} |
|
266 |
} |
|
267 |
} |
|
268 |
return currencyNameProvider; |
|
269 |
} |
|
270 |
||
271 |
@Override |
|
272 |
public LocaleNameProvider getLocaleNameProvider() { |
|
273 |
if (localeNameProvider == null) { |
|
30047
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
274 |
LocaleNameProvider provider = AccessController.doPrivileged( |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
275 |
(PrivilegedAction<LocaleNameProvider>) () -> |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
276 |
new LocaleNameProviderImpl( |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
277 |
getAdapterType(), |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
278 |
getLanguageTagSet("LocaleNames"))); |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
279 |
|
13583 | 280 |
synchronized (this) { |
281 |
if (localeNameProvider == null) { |
|
282 |
localeNameProvider = provider; |
|
283 |
} |
|
284 |
} |
|
285 |
} |
|
286 |
return localeNameProvider; |
|
287 |
} |
|
288 |
||
289 |
@Override |
|
290 |
public TimeZoneNameProvider getTimeZoneNameProvider() { |
|
291 |
if (timeZoneNameProvider == null) { |
|
30047
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
292 |
TimeZoneNameProvider provider = AccessController.doPrivileged( |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
293 |
(PrivilegedAction<TimeZoneNameProvider>) () -> |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
294 |
new TimeZoneNameProviderImpl( |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
295 |
getAdapterType(), |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
296 |
getLanguageTagSet("TimeZoneNames"))); |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
297 |
|
13583 | 298 |
synchronized (this) { |
299 |
if (timeZoneNameProvider == null) { |
|
300 |
timeZoneNameProvider = provider; |
|
301 |
} |
|
302 |
} |
|
303 |
} |
|
304 |
return timeZoneNameProvider; |
|
305 |
} |
|
306 |
||
307 |
@Override |
|
308 |
public CalendarDataProvider getCalendarDataProvider() { |
|
309 |
if (calendarDataProvider == null) { |
|
30047
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
310 |
CalendarDataProvider provider = AccessController.doPrivileged( |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
311 |
(PrivilegedAction<CalendarDataProvider>) () -> |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
312 |
new CalendarDataProviderImpl( |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
313 |
getAdapterType(), |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
314 |
getLanguageTagSet("CalendarData"))); |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
315 |
|
13583 | 316 |
synchronized (this) { |
317 |
if (calendarDataProvider == null) { |
|
318 |
calendarDataProvider = provider; |
|
319 |
} |
|
320 |
} |
|
321 |
} |
|
322 |
return calendarDataProvider; |
|
323 |
} |
|
324 |
||
325 |
@Override |
|
14502
d63fed06fed4
8000986: Split java.util.spi.CalendarDataProvider into week parameters and field names portions
okutsu
parents:
14418
diff
changeset
|
326 |
public CalendarNameProvider getCalendarNameProvider() { |
d63fed06fed4
8000986: Split java.util.spi.CalendarDataProvider into week parameters and field names portions
okutsu
parents:
14418
diff
changeset
|
327 |
if (calendarNameProvider == null) { |
30047
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
328 |
CalendarNameProvider provider = AccessController.doPrivileged( |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
329 |
(PrivilegedAction<CalendarNameProvider>) () -> |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
330 |
new CalendarNameProviderImpl( |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
331 |
getAdapterType(), |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
332 |
getLanguageTagSet("FormatData"))); |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
333 |
|
14502
d63fed06fed4
8000986: Split java.util.spi.CalendarDataProvider into week parameters and field names portions
okutsu
parents:
14418
diff
changeset
|
334 |
synchronized (this) { |
d63fed06fed4
8000986: Split java.util.spi.CalendarDataProvider into week parameters and field names portions
okutsu
parents:
14418
diff
changeset
|
335 |
if (calendarNameProvider == null) { |
d63fed06fed4
8000986: Split java.util.spi.CalendarDataProvider into week parameters and field names portions
okutsu
parents:
14418
diff
changeset
|
336 |
calendarNameProvider = provider; |
d63fed06fed4
8000986: Split java.util.spi.CalendarDataProvider into week parameters and field names portions
okutsu
parents:
14418
diff
changeset
|
337 |
} |
d63fed06fed4
8000986: Split java.util.spi.CalendarDataProvider into week parameters and field names portions
okutsu
parents:
14418
diff
changeset
|
338 |
} |
d63fed06fed4
8000986: Split java.util.spi.CalendarDataProvider into week parameters and field names portions
okutsu
parents:
14418
diff
changeset
|
339 |
} |
d63fed06fed4
8000986: Split java.util.spi.CalendarDataProvider into week parameters and field names portions
okutsu
parents:
14418
diff
changeset
|
340 |
return calendarNameProvider; |
d63fed06fed4
8000986: Split java.util.spi.CalendarDataProvider into week parameters and field names portions
okutsu
parents:
14418
diff
changeset
|
341 |
} |
d63fed06fed4
8000986: Split java.util.spi.CalendarDataProvider into week parameters and field names portions
okutsu
parents:
14418
diff
changeset
|
342 |
|
16481
8e30386cc014
8008576: Calendar mismatch using Host LocaleProviderAdapter
naoto
parents:
15260
diff
changeset
|
343 |
/** |
8e30386cc014
8008576: Calendar mismatch using Host LocaleProviderAdapter
naoto
parents:
15260
diff
changeset
|
344 |
* Getter methods for sun.util.spi.* providers |
8e30386cc014
8008576: Calendar mismatch using Host LocaleProviderAdapter
naoto
parents:
15260
diff
changeset
|
345 |
*/ |
8e30386cc014
8008576: Calendar mismatch using Host LocaleProviderAdapter
naoto
parents:
15260
diff
changeset
|
346 |
@Override |
8e30386cc014
8008576: Calendar mismatch using Host LocaleProviderAdapter
naoto
parents:
15260
diff
changeset
|
347 |
public CalendarProvider getCalendarProvider() { |
8e30386cc014
8008576: Calendar mismatch using Host LocaleProviderAdapter
naoto
parents:
15260
diff
changeset
|
348 |
if (calendarProvider == null) { |
30047
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
349 |
CalendarProvider provider = AccessController.doPrivileged( |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
350 |
(PrivilegedAction<CalendarProvider>) () -> |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
351 |
new CalendarProviderImpl( |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
352 |
getAdapterType(), |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
353 |
getLanguageTagSet("CalendarData"))); |
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
354 |
|
16481
8e30386cc014
8008576: Calendar mismatch using Host LocaleProviderAdapter
naoto
parents:
15260
diff
changeset
|
355 |
synchronized (this) { |
8e30386cc014
8008576: Calendar mismatch using Host LocaleProviderAdapter
naoto
parents:
15260
diff
changeset
|
356 |
if (calendarProvider == null) { |
8e30386cc014
8008576: Calendar mismatch using Host LocaleProviderAdapter
naoto
parents:
15260
diff
changeset
|
357 |
calendarProvider = provider; |
8e30386cc014
8008576: Calendar mismatch using Host LocaleProviderAdapter
naoto
parents:
15260
diff
changeset
|
358 |
} |
8e30386cc014
8008576: Calendar mismatch using Host LocaleProviderAdapter
naoto
parents:
15260
diff
changeset
|
359 |
} |
8e30386cc014
8008576: Calendar mismatch using Host LocaleProviderAdapter
naoto
parents:
15260
diff
changeset
|
360 |
} |
8e30386cc014
8008576: Calendar mismatch using Host LocaleProviderAdapter
naoto
parents:
15260
diff
changeset
|
361 |
return calendarProvider; |
8e30386cc014
8008576: Calendar mismatch using Host LocaleProviderAdapter
naoto
parents:
15260
diff
changeset
|
362 |
} |
8e30386cc014
8008576: Calendar mismatch using Host LocaleProviderAdapter
naoto
parents:
15260
diff
changeset
|
363 |
|
42360 | 364 |
/** |
365 |
* Getter methods for sun.text.spi.JavaTimeDateTimePatternProvider provider |
|
366 |
*/ |
|
367 |
@Override |
|
368 |
public JavaTimeDateTimePatternProvider getJavaTimeDateTimePatternProvider() { |
|
369 |
if (javaTimeDateTimePatternProvider == null) { |
|
370 |
JavaTimeDateTimePatternProvider provider = AccessController.doPrivileged( |
|
371 |
(PrivilegedAction<JavaTimeDateTimePatternProvider>) () |
|
372 |
-> new JavaTimeDateTimePatternImpl( |
|
373 |
getAdapterType(), |
|
374 |
getLanguageTagSet("FormatData"))); |
|
375 |
||
376 |
synchronized (this) { |
|
377 |
if (javaTimeDateTimePatternProvider == null) { |
|
378 |
javaTimeDateTimePatternProvider = provider; |
|
379 |
} |
|
380 |
} |
|
381 |
} |
|
382 |
return javaTimeDateTimePatternProvider; |
|
383 |
} |
|
384 |
||
14502
d63fed06fed4
8000986: Split java.util.spi.CalendarDataProvider into week parameters and field names portions
okutsu
parents:
14418
diff
changeset
|
385 |
@Override |
13583 | 386 |
public LocaleResources getLocaleResources(Locale locale) { |
387 |
LocaleResources lr = localeResourcesMap.get(locale); |
|
388 |
if (lr == null) { |
|
389 |
lr = new LocaleResources(this, locale); |
|
390 |
LocaleResources lrc = localeResourcesMap.putIfAbsent(locale, lr); |
|
391 |
if (lrc != null) { |
|
392 |
lr = lrc; |
|
393 |
} |
|
394 |
} |
|
395 |
return lr; |
|
396 |
} |
|
397 |
||
15260 | 398 |
// ResourceBundleBasedAdapter method implementation |
30047
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
399 |
|
13583 | 400 |
@Override |
401 |
public LocaleData getLocaleData() { |
|
402 |
if (localeData == null) { |
|
403 |
synchronized (this) { |
|
404 |
if (localeData == null) { |
|
405 |
localeData = new LocaleData(getAdapterType()); |
|
406 |
} |
|
407 |
} |
|
408 |
} |
|
409 |
return localeData; |
|
410 |
} |
|
411 |
||
31263 | 412 |
@Override |
413 |
public List<Locale> getCandidateLocales(String baseName, Locale locale) { |
|
414 |
return ResourceBundle.Control |
|
415 |
.getNoFallbackControl(ResourceBundle.Control.FORMAT_DEFAULT) |
|
416 |
.getCandidateLocales(baseName, locale); |
|
417 |
} |
|
418 |
||
13583 | 419 |
/** |
420 |
* Returns a list of the installed locales. Currently, this simply returns |
|
421 |
* the list of locales for which a sun.text.resources.FormatData bundle |
|
422 |
* exists. This bundle family happens to be the one with the broadest |
|
423 |
* locale coverage in the JRE. |
|
424 |
*/ |
|
425 |
@Override |
|
426 |
public Locale[] getAvailableLocales() { |
|
427 |
return AvailableJRELocales.localeList.clone(); |
|
428 |
} |
|
429 |
||
14028
5f3d5ae5f1ea
7198834: HOST Adapter: one extra empty space in the end of the pattern string
naoto
parents:
14026
diff
changeset
|
430 |
public Set<String> getLanguageTagSet(String category) { |
13583 | 431 |
Set<String> tagset = langtagSets.get(category); |
432 |
if (tagset == null) { |
|
433 |
tagset = createLanguageTagSet(category); |
|
434 |
Set<String> ts = langtagSets.putIfAbsent(category, tagset); |
|
435 |
if (ts != null) { |
|
436 |
tagset = ts; |
|
437 |
} |
|
438 |
} |
|
439 |
return tagset; |
|
440 |
} |
|
441 |
||
442 |
protected Set<String> createLanguageTagSet(String category) { |
|
26360
697f70835528
8038436: Re-examine the mechanism to determine available localedata and cldrdata
naoto
parents:
25996
diff
changeset
|
443 |
String supportedLocaleString = createSupportedLocaleString(category); |
25996
4aa9eb909760
8055088: Optimization for locale resources loading isn't working
okutsu
parents:
25859
diff
changeset
|
444 |
if (supportedLocaleString == null) { |
4aa9eb909760
8055088: Optimization for locale resources loading isn't working
okutsu
parents:
25859
diff
changeset
|
445 |
return Collections.emptySet(); |
4aa9eb909760
8055088: Optimization for locale resources loading isn't working
okutsu
parents:
25859
diff
changeset
|
446 |
} |
13583 | 447 |
Set<String> tagset = new HashSet<>(); |
448 |
StringTokenizer tokens = new StringTokenizer(supportedLocaleString); |
|
449 |
while (tokens.hasMoreTokens()) { |
|
26360
697f70835528
8038436: Re-examine the mechanism to determine available localedata and cldrdata
naoto
parents:
25996
diff
changeset
|
450 |
tagset.add(tokens.nextToken()); |
13583 | 451 |
} |
14026
ec2c0bbcb881
7200119: Collator.getAvailableLocales() doesn't return Locale.US
naoto
parents:
14024
diff
changeset
|
452 |
|
13583 | 453 |
return tagset; |
454 |
} |
|
455 |
||
26360
697f70835528
8038436: Re-examine the mechanism to determine available localedata and cldrdata
naoto
parents:
25996
diff
changeset
|
456 |
private static String createSupportedLocaleString(String category) { |
31263 | 457 |
// Directly call Base tags, as we know it's in the base module. |
458 |
String supportedLocaleString = BaseLocaleDataMetaInfo.getSupportedLocaleString(category); |
|
26360
697f70835528
8038436: Re-examine the mechanism to determine available localedata and cldrdata
naoto
parents:
25996
diff
changeset
|
459 |
|
697f70835528
8038436: Re-examine the mechanism to determine available localedata and cldrdata
naoto
parents:
25996
diff
changeset
|
460 |
// Use ServiceLoader to dynamically acquire installed locales' tags. |
697f70835528
8038436: Re-examine the mechanism to determine available localedata and cldrdata
naoto
parents:
25996
diff
changeset
|
461 |
try { |
36511 | 462 |
String nonBaseTags = AccessController.doPrivileged((PrivilegedExceptionAction<String>) () -> { |
463 |
StringBuilder tags = new StringBuilder(); |
|
464 |
for (LocaleDataMetaInfo ldmi : |
|
465 |
ServiceLoader.loadInstalled(LocaleDataMetaInfo.class)) { |
|
466 |
if (ldmi.getType() == LocaleProviderAdapter.Type.JRE) { |
|
467 |
String t = ldmi.availableLanguageTags(category); |
|
468 |
if (t != null) { |
|
469 |
if (tags.length() > 0) { |
|
470 |
tags.append(' '); |
|
26360
697f70835528
8038436: Re-examine the mechanism to determine available localedata and cldrdata
naoto
parents:
25996
diff
changeset
|
471 |
} |
36511 | 472 |
tags.append(t); |
26360
697f70835528
8038436: Re-examine the mechanism to determine available localedata and cldrdata
naoto
parents:
25996
diff
changeset
|
473 |
} |
697f70835528
8038436: Re-examine the mechanism to determine available localedata and cldrdata
naoto
parents:
25996
diff
changeset
|
474 |
} |
697f70835528
8038436: Re-examine the mechanism to determine available localedata and cldrdata
naoto
parents:
25996
diff
changeset
|
475 |
} |
36511 | 476 |
return tags.toString(); |
26360
697f70835528
8038436: Re-examine the mechanism to determine available localedata and cldrdata
naoto
parents:
25996
diff
changeset
|
477 |
}); |
697f70835528
8038436: Re-examine the mechanism to determine available localedata and cldrdata
naoto
parents:
25996
diff
changeset
|
478 |
|
31263 | 479 |
if (nonBaseTags != null) { |
480 |
supportedLocaleString += " " + nonBaseTags; |
|
26360
697f70835528
8038436: Re-examine the mechanism to determine available localedata and cldrdata
naoto
parents:
25996
diff
changeset
|
481 |
} |
47442
560ee83bfce5
8189272: CLDR and JRE LocaleProviderAdapters silently swallow exceptions
naoto
parents:
47345
diff
changeset
|
482 |
} catch (PrivilegedActionException pae) { |
560ee83bfce5
8189272: CLDR and JRE LocaleProviderAdapters silently swallow exceptions
naoto
parents:
47345
diff
changeset
|
483 |
throw new InternalError(pae.getCause()); |
26360
697f70835528
8038436: Re-examine the mechanism to determine available localedata and cldrdata
naoto
parents:
25996
diff
changeset
|
484 |
} |
697f70835528
8038436: Re-examine the mechanism to determine available localedata and cldrdata
naoto
parents:
25996
diff
changeset
|
485 |
|
697f70835528
8038436: Re-examine the mechanism to determine available localedata and cldrdata
naoto
parents:
25996
diff
changeset
|
486 |
return supportedLocaleString; |
697f70835528
8038436: Re-examine the mechanism to determine available localedata and cldrdata
naoto
parents:
25996
diff
changeset
|
487 |
} |
697f70835528
8038436: Re-examine the mechanism to determine available localedata and cldrdata
naoto
parents:
25996
diff
changeset
|
488 |
|
13583 | 489 |
/** |
490 |
* Lazy load available locales. |
|
491 |
*/ |
|
492 |
private static class AvailableJRELocales { |
|
493 |
private static final Locale[] localeList = createAvailableLocales(); |
|
494 |
private AvailableJRELocales() { |
|
495 |
} |
|
496 |
} |
|
497 |
||
498 |
private static Locale[] createAvailableLocales() { |
|
499 |
/* |
|
26360
697f70835528
8038436: Re-examine the mechanism to determine available localedata and cldrdata
naoto
parents:
25996
diff
changeset
|
500 |
* Gets the locale string list from LocaleDataMetaInfo classes and then |
13583 | 501 |
* contructs the Locale array and a set of language tags based on the |
502 |
* locale string returned above. |
|
503 |
*/ |
|
26360
697f70835528
8038436: Re-examine the mechanism to determine available localedata and cldrdata
naoto
parents:
25996
diff
changeset
|
504 |
String supportedLocaleString = createSupportedLocaleString("AvailableLocales"); |
13583 | 505 |
|
53018
8bf9268df0e2
8215281: Use String.isEmpty() when applicable in java.base
redestad
parents:
50974
diff
changeset
|
506 |
if (supportedLocaleString.isEmpty()) { |
13583 | 507 |
throw new InternalError("No available locales for JRE"); |
508 |
} |
|
509 |
||
26360
697f70835528
8038436: Re-examine the mechanism to determine available localedata and cldrdata
naoto
parents:
25996
diff
changeset
|
510 |
StringTokenizer localeStringTokenizer = new StringTokenizer(supportedLocaleString); |
13583 | 511 |
|
512 |
int length = localeStringTokenizer.countTokens(); |
|
513 |
Locale[] locales = new Locale[length + 1]; |
|
514 |
locales[0] = Locale.ROOT; |
|
515 |
for (int i = 1; i <= length; i++) { |
|
516 |
String currentToken = localeStringTokenizer.nextToken(); |
|
517 |
switch (currentToken) { |
|
518 |
case "ja-JP-JP": |
|
519 |
locales[i] = JRELocaleConstants.JA_JP_JP; |
|
520 |
break; |
|
521 |
case "no-NO-NY": |
|
522 |
locales[i] = JRELocaleConstants.NO_NO_NY; |
|
523 |
break; |
|
524 |
case "th-TH-TH": |
|
525 |
locales[i] = JRELocaleConstants.TH_TH_TH; |
|
526 |
break; |
|
527 |
default: |
|
528 |
locales[i] = Locale.forLanguageTag(currentToken); |
|
529 |
} |
|
530 |
} |
|
531 |
return locales; |
|
532 |
} |
|
31263 | 533 |
|
534 |
@Override |
|
535 |
public boolean isSupportedProviderLocale(Locale locale, Set<String> langtags) { |
|
536 |
if (Locale.ROOT.equals(locale)) { |
|
537 |
return true; |
|
30047
63b6a16968d5
8075545: Add permission check for locale service provider implementations
naoto
parents:
26360
diff
changeset
|
538 |
} |
31263 | 539 |
|
540 |
locale = locale.stripExtensions(); |
|
541 |
if (langtags.contains(locale.toLanguageTag())) { |
|
542 |
return true; |
|
543 |
} |
|
544 |
||
545 |
String oldname = locale.toString().replace('_', '-'); |
|
546 |
return langtags.contains(oldname) || |
|
547 |
"ja-JP-JP".equals(oldname) || |
|
548 |
"th-TH-TH".equals(oldname) || |
|
549 |
"no-NO-NY".equals(oldname); |
|
550 |
} |
|
551 |
} |