diff options
author | Shawn O. Pearce <sop@google.com> | 2009-05-15 09:40:23 -0700 |
---|---|---|
committer | Shawn O. Pearce <sop@google.com> | 2009-05-15 09:40:23 -0700 |
commit | 02ed182d3a81e768ca23f8cecfdd4a8fbfa30dec (patch) | |
tree | 6a4e0cffcc69e5936c7471cdb9f6d5c9a1f61e23 | |
parent | 74552d98ab76eba84572946f1e20f8bec8a92d5d (diff) | |
download | gwtjsonrpc-02ed182d3a81e768ca23f8cecfdd4a8fbfa30dec.tar.gz |
Fix result types for List<T>, Set<T>, Map<K,V>
Parameterized result types are stored as instance members in the
proxy, and thus must be held in a field of type ResultDeserializer<R>
and not a JsonSerializer<R>.
Also add support for ResultDeserializer to the various basic Java
collection types we support.
Signed-off-by: Shawn O. Pearce <sop@google.com>
5 files changed, 34 insertions, 5 deletions
diff --git a/src/main/java/com/google/gwtjsonrpc/client/ListSerializer.java b/src/main/java/com/google/gwtjsonrpc/client/ListSerializer.java index f0e0cfa..61a69e5 100644 --- a/src/main/java/com/google/gwtjsonrpc/client/ListSerializer.java +++ b/src/main/java/com/google/gwtjsonrpc/client/ListSerializer.java @@ -24,7 +24,8 @@ import java.util.ArrayList; * When deserialized from JSON the List implementation is always an * {@link ArrayList}. When serializing to JSON any List is permitted. */ -public class ListSerializer<T> extends JsonSerializer<java.util.List<T>> { +public class ListSerializer<T> extends JsonSerializer<java.util.List<T>> + implements ResultDeserializer<java.util.List<T>> { private final JsonSerializer<T> serializer; public ListSerializer(final JsonSerializer<T> s) { @@ -65,6 +66,12 @@ public class ListSerializer<T> extends JsonSerializer<java.util.List<T>> { return r; } + @Override + public java.util.List<T> fromResult(final JavaScriptObject response) { + final JavaScriptObject result = ObjectSerializer.objectResult(response); + return result == null ? null : fromJson(result); + } + private static final native int size(JavaScriptObject o)/*-{ return o.length; }-*/; private static final native Object get(JavaScriptObject o, int i)/*-{ return o[i]; }-*/; diff --git a/src/main/java/com/google/gwtjsonrpc/client/ObjectMapSerializer.java b/src/main/java/com/google/gwtjsonrpc/client/ObjectMapSerializer.java index 6ee6502..f18f321 100644 --- a/src/main/java/com/google/gwtjsonrpc/client/ObjectMapSerializer.java +++ b/src/main/java/com/google/gwtjsonrpc/client/ObjectMapSerializer.java @@ -30,7 +30,8 @@ import java.util.Map; * {@link HashMap}. When serializing to JSON any Map is permitted. */ public class ObjectMapSerializer<K, V> extends - JsonSerializer<java.util.Map<K, V>> { + JsonSerializer<java.util.Map<K, V>> implements + ResultDeserializer<java.util.Map<K, V>> { private final JsonSerializer<K> keySerializer; private final JsonSerializer<V> valueSerializer; @@ -82,6 +83,12 @@ public class ObjectMapSerializer<K, V> extends return r; } + @Override + public java.util.Map<K, V> fromResult(final JavaScriptObject response) { + final JavaScriptObject result = ObjectSerializer.objectResult(response); + return result == null ? null : fromJson(result); + } + private static final native int size(JavaScriptObject o)/*-{ return o.length; }-*/; private static final native Object get(JavaScriptObject o, int i)/*-{ return o[i]; }-*/; diff --git a/src/main/java/com/google/gwtjsonrpc/client/SetSerializer.java b/src/main/java/com/google/gwtjsonrpc/client/SetSerializer.java index c10e6aa..d016e83 100644 --- a/src/main/java/com/google/gwtjsonrpc/client/SetSerializer.java +++ b/src/main/java/com/google/gwtjsonrpc/client/SetSerializer.java @@ -24,7 +24,8 @@ import java.util.HashSet; * When deserialized from JSON the Set implementation is always a * {@link HashSet}. When serializing to JSON any Set is permitted. */ -public class SetSerializer<T> extends JsonSerializer<java.util.Set<T>> { +public class SetSerializer<T> extends JsonSerializer<java.util.Set<T>> + implements ResultDeserializer<java.util.Set<T>> { private final JsonSerializer<T> serializer; public SetSerializer(final JsonSerializer<T> s) { @@ -65,6 +66,12 @@ public class SetSerializer<T> extends JsonSerializer<java.util.Set<T>> { return r; } + @Override + public java.util.Set<T> fromResult(final JavaScriptObject response) { + final JavaScriptObject result = ObjectSerializer.objectResult(response); + return result == null ? null : fromJson(result); + } + private static final native int size(JavaScriptObject o)/*-{ return o.length; }-*/; private static final native Object get(JavaScriptObject o, int i)/*-{ return o[i]; }-*/; diff --git a/src/main/java/com/google/gwtjsonrpc/client/StringMapSerializer.java b/src/main/java/com/google/gwtjsonrpc/client/StringMapSerializer.java index f854a73..82f497c 100644 --- a/src/main/java/com/google/gwtjsonrpc/client/StringMapSerializer.java +++ b/src/main/java/com/google/gwtjsonrpc/client/StringMapSerializer.java @@ -29,7 +29,8 @@ import java.util.Map; * {@link HashMap}. When serializing to JSON any Map is permitted. */ public class StringMapSerializer<V> extends - JsonSerializer<java.util.Map<String, V>> { + JsonSerializer<java.util.Map<String, V>> implements + ResultDeserializer<java.util.Map<String, V>> { private final JsonSerializer<V> valueSerializer; public StringMapSerializer(final JsonSerializer<V> v) { @@ -74,6 +75,12 @@ public class StringMapSerializer<V> extends return r; } + @Override + public java.util.Map<String, V> fromResult(final JavaScriptObject response) { + final JavaScriptObject result = ObjectSerializer.objectResult(response); + return result == null ? null : fromJson(result); + } + private native void copy(Map<String, V> r, JavaScriptObject jsObject) /*-{ for (var key in jsObject) { this.@com.google.gwtjsonrpc.client.StringMapSerializer::copyOne(Ljava/util/Map;Ljava/lang/String;Ljava/lang/Object;)(r, key, jsObject[key]); diff --git a/src/main/java/com/google/gwtjsonrpc/rebind/ProxyCreator.java b/src/main/java/com/google/gwtjsonrpc/rebind/ProxyCreator.java index 26d65e0..404372e 100644 --- a/src/main/java/com/google/gwtjsonrpc/rebind/ProxyCreator.java +++ b/src/main/java/com/google/gwtjsonrpc/rebind/ProxyCreator.java @@ -36,6 +36,7 @@ import com.google.gwtjsonrpc.client.CallbackHandle; import com.google.gwtjsonrpc.client.HostPageCache; import com.google.gwtjsonrpc.client.JsonSerializer; import com.google.gwtjsonrpc.client.JsonUtil; +import com.google.gwtjsonrpc.client.ResultDeserializer; import java.io.PrintWriter; import java.util.HashSet; @@ -236,7 +237,7 @@ class ProxyCreator { if (resultType.isParameterized() != null) { serializerFields[params.length - 1] = "serializer_" + instanceField++; w.print("private static final "); - w.print(JsonSerializer.class.getName()); + w.print(ResultDeserializer.class.getName()); w.print(" "); w.print(serializerFields[params.length - 1]); w.print(" = "); |