Several small deRPC fixes.
- Canonicalization of inner array type names
- Ensuring that primitive return types for service methods cause their boxed counterparts to be rescued since return types are boxed over the wire.
- Re-use an existing local variable.
Patch by: bobv
Review by: amitmanjhi
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@5762 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/rpc/rebind/RpcProxyCreator.java b/user/src/com/google/gwt/rpc/rebind/RpcProxyCreator.java
index 7c01bb7..2467976 100644
--- a/user/src/com/google/gwt/rpc/rebind/RpcProxyCreator.java
+++ b/user/src/com/google/gwt/rpc/rebind/RpcProxyCreator.java
@@ -302,12 +302,20 @@
serializationSto.getSerializableTypes());
Collections.addAll(serializableTypes,
deserializationSto.getSerializableTypes());
+ for (JMethod m : serviceIntf.getOverridableMethods()) {
+ // Pick up any primitive return types, which get sent boxed
+ assert serializableTypes.contains(m.getReturnType())
+ || m.getReturnType().isPrimitive() != null : "Missing non-primitive return type "
+ + m.getReturnType().getQualifiedSourceName();
+ serializableTypes.add(m.getReturnType());
+ }
StringBuilder sb = new StringBuilder("@ArtificialRescue({");
for (JType serializableType : serializableTypes) {
JArrayType serializableArray = serializableType.isArray();
JClassType serializableClass = serializableType.isClass();
+ JPrimitiveType serializablePrimitive = serializableType.isPrimitive();
if (serializableArray != null) {
sb.append("\n@Rescue(className = \"");
if (serializableArray.getLeafType() instanceof JPrimitiveType) {
@@ -319,8 +327,15 @@
sb.append(serializableArray.getQualifiedSourceName());
}
sb.append("\",\n instantiable = true),");
+
} else if (serializableClass != null) {
writeSingleRescue(typeOracle, deserializationSto, sb, serializableClass);
+
+ } else if (serializablePrimitive != null) {
+ JClassType boxedClass = typeOracle.findType(serializablePrimitive.getQualifiedBoxedSourceName());
+ assert boxedClass != null : "No boxed version of "
+ + serializablePrimitive.getQualifiedSourceName();
+ writeSingleRescue(typeOracle, deserializationSto, sb, boxedClass);
}
}
sb.append("})");
diff --git a/user/src/com/google/gwt/rpc/server/WebModeClientOracle.java b/user/src/com/google/gwt/rpc/server/WebModeClientOracle.java
index 42090b8..97e6262 100644
--- a/user/src/com/google/gwt/rpc/server/WebModeClientOracle.java
+++ b/user/src/com/google/gwt/rpc/server/WebModeClientOracle.java
@@ -381,9 +381,15 @@
leafType = leafType.getComponentType();
} while (leafType.isArray());
- if (leafType.getPackage() == null) {
+ Class<?> enclosing = leafType.getEnclosingClass();
+ if (enclosing != null) {
+ // com.foo.Enclosing$Name[]
+ return canonicalName(enclosing) + "$" + clazz.getSimpleName();
+ } else if (leafType.getPackage() == null) {
+ // Name0[
return clazz.getSimpleName();
} else {
+ // com.foo.Name[]
return leafType.getPackage().getName() + "." + clazz.getSimpleName();
}
} else {
diff --git a/user/src/com/google/gwt/rpc/server/WebModePayloadSink.java b/user/src/com/google/gwt/rpc/server/WebModePayloadSink.java
index 924a55b..3edbec8 100644
--- a/user/src/com/google/gwt/rpc/server/WebModePayloadSink.java
+++ b/user/src/com/google/gwt/rpc/server/WebModePayloadSink.java
@@ -555,8 +555,7 @@
* Set the typeIds and queryIds to exact values, or fall back to acting
* like a plain Object[] array.
*/
- int typeId = clientOracle.getTypeId(Array.newInstance(
- x.getComponentType(), 0).getClass());
+ int typeId = clientOracle.getTypeId(targetClass);
if (typeId == 0) {
typeId = clientOracle.getTypeId(Object[].class);
}