diff options
author | Gert Scholten <gscholt@gmail.com> | 2009-05-11 16:11:37 +0200 |
---|---|---|
committer | Gert Scholten <gscholt@gmail.com> | 2009-05-15 09:13:29 +0200 |
commit | 74552d98ab76eba84572946f1e20f8bec8a92d5d (patch) | |
tree | e7eb958eb39f75d0491bb5401e028f8fe319122a | |
parent | f0f7d146fdcb303cd3312641517fbef8c65d5c1f (diff) | |
download | gwtjsonrpc-74552d98ab76eba84572946f1e20f8bec8a92d5d.tar.gz |
Added non-object result value support to methods using HostPageCache
and CallbackHandle
Signed-off-by: Gert Scholten <gscholt@gmail.com>
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); |