From eeac68872b90a74b452b7f810a4047ac75bd490a Mon Sep 17 00:00:00 2001 From: Naoto Sato Date: Fri, 5 Oct 2012 09:57:50 -0700 Subject: [PATCH] 7198834: HOST Adapter: one extra empty space in the end of the pattern string Reviewed-by: okutsu --- .../provider/JRELocaleProviderAdapter.java | 24 ++-- .../provider/HostLocaleProviderAdapter_md.c | 19 ++-- .../java/util/Locale/LocaleProviders.java | 68 ++++++++--- jdk/test/java/util/Locale/LocaleProviders.sh | 106 +++++++++++------- 4 files changed, 137 insertions(+), 80 deletions(-) diff --git a/jdk/src/share/classes/sun/util/locale/provider/JRELocaleProviderAdapter.java b/jdk/src/share/classes/sun/util/locale/provider/JRELocaleProviderAdapter.java index b2120458a45..34ed5b890e2 100644 --- a/jdk/src/share/classes/sun/util/locale/provider/JRELocaleProviderAdapter.java +++ b/jdk/src/share/classes/sun/util/locale/provider/JRELocaleProviderAdapter.java @@ -125,7 +125,7 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter { public BreakIteratorProvider getBreakIteratorProvider() { if (breakIteratorProvider == null) { BreakIteratorProvider provider = new BreakIteratorProviderImpl(getAdapterType(), - getLanguateTagSet("FormatData")); + getLanguageTagSet("FormatData")); synchronized (this) { if (breakIteratorProvider == null) { breakIteratorProvider = provider; @@ -139,7 +139,7 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter { public CollatorProvider getCollatorProvider() { if (collatorProvider == null) { CollatorProvider provider = new CollatorProviderImpl(getAdapterType(), - getLanguateTagSet("CollationData")); + getLanguageTagSet("CollationData")); synchronized (this) { if (collatorProvider == null) { collatorProvider = provider; @@ -153,7 +153,7 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter { public DateFormatProvider getDateFormatProvider() { if (dateFormatProvider == null) { DateFormatProvider provider = new DateFormatProviderImpl(getAdapterType(), - getLanguateTagSet("FormatData")); + getLanguageTagSet("FormatData")); synchronized (this) { if (dateFormatProvider == null) { dateFormatProvider = provider; @@ -167,7 +167,7 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter { public DateFormatSymbolsProvider getDateFormatSymbolsProvider() { if (dateFormatSymbolsProvider == null) { DateFormatSymbolsProvider provider = new DateFormatSymbolsProviderImpl(getAdapterType(), - getLanguateTagSet("FormatData")); + getLanguageTagSet("FormatData")); synchronized (this) { if (dateFormatSymbolsProvider == null) { dateFormatSymbolsProvider = provider; @@ -180,7 +180,7 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter { @Override public DecimalFormatSymbolsProvider getDecimalFormatSymbolsProvider() { if (decimalFormatSymbolsProvider == null) { - DecimalFormatSymbolsProvider provider = new DecimalFormatSymbolsProviderImpl(getAdapterType(), getLanguateTagSet("FormatData")); + DecimalFormatSymbolsProvider provider = new DecimalFormatSymbolsProviderImpl(getAdapterType(), getLanguageTagSet("FormatData")); synchronized (this) { if (decimalFormatSymbolsProvider == null) { decimalFormatSymbolsProvider = provider; @@ -194,7 +194,7 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter { public NumberFormatProvider getNumberFormatProvider() { if (numberFormatProvider == null) { NumberFormatProvider provider = new NumberFormatProviderImpl(getAdapterType(), - getLanguateTagSet("FormatData")); + getLanguageTagSet("FormatData")); synchronized (this) { if (numberFormatProvider == null) { numberFormatProvider = provider; @@ -211,7 +211,7 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter { public CurrencyNameProvider getCurrencyNameProvider() { if (currencyNameProvider == null) { CurrencyNameProvider provider = new CurrencyNameProviderImpl(getAdapterType(), - getLanguateTagSet("CurrencyNames")); + getLanguageTagSet("CurrencyNames")); synchronized (this) { if (currencyNameProvider == null) { currencyNameProvider = provider; @@ -225,7 +225,7 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter { public LocaleNameProvider getLocaleNameProvider() { if (localeNameProvider == null) { LocaleNameProvider provider = new LocaleNameProviderImpl(getAdapterType(), - getLanguateTagSet("LocaleNames")); + getLanguageTagSet("LocaleNames")); synchronized (this) { if (localeNameProvider == null) { localeNameProvider = provider; @@ -239,7 +239,7 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter { public TimeZoneNameProvider getTimeZoneNameProvider() { if (timeZoneNameProvider == null) { TimeZoneNameProvider provider = new TimeZoneNameProviderImpl(getAdapterType(), - getLanguateTagSet("TimeZoneNames")); + getLanguageTagSet("TimeZoneNames")); synchronized (this) { if (timeZoneNameProvider == null) { timeZoneNameProvider = provider; @@ -253,8 +253,8 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter { public CalendarDataProvider getCalendarDataProvider() { if (calendarDataProvider == null) { Set set = new HashSet<>(); - set.addAll(getLanguateTagSet("FormatData")); - set.addAll(getLanguateTagSet("CalendarData")); + set.addAll(getLanguageTagSet("FormatData")); + set.addAll(getLanguageTagSet("CalendarData")); CalendarDataProvider provider = new CalendarDataProviderImpl(getAdapterType(), set); synchronized (this) { @@ -302,7 +302,7 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter { return AvailableJRELocales.localeList.clone(); } - public Set getLanguateTagSet(String category) { + public Set getLanguageTagSet(String category) { Set tagset = langtagSets.get(category); if (tagset == null) { tagset = createLanguageTagSet(category); diff --git a/jdk/src/windows/native/sun/util/locale/provider/HostLocaleProviderAdapter_md.c b/jdk/src/windows/native/sun/util/locale/provider/HostLocaleProviderAdapter_md.c index ca29a2a064f..e507a6fb598 100644 --- a/jdk/src/windows/native/sun/util/locale/provider/HostLocaleProviderAdapter_md.c +++ b/jdk/src/windows/native/sun/util/locale/provider/HostLocaleProviderAdapter_md.c @@ -209,31 +209,26 @@ JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapte */ JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getDateTimePattern (JNIEnv *env, jclass cls, jint dateStyle, jint timeStyle, jstring jlangtag) { - WCHAR datePattern[BUFLEN]; - WCHAR timePattern[BUFLEN]; + WCHAR pattern[BUFLEN]; const jchar *langtag = (*env)->GetStringChars(env, jlangtag, JNI_FALSE); - datePattern[0] = L'\0'; - timePattern[0] = L'\0'; + pattern[0] = L'\0'; if (dateStyle == 0 || dateStyle == 1) { - getLocaleInfoWrapper(langtag, LOCALE_SLONGDATE, datePattern, BUFLEN); + getLocaleInfoWrapper(langtag, LOCALE_SLONGDATE, pattern, BUFLEN); } else if (dateStyle == 2 || dateStyle == 3) { - getLocaleInfoWrapper(langtag, LOCALE_SSHORTDATE, datePattern, BUFLEN); + getLocaleInfoWrapper(langtag, LOCALE_SSHORTDATE, pattern, BUFLEN); } if (timeStyle == 0 || timeStyle == 1) { - getLocaleInfoWrapper(langtag, LOCALE_STIMEFORMAT, timePattern, BUFLEN); + getLocaleInfoWrapper(langtag, LOCALE_STIMEFORMAT, pattern, BUFLEN); } else if (timeStyle == 2 || timeStyle == 3) { - getLocaleInfoWrapper(langtag, LOCALE_SSHORTTIME, timePattern, BUFLEN); + getLocaleInfoWrapper(langtag, LOCALE_SSHORTTIME, pattern, BUFLEN); } - wcscat(datePattern, L" "); - wcscat(datePattern, timePattern); - (*env)->ReleaseStringChars(env, jlangtag, langtag); - return (*env)->NewString(env, datePattern, wcslen(datePattern)); + return (*env)->NewString(env, pattern, wcslen(pattern)); } /* diff --git a/jdk/test/java/util/Locale/LocaleProviders.java b/jdk/test/java/util/Locale/LocaleProviders.java index a2a298e499e..98a999b39d4 100644 --- a/jdk/test/java/util/Locale/LocaleProviders.java +++ b/jdk/test/java/util/Locale/LocaleProviders.java @@ -20,27 +20,65 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -import java.text.spi.DateFormatProvider; -import java.util.Locale; +import java.text.*; +import java.text.spi.*; +import java.util.*; import sun.util.locale.provider.LocaleProviderAdapter; public class LocaleProviders { public static void main(String[] args) { - if (args.length == 0) { - // no args indicates that the caller is asking the platform default locale. - Locale defloc = Locale.getDefault(); - System.out.printf("%s,%s\n", defloc.getLanguage(), defloc.getCountry()); - } else { - String expected = args[0]; - Locale testLocale = new Locale(args[1], (args.length >= 3 ? args[2] : "")); - String preference = System.getProperty("java.locale.providers", ""); - LocaleProviderAdapter lda = LocaleProviderAdapter.getAdapter(DateFormatProvider.class, testLocale); - LocaleProviderAdapter.Type type = lda.getAdapterType(); - System.out.printf("testLocale: %s, got: %s, expected: %s\n", testLocale, type, expected); - if (!type.toString().equals(expected)) { - throw new RuntimeException("Returned locale data adapter is not correct."); + String methodName = args[0]; + + switch (methodName) { + case "getPlatformLocale": + if (args[1].equals("format")) { + getPlatformLocale(Locale.Category.FORMAT); + } else { + getPlatformLocale(Locale.Category.DISPLAY); + } + break; + + case "adapterTest": + adapterTest(args[1], args[2], (args.length >= 4 ? args[3] : "")); + break; + + case "bug7198834Test": + bug7198834Test(); + break; + + default: + throw new RuntimeException("Test method '"+methodName+"' not found."); + } + } + + static void getPlatformLocale(Locale.Category cat) { + Locale defloc = Locale.getDefault(cat); + System.out.printf("%s,%s\n", defloc.getLanguage(), defloc.getCountry()); + } + + static void adapterTest(String expected, String lang, String ctry) { + Locale testLocale = new Locale(lang, ctry); + String preference = System.getProperty("java.locale.providers", ""); + LocaleProviderAdapter lda = LocaleProviderAdapter.getAdapter(DateFormatProvider.class, testLocale); + LocaleProviderAdapter.Type type = lda.getAdapterType(); + System.out.printf("testLocale: %s, got: %s, expected: %s\n", testLocale, type, expected); + if (!type.toString().equals(expected)) { + throw new RuntimeException("Returned locale data adapter is not correct."); + } + } + + static void bug7198834Test() { + LocaleProviderAdapter lda = LocaleProviderAdapter.getAdapter(DateFormatProvider.class, Locale.US); + LocaleProviderAdapter.Type type = lda.getAdapterType(); + if (type == LocaleProviderAdapter.Type.HOST && System.getProperty("os.name").startsWith("Windows")) { + DateFormat df = DateFormat.getDateInstance(DateFormat.FULL, Locale.US); + String date = df.format(new Date()); + if (date.charAt(date.length()-1) == ' ') { + throw new RuntimeException("Windows Host Locale Provider returns a trailing space."); } + } else { + System.out.println("Windows HOST locale adapter not found. Ignoring this test."); } } } diff --git a/jdk/test/java/util/Locale/LocaleProviders.sh b/jdk/test/java/util/Locale/LocaleProviders.sh index dcad0e36e34..703d1f0f8a3 100644 --- a/jdk/test/java/util/Locale/LocaleProviders.sh +++ b/jdk/test/java/util/Locale/LocaleProviders.sh @@ -23,7 +23,7 @@ #!/bin/sh # # @test -# @bug 6336885 7196799 7197573 +# @bug 6336885 7196799 7197573 7198834 # @summary tests for "java.locale.providers" system property # @compile -XDignore.symbol.file LocaleProviders.java # @run shell/timeout=600 LocaleProviders.sh @@ -65,16 +65,21 @@ case "$OS" in ;; esac -# get the platform default locale -PLATDEF=`${TESTJAVA}${FS}bin${FS}java -classpath ${TESTCLASSES} LocaleProviders` +# get the platform default locales +PLATDEF=`${TESTJAVA}${FS}bin${FS}java -classpath ${TESTCLASSES} LocaleProviders getPlatformLocale display` DEFLANG=`echo ${PLATDEF} | sed -e "s/,.*//"` DEFCTRY=`echo ${PLATDEF} | sed -e "s/.*,//"` echo "DEFLANG=${DEFLANG}" echo "DEFCTRY=${DEFCTRY}" +PLATDEF=`${TESTJAVA}${FS}bin${FS}java -classpath ${TESTCLASSES} LocaleProviders getPlatformLocale format` +DEFFMTLANG=`echo ${PLATDEF} | sed -e "s/,.*//"` +DEFFMTCTRY=`echo ${PLATDEF} | sed -e "s/.*,//"` +echo "DEFFMTLANG=${DEFFMTLANG}" +echo "DEFFMTCTRY=${DEFFMTCTRY}" runTest() { - RUNCMD="${TESTJAVA}${FS}bin${FS}java -classpath ${TESTCLASSES} -Djava.locale.providers=$PREFLIST LocaleProviders $EXPECTED $TESTLANG $TESTCTRY" + RUNCMD="${TESTJAVA}${FS}bin${FS}java -classpath ${TESTCLASSES} -Djava.locale.providers=$PREFLIST LocaleProviders $METHODNAME $PARAM1 $PARAM2 $PARAM3" echo ${RUNCMD} ${RUNCMD} result=$? @@ -88,91 +93,110 @@ runTest() } # testing HOST is selected for the default locale, if specified on Windows or MacOSX +METHODNAME=adapterTest PREFLIST=HOST,JRE case "$OS" in Windows_NT* ) WINVER=`uname -r` if [ "${WINVER}" = "5" ] then - EXPECTED=JRE + PARAM1=JRE else - EXPECTED=HOST + PARAM1=HOST fi ;; CYGWIN_NT-6* | Darwin ) - EXPECTED=HOST + PARAM1=HOST ;; * ) - EXPECTED=JRE + PARAM1=JRE ;; esac -TESTLANG=${DEFLANG} -TESTCTRY=${DEFCTRY} +PARAM2=${DEFLANG} +PARAM3=${DEFCTRY} runTest # testing HOST is NOT selected for the non-default locale, if specified +METHODNAME=adapterTest PREFLIST=HOST,JRE -EXPECTED=JRE -if [ "${DEFLANG}" = "en" ] -then - TESTLANG=ja - TESTCTRY=JP +PARAM1=JRE +# Try to find the locale JRE supports which is not the platform default (HOST supports that one) +if [ "${DEFLANG}" != "en" ] && [ "${DEFFMTLANG}" != "en" ]; then + PARAM2=en + PARAM3=US +elif [ "${DEFLANG}" != "ja" ] && [ "${DEFFMTLANG}" != "ja" ]; then + PARAM2=ja + PARAM3=JP else - TESTLANG=en - TESTCTRY=US + PARAM2=zh + PARAM3=CN fi runTest # testing SPI is NOT selected, as there is none. +METHODNAME=adapterTest PREFLIST=SPI,JRE -EXPECTED=JRE -TESTLANG=en -TESTCTRY=US +PARAM1=JRE +PARAM2=en +PARAM3=US runTest # testing the order, variaton #1. This assumes en_GB DateFormat data are available both in JRE & CLDR +METHODNAME=adapterTest PREFLIST=CLDR,JRE -EXPECTED=CLDR -TESTLANG=en -TESTCTRY=GB +PARAM1=CLDR +PARAM2=en +PARAM3=GB runTest # testing the order, variaton #2. This assumes en_GB DateFormat data are available both in JRE & CLDR +METHODNAME=adapterTest PREFLIST=JRE,CLDR -EXPECTED=JRE -TESTLANG=en -TESTCTRY=GB +PARAM1=JRE +PARAM2=en +PARAM3=GB runTest # testing the order, variaton #3 for non-existent locale in JRE assuming "haw" is not in JRE. +METHODNAME=adapterTest PREFLIST=JRE,CLDR -EXPECTED=CLDR -TESTLANG=haw -TESTCTRY=GB +PARAM1=CLDR +PARAM2=haw +PARAM3=GB runTest # testing the order, variaton #4 for the bug 7196799. CLDR's "zh" data should be used in "zh_CN" +METHODNAME=adapterTest PREFLIST=CLDR -EXPECTED=CLDR -TESTLANG=zh -TESTCTRY=CN +PARAM1=CLDR +PARAM2=zh +PARAM3=CN runTest # testing FALLBACK provider. SPI and invalid one cases. +METHODNAME=adapterTest PREFLIST=SPI -EXPECTED=FALLBACK -TESTLANG=en -TESTCTRY=US +PARAM1=FALLBACK +PARAM2=en +PARAM3=US runTest PREFLIST=FOO -EXPECTED=JRE -TESTLANG=en -TESTCTRY=US +PARAM1=JRE +PARAM2=en +PARAM3=US runTest PREFLIST=BAR,SPI -EXPECTED=FALLBACK -TESTLANG=en -TESTCTRY=US +PARAM1=FALLBACK +PARAM2=en +PARAM3=US +runTest + +# testing 7198834 fix. Only works on Windows Vista or upper. +METHODNAME=bug7198834Test +PREFLIST=HOST +PARAM1= +PARAM2= +PARAM3= runTest exit $result