From e699f6f1a33ac13a02a10939d15e991320fe64c1 Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Tue, 9 Sep 2008 13:30:57 +0000
Subject: [PATCH] LMS-445 Show UserFailureException properly

SVN: 8249
---
 .../web/client/IGenericClientService.java     |  6 +-
 .../application/AbstractAsyncCallback.java    |  3 +-
 .../InvalidSessionException.java              |  2 +-
 .../UserFailureException.java                 |  2 +-
 .../web/server/GenericClientService.java      | 29 ++++++---
 .../util/UserFailureExceptionTranslater.java  | 62 +++++++++++++++++++
 .../openbis/generic/server/GenericServer.java |  2 +-
 7 files changed, 93 insertions(+), 13 deletions(-)
 rename openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/{application/util => exception}/InvalidSessionException.java (93%)
 rename openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/{application/util => exception}/UserFailureException.java (94%)
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/UserFailureExceptionTranslater.java

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/IGenericClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/IGenericClientService.java
index 0f2643f5b9a..6d424ffb9a3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/IGenericClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/IGenericClientService.java
@@ -23,6 +23,7 @@ import com.google.gwt.user.client.rpc.RemoteService;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ApplicationInfo;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Group;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SessionContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException;
 
 /**
  * Service interface for the generic GWT client.
@@ -54,10 +55,11 @@ public interface IGenericClientService extends RemoteService
     /**
      * Returns a list of all groups which belong to the specified database instance.
      */
-    public List<Group> listGroups(String databaseInstanceCode);
+    public List<Group> listGroups(String databaseInstanceCode) throws UserFailureException;
     
     /**
      * Registers a new group with specified code and optional description and group leader ID.
      */
-    public void registerGroup(String groupCode, String descriptionOrNull, String groupLeaderOrNull);
+    public void registerGroup(String groupCode, String descriptionOrNull, String groupLeaderOrNull)
+            throws UserFailureException;
 }
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 d47c1a55500..1ff36d543e0 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
@@ -20,8 +20,8 @@ import com.extjs.gxt.ui.client.widget.MessageBox;
 import com.google.gwt.user.client.rpc.AsyncCallback;
 import com.google.gwt.user.client.rpc.InvocationException;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.InvalidSessionException;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.StringUtils;
+import ch.systemsx.cisd.openbis.generic.client.web.client.exception.InvalidSessionException;
 
 
 
