--- a/jdk/src/share/classes/java/text/DecimalFormatSymbols.java Sun Jan 13 19:57:06 2013 -0500
+++ b/jdk/src/share/classes/java/text/DecimalFormatSymbols.java Mon Jan 14 11:09:53 2013 -0800
@@ -52,6 +52,7 @@
import java.util.concurrent.ConcurrentMap;
import sun.util.locale.provider.LocaleProviderAdapter;
import sun.util.locale.provider.LocaleServiceProviderPool;
+import sun.util.locale.provider.ResourceBundleBasedAdapter;
/**
* This class represents the set of symbols (such as the decimal separator,
@@ -542,48 +543,13 @@
private void initialize( Locale locale ) {
this.locale = locale;
- // get resource bundle data - try the cache first
- boolean needCacheUpdate = false;
- Object[] data = cachedLocaleData.get(locale);
- if (data == null) { /* cache miss */
- LocaleProviderAdapter adapter = LocaleProviderAdapter.getAdapter(DecimalFormatSymbolsProvider.class, locale);
- // Avoid potential recursions
- switch (adapter.getAdapterType()) {
- case HOST:
- case SPI:
- adapter = LocaleProviderAdapter.getResourceBundleBased();
- break;
- }
- ResourceBundle rb = adapter.getLocaleData().getNumberFormatData(locale);
- data = new Object[3];
-
- // NumberElements look up. First, try the Unicode extension
- String numElemKey;
- String numberType = locale.getUnicodeLocaleType("nu");
- if (numberType != null) {
- numElemKey = numberType + ".NumberElements";
- if (rb.containsKey(numElemKey)) {
- data[0] = rb.getStringArray(numElemKey);
- }
- }
-
- // Next, try DefaultNumberingSystem value
- if (data[0] == null && rb.containsKey("DefaultNumberingSystem")) {
- numElemKey = rb.getString("DefaultNumberingSystem") + ".NumberElements";
- if (rb.containsKey(numElemKey)) {
- data[0] = rb.getStringArray(numElemKey);
- }
- }
-
- // Last resort. No need to check the availability.
- // Just let it throw MissingResourceException when needed.
- if (data[0] == null) {
- data[0] = rb.getStringArray("NumberElements");
- }
-
- needCacheUpdate = true;
+ // get resource bundle data
+ LocaleProviderAdapter adapter = LocaleProviderAdapter.getAdapter(DecimalFormatSymbolsProvider.class, locale);
+ // Avoid potential recursions
+ if (!(adapter instanceof ResourceBundleBasedAdapter)) {
+ adapter = LocaleProviderAdapter.getResourceBundleBased();
}
-
+ Object[] data = adapter.getLocaleResources(locale).getDecimalFormatSymbolsData();
String[] numberElements = (String[]) data[0];
decimalSeparator = numberElements[0].charAt(0);
@@ -618,7 +584,6 @@
currencySymbol = currency.getSymbol(locale);
data[1] = intlCurrencySymbol;
data[2] = currencySymbol;
- needCacheUpdate = true;
}
} else {
// default values
@@ -633,10 +598,6 @@
// standard decimal separator for all locales that we support.
// If that changes, add a new entry to NumberElements.
monetarySeparator = decimalSeparator;
-
- if (needCacheUpdate) {
- cachedLocaleData.putIfAbsent(locale, data);
- }
}
/**
@@ -850,11 +811,4 @@
* @since JDK 1.1.6
*/
private int serialVersionOnStream = currentSerialVersion;
-
- /**
- * cache to hold the NumberElements and the Currency
- * of a Locale.
- */
- private static final ConcurrentMap<Locale, Object[]> cachedLocaleData
- = new ConcurrentHashMap<>(3);
}