diff options
author | Narayan Kamath <narayan@google.com> | 2014-08-14 09:48:43 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-08-13 23:17:40 +0000 |
commit | 0dcfa1d088f114eb92a96b09eebf6172428ea6b5 (patch) | |
tree | b7a48c08db3983968ab16b7b872553787a59dd5d | |
parent | eaed9b618b3d0b40d6d9a453f4cf8c6bf812f077 (diff) | |
parent | 148de94b69ad9ed98ebb1adf0e8eb1b1e9e33e1f (diff) | |
download | libcore-0dcfa1d088f114eb92a96b09eebf6172428ea6b5.zip libcore-0dcfa1d088f114eb92a96b09eebf6172428ea6b5.tar.gz libcore-0dcfa1d088f114eb92a96b09eebf6172428ea6b5.tar.bz2 |
Merge "Allow Calendar.getInstance to be called with a null Locale."
-rw-r--r-- | luni/src/main/java/java/text/DateFormat.java | 10 | ||||
-rw-r--r-- | luni/src/main/java/java/text/NumberFormat.java | 15 | ||||
-rw-r--r-- | luni/src/main/java/java/util/Calendar.java | 1 | ||||
-rw-r--r-- | luni/src/main/java/java/util/Currency.java | 6 | ||||
-rw-r--r-- | luni/src/main/java/libcore/icu/LocaleData.java | 4 | ||||
-rw-r--r-- | luni/src/test/java/libcore/java/text/NumberFormatTest.java | 27 | ||||
-rw-r--r-- | luni/src/test/java/libcore/java/text/SimpleDateFormatTest.java | 17 | ||||
-rw-r--r-- | luni/src/test/java/libcore/java/util/CalendarTest.java | 17 | ||||
-rw-r--r-- | luni/src/test/java/libcore/java/util/CurrencyTest.java | 8 |
9 files changed, 105 insertions, 0 deletions
diff --git a/luni/src/main/java/java/text/DateFormat.java b/luni/src/main/java/java/text/DateFormat.java index 64784b7..3055843 100644 --- a/luni/src/main/java/java/text/DateFormat.java +++ b/luni/src/main/java/java/text/DateFormat.java @@ -388,6 +388,9 @@ public abstract class DateFormat extends Format { */ public static final DateFormat getDateInstance(int style, Locale locale) { checkDateStyle(style); + if (locale == null) { + throw new NullPointerException("locale == null"); + } return new SimpleDateFormat(LocaleData.get(locale).getDateFormat(style), locale); } @@ -440,6 +443,9 @@ public abstract class DateFormat extends Format { public static final DateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale locale) { checkTimeStyle(timeStyle); checkDateStyle(dateStyle); + if (locale == null) { + throw new NullPointerException("locale == null"); + } LocaleData localeData = LocaleData.get(locale); String pattern = localeData.getDateFormat(dateStyle) + " " + localeData.getTimeFormat(timeStyle); return new SimpleDateFormat(pattern, locale); @@ -514,6 +520,10 @@ public abstract class DateFormat extends Format { */ public static final DateFormat getTimeInstance(int style, Locale locale) { checkTimeStyle(style); + if (locale == null) { + throw new NullPointerException("locale == null"); + } + return new SimpleDateFormat(LocaleData.get(locale).getTimeFormat(style), locale); } diff --git a/luni/src/main/java/java/text/NumberFormat.java b/luni/src/main/java/java/text/NumberFormat.java index 5879191..a1f10d4 100644 --- a/luni/src/main/java/java/text/NumberFormat.java +++ b/luni/src/main/java/java/text/NumberFormat.java @@ -353,6 +353,10 @@ public abstract class NumberFormat extends Format { * @return a {@code NumberFormat} for handling currency values. */ public static NumberFormat getCurrencyInstance(Locale locale) { + if (locale == null) { + throw new NullPointerException("locale == null"); + } + return getInstance(LocaleData.get(locale).currencyPattern, locale); } @@ -376,6 +380,10 @@ public abstract class NumberFormat extends Format { * @return a {@code NumberFormat} for handling integers. */ public static NumberFormat getIntegerInstance(Locale locale) { + if (locale == null) { + throw new NullPointerException("locale == null"); + } + NumberFormat result = getInstance(LocaleData.get(locale).integerPattern, locale); result.setParseIntegerOnly(true); return result; @@ -469,6 +477,9 @@ public abstract class NumberFormat extends Format { * @return a {@code NumberFormat} for handling {@code Number} objects. */ public static NumberFormat getNumberInstance(Locale locale) { + if (locale == null) { + throw new NullPointerException("locale == null"); + } return getInstance(LocaleData.get(locale).numberPattern, locale); } @@ -496,6 +507,10 @@ public abstract class NumberFormat extends Format { * treated as 5,300%, which is rarely what you intended. */ public static NumberFormat getPercentInstance(Locale locale) { + if (locale == null) { + throw new NullPointerException("locale == null"); + } + return getInstance(LocaleData.get(locale).percentPattern, locale); } diff --git a/luni/src/main/java/java/util/Calendar.java b/luni/src/main/java/java/util/Calendar.java index e15641f..fc4cef6 100644 --- a/luni/src/main/java/java/util/Calendar.java +++ b/luni/src/main/java/java/util/Calendar.java @@ -727,6 +727,7 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable<Ca */ protected Calendar(TimeZone timezone, Locale locale) { this(timezone); + locale = LocaleData.mapInvalidAndNullLocales(locale); LocaleData localeData = LocaleData.get(locale); setFirstDayOfWeek(localeData.firstDayOfWeek.intValue()); setMinimalDaysInFirstWeek(localeData.minimalDaysInFirstWeek.intValue()); diff --git a/luni/src/main/java/java/util/Currency.java b/luni/src/main/java/java/util/Currency.java index 8cfb68f..f43ddae 100644 --- a/luni/src/main/java/java/util/Currency.java +++ b/luni/src/main/java/java/util/Currency.java @@ -65,6 +65,9 @@ public final class Currency implements Serializable { */ public static Currency getInstance(Locale locale) { synchronized (localesToCurrencies) { + if (locale == null) { + throw new NullPointerException("locale == null"); + } Currency currency = localesToCurrencies.get(locale); if (currency != null) { return currency; @@ -146,6 +149,9 @@ public final class Currency implements Serializable { * <p>If there is no locale-specific currency symbol, the ISO 4217 currency code is returned. */ public String getSymbol(Locale locale) { + if (locale == null) { + throw new NullPointerException("locale == null"); + } // Check the locale first, in case the locale has the same currency. LocaleData localeData = LocaleData.get(locale); if (localeData.internationalCurrencySymbol.equals(currencyCode)) { diff --git a/luni/src/main/java/libcore/icu/LocaleData.java b/luni/src/main/java/libcore/icu/LocaleData.java index ec05b53..6f59257 100644 --- a/luni/src/main/java/libcore/icu/LocaleData.java +++ b/luni/src/main/java/libcore/icu/LocaleData.java @@ -128,6 +128,10 @@ public final class LocaleData { * Returns a shared LocaleData for the given locale. */ public static LocaleData get(Locale locale) { + if (locale == null) { + throw new NullPointerException("locale == null"); + } + final String languageTag = locale.toLanguageTag(); synchronized (localeDataCache) { LocaleData localeData = localeDataCache.get(languageTag); diff --git a/luni/src/test/java/libcore/java/text/NumberFormatTest.java b/luni/src/test/java/libcore/java/text/NumberFormatTest.java index 5862a6c..4ff063b 100644 --- a/luni/src/test/java/libcore/java/text/NumberFormatTest.java +++ b/luni/src/test/java/libcore/java/text/NumberFormatTest.java @@ -99,4 +99,31 @@ public class NumberFormatTest extends junit.framework.TestCase { } catch (NullPointerException expected) { } } + + public void test_nullLocales() { + try { + NumberFormat.getInstance(null); + fail(); + } catch (NullPointerException expected) {} + + try { + NumberFormat.getIntegerInstance(null); + fail(); + } catch (NullPointerException expected) {} + + try { + NumberFormat.getCurrencyInstance(null); + fail(); + } catch (NullPointerException expected) {} + + try { + NumberFormat.getPercentInstance(null); + fail(); + } catch (NullPointerException expected) {} + + try { + NumberFormat.getNumberInstance(null); + fail(); + } catch (NullPointerException expected) {} + } } diff --git a/luni/src/test/java/libcore/java/text/SimpleDateFormatTest.java b/luni/src/test/java/libcore/java/text/SimpleDateFormatTest.java index bc21739..d65aa0e 100644 --- a/luni/src/test/java/libcore/java/text/SimpleDateFormatTest.java +++ b/luni/src/test/java/libcore/java/text/SimpleDateFormatTest.java @@ -350,4 +350,21 @@ public class SimpleDateFormatTest extends junit.framework.TestCase { assertEquals(1376927400000L, sdf.parse("19. Aug 2013 8:50").getTime()); assertEquals(1376927400000L, sdf.parse("19. Aug. 2013 8:50").getTime()); } + + public void test_nullLocales() { + try { + SimpleDateFormat.getDateInstance(DateFormat.SHORT, null); + fail(); + } catch (NullPointerException expected) {} + + try { + SimpleDateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, null); + fail(); + } catch (NullPointerException expected) {} + + try { + SimpleDateFormat.getTimeInstance(DateFormat.SHORT, null); + fail(); + } catch (NullPointerException expected) {} + } } diff --git a/luni/src/test/java/libcore/java/util/CalendarTest.java b/luni/src/test/java/libcore/java/util/CalendarTest.java index b0ba4dd..b2f6b94 100644 --- a/luni/src/test/java/libcore/java/util/CalendarTest.java +++ b/luni/src/test/java/libcore/java/util/CalendarTest.java @@ -238,4 +238,21 @@ public class CalendarTest extends junit.framework.TestCase { cal.set(Calendar.HOUR_OF_DAY, 1); assertEquals(32400000, cal.getTimeInMillis()); } + + // http://b/16938922. + // + // TODO: This is for backwards compatibility only. Seems like a better idea to throw + // here. We should add a targetSdkVersion based check and throw for each of these + // cases. + public void test_nullLocale() { + assertEquals( + Calendar.getInstance(Locale.getDefault()), + Calendar.getInstance((Locale) null)); + assertEquals( + Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault()), + Calendar.getInstance(TimeZone.getDefault(), null)); + assertEquals( + new GregorianCalendar(Locale.getDefault()), + new GregorianCalendar((Locale) null)); + } } diff --git a/luni/src/test/java/libcore/java/util/CurrencyTest.java b/luni/src/test/java/libcore/java/util/CurrencyTest.java index 61a22fd..cf2a1b6 100644 --- a/luni/src/test/java/libcore/java/util/CurrencyTest.java +++ b/luni/src/test/java/libcore/java/util/CurrencyTest.java @@ -79,4 +79,12 @@ public class CurrencyTest extends junit.framework.TestCase { assertEquals("€", Currency.getInstance(pt_PT).getSymbol(pt_BR)); assertEquals("€", Currency.getInstance(pt_PT).getSymbol(pt_PT)); } + + public void test_nullLocales() { + Currency currency = Currency.getInstance(Locale.getDefault()); + try { + currency.getSymbol(null); + fail(); + } catch (NullPointerException expected) {} + } } |