提交 0af9327b 编写于 作者: N naoto

8013903: Japanese calendar field names are not displayed with...

8013903: Japanese calendar field names are not displayed with -Djava.locale.providers=HOST on Windows
Reviewed-by: okutsu
上级 6f1e97a8
...@@ -128,6 +128,14 @@ import java.util.Locale; ...@@ -128,6 +128,14 @@ import java.util.Locale;
* installed SPI providers, and "JRE" represents the locale sensitive services * installed SPI providers, and "JRE" represents the locale sensitive services
* in the Java Runtime Environment, the locale sensitive services in the SPI * in the Java Runtime Environment, the locale sensitive services in the SPI
* providers are looked up first. * providers are looked up first.
* <p>
* There are two other possible locale sensitive service providers, i.e., "CLDR"
* which is a provider based on Unicode Consortium's
* <a href="http://cldr.unicode.org/">CLDR Project</a>, and "HOST" which is a
* provider that reflects the user's custom settings in the underlying operating
* system. These two providers may not be available, depending on the Java Runtime
* Environment implementation. Specifying "JRE,SPI" is identical to the default
* behavior, which is compatibile with the prior releases.
* *
* @since 1.6 * @since 1.6
*/ */
......
...@@ -25,6 +25,11 @@ ...@@ -25,6 +25,11 @@
package sun.util.locale.provider; package sun.util.locale.provider;
import java.util.Collections;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
/** /**
* FallbackProviderAdapter implementation. * FallbackProviderAdapter implementation.
* *
...@@ -32,6 +37,18 @@ package sun.util.locale.provider; ...@@ -32,6 +37,18 @@ package sun.util.locale.provider;
*/ */
public class FallbackLocaleProviderAdapter extends JRELocaleProviderAdapter { public class FallbackLocaleProviderAdapter extends JRELocaleProviderAdapter {
/**
* Supported language tag set.
*/
private static final Set<String> rootTagSet =
Collections.singleton(Locale.ROOT.toLanguageTag());
/**
* Fallback provider only provides the ROOT locale data.
*/
private final LocaleResources rootLocaleResources =
new LocaleResources(this, Locale.ROOT);
/** /**
* Returns the type of this LocaleProviderAdapter * Returns the type of this LocaleProviderAdapter
*/ */
...@@ -39,4 +56,14 @@ public class FallbackLocaleProviderAdapter extends JRELocaleProviderAdapter { ...@@ -39,4 +56,14 @@ public class FallbackLocaleProviderAdapter extends JRELocaleProviderAdapter {
public LocaleProviderAdapter.Type getAdapterType() { public LocaleProviderAdapter.Type getAdapterType() {
return Type.FALLBACK; return Type.FALLBACK;
} }
@Override
public LocaleResources getLocaleResources(Locale locale) {
return rootLocaleResources;
}
@Override
protected Set<String> createLanguageTagSet(String category) {
return rootTagSet;
}
} }
...@@ -34,12 +34,10 @@ import java.text.spi.DateFormatProvider; ...@@ -34,12 +34,10 @@ import java.text.spi.DateFormatProvider;
import java.text.spi.DateFormatSymbolsProvider; import java.text.spi.DateFormatSymbolsProvider;
import java.text.spi.DecimalFormatSymbolsProvider; import java.text.spi.DecimalFormatSymbolsProvider;
import java.text.spi.NumberFormatProvider; import java.text.spi.NumberFormatProvider;
import java.util.Calendar;
import java.util.HashSet; import java.util.HashSet;
import java.util.Locale; import java.util.Locale;
import java.util.Set; import java.util.Set;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import java.util.TimeZone;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
import java.util.spi.CalendarDataProvider; import java.util.spi.CalendarDataProvider;
......
...@@ -119,6 +119,12 @@ public abstract class LocaleProviderAdapter { ...@@ -119,6 +119,12 @@ public abstract class LocaleProviderAdapter {
*/ */
private static LocaleProviderAdapter fallbackLocaleProviderAdapter = null; private static LocaleProviderAdapter fallbackLocaleProviderAdapter = null;
/**
* Default fallback adapter type, which should return something meaningful in any case.
* This is either JRE or FALLBACK.
*/
static LocaleProviderAdapter.Type defaultLocaleProviderAdapter = null;
/** /**
* Adapter lookup cache. * Adapter lookup cache.
*/ */
...@@ -140,13 +146,19 @@ public abstract class LocaleProviderAdapter { ...@@ -140,13 +146,19 @@ public abstract class LocaleProviderAdapter {
// load adapter if necessary // load adapter if necessary
switch (aType) { switch (aType) {
case CLDR: case CLDR:
cldrLocaleProviderAdapter = new CLDRLocaleProviderAdapter(); if (cldrLocaleProviderAdapter == null) {
cldrLocaleProviderAdapter = new CLDRLocaleProviderAdapter();
}
break; break;
case HOST: case HOST:
hostLocaleProviderAdapter = new HostLocaleProviderAdapter(); if (hostLocaleProviderAdapter == null) {
hostLocaleProviderAdapter = new HostLocaleProviderAdapter();
}
break; break;
} }
typeList.add(aType); if (!typeList.contains(aType)) {
typeList.add(aType);
}
} catch (IllegalArgumentException | UnsupportedOperationException e) { } catch (IllegalArgumentException | UnsupportedOperationException e) {
// could be caused by the user specifying wrong // could be caused by the user specifying wrong
// provider name or format in the system property // provider name or format in the system property
...@@ -160,11 +172,15 @@ public abstract class LocaleProviderAdapter { ...@@ -160,11 +172,15 @@ public abstract class LocaleProviderAdapter {
// Append FALLBACK as the last resort. // Append FALLBACK as the last resort.
fallbackLocaleProviderAdapter = new FallbackLocaleProviderAdapter(); fallbackLocaleProviderAdapter = new FallbackLocaleProviderAdapter();
typeList.add(Type.FALLBACK); typeList.add(Type.FALLBACK);
defaultLocaleProviderAdapter = Type.FALLBACK;
} else {
defaultLocaleProviderAdapter = Type.JRE;
} }
} else { } else {
// Default preference list // Default preference list
typeList.add(Type.JRE); typeList.add(Type.JRE);
typeList.add(Type.SPI); typeList.add(Type.SPI);
defaultLocaleProviderAdapter = Type.JRE;
} }
adapterPreference = Collections.unmodifiableList(typeList); adapterPreference = Collections.unmodifiableList(typeList);
......
...@@ -127,32 +127,13 @@ public final class LocaleServiceProviderPool { ...@@ -127,32 +127,13 @@ public final class LocaleServiceProviderPool {
private LocaleServiceProviderPool (final Class<? extends LocaleServiceProvider> c) { private LocaleServiceProviderPool (final Class<? extends LocaleServiceProvider> c) {
providerClass = c; providerClass = c;
// Add the JRE Locale Data Adapter implementation. for (LocaleProviderAdapter.Type type : LocaleProviderAdapter.getAdapterPreference()) {
providers.putIfAbsent(LocaleProviderAdapter.Type.JRE, LocaleProviderAdapter lda = LocaleProviderAdapter.forType(type);
LocaleProviderAdapter.forJRE().getLocaleServiceProvider(c)); if (lda != null) {
LocaleServiceProvider provider = lda.getLocaleServiceProvider(c);
// Add the SPI Locale Data Adapter implementation. if (provider != null) {
LocaleProviderAdapter lda = LocaleProviderAdapter.forType(LocaleProviderAdapter.Type.SPI); providers.putIfAbsent(type, provider);
LocaleServiceProvider provider = lda.getLocaleServiceProvider(c); }
if (provider != null) {
providers.putIfAbsent(LocaleProviderAdapter.Type.SPI, provider);
}
// Add the CLDR Locale Data Adapter implementation, if needed.
lda = LocaleProviderAdapter.forType(LocaleProviderAdapter.Type.CLDR);
if (lda != null) {
provider = lda.getLocaleServiceProvider(c);
if (provider != null) {
providers.putIfAbsent(LocaleProviderAdapter.Type.CLDR, provider);
}
}
// Add the Host Locale Data Adapter implementation, if needed.
lda = LocaleProviderAdapter.forType(LocaleProviderAdapter.Type.HOST);
if (lda != null) {
provider = lda.getLocaleServiceProvider(c);
if (provider != null) {
providers.putIfAbsent(LocaleProviderAdapter.Type.HOST, provider);
} }
} }
} }
...@@ -246,7 +227,8 @@ public final class LocaleServiceProviderPool { ...@@ -246,7 +227,8 @@ public final class LocaleServiceProviderPool {
*/ */
boolean hasProviders() { boolean hasProviders() {
return providers.size() != 1 || return providers.size() != 1 ||
providers.get(LocaleProviderAdapter.Type.JRE) == null; (providers.get(LocaleProviderAdapter.Type.JRE) == null &&
providers.get(LocaleProviderAdapter.Type.FALLBACK) == null);
} }
/** /**
...@@ -296,9 +278,8 @@ public final class LocaleServiceProviderPool { ...@@ -296,9 +278,8 @@ public final class LocaleServiceProviderPool {
// Check whether JRE is the sole locale data provider or not, // Check whether JRE is the sole locale data provider or not,
// and directly call it if it is. // and directly call it if it is.
if (!hasProviders()) { if (!hasProviders()) {
return getter.getObject( return getter.getObject((P)providers.get(LocaleProviderAdapter.defaultLocaleProviderAdapter),
(P)providers.get(LocaleProviderAdapter.Type.JRE), locale, key, params);
locale, key, params);
} }
List<Locale> lookupLocales = getLookupLocales(locale); List<Locale> lookupLocales = getLookupLocales(locale);
......
...@@ -48,7 +48,6 @@ import java.util.concurrent.ConcurrentHashMap; ...@@ -48,7 +48,6 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicReferenceArray; import java.util.concurrent.atomic.AtomicReferenceArray;
import java.util.spi.CalendarDataProvider; import java.util.spi.CalendarDataProvider;
import java.util.spi.CalendarNameProvider;
import java.util.spi.CurrencyNameProvider; import java.util.spi.CurrencyNameProvider;
import java.util.spi.LocaleNameProvider; import java.util.spi.LocaleNameProvider;
import sun.util.spi.CalendarProvider; import sun.util.spi.CalendarProvider;
...@@ -364,32 +363,6 @@ public class HostLocaleProviderAdapterImpl { ...@@ -364,32 +363,6 @@ public class HostLocaleProviderAdapterImpl {
}; };
} }
public static CalendarNameProvider getCalendarNameProvider() {
return new CalendarNameProvider() {
@Override
public Locale[] getAvailableLocales() {
return getSupportedCalendarLocales();
}
@Override
public boolean isSupportedLocale(Locale locale) {
return isSupportedCalendarLocale(locale);
}
@Override
public String getDisplayName(String calType, int field, int value,
int style, Locale locale) {
return null;
}
@Override
public Map<String, Integer> getDisplayNames(String calType,
int field, int style, Locale locale) {
return null;
}
};
}
public static CalendarProvider getCalendarProvider() { public static CalendarProvider getCalendarProvider() {
return new CalendarProvider() { return new CalendarProvider() {
@Override @Override
......
...@@ -64,6 +64,10 @@ public class LocaleProviders { ...@@ -64,6 +64,10 @@ public class LocaleProviders {
bug8013086Test(args[1], args[2]); bug8013086Test(args[1], args[2]);
break; break;
case "bug8013903Test":
bug8013903Test();
break;
default: default:
throw new RuntimeException("Test method '"+methodName+"' not found."); throw new RuntimeException("Test method '"+methodName+"' not found.");
} }
...@@ -195,4 +199,30 @@ public class LocaleProviders { ...@@ -195,4 +199,30 @@ public class LocaleProviders {
// ParseException is fine in this test, as it's not "UTC" // ParseException is fine in this test, as it's not "UTC"
} }
} }
static void bug8013903Test() {
if (System.getProperty("os.name").startsWith("Windows")) {
Date sampleDate = new Date(0x10000000000L);
String fallbackResult = "Heisei 16.Nov.03 (Wed) AM 11:53:47";
String jreResult = "\u5e73\u6210 16.11.03 (\u6c34) \u5348\u524d 11:53:47";
Locale l = new Locale("ja", "JP", "JP");
SimpleDateFormat sdf = new SimpleDateFormat("GGGG yyyy.MMM.dd '('E')' a hh:mm:ss", l);
String result = sdf.format(sampleDate);
System.out.println(result);
if (LocaleProviderAdapter.getAdapterPreference()
.contains(LocaleProviderAdapter.Type.JRE)) {
if (!jreResult.equals(result)) {
throw new RuntimeException("Format failed. result: \"" +
result + "\", expected: \"" + jreResult);
}
} else {
// should be FALLBACK, as Windows HOST does not return
// display names
if (!fallbackResult.equals(result)) {
throw new RuntimeException("Format failed. result: \"" +
result + "\", expected: \"" + fallbackResult);
}
}
}
}
} }
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
# #
# @test # @test
# @bug 6336885 7196799 7197573 7198834 8000245 8000615 8001440 8010666 # @bug 6336885 7196799 7197573 7198834 8000245 8000615 8001440 8010666
# 8013086 8013233 # 8013086 8013233 8013903
# @summary tests for "java.locale.providers" system property # @summary tests for "java.locale.providers" system property
# @compile -XDignore.symbol.file LocaleProviders.java # @compile -XDignore.symbol.file LocaleProviders.java
# @run shell/timeout=600 LocaleProviders.sh # @run shell/timeout=600 LocaleProviders.sh
...@@ -300,4 +300,18 @@ PARAM2=JP ...@@ -300,4 +300,18 @@ PARAM2=JP
PARAM3= PARAM3=
runTest runTest
# testing 8013903 fix. (Windows only)
METHODNAME=bug8013903Test
PREFLIST=HOST,JRE
PARAM1=
PARAM2=
PARAM3=
runTest
METHODNAME=bug8013903Test
PREFLIST=HOST
PARAM1=
PARAM2=
PARAM3=
runTest
exit $result exit $result
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册