From 81854db4ac8c50aa65ffb5ad7b66747cdea4ab4c Mon Sep 17 00:00:00 2001 From: Inderjeet Singh Date: Sun, 25 Sep 2011 21:35:36 +0000 Subject: [PATCH] Converted java.sql.Timestamp type adapter to the new style. --- .../com/google/gson/DefaultTypeAdapters.java | 11 -------- gson/src/main/java/com/google/gson/Gson.java | 1 + .../gson/internal/bind/TypeAdapters.java | 26 +++++++++++++++++++ 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java b/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java index e92ab93d..67fd70a8 100644 --- a/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java +++ b/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java @@ -37,8 +37,6 @@ import com.google.gson.internal.ParameterizedTypeHandlerMap; final class DefaultTypeAdapters { private static final DefaultDateTypeAdapter DATE_TYPE_ADAPTER = new DefaultDateTypeAdapter(); - private static final DefaultTimestampDeserializer TIMESTAMP_DESERIALIZER = - new DefaultTimestampDeserializer(); // The constants DEFAULT_SERIALIZERS, DEFAULT_DESERIALIZERS, and DEFAULT_INSTANCE_CREATORS // must be defined after the constants for the type adapters. Otherwise, the type adapter @@ -65,7 +63,6 @@ final class DefaultTypeAdapters { ParameterizedTypeHandlerMap> map = new ParameterizedTypeHandlerMap>(); map.register(Date.class, wrapDeserializer(DATE_TYPE_ADAPTER), true); - map.register(Timestamp.class, wrapDeserializer(TIMESTAMP_DESERIALIZER), true); map.makeUnmodifiable(); return map; @@ -169,12 +166,4 @@ final class DefaultTypeAdapters { return sb.toString(); } } - - static final class DefaultTimestampDeserializer implements JsonDeserializer { - public Timestamp deserialize(JsonElement json, Type typeOfT, - JsonDeserializationContext context) throws JsonParseException { - Date date = context.deserialize(json, Date.class); - return new Timestamp(date.getTime()); - } - } } diff --git a/gson/src/main/java/com/google/gson/Gson.java b/gson/src/main/java/com/google/gson/Gson.java index 7fb95009..353c171a 100644 --- a/gson/src/main/java/com/google/gson/Gson.java +++ b/gson/src/main/java/com/google/gson/Gson.java @@ -257,6 +257,7 @@ public final class Gson { .factory(TypeAdapters.CALENDAR_FACTORY) .factory(TypeAdapters.SQL_TIME_FACTORY) .factory(TypeAdapters.SQL_DATE_FACTORY) + .factory(TypeAdapters.SQL_TIMESTAMP_FACTORY) .factory(new MapTypeAdapterFactory(constructorConstructor, complexMapKeySerialization)) .factory(ArrayTypeAdapter.FACTORY) .factory(TypeAdapters.ENUM_FACTORY) diff --git a/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java b/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java index 1c32969c..c4a0a187 100644 --- a/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java +++ b/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java @@ -22,6 +22,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.sql.Time; +import java.sql.Timestamp; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -433,6 +434,31 @@ public final class TypeAdapters { public static final TypeAdapter.Factory SQL_TIME_FACTORY = newFactory(Time.class, SQL_TIME); + private static final class TimestampTypeAdapter extends TypeAdapter { + private final DateFormat format = new SimpleDateFormat("hh:mm:ss a"); + private final MiniGson context; + public TimestampTypeAdapter(MiniGson context) { + this.context = context; + } + @Override + public Timestamp read(JsonReader reader) throws IOException { + TypeAdapter dateTypeAdapter = context.getAdapter(Date.class); + Date date = dateTypeAdapter.read(reader); + return new java.sql.Timestamp(date.getTime()); + } + @Override + public void write(JsonWriter writer, Timestamp value) throws IOException { + writer.value(format.format(value)); + } + }; + public static final TypeAdapter.Factory SQL_TIMESTAMP_FACTORY = new TypeAdapter.Factory() { + @SuppressWarnings("unchecked") + public TypeAdapter create(MiniGson context, TypeToken typeToken) { + return typeToken.getRawType() == Timestamp.class + ? (TypeAdapter) new TimestampTypeAdapter(context) : null; + } + }; + public static final TypeAdapter SQL_DATE = new TypeAdapter() { private final DateFormat format = new SimpleDateFormat("MMM d, yyyy"); @Override