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

Reply via email to