Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/java.base/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java
41161 views
1
/*
2
* Copyright (c) 2012, 2021, Oracle and/or its affiliates. All rights reserved.
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;
29
import java.security.PrivilegedActionException;
30
import java.security.PrivilegedExceptionAction;
31
import java.text.BreakIterator;
32
import java.text.Collator;
33
import java.text.DateFormat;
34
import java.text.DateFormatSymbols;
35
import java.text.DecimalFormatSymbols;
36
import java.text.NumberFormat;
37
import java.text.spi.BreakIteratorProvider;
38
import java.text.spi.CollatorProvider;
39
import java.text.spi.DateFormatProvider;
40
import java.text.spi.DateFormatSymbolsProvider;
41
import java.text.spi.DecimalFormatSymbolsProvider;
42
import java.text.spi.NumberFormatProvider;
43
import java.util.Arrays;
44
import java.util.Locale;
45
import java.util.Map;
46
import java.util.ServiceConfigurationError;
47
import java.util.ServiceLoader;
48
import java.util.concurrent.ConcurrentHashMap;
49
import java.util.spi.CalendarDataProvider;
50
import java.util.spi.CalendarNameProvider;
51
import java.util.spi.CurrencyNameProvider;
52
import java.util.spi.LocaleNameProvider;
53
import java.util.spi.LocaleServiceProvider;
54
import java.util.spi.TimeZoneNameProvider;
55
56
/**
57
* LocaleProviderAdapter implementation for the installed SPI implementations.
58
*
59
* @author Naoto Sato
60
* @author Masayoshi Okutsu
61
*/
62
public class SPILocaleProviderAdapter extends AuxLocaleProviderAdapter {
63
64
/**
65
* Returns the type of this LocaleProviderAdapter
66
*/
67
@Override
68
public LocaleProviderAdapter.Type getAdapterType() {
69
return LocaleProviderAdapter.Type.SPI;
70
}
71
72
@SuppressWarnings("removal")
73
@Override
74
protected <P extends LocaleServiceProvider> P findInstalledProvider(final Class<P> c) {
75
try {
76
return AccessController.doPrivileged(new PrivilegedExceptionAction<>() {
77
@Override
78
@SuppressWarnings(value={"unchecked", "deprecation"})
79
public P run() {
80
P delegate = null;
81
82
for (LocaleServiceProvider provider :
83
ServiceLoader.load(c, ClassLoader.getSystemClassLoader())) {
84
if (delegate == null) {
85
try {
86
delegate =
87
(P) Class.forName(SPILocaleProviderAdapter.class.getCanonicalName() +
88
"$" +
89
c.getSimpleName() +
90
"Delegate")
91
.newInstance();
92
} catch (ClassNotFoundException |
93
InstantiationException |
94
IllegalAccessException e) {
95
throw new ServiceConfigurationError(
96
"SPI locale provider cannot be instantiated.", e);
97
}
98
}
99
100
((Delegate)delegate).addImpl(provider);
101
}
102
return delegate;
103
}
104
});
105
} catch (PrivilegedActionException e) {
106
throw new ServiceConfigurationError(
107
"SPI locale provider cannot be instantiated.", e);
108
}
109
}
110
111
/*
112
* Delegate interface. All the implementations have to have the class name
113
* following "<provider class name>Delegate" convention.
114
*/
115
private interface Delegate<P extends LocaleServiceProvider> {
116
default void addImpl(P impl) {
117
for (Locale l : impl.getAvailableLocales()) {
118
getDelegateMap().putIfAbsent(l, impl);
119
}
120
}
121
122
/*
123
* Obtain the real SPI implementation, using locale fallback
124
*/
125
default P getImpl(Locale locale) {
126
for (Locale l : LocaleServiceProviderPool.getLookupLocales(locale.stripExtensions())) {
127
P ret = getDelegateMap().get(l);
128
if (ret != null) {
129
return ret;
130
}
131
}
132
return null;
133
}
134
135
Map<Locale, P> getDelegateMap();
136
137
default Locale[] getAvailableLocalesDelegate() {
138
return getDelegateMap().keySet().toArray(new Locale[0]);
139
}
140
141
default boolean isSupportedLocaleDelegate(Locale locale) {
142
Map<Locale, P> map = getDelegateMap();
143
Locale override = CalendarDataUtility.findRegionOverride(locale);
144
145
// First, call the method with extensions (if any)
146
P impl = map.get(override);
147
if (impl != null) {
148
return impl.isSupportedLocale(override);
149
} else {
150
// The default behavior
151
Locale overrideNoExt = override.stripExtensions();
152
impl = map.get(overrideNoExt);
153
if (impl != null) {
154
return Arrays.stream(impl.getAvailableLocales())
155
.anyMatch(overrideNoExt::equals);
156
}
157
}
158
159
return false;
160
}
161
}
162
163
/*
164
* Delegates for the actual SPI implementations.
165
*/
166
static class BreakIteratorProviderDelegate extends BreakIteratorProvider
167
implements Delegate<BreakIteratorProvider> {
168
private final Map<Locale, BreakIteratorProvider> map = new ConcurrentHashMap<>();
169
170
@Override
171
public Map<Locale, BreakIteratorProvider> getDelegateMap() {
172
return map;
173
}
174
175
@Override
176
public Locale[] getAvailableLocales() {
177
return getAvailableLocalesDelegate();
178
}
179
180
@Override
181
public boolean isSupportedLocale(Locale locale) {
182
return isSupportedLocaleDelegate(locale);
183
}
184
185
@Override
186
public BreakIterator getWordInstance(Locale locale) {
187
locale = CalendarDataUtility.findRegionOverride(locale);
188
BreakIteratorProvider bip = getImpl(locale);
189
return bip.getWordInstance(locale);
190
}
191
192
@Override
193
public BreakIterator getLineInstance(Locale locale) {
194
locale = CalendarDataUtility.findRegionOverride(locale);
195
BreakIteratorProvider bip = getImpl(locale);
196
return bip.getLineInstance(locale);
197
}
198
199
@Override
200
public BreakIterator getCharacterInstance(Locale locale) {
201
locale = CalendarDataUtility.findRegionOverride(locale);
202
BreakIteratorProvider bip = getImpl(locale);
203
return bip.getCharacterInstance(locale);
204
}
205
206
@Override
207
public BreakIterator getSentenceInstance(Locale locale) {
208
locale = CalendarDataUtility.findRegionOverride(locale);
209
BreakIteratorProvider bip = getImpl(locale);
210
return bip.getSentenceInstance(locale);
211
}
212
213
}
214
215
static class CollatorProviderDelegate extends CollatorProvider implements Delegate<CollatorProvider> {
216
private final Map<Locale, CollatorProvider> map = new ConcurrentHashMap<>();
217
218
@Override
219
public Map<Locale, CollatorProvider> getDelegateMap() {
220
return map;
221
}
222
223
@Override
224
public Locale[] getAvailableLocales() {
225
return getAvailableLocalesDelegate();
226
}
227
228
@Override
229
public boolean isSupportedLocale(Locale locale) {
230
return isSupportedLocaleDelegate(locale);
231
}
232
233
@Override
234
public Collator getInstance(Locale locale) {
235
locale = CalendarDataUtility.findRegionOverride(locale);
236
CollatorProvider cp = getImpl(locale);
237
return cp.getInstance(locale);
238
}
239
}
240
241
static class DateFormatProviderDelegate extends DateFormatProvider
242
implements Delegate<DateFormatProvider> {
243
private final Map<Locale, DateFormatProvider> map = new ConcurrentHashMap<>();
244
245
@Override
246
public Map<Locale, DateFormatProvider> getDelegateMap() {
247
return map;
248
}
249
250
@Override
251
public Locale[] getAvailableLocales() {
252
return getAvailableLocalesDelegate();
253
}
254
255
@Override
256
public boolean isSupportedLocale(Locale locale) {
257
return isSupportedLocaleDelegate(locale);
258
}
259
260
@Override
261
public DateFormat getTimeInstance(int style, Locale locale) {
262
locale = CalendarDataUtility.findRegionOverride(locale);
263
DateFormatProvider dfp = getImpl(locale);
264
return dfp.getTimeInstance(style, locale);
265
}
266
267
@Override
268
public DateFormat getDateInstance(int style, Locale locale) {
269
locale = CalendarDataUtility.findRegionOverride(locale);
270
DateFormatProvider dfp = getImpl(locale);
271
return dfp.getDateInstance(style, locale);
272
}
273
274
@Override
275
public DateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale locale) {
276
locale = CalendarDataUtility.findRegionOverride(locale);
277
DateFormatProvider dfp = getImpl(locale);
278
return dfp.getDateTimeInstance(dateStyle, timeStyle, locale);
279
}
280
}
281
282
static class DateFormatSymbolsProviderDelegate extends DateFormatSymbolsProvider
283
implements Delegate<DateFormatSymbolsProvider> {
284
private final Map<Locale, DateFormatSymbolsProvider> map = new ConcurrentHashMap<>();
285
286
@Override
287
public Map<Locale, DateFormatSymbolsProvider> getDelegateMap() {
288
return map;
289
}
290
291
@Override
292
public Locale[] getAvailableLocales() {
293
return getAvailableLocalesDelegate();
294
}
295
296
@Override
297
public boolean isSupportedLocale(Locale locale) {
298
return isSupportedLocaleDelegate(locale);
299
}
300
301
@Override
302
public DateFormatSymbols getInstance(Locale locale) {
303
locale = CalendarDataUtility.findRegionOverride(locale);
304
DateFormatSymbolsProvider dfsp = getImpl(locale);
305
return dfsp.getInstance(locale);
306
}
307
}
308
309
static class DecimalFormatSymbolsProviderDelegate extends DecimalFormatSymbolsProvider
310
implements Delegate<DecimalFormatSymbolsProvider> {
311
private final Map<Locale, DecimalFormatSymbolsProvider> map = new ConcurrentHashMap<>();
312
313
@Override
314
public Map<Locale, DecimalFormatSymbolsProvider> getDelegateMap() {
315
return map;
316
}
317
318
@Override
319
public Locale[] getAvailableLocales() {
320
return getAvailableLocalesDelegate();
321
}
322
323
@Override
324
public boolean isSupportedLocale(Locale locale) {
325
return isSupportedLocaleDelegate(locale);
326
}
327
328
@Override
329
public DecimalFormatSymbols getInstance(Locale locale) {
330
locale = CalendarDataUtility.findRegionOverride(locale);
331
DecimalFormatSymbolsProvider dfsp = getImpl(locale);
332
return dfsp.getInstance(locale);
333
}
334
}
335
336
static class NumberFormatProviderDelegate extends NumberFormatProvider
337
implements Delegate<NumberFormatProvider> {
338
private final Map<Locale, NumberFormatProvider> map = new ConcurrentHashMap<>();
339
340
@Override
341
public Map<Locale, NumberFormatProvider> getDelegateMap() {
342
return map;
343
}
344
345
@Override
346
public Locale[] getAvailableLocales() {
347
return getAvailableLocalesDelegate();
348
}
349
350
@Override
351
public boolean isSupportedLocale(Locale locale) {
352
return isSupportedLocaleDelegate(locale);
353
}
354
355
@Override
356
public NumberFormat getCurrencyInstance(Locale locale) {
357
locale = CalendarDataUtility.findRegionOverride(locale);
358
NumberFormatProvider nfp = getImpl(locale);
359
return nfp.getCurrencyInstance(locale);
360
}
361
362
@Override
363
public NumberFormat getIntegerInstance(Locale locale) {
364
locale = CalendarDataUtility.findRegionOverride(locale);
365
NumberFormatProvider nfp = getImpl(locale);
366
return nfp.getIntegerInstance(locale);
367
}
368
369
@Override
370
public NumberFormat getNumberInstance(Locale locale) {
371
locale = CalendarDataUtility.findRegionOverride(locale);
372
NumberFormatProvider nfp = getImpl(locale);
373
return nfp.getNumberInstance(locale);
374
}
375
376
@Override
377
public NumberFormat getPercentInstance(Locale locale) {
378
locale = CalendarDataUtility.findRegionOverride(locale);
379
NumberFormatProvider nfp = getImpl(locale);
380
return nfp.getPercentInstance(locale);
381
}
382
383
@Override
384
public NumberFormat getCompactNumberInstance(Locale locale,
385
NumberFormat.Style style) {
386
locale = CalendarDataUtility.findRegionOverride(locale);
387
NumberFormatProvider nfp = getImpl(locale);
388
return nfp.getCompactNumberInstance(locale, style);
389
}
390
}
391
392
static class CalendarDataProviderDelegate extends CalendarDataProvider
393
implements Delegate<CalendarDataProvider> {
394
private final Map<Locale, CalendarDataProvider> map = new ConcurrentHashMap<>();
395
396
@Override
397
public Map<Locale, CalendarDataProvider> getDelegateMap() {
398
return map;
399
}
400
401
@Override
402
public Locale[] getAvailableLocales() {
403
return getAvailableLocalesDelegate();
404
}
405
406
@Override
407
public boolean isSupportedLocale(Locale locale) {
408
return isSupportedLocaleDelegate(locale);
409
}
410
411
@Override
412
public int getFirstDayOfWeek(Locale locale) {
413
locale = CalendarDataUtility.findRegionOverride(locale);
414
CalendarDataProvider cdp = getImpl(locale);
415
return cdp.getFirstDayOfWeek(locale);
416
}
417
418
@Override
419
public int getMinimalDaysInFirstWeek(Locale locale) {
420
locale = CalendarDataUtility.findRegionOverride(locale);
421
CalendarDataProvider cdp = getImpl(locale);
422
return cdp.getMinimalDaysInFirstWeek(locale);
423
}
424
}
425
426
static class CalendarNameProviderDelegate extends CalendarNameProvider
427
implements Delegate<CalendarNameProvider> {
428
private final Map<Locale, CalendarNameProvider> map = new ConcurrentHashMap<>();
429
430
@Override
431
public Map<Locale, CalendarNameProvider> getDelegateMap() {
432
return map;
433
}
434
435
@Override
436
public Locale[] getAvailableLocales() {
437
return getAvailableLocalesDelegate();
438
}
439
440
@Override
441
public boolean isSupportedLocale(Locale locale) {
442
return isSupportedLocaleDelegate(locale);
443
}
444
445
@Override
446
public String getDisplayName(String calendarType,
447
int field, int value,
448
int style, Locale locale) {
449
locale = CalendarDataUtility.findRegionOverride(locale);
450
CalendarNameProvider cdp = getImpl(locale);
451
return cdp.getDisplayName(calendarType, field, value, style, locale);
452
}
453
454
@Override
455
public Map<String, Integer> getDisplayNames(String calendarType,
456
int field, int style,
457
Locale locale) {
458
locale = CalendarDataUtility.findRegionOverride(locale);
459
CalendarNameProvider cdp = getImpl(locale);
460
return cdp.getDisplayNames(calendarType, field, style, locale);
461
}
462
}
463
464
static class CurrencyNameProviderDelegate extends CurrencyNameProvider
465
implements Delegate<CurrencyNameProvider> {
466
private final Map<Locale, CurrencyNameProvider> map = new ConcurrentHashMap<>();
467
468
@Override
469
public Map<Locale, CurrencyNameProvider> getDelegateMap() {
470
return map;
471
}
472
473
@Override
474
public Locale[] getAvailableLocales() {
475
return getAvailableLocalesDelegate();
476
}
477
478
@Override
479
public boolean isSupportedLocale(Locale locale) {
480
return isSupportedLocaleDelegate(locale);
481
}
482
483
@Override
484
public String getSymbol(String currencyCode, Locale locale) {
485
locale = CalendarDataUtility.findRegionOverride(locale);
486
CurrencyNameProvider cnp = getImpl(locale);
487
return cnp.getSymbol(currencyCode, locale);
488
}
489
490
@Override
491
public String getDisplayName(String currencyCode, Locale locale) {
492
locale = CalendarDataUtility.findRegionOverride(locale);
493
CurrencyNameProvider cnp = getImpl(locale);
494
return cnp.getDisplayName(currencyCode, locale);
495
}
496
}
497
498
static class LocaleNameProviderDelegate extends LocaleNameProvider
499
implements Delegate<LocaleNameProvider> {
500
private final Map<Locale, LocaleNameProvider> map = new ConcurrentHashMap<>();
501
502
@Override
503
public Map<Locale, LocaleNameProvider> getDelegateMap() {
504
return map;
505
}
506
507
@Override
508
public Locale[] getAvailableLocales() {
509
return getAvailableLocalesDelegate();
510
}
511
512
@Override
513
public boolean isSupportedLocale(Locale locale) {
514
return isSupportedLocaleDelegate(locale);
515
}
516
517
@Override
518
public String getDisplayLanguage(String languageCode, Locale locale) {
519
locale = CalendarDataUtility.findRegionOverride(locale);
520
LocaleNameProvider lnp = getImpl(locale);
521
return lnp.getDisplayLanguage(languageCode, locale);
522
}
523
524
@Override
525
public String getDisplayScript(String scriptCode, Locale locale) {
526
locale = CalendarDataUtility.findRegionOverride(locale);
527
LocaleNameProvider lnp = getImpl(locale);
528
return lnp.getDisplayScript(scriptCode, locale);
529
}
530
531
@Override
532
public String getDisplayCountry(String countryCode, Locale locale) {
533
locale = CalendarDataUtility.findRegionOverride(locale);
534
LocaleNameProvider lnp = getImpl(locale);
535
return lnp.getDisplayCountry(countryCode, locale);
536
}
537
538
@Override
539
public String getDisplayVariant(String variant, Locale locale) {
540
locale = CalendarDataUtility.findRegionOverride(locale);
541
LocaleNameProvider lnp = getImpl(locale);
542
return lnp.getDisplayVariant(variant, locale);
543
}
544
545
@Override
546
public String getDisplayUnicodeExtensionKey(String key, Locale locale) {
547
locale = CalendarDataUtility.findRegionOverride(locale);
548
LocaleNameProvider lnp = getImpl(locale);
549
return lnp.getDisplayUnicodeExtensionKey(key, locale);
550
}
551
552
@Override
553
public String getDisplayUnicodeExtensionType(String extType, String key, Locale locale) {
554
locale = CalendarDataUtility.findRegionOverride(locale);
555
LocaleNameProvider lnp = getImpl(locale);
556
return lnp.getDisplayUnicodeExtensionType(extType, key, locale);
557
}
558
}
559
560
static class TimeZoneNameProviderDelegate extends TimeZoneNameProvider
561
implements Delegate<TimeZoneNameProvider> {
562
private final Map<Locale, TimeZoneNameProvider> map = new ConcurrentHashMap<>();
563
564
@Override
565
public Map<Locale, TimeZoneNameProvider> getDelegateMap() {
566
return map;
567
}
568
569
@Override
570
public Locale[] getAvailableLocales() {
571
return getAvailableLocalesDelegate();
572
}
573
574
@Override
575
public boolean isSupportedLocale(Locale locale) {
576
return isSupportedLocaleDelegate(locale);
577
}
578
579
@Override
580
public String getDisplayName(String ID, boolean daylight, int style, Locale locale) {
581
locale = CalendarDataUtility.findRegionOverride(locale);
582
TimeZoneNameProvider tznp = getImpl(locale);
583
return tznp.getDisplayName(ID, daylight, style, locale);
584
}
585
586
@Override
587
public String getGenericDisplayName(String ID, int style, Locale locale) {
588
locale = CalendarDataUtility.findRegionOverride(locale);
589
TimeZoneNameProvider tznp = getImpl(locale);
590
return tznp.getGenericDisplayName(ID, style, locale);
591
}
592
}
593
}
594
595