aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGert Scholten <gscholt@gmail.com>2009-05-11 16:11:37 +0200
committerGert Scholten <gscholt@gmail.com>2009-05-15 09:13:29 +0200
commit74552d98ab76eba84572946f1e20f8bec8a92d5d (patch)
treee7eb958eb39f75d0491bb5401e028f8fe319122a
parentf0f7d146fdcb303cd3312641517fbef8c65d5c1f (diff)
downloadgwtjsonrpc-74552d98ab76eba84572946f1e20f8bec8a92d5d.tar.gz
Added non-object result value support to methods using HostPageCache
and CallbackHandle Signed-off-by: Gert Scholten <gscholt@gmail.com>
-rw-r--r--src/main/java/com/google/gwtjsonrpc/client/AbstractJsonProxy.java9
-rw-r--r--src/main/java/com/google/gwtjsonrpc/client/CallbackHandle.java14
-rw-r--r--src/main/java/com/google/gwtjsonrpc/client/JsonUtil.java14
-rw-r--r--src/main/java/com/google/gwtjsonrpc/rebind/ProxyCreator.java20
4 files changed, 18 insertions, 39 deletions
diff --git a/src/main/java/com/google/gwtjsonrpc/client/AbstractJsonProxy.java b/src/main/java/com/google/gwtjsonrpc/client/AbstractJsonProxy.java
index a57cf8a..7ddf123 100644
--- a/src/main/java/com/google/gwtjsonrpc/client/AbstractJsonProxy.java
+++ b/src/main/java/com/google/gwtjsonrpc/client/AbstractJsonProxy.java
@@ -14,6 +14,7 @@
package com.google.gwtjsonrpc.client;
+import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.InvocationException;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
@@ -48,9 +49,9 @@ public abstract class AbstractJsonProxy implements ServiceDefTarget {
new JsonCall<T>(this, methodName, reqData, ser, cb).send();
}
- protected static native Object hostPageCacheGetOnce(String name)
- /*-{ var r = $wnd[name];$wnd[name] = null;return r; }-*/;
+ protected static native JavaScriptObject hostPageCacheGetOnce(String name)
+ /*-{ var r = $wnd[name];$wnd[name] = null;return r ? {result: r} : null; }-*/;
- protected static native Object hostPageCacheGetMany(String name)
- /*-{ return $wnd[name]; }-*/;
+ protected static native JavaScriptObject hostPageCacheGetMany(String name)
+ /*-{ return $wnd[name] ? {result : $wnd[name]} : null; }-*/;
}
diff --git a/src/main/java/com/google/gwtjsonrpc/client/CallbackHandle.java b/src/main/java/com/google/gwtjsonrpc/client/CallbackHandle.java
index 5e86998..ff4ff1e 100644
--- a/src/main/java/com/google/gwtjsonrpc/client/CallbackHandle.java
+++ b/src/main/java/com/google/gwtjsonrpc/client/CallbackHandle.java
@@ -14,6 +14,7 @@
package com.google.gwtjsonrpc.client;
+import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.user.client.rpc.AsyncCallback;
/**
@@ -59,7 +60,7 @@ public class CallbackHandle<R> {
return ++callbackId;
}
- private final JsonSerializer<R> serializer;
+ private final ResultDeserializer<R> deserializer;
private final AsyncCallback<R> callback;
private int functionId;
@@ -73,8 +74,9 @@ public class CallbackHandle<R> {
* @param ac the application callback function to supply the result to. Only
* <code>onSuccess</code> will be invoked.
*/
- public CallbackHandle(final JsonSerializer<R> ser, final AsyncCallback<R> ac) {
- serializer = ser;
+ public CallbackHandle(final ResultDeserializer<R> ser,
+ final AsyncCallback<R> ac) {
+ deserializer = ser;
callback = ac;
}
@@ -128,9 +130,9 @@ public class CallbackHandle<R> {
}
}
- final void onResult(final Object result) {
+ final void onResult(final JavaScriptObject rpcResult) {
cancel();
- JsonUtil.invoke(serializer, callback, result);
+ JsonUtil.invoke(deserializer, callback, rpcResult);
}
private static final native void nativeInit()
@@ -141,5 +143,5 @@ public class CallbackHandle<R> {
private static final native void nativeInstall(int funid,
CallbackHandle<?> imp)
- /*-{ $wnd.__gwtjsonrpc_callbackhandle[funid] = function(r) { imp.@com.google.gwtjsonrpc.client.CallbackHandle::onResult(Ljava/lang/Object;)(r); }; }-*/;
+ /*-{ $wnd.__gwtjsonrpc_callbackhandle[funid] = function(r) { imp.@com.google.gwtjsonrpc.client.CallbackHandle::onResult(Ljava/lang/Object;)({result:r}); }; }-*/;
}
diff --git a/src/main/java/com/google/gwtjsonrpc/client/JsonUtil.java b/src/main/java/com/google/gwtjsonrpc/client/JsonUtil.java
index 004cc59..51cb632 100644
--- a/src/main/java/com/google/gwtjsonrpc/client/JsonUtil.java
+++ b/src/main/java/com/google/gwtjsonrpc/client/JsonUtil.java
@@ -91,20 +91,6 @@ public class JsonUtil {
callback.onSuccess(result);
}
- // TODO: remove when the CallbackHandle supports primitive 'return' types?
- // It is not called from anywhere in gwtjsonrpc, but it is a public method
- public static <T> void invoke(final JsonSerializer<T> resultSerializer,
- final AsyncCallback<T> callback, final Object encoded) {
- final T resobj;
- try {
- resobj = encoded != null ? resultSerializer.fromJson(encoded) : null;
- } catch (RuntimeException e) {
- callback.onFailure(new InvocationException("Invalid JSON Response", e));
- return;
- }
- callback.onSuccess(resobj);
- }
-
private JsonUtil() {
}
}
diff --git a/src/main/java/com/google/gwtjsonrpc/rebind/ProxyCreator.java b/src/main/java/com/google/gwtjsonrpc/rebind/ProxyCreator.java
index f5ad548..26d65e0 100644
--- a/src/main/java/com/google/gwtjsonrpc/rebind/ProxyCreator.java
+++ b/src/main/java/com/google/gwtjsonrpc/rebind/ProxyCreator.java
@@ -14,6 +14,7 @@
package com.google.gwtjsonrpc.rebind;
+import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.ext.GeneratorContext;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
@@ -154,16 +155,6 @@ class ProxyCreator {
final TreeLogger branch =
logger.branch(TreeLogger.DEBUG, m.getName() + ", result "
+ resultType.getQualifiedSourceName());
- // For now, extra-check on result deserialisation using CbHandles or HPC
- if (returnsCallbackHandle(m)
- || m.getAnnotation(HostPageCache.class) != null) {
- if (resultType.isArray() != null
- || SerializerCreator.isJsonPrimitive(resultType)
- || SerializerCreator.isBoxedPrimitive(resultType))
- invalid(branch, "GwtJsonRpc does not support (Boxed)Primitives or "
- + "Arrays as result values using a CallbackHandle "
- + "or HostPageCache");
- }
serializerCreator.checkCanSerialize(branch, resultType);
if (resultType.isArray() != null) {
// Arrays need a special deserializer
@@ -202,6 +193,7 @@ class ProxyCreator {
cf = new ClassSourceFileComposerFactory(pkgName, getProxySimpleName());
cf.addImport(AbstractJsonProxy.class.getCanonicalName());
cf.addImport(JsonSerializer.class.getCanonicalName());
+ cf.addImport(JavaScriptObject.class.getCanonicalName());
cf.setSuperclass(AbstractJsonProxy.class.getSimpleName());
cf.addImplementedInterface(svcInf.getErasedType().getQualifiedSourceName());
return cf.createSourceWriter(ctx, pw);
@@ -279,7 +271,6 @@ class ProxyCreator {
w.println(") {");
w.indent();
- // TODO: add support for non-object return values with a CallbackHandle
if (returnsCallbackHandle(method)) {
w.print("return new ");
w.print(CallbackHandle.class.getName());
@@ -287,7 +278,7 @@ class ProxyCreator {
if (SerializerCreator.needsTypeParameter(resultType)) {
w.print(serializerFields[params.length - 1]);
} else {
- serializerCreator.generateSerializerReference(resultType, w);
+ deserializerCreator.generateDeserializerReference(resultType, w);
}
w.print(", " + callback.getName());
w.println(");");
@@ -296,10 +287,9 @@ class ProxyCreator {
return;
}
- // TODO: add support for non-object return values using HostPageCache
if (hpc != null) {
final String objName = nameFactory.createName("cached");
- w.print("final Object " + objName + " = ");
+ w.print("final JavaScriptObject " + objName + " = ");
w.print(AbstractJsonProxy.class.getName());
w.print(".");
w.print(hpc.once() ? "hostPageCacheGetOnce" : "hostPageCacheGetMany");
@@ -311,7 +301,7 @@ class ProxyCreator {
if (SerializerCreator.needsTypeParameter(resultType)) {
w.print(serializerFields[params.length - 1]);
} else {
- serializerCreator.generateSerializerReference(resultType, w);
+ deserializerCreator.generateDeserializerReference(resultType, w);
}
w.print(", " + callback.getName());
w.print(", " + objName);