24 */
25
26 package sun.util.locale.provider;
27
28 import java.io.File;
29 import java.security.AccessController;
30 import java.security.PrivilegedAction;
31 import java.text.spi.BreakIteratorProvider;
32 import java.text.spi.CollatorProvider;
33 import java.text.spi.DateFormatProvider;
34 import java.text.spi.DateFormatSymbolsProvider;
35 import java.text.spi.DecimalFormatSymbolsProvider;
36 import java.text.spi.NumberFormatProvider;
37 import java.util.HashSet;
38 import java.util.Locale;
39 import java.util.Set;
40 import java.util.StringTokenizer;
41 import java.util.concurrent.ConcurrentHashMap;
42 import java.util.concurrent.ConcurrentMap;
43 import java.util.spi.CalendarDataProvider;
44 import java.util.spi.CurrencyNameProvider;
45 import java.util.spi.LocaleNameProvider;
46 import java.util.spi.LocaleServiceProvider;
47 import java.util.spi.TimeZoneNameProvider;
48 import sun.util.resources.LocaleData;
49
50 /**
51 * LocaleProviderAdapter implementation for the legacy JRE locale data.
52 *
53 * @author Naoto Sato
54 * @author Masayoshi Okutsu
55 */
56 public class JRELocaleProviderAdapter extends LocaleProviderAdapter {
57
58 private static final String LOCALE_DATA_JAR_NAME = "localedata.jar";
59
60 private final ConcurrentMap<String, Set<String>> langtagSets
61 = new ConcurrentHashMap<>();
62
63 private final ConcurrentMap<Locale, LocaleResources> localeResourcesMap
84 case "BreakIteratorProvider":
85 return (P) getBreakIteratorProvider();
86 case "CollatorProvider":
87 return (P) getCollatorProvider();
88 case "DateFormatProvider":
89 return (P) getDateFormatProvider();
90 case "DateFormatSymbolsProvider":
91 return (P) getDateFormatSymbolsProvider();
92 case "DecimalFormatSymbolsProvider":
93 return (P) getDecimalFormatSymbolsProvider();
94 case "NumberFormatProvider":
95 return (P) getNumberFormatProvider();
96 case "CurrencyNameProvider":
97 return (P) getCurrencyNameProvider();
98 case "LocaleNameProvider":
99 return (P) getLocaleNameProvider();
100 case "TimeZoneNameProvider":
101 return (P) getTimeZoneNameProvider();
102 case "CalendarDataProvider":
103 return (P) getCalendarDataProvider();
104 default:
105 throw new InternalError("should not come down here");
106 }
107 }
108
109 private volatile BreakIteratorProvider breakIteratorProvider = null;
110 private volatile CollatorProvider collatorProvider = null;
111 private volatile DateFormatProvider dateFormatProvider = null;
112 private volatile DateFormatSymbolsProvider dateFormatSymbolsProvider = null;
113 private volatile DecimalFormatSymbolsProvider decimalFormatSymbolsProvider = null;
114 private volatile NumberFormatProvider numberFormatProvider = null;
115
116 private volatile CurrencyNameProvider currencyNameProvider = null;
117 private volatile LocaleNameProvider localeNameProvider = null;
118 private volatile TimeZoneNameProvider timeZoneNameProvider = null;
119 private volatile CalendarDataProvider calendarDataProvider = null;
120
121 /*
122 * Getter methods for java.text.spi.* providers
123 */
124 @Override
125 public BreakIteratorProvider getBreakIteratorProvider() {
126 if (breakIteratorProvider == null) {
127 BreakIteratorProvider provider = new BreakIteratorProviderImpl(getAdapterType(),
128 getLanguageTagSet("FormatData"));
129 synchronized (this) {
130 if (breakIteratorProvider == null) {
131 breakIteratorProvider = provider;
132 }
133 }
134 }
135 return breakIteratorProvider;
136 }
137
138 @Override
139 public CollatorProvider getCollatorProvider() {
235 return localeNameProvider;
236 }
237
238 @Override
239 public TimeZoneNameProvider getTimeZoneNameProvider() {
240 if (timeZoneNameProvider == null) {
241 TimeZoneNameProvider provider = new TimeZoneNameProviderImpl(getAdapterType(),
242 getLanguageTagSet("TimeZoneNames"));
243 synchronized (this) {
244 if (timeZoneNameProvider == null) {
245 timeZoneNameProvider = provider;
246 }
247 }
248 }
249 return timeZoneNameProvider;
250 }
251
252 @Override
253 public CalendarDataProvider getCalendarDataProvider() {
254 if (calendarDataProvider == null) {
255 Set<String> set = new HashSet<>();
256 set.addAll(getLanguageTagSet("FormatData"));
257 set.addAll(getLanguageTagSet("CalendarData"));
258 CalendarDataProvider provider = new CalendarDataProviderImpl(getAdapterType(),
259 set);
260 synchronized (this) {
261 if (calendarDataProvider == null) {
262 calendarDataProvider = provider;
263 }
264 }
265 }
266 return calendarDataProvider;
267 }
268
269 @Override
270 public LocaleResources getLocaleResources(Locale locale) {
271 LocaleResources lr = localeResourcesMap.get(locale);
272 if (lr == null) {
273 lr = new LocaleResources(this, locale);
274 LocaleResources lrc = localeResourcesMap.putIfAbsent(locale, lr);
275 if (lrc != null) {
276 lr = lrc;
277 }
278 }
279 return lr;
280 }
281
282 @Override
283 public LocaleData getLocaleData() {
284 if (localeData == null) {
285 synchronized (this) {
286 if (localeData == null) {
|
24 */
25
26 package sun.util.locale.provider;
27
28 import java.io.File;
29 import java.security.AccessController;
30 import java.security.PrivilegedAction;
31 import java.text.spi.BreakIteratorProvider;
32 import java.text.spi.CollatorProvider;
33 import java.text.spi.DateFormatProvider;
34 import java.text.spi.DateFormatSymbolsProvider;
35 import java.text.spi.DecimalFormatSymbolsProvider;
36 import java.text.spi.NumberFormatProvider;
37 import java.util.HashSet;
38 import java.util.Locale;
39 import java.util.Set;
40 import java.util.StringTokenizer;
41 import java.util.concurrent.ConcurrentHashMap;
42 import java.util.concurrent.ConcurrentMap;
43 import java.util.spi.CalendarDataProvider;
44 import java.util.spi.CalendarNameProvider;
45 import java.util.spi.CurrencyNameProvider;
46 import java.util.spi.LocaleNameProvider;
47 import java.util.spi.LocaleServiceProvider;
48 import java.util.spi.TimeZoneNameProvider;
49 import sun.util.resources.LocaleData;
50
51 /**
52 * LocaleProviderAdapter implementation for the legacy JRE locale data.
53 *
54 * @author Naoto Sato
55 * @author Masayoshi Okutsu
56 */
57 public class JRELocaleProviderAdapter extends LocaleProviderAdapter {
58
59 private static final String LOCALE_DATA_JAR_NAME = "localedata.jar";
60
61 private final ConcurrentMap<String, Set<String>> langtagSets
62 = new ConcurrentHashMap<>();
63
64 private final ConcurrentMap<Locale, LocaleResources> localeResourcesMap
85 case "BreakIteratorProvider":
86 return (P) getBreakIteratorProvider();
87 case "CollatorProvider":
88 return (P) getCollatorProvider();
89 case "DateFormatProvider":
90 return (P) getDateFormatProvider();
91 case "DateFormatSymbolsProvider":
92 return (P) getDateFormatSymbolsProvider();
93 case "DecimalFormatSymbolsProvider":
94 return (P) getDecimalFormatSymbolsProvider();
95 case "NumberFormatProvider":
96 return (P) getNumberFormatProvider();
97 case "CurrencyNameProvider":
98 return (P) getCurrencyNameProvider();
99 case "LocaleNameProvider":
100 return (P) getLocaleNameProvider();
101 case "TimeZoneNameProvider":
102 return (P) getTimeZoneNameProvider();
103 case "CalendarDataProvider":
104 return (P) getCalendarDataProvider();
105 case "CalendarNameProvider":
106 return (P) getCalendarNameProvider();
107 default:
108 throw new InternalError("should not come down here");
109 }
110 }
111
112 private volatile BreakIteratorProvider breakIteratorProvider = null;
113 private volatile CollatorProvider collatorProvider = null;
114 private volatile DateFormatProvider dateFormatProvider = null;
115 private volatile DateFormatSymbolsProvider dateFormatSymbolsProvider = null;
116 private volatile DecimalFormatSymbolsProvider decimalFormatSymbolsProvider = null;
117 private volatile NumberFormatProvider numberFormatProvider = null;
118
119 private volatile CurrencyNameProvider currencyNameProvider = null;
120 private volatile LocaleNameProvider localeNameProvider = null;
121 private volatile TimeZoneNameProvider timeZoneNameProvider = null;
122 private volatile CalendarDataProvider calendarDataProvider = null;
123 private volatile CalendarNameProvider calendarNameProvider = null;
124
125 /*
126 * Getter methods for java.text.spi.* providers
127 */
128 @Override
129 public BreakIteratorProvider getBreakIteratorProvider() {
130 if (breakIteratorProvider == null) {
131 BreakIteratorProvider provider = new BreakIteratorProviderImpl(getAdapterType(),
132 getLanguageTagSet("FormatData"));
133 synchronized (this) {
134 if (breakIteratorProvider == null) {
135 breakIteratorProvider = provider;
136 }
137 }
138 }
139 return breakIteratorProvider;
140 }
141
142 @Override
143 public CollatorProvider getCollatorProvider() {
239 return localeNameProvider;
240 }
241
242 @Override
243 public TimeZoneNameProvider getTimeZoneNameProvider() {
244 if (timeZoneNameProvider == null) {
245 TimeZoneNameProvider provider = new TimeZoneNameProviderImpl(getAdapterType(),
246 getLanguageTagSet("TimeZoneNames"));
247 synchronized (this) {
248 if (timeZoneNameProvider == null) {
249 timeZoneNameProvider = provider;
250 }
251 }
252 }
253 return timeZoneNameProvider;
254 }
255
256 @Override
257 public CalendarDataProvider getCalendarDataProvider() {
258 if (calendarDataProvider == null) {
259 CalendarDataProvider provider;
260 provider = new CalendarDataProviderImpl(getAdapterType(),
261 getLanguageTagSet("CalendarData"));
262 synchronized (this) {
263 if (calendarDataProvider == null) {
264 calendarDataProvider = provider;
265 }
266 }
267 }
268 return calendarDataProvider;
269 }
270
271 @Override
272 public CalendarNameProvider getCalendarNameProvider() {
273 if (calendarNameProvider == null) {
274 CalendarNameProvider provider;
275 provider = new CalendarNameProviderImpl(getAdapterType(),
276 getLanguageTagSet("FormatData"));
277 synchronized (this) {
278 if (calendarNameProvider == null) {
279 calendarNameProvider = provider;
280 }
281 }
282 }
283 return calendarNameProvider;
284 }
285
286 @Override
287 public LocaleResources getLocaleResources(Locale locale) {
288 LocaleResources lr = localeResourcesMap.get(locale);
289 if (lr == null) {
290 lr = new LocaleResources(this, locale);
291 LocaleResources lrc = localeResourcesMap.putIfAbsent(locale, lr);
292 if (lrc != null) {
293 lr = lrc;
294 }
295 }
296 return lr;
297 }
298
299 @Override
300 public LocaleData getLocaleData() {
301 if (localeData == null) {
302 synchronized (this) {
303 if (localeData == null) {
|