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;