Better error reporting. Also, move the proxy and request interfaces
to shared, where they belong — the servlet validates against them.

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

Review by: jlabanca@google.com

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@10168 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/App.java b/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/App.java
index 240889e..b37fd2b 100644
--- a/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/App.java
+++ b/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/App.java
@@ -15,6 +15,8 @@
  */
 package com.google.gwt.sample.mobilewebapp.client;
 
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.GWT.UncaughtExceptionHandler;
 import com.google.gwt.event.shared.EventBus;
 import com.google.gwt.place.shared.Place;
 import com.google.gwt.place.shared.PlaceChangeEvent;
@@ -24,7 +26,9 @@
 import com.google.gwt.sample.mobilewebapp.client.place.AppPlaceHistoryMapper;
 import com.google.gwt.sample.mobilewebapp.client.place.TaskListPlace;
 import com.google.gwt.storage.client.Storage;
+import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.ui.HasWidgets;
+import com.google.web.bindery.event.shared.UmbrellaException;
 
 /**
  * The heart of the applicaiton, mainly concerned with bootstrapping.
@@ -53,7 +57,7 @@
   private final AppPlaceHistoryMapper historyMapper;
 
   private final PlaceHistoryHandler historyHandler;
-  
+
   private final ReloadOnAuthenticationFailure reloadOnAuthenticationFailure;
 
   public App(Storage storage, EventBus eventBus, PlaceController placeController,
@@ -77,6 +81,17 @@
   public void run(HasWidgets.ForIsWidget parentView) {
     parentView.add(shell);
 
+    GWT.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
+      @Override
+      public void onUncaughtException(Throwable e) {
+        while (e instanceof UmbrellaException) {
+          e = ((UmbrellaException)e).getCauses().iterator().next();
+        }
+        Window.alert("An unexpected error occurred: " + e.getMessage());
+        placeController.goTo(new TaskListPlace(false));
+      }
+    });
+
     // Check for authentication failures or mismatches
     reloadOnAuthenticationFailure.register(eventBus);
 
diff --git a/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/ClientFactory.java b/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/ClientFactory.java
index 913ed2d..f66c5c0 100644
--- a/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/ClientFactory.java
+++ b/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/ClientFactory.java
@@ -21,6 +21,7 @@
 import com.google.gwt.sample.mobilewebapp.client.activity.TaskListView;
 import com.google.gwt.sample.mobilewebapp.client.activity.TaskReadView;
 import com.google.gwt.storage.client.Storage;
+import com.google.gwt.sample.mobilewebapp.shared.MobileWebAppRequestFactory;
 
 /**
  * The factory responsible for instantiating everything interesting in this
diff --git a/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/ClientFactoryImpl.java b/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/ClientFactoryImpl.java
index fbbe23d..4dc6e9f 100644
--- a/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/ClientFactoryImpl.java
+++ b/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/ClientFactoryImpl.java
@@ -34,6 +34,7 @@
 import com.google.gwt.sample.mobilewebapp.client.desktop.DesktopTaskReadView;
 import com.google.gwt.sample.mobilewebapp.client.desktop.MobileWebAppShellDesktop;
 import com.google.gwt.sample.mobilewebapp.client.place.AppPlaceHistoryMapper;
+import com.google.gwt.sample.mobilewebapp.shared.MobileWebAppRequestFactory;
 import com.google.gwt.storage.client.Storage;
 import com.google.gwt.user.client.Window;
 import com.google.web.bindery.requestfactory.shared.RequestTransport;
diff --git a/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/activity/TaskEditActivity.java b/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/activity/TaskEditActivity.java
index 470c85a..50ce3d6 100644
--- a/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/activity/TaskEditActivity.java
+++ b/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/activity/TaskEditActivity.java
@@ -18,11 +18,11 @@
 import com.google.gwt.activity.shared.AbstractActivity;
 import com.google.gwt.event.shared.EventBus;
 import com.google.gwt.sample.mobilewebapp.client.ClientFactory;
-import com.google.gwt.sample.mobilewebapp.client.TaskRequest;
 import com.google.gwt.sample.mobilewebapp.client.place.TaskEditPlace;
 import com.google.gwt.sample.mobilewebapp.client.place.TaskListPlace;
 import com.google.gwt.sample.mobilewebapp.client.ui.SoundEffects;
 import com.google.gwt.sample.mobilewebapp.shared.TaskProxy;
+import com.google.gwt.sample.mobilewebapp.shared.TaskRequest;
 import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.ui.AcceptsOneWidget;
 import com.google.web.bindery.requestfactory.shared.Receiver;
@@ -131,13 +131,6 @@
       }
 
       @Override
-      public void onFailure(ServerFailure error) {
-        Window.alert("An error occurred on the server while saving this task."
-            + " Please try saving the task again.");
-        doCancelTask();
-      }
-
-      @Override
       public void onSuccess(Void response) {
         // Notify the user that the task was updated.
         TaskEditActivity.this.notify("Task Saved");
@@ -177,13 +170,6 @@
         clientFactory.getRequestFactory().taskRequest().findTask(this.taskId).fire(
             new Receiver<TaskProxy>() {
               @Override
-              public void onFailure(ServerFailure error) {
-                Window.alert("An error occurred on the server while loading this task."
-                    + " Please select a different task from the task list.");
-                doCancelTask();
-              }
-
-              @Override
               public void onSuccess(TaskProxy response) {
                 // Early exit if this activity has already been cancelled.
                 if (isDead) {
@@ -234,8 +220,8 @@
         new Receiver<Void>() {
           @Override
           public void onFailure(ServerFailure error) {
-            Window.alert("An error occurred on the server while deleting this task."
-                + " Please try deleting it again.");
+            Window.alert("An error occurred on the server while deleting this task: \"."
+                + error.getMessage() + "\".");
           }
 
           @Override
@@ -293,13 +279,6 @@
       clientFactory.getRequestFactory().taskRequest().findTask(this.taskId).fire(
           new Receiver<TaskProxy>() {
             @Override
-            public void onFailure(ServerFailure error) {
-              Window.alert("An error occurred on the server while loading this task."
-                  + " Please select a different task from the task list.");
-              doCancelTask();
-            }
-
-            @Override
             public void onSuccess(TaskProxy response) {
               // Early exit if this activity has already been cancelled.
               if (isDead) {
diff --git a/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/MobileWebAppRequestFactory.java b/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/shared/MobileWebAppRequestFactory.java
similarity index 94%
rename from samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/MobileWebAppRequestFactory.java
rename to samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/shared/MobileWebAppRequestFactory.java
index 1900a4c..0173ca6 100644
--- a/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/MobileWebAppRequestFactory.java
+++ b/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/shared/MobileWebAppRequestFactory.java
@@ -13,7 +13,7 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.sample.mobilewebapp.client;
+package com.google.gwt.sample.mobilewebapp.shared;
 
 import com.google.web.bindery.requestfactory.shared.RequestFactory;
 
diff --git a/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/TaskRequest.java b/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/shared/TaskRequest.java
similarity index 93%
rename from samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/TaskRequest.java
rename to samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/shared/TaskRequest.java
index 65fa8ec..cfbc6b2 100644
--- a/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/TaskRequest.java
+++ b/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/shared/TaskRequest.java
@@ -13,10 +13,9 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.sample.mobilewebapp.client;
+package com.google.gwt.sample.mobilewebapp.shared;
 
 import com.google.gwt.sample.mobilewebapp.server.domain.Task;
-import com.google.gwt.sample.mobilewebapp.shared.TaskProxy;
 import com.google.web.bindery.requestfactory.shared.InstanceRequest;
 import com.google.web.bindery.requestfactory.shared.Request;
 import com.google.web.bindery.requestfactory.shared.RequestContext;