diff --git a/gson/src/main/java/com/google/gson/GsonBuilder.java b/gson/src/main/java/com/google/gson/GsonBuilder.java index 536207362f..7ebdad4e30 100644 --- a/gson/src/main/java/com/google/gson/GsonBuilder.java +++ b/gson/src/main/java/com/google/gson/GsonBuilder.java @@ -43,6 +43,7 @@ import com.google.gson.stream.JsonWriter; import java.lang.reflect.Type; import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collections; @@ -598,7 +599,14 @@ public GsonBuilder disableHtmlEscaping() { */ @CanIgnoreReturnValue public GsonBuilder setDateFormat(String pattern) { - // TODO(Joel): Make this fail fast if it is an invalid date format + if (pattern != null) { + try { + new SimpleDateFormat(pattern); + } catch (IllegalArgumentException e) { + // Throw exception if it is an invalid date format + throw new IllegalArgumentException("The date pattern '" + pattern + "' is not valid", e); + } + } this.datePattern = pattern; return this; } diff --git a/gson/src/main/java/com/google/gson/internal/bind/util/ISO8601Utils.java b/gson/src/main/java/com/google/gson/internal/bind/util/ISO8601Utils.java index b9a0f9968a..05dbafa096 100644 --- a/gson/src/main/java/com/google/gson/internal/bind/util/ISO8601Utils.java +++ b/gson/src/main/java/com/google/gson/internal/bind/util/ISO8601Utils.java @@ -289,11 +289,7 @@ public static Date parse(String date, ParsePosition pos) throws ParseException { return calendar.getTime(); // If we get a ParseException it'll already have the right message/offset. // Other exception types can convert here. - } catch (IndexOutOfBoundsException e) { - fail = e; - } catch (NumberFormatException e) { - fail = e; - } catch (IllegalArgumentException e) { + } catch (IndexOutOfBoundsException | IllegalArgumentException e) { fail = e; } String input = (date == null) ? null : ('"' + date + '"'); diff --git a/gson/src/test/java/com/google/gson/functional/DefaultTypeAdaptersTest.java b/gson/src/test/java/com/google/gson/functional/DefaultTypeAdaptersTest.java index a0c493cfa3..ccef12229c 100644 --- a/gson/src/test/java/com/google/gson/functional/DefaultTypeAdaptersTest.java +++ b/gson/src/test/java/com/google/gson/functional/DefaultTypeAdaptersTest.java @@ -16,6 +16,7 @@ package com.google.gson.functional; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertThrows; import static org.junit.Assert.fail; import com.google.gson.Gson; @@ -737,6 +738,24 @@ public void testStringBufferDeserialization() { assertThat(sb.toString()).isEqualTo("abc"); } + @Test + public void testSetDateFormatWithInvalidPattern() { + GsonBuilder builder = new GsonBuilder(); + String invalidPattern = "This is a invalid Pattern"; + assertThrows( + IllegalArgumentException.class, + () -> { + builder.setDateFormat(invalidPattern); + }); + } + + @Test + public void testSetDateFormatWithValidPattern() { + GsonBuilder builder = new GsonBuilder(); + String validPattern = "yyyy-MM-dd"; + builder.setDateFormat(validPattern); + } + private static class MyClassTypeAdapter extends TypeAdapter> { @Override public void write(JsonWriter out, Class value) throws IOException {