src/java.base/share/classes/sun/util/locale/provider/JRELocaleProviderAdapter.java

Print this page
rev 10528 : 8038436: Re-examine the mechanism to determine available localedata and cldrdata
Reviewed-by:

*** 23,44 **** * questions. */ package sun.util.locale.provider; - import java.io.File; import java.security.AccessController; ! import java.security.PrivilegedAction; import java.text.spi.BreakIteratorProvider; import java.text.spi.CollatorProvider; import java.text.spi.DateFormatProvider; import java.text.spi.DateFormatSymbolsProvider; import java.text.spi.DecimalFormatSymbolsProvider; import java.text.spi.NumberFormatProvider; import java.util.Collections; import java.util.HashSet; import java.util.Locale; import java.util.Set; import java.util.StringTokenizer; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.spi.CalendarDataProvider; --- 23,45 ---- * questions. */ package sun.util.locale.provider; import java.security.AccessController; ! import java.security.PrivilegedActionException; ! import java.security.PrivilegedExceptionAction; import java.text.spi.BreakIteratorProvider; import java.text.spi.CollatorProvider; import java.text.spi.DateFormatProvider; import java.text.spi.DateFormatSymbolsProvider; import java.text.spi.DecimalFormatSymbolsProvider; import java.text.spi.NumberFormatProvider; import java.util.Collections; import java.util.HashSet; import java.util.Locale; + import java.util.ServiceLoader; import java.util.Set; import java.util.StringTokenizer; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.spi.CalendarDataProvider;
*** 56,67 **** * @author Naoto Sato * @author Masayoshi Okutsu */ public class JRELocaleProviderAdapter extends LocaleProviderAdapter implements ResourceBundleBasedAdapter { - private static final String LOCALE_DATA_JAR_NAME = "localedata.jar"; - private final ConcurrentMap<String, Set<String>> langtagSets = new ConcurrentHashMap<>(); private final ConcurrentMap<Locale, LocaleResources> localeResourcesMap = new ConcurrentHashMap<>(); --- 57,66 ----
*** 132,143 **** * Getter methods for java.text.spi.* providers */ @Override public BreakIteratorProvider getBreakIteratorProvider() { if (breakIteratorProvider == null) { ! BreakIteratorProvider provider = new BreakIteratorProviderImpl(getAdapterType(), ! getLanguageTagSet("FormatData")); synchronized (this) { if (breakIteratorProvider == null) { breakIteratorProvider = provider; } } --- 131,141 ---- * Getter methods for java.text.spi.* providers */ @Override public BreakIteratorProvider getBreakIteratorProvider() { if (breakIteratorProvider == null) { ! BreakIteratorProvider provider = new BreakIteratorProviderImpl(getAdapterType()); synchronized (this) { if (breakIteratorProvider == null) { breakIteratorProvider = provider; } }
*** 146,157 **** } @Override public CollatorProvider getCollatorProvider() { if (collatorProvider == null) { ! CollatorProvider provider = new CollatorProviderImpl(getAdapterType(), ! getLanguageTagSet("CollationData")); synchronized (this) { if (collatorProvider == null) { collatorProvider = provider; } } --- 144,154 ---- } @Override public CollatorProvider getCollatorProvider() { if (collatorProvider == null) { ! CollatorProvider provider = new CollatorProviderImpl(getAdapterType()); synchronized (this) { if (collatorProvider == null) { collatorProvider = provider; } }
*** 160,171 **** } @Override public DateFormatProvider getDateFormatProvider() { if (dateFormatProvider == null) { ! DateFormatProvider provider = new DateFormatProviderImpl(getAdapterType(), ! getLanguageTagSet("FormatData")); synchronized (this) { if (dateFormatProvider == null) { dateFormatProvider = provider; } } --- 157,167 ---- } @Override public DateFormatProvider getDateFormatProvider() { if (dateFormatProvider == null) { ! DateFormatProvider provider = new DateFormatProviderImpl(getAdapterType()); synchronized (this) { if (dateFormatProvider == null) { dateFormatProvider = provider; } }
*** 174,185 **** } @Override public DateFormatSymbolsProvider getDateFormatSymbolsProvider() { if (dateFormatSymbolsProvider == null) { ! DateFormatSymbolsProvider provider = new DateFormatSymbolsProviderImpl(getAdapterType(), ! getLanguageTagSet("FormatData")); synchronized (this) { if (dateFormatSymbolsProvider == null) { dateFormatSymbolsProvider = provider; } } --- 170,180 ---- } @Override public DateFormatSymbolsProvider getDateFormatSymbolsProvider() { if (dateFormatSymbolsProvider == null) { ! DateFormatSymbolsProvider provider = new DateFormatSymbolsProviderImpl(getAdapterType()); synchronized (this) { if (dateFormatSymbolsProvider == null) { dateFormatSymbolsProvider = provider; } }
*** 188,198 **** } @Override public DecimalFormatSymbolsProvider getDecimalFormatSymbolsProvider() { if (decimalFormatSymbolsProvider == null) { ! DecimalFormatSymbolsProvider provider = new DecimalFormatSymbolsProviderImpl(getAdapterType(), getLanguageTagSet("FormatData")); synchronized (this) { if (decimalFormatSymbolsProvider == null) { decimalFormatSymbolsProvider = provider; } } --- 183,193 ---- } @Override public DecimalFormatSymbolsProvider getDecimalFormatSymbolsProvider() { if (decimalFormatSymbolsProvider == null) { ! DecimalFormatSymbolsProvider provider = new DecimalFormatSymbolsProviderImpl(getAdapterType()); synchronized (this) { if (decimalFormatSymbolsProvider == null) { decimalFormatSymbolsProvider = provider; } }
*** 201,212 **** } @Override public NumberFormatProvider getNumberFormatProvider() { if (numberFormatProvider == null) { ! NumberFormatProvider provider = new NumberFormatProviderImpl(getAdapterType(), ! getLanguageTagSet("FormatData")); synchronized (this) { if (numberFormatProvider == null) { numberFormatProvider = provider; } } --- 196,206 ---- } @Override public NumberFormatProvider getNumberFormatProvider() { if (numberFormatProvider == null) { ! NumberFormatProvider provider = new NumberFormatProviderImpl(getAdapterType()); synchronized (this) { if (numberFormatProvider == null) { numberFormatProvider = provider; } }
*** 218,229 **** * Getter methods for java.util.spi.* providers */ @Override public CurrencyNameProvider getCurrencyNameProvider() { if (currencyNameProvider == null) { ! CurrencyNameProvider provider = new CurrencyNameProviderImpl(getAdapterType(), ! getLanguageTagSet("CurrencyNames")); synchronized (this) { if (currencyNameProvider == null) { currencyNameProvider = provider; } } --- 212,222 ---- * Getter methods for java.util.spi.* providers */ @Override public CurrencyNameProvider getCurrencyNameProvider() { if (currencyNameProvider == null) { ! CurrencyNameProvider provider = new CurrencyNameProviderImpl(getAdapterType()); synchronized (this) { if (currencyNameProvider == null) { currencyNameProvider = provider; } }
*** 232,243 **** } @Override public LocaleNameProvider getLocaleNameProvider() { if (localeNameProvider == null) { ! LocaleNameProvider provider = new LocaleNameProviderImpl(getAdapterType(), ! getLanguageTagSet("LocaleNames")); synchronized (this) { if (localeNameProvider == null) { localeNameProvider = provider; } } --- 225,235 ---- } @Override public LocaleNameProvider getLocaleNameProvider() { if (localeNameProvider == null) { ! LocaleNameProvider provider = new LocaleNameProviderImpl(getAdapterType()); synchronized (this) { if (localeNameProvider == null) { localeNameProvider = provider; } }
*** 246,257 **** } @Override public TimeZoneNameProvider getTimeZoneNameProvider() { if (timeZoneNameProvider == null) { ! TimeZoneNameProvider provider = new TimeZoneNameProviderImpl(getAdapterType(), ! getLanguageTagSet("TimeZoneNames")); synchronized (this) { if (timeZoneNameProvider == null) { timeZoneNameProvider = provider; } } --- 238,248 ---- } @Override public TimeZoneNameProvider getTimeZoneNameProvider() { if (timeZoneNameProvider == null) { ! TimeZoneNameProvider provider = new TimeZoneNameProviderImpl(getAdapterType()); synchronized (this) { if (timeZoneNameProvider == null) { timeZoneNameProvider = provider; } }
*** 261,272 **** @Override public CalendarDataProvider getCalendarDataProvider() { if (calendarDataProvider == null) { CalendarDataProvider provider; ! provider = new CalendarDataProviderImpl(getAdapterType(), ! getLanguageTagSet("CalendarData")); synchronized (this) { if (calendarDataProvider == null) { calendarDataProvider = provider; } } --- 252,262 ---- @Override public CalendarDataProvider getCalendarDataProvider() { if (calendarDataProvider == null) { CalendarDataProvider provider; ! provider = new CalendarDataProviderImpl(getAdapterType()); synchronized (this) { if (calendarDataProvider == null) { calendarDataProvider = provider; } }
*** 276,287 **** @Override public CalendarNameProvider getCalendarNameProvider() { if (calendarNameProvider == null) { CalendarNameProvider provider; ! provider = new CalendarNameProviderImpl(getAdapterType(), ! getLanguageTagSet("FormatData")); synchronized (this) { if (calendarNameProvider == null) { calendarNameProvider = provider; } } --- 266,276 ---- @Override public CalendarNameProvider getCalendarNameProvider() { if (calendarNameProvider == null) { CalendarNameProvider provider; ! provider = new CalendarNameProviderImpl(getAdapterType()); synchronized (this) { if (calendarNameProvider == null) { calendarNameProvider = provider; } }
*** 293,304 **** * Getter methods for sun.util.spi.* providers */ @Override public CalendarProvider getCalendarProvider() { if (calendarProvider == null) { ! CalendarProvider provider = new CalendarProviderImpl(getAdapterType(), ! getLanguageTagSet("CalendarData")); synchronized (this) { if (calendarProvider == null) { calendarProvider = provider; } } --- 282,292 ---- * Getter methods for sun.util.spi.* providers */ @Override public CalendarProvider getCalendarProvider() { if (calendarProvider == null) { ! CalendarProvider provider = new CalendarProviderImpl(getAdapterType()); synchronized (this) { if (calendarProvider == null) { calendarProvider = provider; } }
*** 354,381 **** } return tagset; } protected Set<String> createLanguageTagSet(String category) { ! String supportedLocaleString = LocaleDataMetaInfo.getSupportedLocaleString(category); if (supportedLocaleString == null) { return Collections.emptySet(); } Set<String> tagset = new HashSet<>(); StringTokenizer tokens = new StringTokenizer(supportedLocaleString); while (tokens.hasMoreTokens()) { ! String token = tokens.nextToken(); ! if (token.equals("|")) { ! if (isNonENLangSupported()) { ! continue; } - break; } - tagset.add(token); } ! return tagset; } /** * Lazy load available locales. */ --- 342,399 ---- } return tagset; } protected Set<String> createLanguageTagSet(String category) { ! String supportedLocaleString = createSupportedLocaleString(category); if (supportedLocaleString == null) { return Collections.emptySet(); } Set<String> tagset = new HashSet<>(); StringTokenizer tokens = new StringTokenizer(supportedLocaleString); while (tokens.hasMoreTokens()) { ! tagset.add(tokens.nextToken()); ! } ! ! return tagset; ! } ! ! private static String createSupportedLocaleString(String category) { ! // Directly call English tags, as we know it's in the base module. ! String supportedLocaleString = JREENLocaleDataMetaInfo.getSupportedLocaleString(category); ! ! // Use ServiceLoader to dynamically acquire installede locales' tags. ! try { ! String nonENTags = AccessController.doPrivileged(new PrivilegedExceptionAction<String>() { ! @Override ! public String run() { ! String tags = null; ! for (LocaleDataMetaInfo ldmi : ! ServiceLoader.loadInstalled(LocaleDataMetaInfo.class)) { ! if (ldmi.getType() == LocaleProviderAdapter.Type.JRE) { ! String t = ldmi.availableLanguageTags(category); ! if (t != null) { ! if (tags == null) { ! tags = t; ! } else { ! tags += " " + t; ! } } } } + return tags; + } + }); ! if (nonENTags != null) { ! supportedLocaleString += " " + nonENTags; ! } ! } catch (Exception e) { ! // catch any exception, and ignore them as if non-EN locales do not exist. ! } ! ! return supportedLocaleString; } /** * Lazy load available locales. */
*** 385,415 **** } } private static Locale[] createAvailableLocales() { /* ! * Gets the locale string list from LocaleDataMetaInfo class and then * contructs the Locale array and a set of language tags based on the * locale string returned above. */ ! String supportedLocaleString = LocaleDataMetaInfo.getSupportedLocaleString("AvailableLocales"); if (supportedLocaleString.length() == 0) { throw new InternalError("No available locales for JRE"); } ! /* ! * Look for "|" and construct a new locale string list. ! */ ! int barIndex = supportedLocaleString.indexOf('|'); ! StringTokenizer localeStringTokenizer; ! if (isNonENLangSupported()) { ! localeStringTokenizer = new StringTokenizer(supportedLocaleString.substring(0, barIndex) ! + supportedLocaleString.substring(barIndex + 1)); ! } else { ! localeStringTokenizer = new StringTokenizer(supportedLocaleString.substring(0, barIndex)); ! } int length = localeStringTokenizer.countTokens(); Locale[] locales = new Locale[length + 1]; locales[0] = Locale.ROOT; for (int i = 1; i <= length; i++) { --- 403,423 ---- } } private static Locale[] createAvailableLocales() { /* ! * Gets the locale string list from LocaleDataMetaInfo classes and then * contructs the Locale array and a set of language tags based on the * locale string returned above. */ ! String supportedLocaleString = createSupportedLocaleString("AvailableLocales"); if (supportedLocaleString.length() == 0) { throw new InternalError("No available locales for JRE"); } ! StringTokenizer localeStringTokenizer = new StringTokenizer(supportedLocaleString); int length = localeStringTokenizer.countTokens(); Locale[] locales = new Locale[length + 1]; locales[0] = Locale.ROOT; for (int i = 1; i <= length; i++) {
*** 428,468 **** locales[i] = Locale.forLanguageTag(currentToken); } } return locales; } - - private static volatile Boolean isNonENSupported = null; - - /* - * Returns true if the non EN resources jar file exists in jre - * extension directory. @returns true if the jar file is there. Otherwise, - * returns false. - */ - private static boolean isNonENLangSupported() { - if (isNonENSupported == null) { - synchronized (JRELocaleProviderAdapter.class) { - if (isNonENSupported == null) { - final String sep = File.separator; - String localeDataJar = - java.security.AccessController.doPrivileged( - new sun.security.action.GetPropertyAction("java.home")) - + sep + "lib" + sep + "ext" + sep + LOCALE_DATA_JAR_NAME; - - /* - * Peek at the installed extension directory to see if - * localedata.jar is installed or not. - */ - final File f = new File(localeDataJar); - isNonENSupported = - AccessController.doPrivileged(new PrivilegedAction<Boolean>() { - @Override - public Boolean run() { - return f.exists(); - } - }); - } - } - } - return isNonENSupported; - } } --- 436,441 ----