From d1de4cf676f669fe6771d12dd220e1a9f8d1a42a Mon Sep 17 00:00:00 2001 From: Inderjeet Singh Date: Tue, 22 Nov 2011 23:56:10 +0000 Subject: [PATCH] renamed GsonBuilder.factory() to GsonBuilder.registerTypeAdapterFactory() revised GsonBuilder.registerTypeAdapter/registerTypeHierarchyAdapter to take streaming type adapters as well. Removed the typeAdapter() and typeHierarchyAdapter() methods from the public API. --- .../java/com/google/gson/GsonBuilder.java | 47 +++++++++---------- .../functional/StreamingTypeAdaptersTest.java | 2 +- .../functional/TypeAdapterPrecedenceTest.java | 8 ++-- 3 files changed, 28 insertions(+), 29 deletions(-) diff --git a/gson/src/main/java/com/google/gson/GsonBuilder.java b/gson/src/main/java/com/google/gson/GsonBuilder.java index 76d6af8d..67463e13 100644 --- a/gson/src/main/java/com/google/gson/GsonBuilder.java +++ b/gson/src/main/java/com/google/gson/GsonBuilder.java @@ -105,30 +105,11 @@ public final class GsonBuilder { } // TODO: nice documentation - public GsonBuilder factory(TypeAdapter.Factory factory) { + public GsonBuilder registerTypeAdapterFactory(TypeAdapter.Factory factory) { typeAdapterFactories.add(factory); return this; } - // TODO: nice documentation - public GsonBuilder typeAdapter(final Class type, final TypeAdapter typeAdapter) { - typeAdapterFactories.add(TypeAdapters.newFactory(type, typeAdapter)); - return this; - } - - // TODO: nice documentation - // TODO: accept a Type instead of a TypeToken? It's less typesafe but more Gson-like - public GsonBuilder typeAdapter(TypeToken type, TypeAdapter typeAdapter) { - typeAdapterFactories.add(TypeAdapters.newFactory(type, typeAdapter)); - return this; - } - - // TODO: nice documentation - public GsonBuilder typeHierarchyAdapter(Class type, TypeAdapter typeAdapter) { - typeAdapterFactories.add(TypeAdapters.newTypeHierarchyFactory(type, typeAdapter)); - return this; - } - /** * Configures Gson to enable versioning support. * @@ -476,11 +457,12 @@ public final class GsonBuilder { * {@link JsonSerializer}, and a {@link JsonDeserializer} interfaces. * @return a reference to this {@code GsonBuilder} object to fulfill the "Builder" pattern */ + @SuppressWarnings({"unchecked", "rawtypes"}) public GsonBuilder registerTypeAdapter(Type type, Object typeAdapter) { $Gson$Preconditions.checkArgument(typeAdapter instanceof JsonSerializer || typeAdapter instanceof JsonDeserializer || typeAdapter instanceof InstanceCreator - || typeAdapter instanceof TypeAdapter.Factory); + || typeAdapter instanceof TypeAdapter); if (Primitives.isPrimitive(type) || Primitives.isWrapperType(type)) { throw new IllegalArgumentException( "Cannot register type adapters for " + type); @@ -492,12 +474,18 @@ public final class GsonBuilder { TypeToken typeToken = TypeToken.get(type); typeAdapterFactories.add(new TreeTypeAdapter.SingleTypeFactory(typeToken, typeAdapter)); } - if (typeAdapter instanceof TypeAdapter.Factory) { - typeAdapterFactories.add((TypeAdapter.Factory) typeAdapter); + if (typeAdapter instanceof TypeAdapter) { + typeAdapter(TypeToken.get(type), (TypeAdapter)typeAdapter); } return this; } + // TODO: inline this method? + private GsonBuilder typeAdapter(TypeToken type, TypeAdapter typeAdapter) { + typeAdapterFactories.add(TypeAdapters.newFactory(type, typeAdapter)); + return this; + } + /** * Configures Gson to use a custom {@link InstanceCreator} for the specified type. If an instance * creator was previously registered for the specified class, it is overwritten. Since this method @@ -532,9 +520,11 @@ public final class GsonBuilder { * @return a reference to this {@code GsonBuilder} object to fulfill the "Builder" pattern * @since 1.7 */ + @SuppressWarnings({"unchecked", "rawtypes"}) public GsonBuilder registerTypeHierarchyAdapter(Class baseType, Object typeAdapter) { $Gson$Preconditions.checkArgument(typeAdapter instanceof JsonSerializer - || typeAdapter instanceof JsonDeserializer || typeAdapter instanceof InstanceCreator); + || typeAdapter instanceof JsonDeserializer || typeAdapter instanceof InstanceCreator + || typeAdapter instanceof TypeAdapter); if (typeAdapter instanceof InstanceCreator) { registerInstanceCreatorForTypeHierarchy(baseType, (InstanceCreator) typeAdapter); } @@ -544,6 +534,15 @@ public final class GsonBuilder { if (typeAdapter instanceof JsonDeserializer) { registerDeserializerForTypeHierarchy(baseType, (JsonDeserializer) typeAdapter); } + if (typeAdapter instanceof TypeAdapter) { + typeHierarchyAdapter(baseType, (TypeAdapter)typeAdapter); + } + return this; + } + + // TODO: inline this method? + private GsonBuilder typeHierarchyAdapter(Class type, TypeAdapter typeAdapter) { + typeAdapterFactories.add(TypeAdapters.newTypeHierarchyFactory(type, typeAdapter)); return this; } diff --git a/gson/src/test/java/com/google/gson/functional/StreamingTypeAdaptersTest.java b/gson/src/test/java/com/google/gson/functional/StreamingTypeAdaptersTest.java index bc7949a6..b499df81 100644 --- a/gson/src/test/java/com/google/gson/functional/StreamingTypeAdaptersTest.java +++ b/gson/src/test/java/com/google/gson/functional/StreamingTypeAdaptersTest.java @@ -102,7 +102,7 @@ public final class StreamingTypeAdaptersTest extends TestCase { writer.value(value.name); } }; - miniGson = new GsonBuilder().typeAdapter(Person.class, personNameAdapter).create(); + miniGson = new GsonBuilder().registerTypeAdapter(Person.class, personNameAdapter).create(); truckAdapter = miniGson.getAdapter(Truck.class); } diff --git a/gson/src/test/java/com/google/gson/functional/TypeAdapterPrecedenceTest.java b/gson/src/test/java/com/google/gson/functional/TypeAdapterPrecedenceTest.java index 2184e383..0dc20aa1 100644 --- a/gson/src/test/java/com/google/gson/functional/TypeAdapterPrecedenceTest.java +++ b/gson/src/test/java/com/google/gson/functional/TypeAdapterPrecedenceTest.java @@ -58,14 +58,14 @@ public final class TypeAdapterPrecedenceTest extends TestCase { public void testSerializeNonstreamingTypeAdapterFollowedByStreamingTypeAdapter() { Gson gson = new GsonBuilder() .registerTypeAdapter(Foo.class, FOO_SERIALIZER) - .typeAdapter(Foo.class, FOO_TYPE_ADAPTER) + .registerTypeAdapter(Foo.class, FOO_TYPE_ADAPTER) .create(); assertEquals("\"foo (via FOO_SERIALIZER)\"", gson.toJson(new Foo("foo"))); } public void testSerializeStreamingTypeAdapterFollowedByNonstreamingTypeAdapter() { Gson gson = new GsonBuilder() - .typeAdapter(Foo.class, FOO_TYPE_ADAPTER) + .registerTypeAdapter(Foo.class, FOO_TYPE_ADAPTER) .registerTypeAdapter(Foo.class, FOO_SERIALIZER) .create(); assertEquals("\"foo (via FOO_TYPE_ADAPTER)\"", gson.toJson(new Foo("foo"))); @@ -74,14 +74,14 @@ public final class TypeAdapterPrecedenceTest extends TestCase { public void testDeserializeNonstreamingTypeAdapterFollowedByStreamingTypeAdapter() { Gson gson = new GsonBuilder() .registerTypeAdapter(Foo.class, FOO_DESERIALIZER) - .typeAdapter(Foo.class, FOO_TYPE_ADAPTER) + .registerTypeAdapter(Foo.class, FOO_TYPE_ADAPTER) .create(); assertEquals("foo (via FOO_DESERIALIZER)", gson.fromJson("foo", Foo.class).name); } public void testDeserializeStreamingTypeAdapterFollowedByNonstreamingTypeAdapter() { Gson gson = new GsonBuilder() - .typeAdapter(Foo.class, FOO_TYPE_ADAPTER) + .registerTypeAdapter(Foo.class, FOO_TYPE_ADAPTER) .registerTypeAdapter(Foo.class, FOO_DESERIALIZER) .create(); assertEquals("foo (via FOO_TYPE_ADAPTER)", gson.fromJson("foo", Foo.class).name);