Revision: 10071
Author: gwt.mirror...@gmail.com
Date: Tue Apr 26 10:46:07 2011
Log: Introducing ServiceHelper, a inner class of RemoteServiceProxy
that
makes ProxyCreator generates less code.
Review at http://gwt-code-reviews.appspot.com/1423808
Review by: robertvaw...@google.com
http://code.google.com/p/google-web-toolkit/source/detail?r=10071
Modified:
/trunk/user/src/com/google/gwt/user/client/rpc/impl/RemoteServiceProxy.java
/trunk/user/src/com/google/gwt/user/rebind/rpc/ProxyCreator.java
=======================================
---
/trunk/user/src/com/google/gwt/user/client/rpc/impl/RemoteServiceProxy.java
Mon Mar 21 12:22:19 2011
+++
/trunk/user/src/com/google/gwt/user/client/rpc/impl/RemoteServiceProxy.java
Tue Apr 26 10:46:07 2011
@@ -46,6 +46,63 @@
* The content type to be used in HTTP requests.
*/
private static final String RPC_CONTENT_TYPE = "text/x-gwt-rpc;
charset=utf-8";
+
+ /**
+ * A helper class that prepares the service to serialize data.
+ */
+ public class ServiceHelper {
+
+ private final String fullServiceName;
+ private final String methodName;
+ private final RpcStatsContext statsContext;
+ private SerializationStreamWriter streamWriter;
+
+ public ServiceHelper(String serviceName, String methodName) {
+ this.fullServiceName = serviceName + "." + methodName;
+ this.methodName = methodName;
+ this.statsContext = new RpcStatsContext();
+ }
+
+ /**
+ * Finishes the serialization.
+ */
+ public Request finish(AsyncCallback callback, ResponseReader
responseHeader)
+ throws SerializationException {
+ String payload = streamWriter.toString();
+ boolean toss = statsContext.isStatsAvailable()
+ &&
statsContext.stats(statsContext.timeStat(fullServiceName, "requestSerialized"));
+ return doInvoke(responseHeader, fullServiceName, statsContext,
payload, callback);
+ }
+
+ /**
+ * Finishes the serialization and return a RequestBuilder.
+ */
+ public RequestBuilder finishForRequestBuilder(AsyncCallback callback,
+ ResponseReader responseHeader) throws SerializationException {
+ String payload = streamWriter.toString();
+ boolean toss = statsContext.isStatsAvailable()
+ &&
statsContext.stats(statsContext.timeStat(fullServiceName, "requestSerialized"));
+ return doPrepareRequestBuilder(
+ responseHeader, fullServiceName, statsContext, payload,
callback);
+ }
+
+ /**
+ * Starts the serialization.
+ */
+ public SerializationStreamWriter start(String
remoteServiceInterfaceName,
+ int paramCount) throws SerializationException {
+ boolean toss = statsContext.isStatsAvailable()
+ &&
statsContext.stats(statsContext.timeStat(fullServiceName, "begin"));
+ streamWriter = createStreamWriter();
+ if (getRpcToken() != null) {
+ streamWriter.writeObject(getRpcToken());
+ }
+ streamWriter.writeString(remoteServiceInterfaceName);
+ streamWriter.writeString(methodName);
+ streamWriter.writeInt(paramCount);
+ return streamWriter;
+ }
+ }
/**
* @deprecated use {@link RpcStatsContext}.
=======================================
--- /trunk/user/src/com/google/gwt/user/rebind/rpc/ProxyCreator.java Tue
Feb 8 05:06:33 2011
+++ /trunk/user/src/com/google/gwt/user/rebind/rpc/ProxyCreator.java Tue
Apr 26 10:46:07 2011
@@ -284,7 +284,7 @@
// Determine the set of serializable types
Event event =
SpeedTracerLogger.start(CompilerEventType.GENERATOR_RPC_STOB);
-
+
SerializableTypeOracleBuilder typesSentFromBrowserBuilder = new
SerializableTypeOracleBuilder(
logger, propertyOracle, context);
typesSentFromBrowserBuilder.setTypeFilter(blacklistTypeFilter);
@@ -334,7 +334,7 @@
rpcLog = stringWriter.toString();
}
event.end();
-
+
generateTypeHandlers(logger, context, typesSentFromBrowser,
typesSentToBrowser);
@@ -514,36 +514,23 @@
w.println(") {");
w.indent();
- String statsContextName = nameFactory.createName("statsContext");
- generateRpcStatsContext(w, syncMethod, asyncMethod, statsContextName);
-
- String statsMethodExpr = getProxySimpleName() + "." +
syncMethod.getName();
- String tossName = nameFactory.createName("toss");
- w.println("boolean %s = %s.isStatsAvailable()
&& %s.stats(%s.timeStat(\"%s\", \"begin\"));",
- tossName, statsContextName, statsContextName, statsContextName,
statsMethodExpr);
- w.print(SerializationStreamWriter.class.getSimpleName());
- w.print(" ");
- String streamWriterName = nameFactory.createName("streamWriter");
- w.println(streamWriterName + " = createStreamWriter();");
- w.println("// createStreamWriter() prepared the stream");
+ String helperName = nameFactory.createName("helper");
+ String helperClassName =
RemoteServiceProxy.ServiceHelper.class.getCanonicalName();
+ w.println("%s %s = new %s(\"%s\", \"%s\");",
+ helperClassName, helperName, helperClassName, getProxySimpleName(),
+ syncMethod.getName());
+
w.println("try {");
w.indent();
- w.println("if (getRpcToken() != null) {");
- w.indent();
- w.println(streamWriterName + ".writeObject(getRpcToken());");
- w.outdent();
- w.println("}");
-
- w.println(streamWriterName
+ ".writeString(REMOTE_SERVICE_INTERFACE_NAME);");
-
- // Write the method name
- w.println(streamWriterName + ".writeString(\"" + syncMethod.getName()
- + "\");");
-
// Write the parameter count followed by the parameter values
JParameter[] syncParams = syncMethod.getParameters();
- w.println(streamWriterName + ".writeInt(" + syncParams.length + ");");
+
+ String streamWriterName = nameFactory.createName("streamWriter");
+ w.println("%s %s = %s.start(REMOTE_SERVICE_INTERFACE_NAME, %s);",
+ SerializationStreamWriter.class.getSimpleName(), streamWriterName,
+ helperName, syncParams.length);
+
for (JParameter param : syncParams) {
JType paramType = param.getType().getErasedType();
String typeNameExpression = computeTypeNameExpression(paramType);
@@ -561,40 +548,31 @@
w.print(Shared.getStreamWriteMethodNameFor(asyncParam.getType()));
w.println("(" + asyncParam.getName() + ");");
}
-
- String payloadName = nameFactory.createName("payload");
- w.println("String " + payloadName + " = " + streamWriterName
- + ".toString();");
-
- w.println(tossName + " = " + statsContextName + ".isStatsAvailable()
&& "
- + statsContextName + ".stats(" + statsContextName + ".timeStat(\""
- + statsMethodExpr + "\", \"requestSerialized\"));");
/*
* Depending on the return type for the async method, return a
* RequestBuilder, a Request, or nothing at all.
*/
+ JParameter callbackParam = asyncParams[asyncParams.length - 1];
+ JType returnType = syncMethod.getReturnType();
+ String callbackName = callbackParam.getName();
+
if (asyncReturnType == JPrimitiveType.VOID) {
- w.print("doInvoke(");
+ w.println("%s.finish(%s, ResponseReader.%s);",
+ helperName, callbackName,
getResponseReaderFor(returnType).name());
} else if (asyncReturnType.getQualifiedSourceName().equals(
RequestBuilder.class.getName())) {
- w.print("return doPrepareRequestBuilder(");
+ w.println("return %s.finishForRequestBuilder(%s,
ResponseReader.%s);",
+ helperName, callbackName,
getResponseReaderFor(returnType).name());
} else if (asyncReturnType.getQualifiedSourceName().equals(
Request.class.getName())) {
- w.print("return doInvoke(");
+ w.println("return %s.finish(%s, ResponseReader.%s);",
+ helperName, callbackName,
getResponseReaderFor(returnType).name());
} else {
// This method should have been caught by RemoteServiceAsyncValidator
throw new RuntimeException("Unhandled return type "
+ asyncReturnType.getQualifiedSourceName());
}
-
- JParameter callbackParam = asyncParams[asyncParams.length - 1];
- String callbackName = callbackParam.getName();
- JType returnType = syncMethod.getReturnType();
- w.print("ResponseReader." + getResponseReaderFor(returnType).name());
- w.println(", \"" + getProxySimpleName() + "." + syncMethod.getName()
- + "\", " + statsContextName + ", " + payloadName + ", " +
callbackName
- + ");");
w.outdent();
w.print("} catch (SerializationException ");
--
http://groups.google.com/group/Google-Web-Toolkit-Contributors