diff --git a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/config/CloudStackParserModule.java b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/config/CloudStackParserModule.java index a8126db3af..39f4dd562d 100644 --- a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/config/CloudStackParserModule.java +++ b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/config/CloudStackParserModule.java @@ -26,6 +26,7 @@ import javax.inject.Inject; import org.jclouds.date.DateService; import org.jclouds.json.config.GsonModule.DateAdapter; import org.jclouds.json.config.GsonModule.Iso8601DateAdapter; +import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.IterableTypeAdapter; import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.IterableTypeAdapterFactory; import com.google.common.base.Splitter; @@ -84,10 +85,10 @@ public class CloudStackParserModule extends AbstractModule { public static final class Adapter extends TypeAdapter> { - private final IterableTypeAdapterFactory.IterableTypeAdapter delegate; + private final IterableTypeAdapter delegate; public Adapter(TypeAdapter elementAdapter) { - this.delegate = new IterableTypeAdapterFactory.IterableTypeAdapter(elementAdapter); + this.delegate = new IterableTypeAdapter(elementAdapter); nullSafe(); } diff --git a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneParserModule.java b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneParserModule.java index 70e6616b02..5658bdc595 100644 --- a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneParserModule.java +++ b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneParserModule.java @@ -25,6 +25,7 @@ import java.util.Set; import org.jclouds.json.config.GsonModule; import org.jclouds.json.config.GsonModule.DateAdapter; +import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.SetTypeAdapter; import org.jclouds.json.internal.NullFilteringTypeAdapterFactories.SetTypeAdapterFactory; import com.google.common.base.Objects; @@ -63,10 +64,10 @@ public class KeystoneParserModule extends AbstractModule { public static final class Adapter extends TypeAdapter> { - private final SetTypeAdapterFactory.SetTypeAdapter delegate; + private final SetTypeAdapter delegate; public Adapter(TypeAdapter elementAdapter) { - this.delegate = new SetTypeAdapterFactory.SetTypeAdapter(elementAdapter); + this.delegate = new SetTypeAdapter(elementAdapter); nullSafe(); } 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 c2f09cea41..1d340cb5cd 100644 --- a/core/src/main/java/org/jclouds/json/config/GsonModule.java +++ b/core/src/main/java/org/jclouds/json/config/GsonModule.java @@ -46,7 +46,10 @@ 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; @@ -88,9 +91,10 @@ public class GsonModule extends AbstractModule { @Singleton Gson provideGson(TypeAdapter jsonAdapter, DateAdapter adapter, ByteListAdapter byteListAdapter, ByteArrayAdapter byteArrayAdapter, PropertiesAdapter propertiesAdapter, JsonAdapterBindings bindings, - OptionalTypeAdapterFactory optional, SetTypeAdapterFactory set, MapTypeAdapterFactory map, - MultimapTypeAdapterFactory multimap, IterableTypeAdapterFactory iterable, - CollectionTypeAdapterFactory collection, FluentIterableTypeAdapterFactory fluentIterable, + OptionalTypeAdapterFactory optional, SetTypeAdapterFactory set, ImmutableSetTypeAdapterFactory immutableSet, + MapTypeAdapterFactory map, MultimapTypeAdapterFactory multimap, IterableTypeAdapterFactory iterable, + CollectionTypeAdapterFactory collection, ListTypeAdapterFactory list, + ImmutableListTypeAdapterFactory immutableList, FluentIterableTypeAdapterFactory fluentIterable, DefaultExclusionStrategy exclusionStrategy) { FieldNamingStrategy serializationPolicy = new AnnotationOrNameFieldNamingStrategy(ImmutableSet.of( @@ -109,7 +113,10 @@ public class GsonModule extends AbstractModule { builder.registerTypeAdapterFactory(optional); builder.registerTypeAdapterFactory(iterable); builder.registerTypeAdapterFactory(collection); + builder.registerTypeAdapterFactory(list); + builder.registerTypeAdapterFactory(immutableList); builder.registerTypeAdapterFactory(set); + builder.registerTypeAdapterFactory(immutableSet); builder.registerTypeAdapterFactory(map); builder.registerTypeAdapterFactory(multimap); builder.registerTypeAdapterFactory(fluentIterable); 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 1f2c6ab296..dfd808e0b8 100644 --- a/core/src/main/java/org/jclouds/json/internal/NullFilteringTypeAdapterFactories.java +++ b/core/src/main/java/org/jclouds/json/internal/NullFilteringTypeAdapterFactories.java @@ -25,6 +25,7 @@ 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; @@ -61,15 +62,73 @@ public class NullFilteringTypeAdapterFactories { param)); } - public static class IterableTypeAdapterFactory implements TypeAdapterFactory { + public static final class IterableTypeAdapter extends TypeAdapter> { + + private final TypeAdapter elementAdapter; + + public IterableTypeAdapter(TypeAdapter elementAdapter) { + this.elementAdapter = elementAdapter; + nullSafe(); + } + + public void write(JsonWriter out, Iterable value) throws IOException { + if (value == null) { + out.nullValue(); + return; + } + out.beginArray(); + for (E element : value) + elementAdapter.write(out, element); + out.endArray(); + } + + public Iterable read(JsonReader in) throws IOException { + return readAndBuild(in, ImmutableList. builder()); + } + + @SuppressWarnings("unchecked") + protected , B extends ImmutableCollection.Builder> C readAndBuild(JsonReader in, + B builder) throws IOException { + in.beginArray(); + while (in.hasNext()) { + E element = elementAdapter.read(in); + if (element != null) + builder.add(element); + } + in.endArray(); + return (C) builder.build(); + } + + @Override + public int hashCode() { + return elementAdapter.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + IterableTypeAdapter that = IterableTypeAdapter.class.cast(obj); + return equal(this.elementAdapter, that.elementAdapter); + } + + @Override + public String toString() { + return toStringHelper(this).add("elementAdapter", elementAdapter).toString(); + } + } + + public static class ImmutableListTypeAdapterFactory implements TypeAdapterFactory { protected final Class declaring; - public IterableTypeAdapterFactory() { - this(Iterable.class); + public ImmutableListTypeAdapterFactory() { + this(ImmutableList.class); } - protected IterableTypeAdapterFactory(Class declaring) { + protected ImmutableListTypeAdapterFactory(Class declaring) { this.declaring = declaring; } @@ -88,164 +147,124 @@ public class NullFilteringTypeAdapterFactories { return (TypeAdapter) new IterableTypeAdapter(elementAdapter); } - public static final class IterableTypeAdapter extends TypeAdapter> { - - private final TypeAdapter elementAdapter; - - public IterableTypeAdapter(TypeAdapter elementAdapter) { - this.elementAdapter = elementAdapter; - nullSafe(); - } - - public void write(JsonWriter out, Iterable value) throws IOException { - if (value == null) { - out.nullValue(); - return; - } - out.beginArray(); - for (E element : value) - elementAdapter.write(out, element); - out.endArray(); - } - - public Iterable read(JsonReader in) throws IOException { - return readAndBuild(in, ImmutableList. builder()); - } - - @SuppressWarnings("unchecked") - protected , B extends ImmutableCollection.Builder> C readAndBuild(JsonReader in, - B builder) throws IOException { - in.beginArray(); - while (in.hasNext()) { - E element = elementAdapter.read(in); - if (element != null) - builder.add(element); - } - in.endArray(); - return (C) builder.build(); - } - - @Override - public int hashCode() { - return elementAdapter.hashCode(); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null || getClass() != obj.getClass()) - return false; - IterableTypeAdapter that = IterableTypeAdapter.class.cast(obj); - return equal(this.elementAdapter, that.elementAdapter); - } - - @Override - public String toString() { - return toStringHelper(this).add("elementAdapter", elementAdapter).toString(); - } - } } - public static class CollectionTypeAdapterFactory extends IterableTypeAdapterFactory { + public static class IterableTypeAdapterFactory extends ImmutableListTypeAdapterFactory { + public IterableTypeAdapterFactory() { + super(Iterable.class); + } + } + + public static class CollectionTypeAdapterFactory extends ImmutableListTypeAdapterFactory { public CollectionTypeAdapterFactory() { super(Collection.class); } + } - @SuppressWarnings("unchecked") - protected TypeAdapter newAdapter(TypeAdapter elementAdapter) { - return (TypeAdapter) new CollectionTypeAdapter(elementAdapter); - } - - public static final class CollectionTypeAdapter extends TypeAdapter> { - - private final IterableTypeAdapterFactory.IterableTypeAdapter delegate; - - public CollectionTypeAdapter(TypeAdapter elementAdapter) { - this.delegate = new IterableTypeAdapterFactory.IterableTypeAdapter(elementAdapter); - nullSafe(); - } - - public void write(JsonWriter out, Collection value) throws IOException { - this.delegate.write(out, value); - } - - public Collection read(JsonReader in) throws IOException { - return delegate.readAndBuild(in, ImmutableList. builder()); - } - - @Override - public int hashCode() { - return delegate.hashCode(); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null || getClass() != obj.getClass()) - return false; - CollectionTypeAdapter that = CollectionTypeAdapter.class.cast(obj); - return equal(this.delegate, that.delegate); - } - - @Override - public String toString() { - return toStringHelper(this).add("elementAdapter", delegate.elementAdapter).toString(); - } + public static class ListTypeAdapterFactory extends ImmutableListTypeAdapterFactory { + public ListTypeAdapterFactory() { + super(List.class); } } - public static class SetTypeAdapterFactory extends IterableTypeAdapterFactory { - public SetTypeAdapterFactory() { - super(Set.class); + public static final class SetTypeAdapter extends TypeAdapter> { + + private final IterableTypeAdapter delegate; + + public SetTypeAdapter(TypeAdapter elementAdapter) { + this.delegate = new IterableTypeAdapter(elementAdapter); + nullSafe(); + } + + public void write(JsonWriter out, Set value) throws IOException { + this.delegate.write(out, value); + } + + public Set read(JsonReader in) throws IOException { + return delegate.readAndBuild(in, ImmutableSet. builder()); + } + + @Override + public int hashCode() { + return delegate.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + SetTypeAdapter that = SetTypeAdapter.class.cast(obj); + return equal(this.delegate, that.delegate); + } + + @Override + public String toString() { + return toStringHelper(this).add("elementAdapter", delegate.elementAdapter).toString(); + } + } + + public static class ImmutableSetTypeAdapterFactory extends ImmutableListTypeAdapterFactory { + public ImmutableSetTypeAdapterFactory() { + this(ImmutableSet.class); + } + + protected ImmutableSetTypeAdapterFactory(Class declaring) { + super(declaring); } @SuppressWarnings("unchecked") protected TypeAdapter newAdapter(TypeAdapter elementAdapter) { return (TypeAdapter) new SetTypeAdapter(elementAdapter); } + } - public static final class SetTypeAdapter extends TypeAdapter> { - - private final IterableTypeAdapterFactory.IterableTypeAdapter delegate; - - public SetTypeAdapter(TypeAdapter elementAdapter) { - this.delegate = new IterableTypeAdapterFactory.IterableTypeAdapter(elementAdapter); - nullSafe(); - } - - public void write(JsonWriter out, Set value) throws IOException { - this.delegate.write(out, value); - } - - public Set read(JsonReader in) throws IOException { - return delegate.readAndBuild(in, ImmutableSet. builder()); - } - - @Override - public int hashCode() { - return delegate.hashCode(); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null || getClass() != obj.getClass()) - return false; - SetTypeAdapter that = SetTypeAdapter.class.cast(obj); - return equal(this.delegate, that.delegate); - } - - @Override - public String toString() { - return toStringHelper(this).add("elementAdapter", delegate.elementAdapter).toString(); - } + public static class SetTypeAdapterFactory extends ImmutableSetTypeAdapterFactory { + public SetTypeAdapterFactory() { + super(Set.class); } } - public static class FluentIterableTypeAdapterFactory extends IterableTypeAdapterFactory { + private static final class FluentIterableTypeAdapter extends TypeAdapter> { + + private final IterableTypeAdapter delegate; + + public FluentIterableTypeAdapter(TypeAdapter elementAdapter) { + this.delegate = new IterableTypeAdapter(elementAdapter); + nullSafe(); + } + + public void write(JsonWriter out, FluentIterable value) throws IOException { + this.delegate.write(out, value.toList()); + } + + public FluentIterable read(JsonReader in) throws IOException { + return FluentIterable.from(delegate.read(in)); + } + + @Override + public int hashCode() { + return delegate.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + FluentIterableTypeAdapter that = FluentIterableTypeAdapter.class.cast(obj); + return equal(this.delegate, that.delegate); + } + + @Override + public String toString() { + return toStringHelper(this).add("elementAdapter", delegate.elementAdapter).toString(); + } + } + + public static class FluentIterableTypeAdapterFactory extends ImmutableListTypeAdapterFactory { public FluentIterableTypeAdapterFactory() { super(FluentIterable.class); } @@ -254,43 +273,64 @@ public class NullFilteringTypeAdapterFactories { protected TypeAdapter newAdapter(TypeAdapter elementAdapter) { return (TypeAdapter) new FluentIterableTypeAdapter(elementAdapter); } + } - public static final class FluentIterableTypeAdapter extends TypeAdapter> { + private static final class MapTypeAdapter extends TypeAdapter> { - private final IterableTypeAdapterFactory.IterableTypeAdapter delegate; + protected final TypeAdapter keyAdapter; + protected final TypeAdapter valueAdapter; - public FluentIterableTypeAdapter(TypeAdapter elementAdapter) { - this.delegate = new IterableTypeAdapterFactory.IterableTypeAdapter(elementAdapter); - nullSafe(); + protected MapTypeAdapter(TypeAdapter keyAdapter, TypeAdapter valueAdapter) { + this.keyAdapter = keyAdapter; + this.valueAdapter = valueAdapter; + nullSafe(); + } + + public void write(JsonWriter out, Map value) throws IOException { + if (value == null) { + out.nullValue(); + return; } - - public void write(JsonWriter out, FluentIterable value) throws IOException { - this.delegate.write(out, value.toList()); + out.beginObject(); + for (Map.Entry element : value.entrySet()) { + out.name(String.valueOf(element.getKey())); + valueAdapter.write(out, element.getValue()); } + out.endObject(); + } - public FluentIterable read(JsonReader in) throws IOException { - return FluentIterable.from(delegate.read(in)); + public Map read(JsonReader in) throws IOException { + ImmutableMap.Builder result = ImmutableMap.builder(); + in.beginObject(); + while (in.hasNext()) { + JsonReaderInternalAccess.INSTANCE.promoteNameToValue(in); + K name = keyAdapter.read(in); + V value = valueAdapter.read(in); + if (value != null) + result.put(name, value); } + in.endObject(); + return result.build(); + } - @Override - public int hashCode() { - return delegate.hashCode(); - } + @Override + public int hashCode() { + return Objects.hashCode(keyAdapter, valueAdapter); + } - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null || getClass() != obj.getClass()) - return false; - FluentIterableTypeAdapter that = FluentIterableTypeAdapter.class.cast(obj); - return equal(this.delegate, that.delegate); - } + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + MapTypeAdapter that = MapTypeAdapter.class.cast(obj); + return equal(this.keyAdapter, that.keyAdapter) && equal(this.valueAdapter, that.valueAdapter); + } - @Override - public String toString() { - return toStringHelper(this).add("elementAdapter", delegate.elementAdapter).toString(); - } + @Override + public String toString() { + return toStringHelper(this).add("keyAdapter", keyAdapter).add("valueAdapter", valueAdapter).toString(); } } @@ -321,64 +361,49 @@ public class NullFilteringTypeAdapterFactories { protected TypeAdapter newAdapter(TypeAdapter keyAdapter, TypeAdapter valueAdapter) { return (TypeAdapter) new MapTypeAdapter(keyAdapter, valueAdapter); } + } - public static final class MapTypeAdapter extends TypeAdapter> { + private static final class MultimapTypeAdapter extends TypeAdapter> { - protected final TypeAdapter keyAdapter; - protected final TypeAdapter valueAdapter; + private final MapTypeAdapter> delegate; - protected MapTypeAdapter(TypeAdapter keyAdapter, TypeAdapter valueAdapter) { - this.keyAdapter = keyAdapter; - this.valueAdapter = valueAdapter; - nullSafe(); - } + public MultimapTypeAdapter(TypeAdapter keyAdapter, TypeAdapter valueAdapter) { + this.delegate = new MapTypeAdapter>(keyAdapter, + new IterableTypeAdapter(valueAdapter)); + nullSafe(); + } - public void write(JsonWriter out, Map value) throws IOException { - if (value == null) { - out.nullValue(); - return; - } - out.beginObject(); - for (Map.Entry element : value.entrySet()) { - out.name(String.valueOf(element.getKey())); - valueAdapter.write(out, element.getValue()); - } - out.endObject(); - } + @SuppressWarnings("unchecked") + public void write(JsonWriter out, Multimap value) throws IOException { + this.delegate.write(out, Map.class.cast(value.asMap())); + } - public Map read(JsonReader in) throws IOException { - ImmutableMap.Builder result = ImmutableMap.builder(); - in.beginObject(); - while (in.hasNext()) { - JsonReaderInternalAccess.INSTANCE.promoteNameToValue(in); - K name = keyAdapter.read(in); - V value = valueAdapter.read(in); - if (value != null) - result.put(name, value); - } - in.endObject(); - return result.build(); - } + public Multimap read(JsonReader in) throws IOException { + ImmutableMultimap.Builder builder = ImmutableMultimap. builder(); + for (Entry> entry : delegate.read(in).entrySet()) + builder.putAll(entry.getKey(), entry.getValue()); + return builder.build(); + } - @Override - public int hashCode() { - return Objects.hashCode(keyAdapter, valueAdapter); - } + @Override + public int hashCode() { + return delegate.hashCode(); + } - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null || getClass() != obj.getClass()) - return false; - MapTypeAdapter that = MapTypeAdapter.class.cast(obj); - return equal(this.keyAdapter, that.keyAdapter) && equal(this.valueAdapter, that.valueAdapter); - } + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + MultimapTypeAdapter that = MultimapTypeAdapter.class.cast(obj); + return equal(this.delegate, that.delegate); + } - @Override - public String toString() { - return toStringHelper(this).add("keyAdapter", keyAdapter).add("valueAdapter", valueAdapter).toString(); - } + @Override + public String toString() { + return toStringHelper(this).add("keyAdapter", delegate.keyAdapter) + .add("valueAdapter", delegate.valueAdapter).toString(); } } @@ -394,47 +419,5 @@ public class NullFilteringTypeAdapterFactories { return (TypeAdapter) new MultimapTypeAdapter(keyAdapter, valueAdapter); } - public static final class MultimapTypeAdapter extends TypeAdapter> { - - private final MapTypeAdapterFactory.MapTypeAdapter> delegate; - - public MultimapTypeAdapter(TypeAdapter keyAdapter, TypeAdapter valueAdapter) { - this.delegate = new MapTypeAdapterFactory.MapTypeAdapter>(keyAdapter, - new CollectionTypeAdapterFactory.CollectionTypeAdapter(valueAdapter)); - nullSafe(); - } - - public void write(JsonWriter out, Multimap value) throws IOException { - this.delegate.write(out, value.asMap()); - } - - public Multimap read(JsonReader in) throws IOException { - ImmutableMultimap.Builder builder = ImmutableMultimap. builder(); - for (Entry> entry : delegate.read(in).entrySet()) - builder.putAll(entry.getKey(), entry.getValue()); - return builder.build(); - } - - @Override - public int hashCode() { - return delegate.hashCode(); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null || getClass() != obj.getClass()) - return false; - MultimapTypeAdapter that = MultimapTypeAdapter.class.cast(obj); - return equal(this.delegate, that.delegate); - } - - @Override - public String toString() { - return toStringHelper(this).add("keyAdapter", delegate.keyAdapter) - .add("valueAdapter", delegate.valueAdapter).toString(); - } - } } } 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 33def24290..f66fbee2f9 100644 --- a/core/src/test/java/org/jclouds/json/internal/NullFilteringTypeAdapterFactoriesTest.java +++ b/core/src/test/java/org/jclouds/json/internal/NullFilteringTypeAdapterFactoriesTest.java @@ -23,12 +23,16 @@ 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 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; @@ -149,6 +153,46 @@ public class NullFilteringTypeAdapterFactoriesTest { ImmutableList.of(new Resource("i-foo", "foo"), new Resource("i-bar", "bar"))); } + private Gson list = new GsonBuilder().registerTypeAdapterFactory(new ListTypeAdapterFactory()).create(); + private Type listType = new TypeToken>() { + private static final long serialVersionUID = 1L; + }.getType(); + private Type listResourceType = new TypeToken>() { + private static final long serialVersionUID = 1L; + }.getType(); + + public void testList() { + Iterable noNulls = list.fromJson("[\"value\",\"a test string!\"]", listType); + assertEquals(noNulls, ImmutableList.of("value", "a test string!")); + Iterable withNull = list.fromJson("[null,\"a test string!\"]", listType); + assertEquals(withNull, ImmutableList.of("a test string!")); + Iterable withDupes = list.fromJson("[\"value\",\"value\"]", listType); + assertEquals(withDupes, ImmutableList.of("value", "value")); + Iterable resources = list.fromJson( + "[{\"id\":\"i-foo\",\"name\":\"foo\"},{\"id\":\"i-bar\",\"name\":\"bar\"}]", listResourceType); + assertEquals(resources, ImmutableList.of(new Resource("i-foo", "foo"), new Resource("i-bar", "bar"))); + } + + private Gson immutableList = new GsonBuilder().registerTypeAdapterFactory(new ImmutableListTypeAdapterFactory()).create(); + private Type immutableListType = new TypeToken>() { + private static final long serialVersionUID = 1L; + }.getType(); + private Type immutableListResourceType = new TypeToken>() { + private static final long serialVersionUID = 1L; + }.getType(); + + public void testImmutableList() { + Iterable noNulls = immutableList.fromJson("[\"value\",\"a test string!\"]", immutableListType); + assertEquals(noNulls, ImmutableList.of("value", "a test string!")); + Iterable withNull = immutableList.fromJson("[null,\"a test string!\"]", immutableListType); + assertEquals(withNull, ImmutableList.of("a test string!")); + Iterable withDupes = immutableList.fromJson("[\"value\",\"value\"]", immutableListType); + assertEquals(withDupes, ImmutableList.of("value", "value")); + Iterable resources = immutableList.fromJson( + "[{\"id\":\"i-foo\",\"name\":\"foo\"},{\"id\":\"i-bar\",\"name\":\"bar\"}]", immutableListResourceType); + assertEquals(resources, ImmutableList.of(new Resource("i-foo", "foo"), new Resource("i-bar", "bar"))); + } + private Gson set = new GsonBuilder().registerTypeAdapterFactory(new SetTypeAdapterFactory()).create(); private Type setType = new TypeToken>() { private static final long serialVersionUID = 1L; @@ -169,6 +213,26 @@ public class NullFilteringTypeAdapterFactoriesTest { assertEquals(resources, ImmutableSet.of(new Resource("i-foo", "foo"), new Resource("i-bar", "bar"))); } + private Gson immutableSet = new GsonBuilder().registerTypeAdapterFactory(new ImmutableSetTypeAdapterFactory()).create(); + private Type immutableSetType = new TypeToken>() { + private static final long serialVersionUID = 1L; + }.getType(); + private Type immutableSetResourceType = new TypeToken>() { + private static final long serialVersionUID = 1L; + }.getType(); + + public void testImmutableSet() { + Iterable noNulls = immutableSet.fromJson("[\"value\",\"a test string!\"]", immutableSetType); + assertEquals(noNulls, ImmutableSet.of("value", "a test string!")); + Iterable withNull = immutableSet.fromJson("[null,\"a test string!\"]", immutableSetType); + assertEquals(withNull, ImmutableSet.of("a test string!")); + Iterable withDupes = immutableSet.fromJson("[\"value\",\"value\"]", immutableSetType); + assertEquals(withDupes, ImmutableSet.of("value", "value")); + Iterable resources = immutableSet.fromJson( + "[{\"id\":\"i-foo\",\"name\":\"foo\"},{\"id\":\"i-bar\",\"name\":\"bar\"}]", immutableSetResourceType); + assertEquals(resources, ImmutableSet.of(new Resource("i-foo", "foo"), new Resource("i-bar", "bar"))); + } + private Gson map = new GsonBuilder().registerTypeAdapterFactory(new MapTypeAdapterFactory()).create(); private Type mapType = new TypeToken>() { private static final long serialVersionUID = 1L;