summaryrefslogtreecommitdiffstats
path: root/luni
diff options
context:
space:
mode:
authorNarayan Kamath <narayan@google.com>2014-08-12 17:47:40 +0100
committerNarayan Kamath <narayan@google.com>2014-08-14 11:21:21 +0100
commite4f01dff49442840faa828dcff0d1583a2e68530 (patch)
tree4ae1977aedea38e5d6a3073c320fb52713facf85 /luni
parenta4ca9e03c1bbd962bfbcc8993a187c46d3bda3e4 (diff)
downloadlibcore-e4f01dff49442840faa828dcff0d1583a2e68530.zip
libcore-e4f01dff49442840faa828dcff0d1583a2e68530.tar.gz
libcore-e4f01dff49442840faa828dcff0d1583a2e68530.tar.bz2
Allow Calendar.getInstance to be called with a null Locale.
LocaleData.get was changed to throw for null locales instead of falling back to the default, so we need to adjust callers accordingly. Turns out all other callers would've thrown anyway (for different reasons) so this change makes those exceptions explicit and adds tests for them. bug: 16938922 (cherry picked from commit 148de94b69ad9ed98ebb1adf0e8eb1b1e9e33e1f) Change-Id: Id89961c9b9524776ef13f57d97b2bb73e19b4eb1
Diffstat (limited to 'luni')
-rw-r--r--luni/src/main/java/java/text/DateFormat.java10
-rw-r--r--luni/src/main/java/java/text/NumberFormat.java15
-rw-r--r--luni/src/main/java/java/util/Calendar.java1
-rw-r--r--luni/src/main/java/java/util/Currency.java6
-rw-r--r--luni/src/main/java/libcore/icu/LocaleData.java4
-rw-r--r--luni/src/test/java/libcore/java/text/NumberFormatTest.java27
-rw-r--r--luni/src/test/java/libcore/java/text/SimpleDateFormatTest.java17
-rw-r--r--luni/src/test/java/libcore/java/util/CalendarTest.java17
-rw-r--r--luni/src/test/java/libcore/java/util/CurrencyTest.java8
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) {}
+ }
}