@@ -46,6 +46,7 @@ public abstract class AbstractAsyncCallback<T> implements AsyncCallback<T>
     
     public void onFailure(Throwable caught)
     {
+        System.out.println(caught);
         final String msg;
         if (caught instanceof InvocationException)
         {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/util/InvalidSessionException.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/exception/InvalidSessionException.java
similarity index 93%
rename from openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/util/InvalidSessionException.java
rename to openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/exception/InvalidSessionException.java
index 9dd1343a6e1..1c4b7d98d00 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/util/InvalidSessionException.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/exception/InvalidSessionException.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package ch.systemsx.cisd.openbis.generic.client.web.client.application.util;
+package ch.systemsx.cisd.openbis.generic.client.web.client.exception;
 
 /**
  * This <code>UserFailureException</code> extension signals that a <code>Session</code> has
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/util/UserFailureException.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/exception/UserFailureException.java
similarity index 94%
rename from openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/util/UserFailureException.java
rename to openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/exception/UserFailureException.java
index 74b290afd53..612101170e8 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/util/UserFailureException.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/exception/UserFailureException.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package ch.systemsx.cisd.openbis.generic.client.web.client.application.util;
+package ch.systemsx.cisd.openbis.generic.client.web.client.exception;
 
 import com.google.gwt.user.client.rpc.IsSerializable;
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/GenericClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/GenericClientService.java
index 78489e41b7e..ce5ee64b8fd 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/GenericClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/GenericClientService.java
@@ -24,6 +24,7 @@ import javax.servlet.http.HttpSession;
 import org.apache.log4j.Logger;
 
 import ch.systemsx.cisd.common.exceptions.InvalidSessionException;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
 import ch.systemsx.cisd.common.servlet.IRequestContextProvider;
@@ -37,6 +38,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Group;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SessionContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.User;
 import ch.systemsx.cisd.openbis.generic.client.web.server.util.GroupTranslater;
+import ch.systemsx.cisd.openbis.generic.client.web.server.util.UserFailureExceptionTranslater;
 import ch.systemsx.cisd.openbis.generic.shared.IGenericServer;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 
@@ -179,19 +181,32 @@ public class GenericClientService implements IGenericClientService
 
     public List<Group> listGroups(String databaseInstanceCode)
     {
-        DatabaseInstanceIdentifier identifier = new DatabaseInstanceIdentifier(databaseInstanceCode);
-        List<Group> result = new ArrayList<Group>();
-        List<GroupPE> groups = server.listGroups(getSessionToken(), identifier);
-        for (GroupPE group : groups)
+        try
         {
-            result.add(GroupTranslater.translate(group));
+            DatabaseInstanceIdentifier identifier = new DatabaseInstanceIdentifier(databaseInstanceCode);
+            List<Group> result = new ArrayList<Group>();
+            List<GroupPE> groups = server.listGroups(getSessionToken(), identifier);
+            for (GroupPE group : groups)
+            {
+                result.add(GroupTranslater.translate(group));
+            }
+            return result;
+        } catch (UserFailureException e)
+        {
+            throw UserFailureExceptionTranslater.translate(e);
         }
-        return result;
     }
 
     public void registerGroup(String groupCode, String descriptionOrNull, String groupLeaderOrNull)
     {
-        server.registerGroup(getSessionToken(), groupCode, descriptionOrNull, groupLeaderOrNull);
+        try
+        {
+            String sessionToken = getSessionToken();
+            server.registerGroup(sessionToken, groupCode, descriptionOrNull, groupLeaderOrNull);
+        } catch (UserFailureException e)
+        {
+            throw UserFailureExceptionTranslater.translate(e);
+        }
     }
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/UserFailureExceptionTranslater.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/UserFailureExceptionTranslater.java
new file mode 100644
index 00000000000..b8fa9629c91
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/UserFailureExceptionTranslater.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2008 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.client.web.server.util;
+
+import ch.systemsx.cisd.common.exceptions.CheckedExceptionTunnel;
+import ch.systemsx.cisd.common.utilities.ClassUtils;
+import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException;
+
+/**
+ * Translator of server side {@link ch.systemsx.cisd.common.exceptions.UserFailureException} into
+ * GWT compatible {@link UserFailureException}.
+ *
+ * @author Franz-Josef Elmer
+ */
+public class UserFailureExceptionTranslater
+{
+    private static final String WEB_CLIENT_EXCEPTIONS_PACKAGE =
+            getPackageName(UserFailureException.class);
+    
+    private static String getPackageName(Class<?> clazz)
+    {
+        String fullName = clazz.getName();
+        return fullName.substring(0, fullName.length() - clazz.getSimpleName().length() - 1);
+    }
+    
+    private UserFailureExceptionTranslater()
+    {
+    }
+
+    /**
+     * Converts any {@link ch.systemsx.cisd.common.exceptions.UserFailureException} or subclass of
+     * it to a <i>GWT</i> {@link UserFailureException} (or subclass of it if this one could be
+     * found in the same package).
+     */
+    public static UserFailureException translate(ch.systemsx.cisd.common.exceptions.UserFailureException exception)
+    {
+        final String className = WEB_CLIENT_EXCEPTIONS_PACKAGE + exception.getClass().getSimpleName();
+        String message = exception.getMessage();
+        try
+        {
+            return ClassUtils.create(UserFailureException.class, className, message);
+        } catch (final CheckedExceptionTunnel e)
+        {
+            return new UserFailureException(message);
+        }
+        
+    }
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/GenericServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/GenericServer.java
index f6c10b4e024..4c067226d3a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/GenericServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/GenericServer.java
@@ -29,7 +29,7 @@ import ch.systemsx.cisd.common.servlet.RequestContextProviderAdapter;
 import ch.systemsx.cisd.lims.base.dto.GroupPE;
 import ch.systemsx.cisd.lims.base.dto.PersonPE;
 import ch.systemsx.cisd.lims.base.identifier.DatabaseInstanceIdentifier;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.UserFailureException;
+import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.shared.IGenericServer;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 
-- 
GitLab