Revision: 9479
Author: [email protected]
Date: Thu Dec 23 11:25:33 2010
Log: Fix an NPE in SimpleRequestProcessor when a client request has no invocations.
Issue 5793.
Patch by: bobv
Review by: rchandia
Found by: cory.prowse

Review at http://gwt-code-reviews.appspot.com/1242801

http://code.google.com/p/google-web-toolkit/source/detail?r=9479

Modified:
/trunk/user/src/com/google/gwt/requestfactory/server/SimpleRequestProcessor.java /trunk/user/test/com/google/gwt/requestfactory/client/RequestFactoryTest.java

=======================================
--- /trunk/user/src/com/google/gwt/requestfactory/server/SimpleRequestProcessor.java Tue Dec 14 07:17:57 2010 +++ /trunk/user/src/com/google/gwt/requestfactory/server/SimpleRequestProcessor.java Thu Dec 23 11:25:33 2010
@@ -214,8 +214,7 @@
     // Invoke methods
     List<Splittable> invocationResults = new ArrayList<Splittable>();
     List<Boolean> invocationSuccess = new ArrayList<Boolean>();
-    List<InvocationMessage> invlist = req.getInvocations();
-    processInvocationMessages(source, invlist, invocationResults,
+    processInvocationMessages(source, req, invocationResults,
         invocationSuccess, returnState);

     // Store return objects
@@ -225,8 +224,11 @@
     toProcess.putAll(returnState.beans);
     createReturnOperations(operations, returnState, toProcess);

-    resp.setInvocationResults(invocationResults);
-    resp.setStatusCodes(invocationSuccess);
+    assert invocationResults.size() == invocationSuccess.size();
+    if (!invocationResults.isEmpty()) {
+      resp.setInvocationResults(invocationResults);
+      resp.setStatusCodes(invocationSuccess);
+    }
     if (!operations.isEmpty()) {
       resp.setOperations(operations);
     }
@@ -409,9 +411,14 @@
   }

   private void processInvocationMessages(RequestState state,
-      List<InvocationMessage> invlist, List<Splittable> results,
-      List<Boolean> success, RequestState returnState) {
-    for (InvocationMessage invocation : invlist) {
+      RequestMessage req, List<Splittable> results, List<Boolean> success,
+      RequestState returnState) {
+    List<InvocationMessage> invocations = req.getInvocations();
+    if (invocations == null) {
+      // No method invocations which can happen via RequestContext.fire()
+      return;
+    }
+    for (InvocationMessage invocation : invocations) {
       try {
         // Find the Method
         String[] operation = invocation.getOperation().split("::");
=======================================
--- /trunk/user/test/com/google/gwt/requestfactory/client/RequestFactoryTest.java Wed Dec 15 12:13:06 2010 +++ /trunk/user/test/com/google/gwt/requestfactory/client/RequestFactoryTest.java Thu Dec 23 11:25:33 2010
@@ -884,6 +884,19 @@
     } catch (IllegalArgumentException expected) {
     }
   }
+
+  /**
+   * Tests a no-op request.
+   */
+  public void testNoOpRequest() {
+    delayTestFinish(DELAY_TEST_FINISH);
+    simpleFooRequest().fire(new Receiver<Void>() {
+      @Override
+      public void onSuccess(Void response) {
+        finishTestAndReset();
+      }
+    });
+  }

   /**
    * Ensures that a service method can respond with a null value.
@@ -1008,7 +1021,7 @@
    */
   public void testNullValueInIntegerListRequest() {
     delayTestFinish(DELAY_TEST_FINISH);
-    List<Integer> list = Arrays.asList(new Integer[]{1, 2, null});
+    List<Integer> list = Arrays.asList(new Integer[] {1, 2, null});
final Request<Void> fooReq = req.simpleFooRequest().receiveNullValueInIntegerList(
         list);
     fooReq.fire(new Receiver<Void>() {
@@ -1024,7 +1037,7 @@
    */
   public void testNullValueInStringListRequest() {
     delayTestFinish(DELAY_TEST_FINISH);
- List<String> list = Arrays.asList(new String[]{"nonnull", "null", null}); + List<String> list = Arrays.asList(new String[] {"nonnull", "null", null}); final Request<Void> fooReq = req.simpleFooRequest().receiveNullValueInStringList(
         list);
     fooReq.fire(new Receiver<Void>() {
@@ -1034,6 +1047,22 @@
       }
     });
   }
+
+  /**
+   * Tests a message consisting only of operations, with no invocations.
+   */
+  public void testOperationOnlyMessage() {
+    delayTestFinish(DELAY_TEST_FINISH);
+    RequestContext ctx = simpleFooRequest();
+    SimpleFooProxy proxy = ctx.create(SimpleFooProxy.class);
+    proxy.setUserName("GWT");
+    ctx.fire(new Receiver<Void>() {
+      @Override
+      public void onSuccess(Void response) {
+        finishTestAndReset();
+      }
+    });
+  }

   public void testPersistAllValueTypes() {
     delayTestFinish(DELAY_TEST_FINISH);

--
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to