You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by za...@apache.org on 2014/07/29 19:42:14 UTC

git commit: Adds support for ImmutableMap in jclouds gson

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 <za...@rackspace.com>
Authored: Fri Jul 25 12:53:36 2014 -0500
Committer: Zack Shoylev <za...@rackspace.com>
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;