From 12ef4461dc20051a6be8d1b25feb9fea2bd1bed1 Mon Sep 17 00:00:00 2001
From: kaloyane <kaloyane>
Date: Wed, 13 Jul 2011 17:04:44 +0000
Subject: [PATCH] [LMS-1719] expect the error to appear and handle it on the
 client side

SVN: 22132
---
 .../client/application/AbstractAsyncCallback.java | 15 +++++++++++++++
 .../client/web/client/application/Dict.java       |  2 ++
 .../cisd/openbis/public/common-dictionary.js      |  1 +
 3 files changed, 18 insertions(+)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AbstractAsyncCallback.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AbstractAsyncCallback.java
index 9e635e8df1f..db28dd4d6db 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AbstractAsyncCallback.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AbstractAsyncCallback.java
@@ -24,7 +24,9 @@ import com.extjs.gxt.ui.client.event.WindowListener;
 import com.extjs.gxt.ui.client.widget.Dialog;
 import com.extjs.gxt.ui.client.widget.MessageBox;
 import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException;
 import com.google.gwt.user.client.rpc.InvocationException;
+import com.google.gwt.user.client.rpc.SerializationException;
 
 import ch.systemsx.cisd.common.shared.basic.utils.StringUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.GWTUtils;
@@ -207,6 +209,13 @@ public abstract class AbstractAsyncCallback<T> implements AsyncCallback<T>
 
     public final void onFailure(final Throwable caught)
     {
+        if (isIncompatibleServerException(caught))
+        {
+            String sessionExpiredMessage = getMessage(Dict.SESSION_EXPIRED_MESSAGE);
+            handleSessionTerminated(sessionExpiredMessage);
+            return;
+        }
+
         final String msg;
         if (caught instanceof InvocationException)
         {
@@ -247,6 +256,12 @@ public abstract class AbstractAsyncCallback<T> implements AsyncCallback<T>
         }
     }
 
+    private boolean isIncompatibleServerException(final Throwable caught)
+    {
+        return caught instanceof SerializationException
+                || caught instanceof IncompatibleRemoteServiceException;
+    }
+
     private String getMessage(String messageKey, Object... params)
     {
         if (viewContext != null)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java
index 5fc114aecc3..4fd575c229f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java
@@ -199,6 +199,8 @@ public abstract class Dict
 
     public static final String EXCEPTION_WITHOUT_MESSAGE = "exception_withoutMessage";
 
+    public static final String SESSION_EXPIRED_MESSAGE = "session_expired";
+
     //
     // Header
     //
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
index 21ff93ef957..5aaed0ce026 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
@@ -168,6 +168,7 @@ var common = {
   
   exception_invocationMessage: "Failed to contact the server. Please try again later or contact your administrator.", 
   exception_withoutMessage: "Unexpected error has occurred, please contact your administrator:<br>{0}",
+  session_expired: "Session expired. Please login again.",
   
   //
   // Header
-- 
GitLab