Repository: jclouds Updated Branches: refs/heads/master 8cb2cb449 -> 231a60675
Adds support for ImmutableMap in jclouds gson Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/231a6067 Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/231a6067 Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/231a6067 Branch: refs/heads/master Commit: 231a60675eec70ff02a8b6cf027e38bccb264276 Parents: 8cb2cb4 Author: Zack Shoylev <[email protected]> Authored: Fri Jul 25 12:53:36 2014 -0500 Committer: Zack Shoylev <[email protected]> Committed: Tue Jul 29 12:36:53 2014 -0500 ---------------------------------------------------------------------- .../org/jclouds/json/config/GsonModule.java | 80 ++++++++++---------- .../NullFilteringTypeAdapterFactories.java | 33 ++++---- .../NullFilteringTypeAdapterFactoriesTest.java | 58 +++++++++----- 3 files changed, 99 insertions(+), 72 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/231a6067/core/src/main/java/org/jclouds/json/config/GsonModule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/json/config/GsonModule.java b/core/src/main/java/org/jclouds/json/config/GsonModule.java index 53a350a..58606fb 100644 --- a/core/src/main/java/org/jclouds/json/config/GsonModule.java +++ b/core/src/main/java/org/jclouds/json/config/GsonModule.java @@ -16,44 +16,6 @@ */ package org.jclouds.json.config; -import static com.google.common.io.BaseEncoding.base16; - -import java.beans.ConstructorProperties; -import java.io.IOException; -import java.lang.reflect.Type; -import java.util.Date; -import java.util.Enumeration; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Set; - -import javax.inject.Inject; -import javax.inject.Provider; -import javax.inject.Singleton; - -import org.jclouds.date.DateService; -import org.jclouds.domain.JsonBall; -import org.jclouds.json.Json; -import org.jclouds.json.internal.DeserializationConstructorAndReflectiveTypeAdapterFactory; -import org.jclouds.json.internal.EnumTypeAdapterThatReturnsFromValue; -import org.jclouds.json.internal.GsonWrapper; -import org.jclouds.json.internal.NamingStrategies.AnnotationConstructorNamingStrategy; -import org.jclouds.json.internal.NamingStrategies.AnnotationOrNameFieldNamingStrategy; -import org.jclouds.json.internal.NamingStrategies.ExtractNamed; -import org.jclouds.json.internal.NamingStrategies.ExtractSerializedName; -import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.CollectionTypeAdapterFactory; -import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.FluentIterableTypeAdapterFactory; -import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.ImmutableListTypeAdapterFactory; -import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.ImmutableSetTypeAdapterFactory; -import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.IterableTypeAdapterFactory; -import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.ListTypeAdapterFactory; -import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.MapTypeAdapterFactory; -import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.MultimapTypeAdapterFactory; -import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.SetTypeAdapterFactory; -import org.jclouds.json.internal.NullHackJsonLiteralAdapter; -import org.jclouds.json.internal.OptionalTypeAdapterFactory; - import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap.Builder; import com.google.common.collect.ImmutableSet; @@ -77,6 +39,43 @@ import com.google.gson.stream.JsonWriter; import com.google.inject.AbstractModule; import com.google.inject.ImplementedBy; import com.google.inject.Provides; +import org.jclouds.date.DateService; +import org.jclouds.domain.JsonBall; +import org.jclouds.json.Json; +import org.jclouds.json.internal.DeserializationConstructorAndReflectiveTypeAdapterFactory; +import org.jclouds.json.internal.EnumTypeAdapterThatReturnsFromValue; +import org.jclouds.json.internal.GsonWrapper; +import org.jclouds.json.internal.NamingStrategies.AnnotationConstructorNamingStrategy; +import org.jclouds.json.internal.NamingStrategies.AnnotationOrNameFieldNamingStrategy; +import org.jclouds.json.internal.NamingStrategies.ExtractNamed; +import org.jclouds.json.internal.NamingStrategies.ExtractSerializedName; +import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.ImmutableMapTypeAdapterFactory; +import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.CollectionTypeAdapterFactory; +import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.FluentIterableTypeAdapterFactory; +import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.ImmutableListTypeAdapterFactory; +import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.ImmutableSetTypeAdapterFactory; +import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.IterableTypeAdapterFactory; +import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.ListTypeAdapterFactory; +import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.MapTypeAdapterFactory; +import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.MultimapTypeAdapterFactory; +import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.SetTypeAdapterFactory; +import org.jclouds.json.internal.NullHackJsonLiteralAdapter; +import org.jclouds.json.internal.OptionalTypeAdapterFactory; + +import javax.inject.Inject; +import javax.inject.Provider; +import javax.inject.Singleton; +import java.beans.ConstructorProperties; +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.Date; +import java.util.Enumeration; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Set; + +import static com.google.common.io.BaseEncoding.base16; /** * Contains logic for parsing objects from Strings. @@ -92,7 +91,7 @@ public class GsonModule extends AbstractModule { MapTypeAdapterFactory map, MultimapTypeAdapterFactory multimap, IterableTypeAdapterFactory iterable, CollectionTypeAdapterFactory collection, ListTypeAdapterFactory list, ImmutableListTypeAdapterFactory immutableList, FluentIterableTypeAdapterFactory fluentIterable, - DefaultExclusionStrategy exclusionStrategy) { + ImmutableMapTypeAdapterFactory immutableMap, DefaultExclusionStrategy exclusionStrategy) { FieldNamingStrategy serializationPolicy = new AnnotationOrNameFieldNamingStrategy(ImmutableSet.of( new ExtractSerializedName(), new ExtractNamed())); @@ -117,6 +116,7 @@ public class GsonModule extends AbstractModule { builder.registerTypeAdapterFactory(map); builder.registerTypeAdapterFactory(multimap); builder.registerTypeAdapterFactory(fluentIterable); + builder.registerTypeAdapterFactory(immutableMap); AnnotationConstructorNamingStrategy deserializationPolicy = new AnnotationConstructorNamingStrategy( ImmutableSet.of(ConstructorProperties.class, Inject.class), ImmutableSet.of(new ExtractNamed())); @@ -151,7 +151,7 @@ public class GsonModule extends AbstractModule { return false; } } - + @ImplementedBy(CDateAdapter.class) public abstract static class DateAdapter extends TypeAdapter<Date> { http://git-wip-us.apache.org/repos/asf/jclouds/blob/231a6067/core/src/main/java/org/jclouds/json/internal/NullFilteringTypeAdapterFactories.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/json/internal/NullFilteringTypeAdapterFactories.java b/core/src/main/java/org/jclouds/json/internal/NullFilteringTypeAdapterFactories.java index 3367450..0479d87 100644 --- a/core/src/main/java/org/jclouds/json/internal/NullFilteringTypeAdapterFactories.java +++ b/core/src/main/java/org/jclouds/json/internal/NullFilteringTypeAdapterFactories.java @@ -16,18 +16,6 @@ */ package org.jclouds.json.internal; -import static com.google.common.base.Objects.equal; -import static com.google.common.base.Objects.toStringHelper; - -import java.io.IOException; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - import com.google.common.base.Objects; import com.google.common.collect.FluentIterable; import com.google.common.collect.ImmutableCollection; @@ -44,6 +32,18 @@ import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; +import java.io.IOException; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import static com.google.common.base.Objects.equal; +import static com.google.common.base.Objects.toStringHelper; + /** * Eliminates null values when deserializing Collections, Maps, and Multimaps * <p/> @@ -150,7 +150,7 @@ public class NullFilteringTypeAdapterFactories { super(Iterable.class); } } - + public static class CollectionTypeAdapterFactory extends ImmutableListTypeAdapterFactory { public CollectionTypeAdapterFactory() { super(Collection.class); @@ -271,6 +271,13 @@ public class NullFilteringTypeAdapterFactories { } } + public static class ImmutableMapTypeAdapterFactory extends MapTypeAdapterFactory { + + public ImmutableMapTypeAdapterFactory() { + super(ImmutableMap.class); + } + } + private static final class MapTypeAdapter<K, V> extends TypeAdapter<Map<K, V>> { protected final TypeAdapter<K> keyAdapter; http://git-wip-us.apache.org/repos/asf/jclouds/blob/231a6067/core/src/test/java/org/jclouds/json/internal/NullFilteringTypeAdapterFactoriesTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/jclouds/json/internal/NullFilteringTypeAdapterFactoriesTest.java b/core/src/test/java/org/jclouds/json/internal/NullFilteringTypeAdapterFactoriesTest.java index 7fcdaab..bf82bc6 100644 --- a/core/src/test/java/org/jclouds/json/internal/NullFilteringTypeAdapterFactoriesTest.java +++ b/core/src/test/java/org/jclouds/json/internal/NullFilteringTypeAdapterFactoriesTest.java @@ -16,15 +16,16 @@ */ package org.jclouds.json.internal; -import static com.google.common.base.Objects.equal; -import static org.testng.Assert.assertEquals; - -import java.lang.reflect.Type; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; - +import com.google.common.base.Objects; +import com.google.common.collect.FluentIterable; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Multimap; +import com.google.common.reflect.TypeToken; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.CollectionTypeAdapterFactory; import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.FluentIterableTypeAdapterFactory; import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.ImmutableListTypeAdapterFactory; @@ -34,18 +35,17 @@ import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.ListTypeAdapt import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.MapTypeAdapterFactory; import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.MultimapTypeAdapterFactory; import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.SetTypeAdapterFactory; +import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.ImmutableMapTypeAdapterFactory; import org.testng.annotations.Test; -import com.google.common.base.Objects; -import com.google.common.collect.FluentIterable; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Multimap; -import com.google.common.reflect.TypeToken; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; +import java.lang.reflect.Type; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static com.google.common.base.Objects.equal; +import static org.testng.Assert.assertEquals; @Test(testName = "NullFilteringTypeAdapterFactoriesTest") public class NullFilteringTypeAdapterFactoriesTest { @@ -227,6 +227,26 @@ public class NullFilteringTypeAdapterFactoriesTest { assertEquals(resources, ImmutableSet.of(new Resource("i-foo", "foo"), new Resource("i-bar", "bar"))); } + private Gson immutableMap = new GsonBuilder().registerTypeAdapterFactory(new ImmutableMapTypeAdapterFactory()).create(); + private Type immutableMapType = new TypeToken<ImmutableMap<String, String>>() { + private static final long serialVersionUID = 1L; + }.getType(); + private Type immutableMapResourceType = new TypeToken<ImmutableMap<String, Resource>>() { + private static final long serialVersionUID = 1L; + }.getType(); + + public void testImmutableMap() { + ImmutableMap<String, String> noNulls = immutableMap.fromJson("{\"value\":\"a test string!\"}", immutableMapType); + assertEquals(noNulls, ImmutableMap.of("value", "a test string!")); + ImmutableMap<String, String> withNull = immutableMap.fromJson("{\"key\":null}", immutableMapType); + assertEquals(withNull, ImmutableMap.of()); + ImmutableMap<String, String> withEmpty = map.fromJson("{\"value\":\"\"}", mapType); + assertEquals(withEmpty, ImmutableMap.of("value", "")); + ImmutableMap<String, Resource> resources = immutableMap.fromJson( + "{\"key1\":{\"id\":\"i-foo\",\"name\":\"foo\"},\"key2\":{\"id\":\"i-bar\",\"name\":\"bar\"}}", immutableMapResourceType); + assertEquals(resources, ImmutableMap.of("key1", new Resource("i-foo", "foo"), "key2", new Resource("i-bar", "bar"))); + } + private Gson map = new GsonBuilder().registerTypeAdapterFactory(new MapTypeAdapterFactory()).create(); private Type mapType = new TypeToken<Map<String, String>>() { private static final long serialVersionUID = 1L;
