From 057bebcc1bcd92e97c008edc8c0088cb61c2f4c1 Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Thu, 14 Jul 2011 08:03:03 +0000
Subject: [PATCH] [LMS-2366] client side permanent deletion with stub on server
 side

SVN: 22135
---
 .../web/client/ICommonClientService.java      |  5 ++
 .../web/client/ICommonClientServiceAsync.java |  5 ++
 .../client/web/client/application/Dict.java   |  6 ++
 .../application/ui/deletion/DeletionGrid.java | 23 +++---
 .../PermanentDeletionConfirmationDialog.java  | 75 +++++++++++++++++++
 .../web/server/CommonClientService.java       |  6 ++
 .../openbis/generic/server/CommonServer.java  |  8 ++
 .../generic/server/CommonServerLogger.java    |  7 +-
 .../openbis/generic/shared/ICommonServer.java | 10 ++-
 .../cisd/openbis/public/common-dictionary.js  |  4 +-
 .../shared/ICommonServer.java.expected        | 10 ++-
 11 files changed, 145 insertions(+), 14 deletions(-)
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/deletion/PermanentDeletionConfirmationDialog.java

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
index 1a5e4d67dd1..afbab8efcab 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
@@ -1094,4 +1094,9 @@ public interface ICommonClientService extends IClientService
      */
     public void revertDeletions(List<TechId> deletionIds) throws UserFailureException;
 
+    /**
+     * Permanently deletes entities moved to trash with specified deletions.
+     */
+    public void deletePermanently(List<TechId> deletionIds) throws UserFailureException;
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
index ed07e57e708..d8c54c32653 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
@@ -988,4 +988,9 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
      * @see ICommonClientService#revertDeletions(List)
      */
     public void revertDeletions(List<TechId> deletionIds, AsyncCallback<Void> callback);
+
+    /**
+     * @see ICommonClientService#deletePermanently(List)
+     */
+    public void deletePermanently(List<TechId> deletionIds, AsyncCallback<Void> callback);
 }
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 4fd575c229f..9fe8f0085b9 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
@@ -528,6 +528,12 @@ public abstract class Dict
     public static final String REVERT_DELETIONS_CONFIRMATION_MSG =
             "revert_deletions_confirmation_msg";
 
+    public static final String PERMANENT_DELETIONS_CONFIRMATION_TITLE =
+            "permanent_deletions_confirmation_title";
+
+    public static final String PERMANENT_DELETIONS_CONFIRMATION_MSG =
+            "permanent_deletions_confirmation_msg";
+
     //
     // Sample Viewer
     //
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/deletion/DeletionGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/deletion/DeletionGrid.java
index b71dcd557e8..38c8684d9b8 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/deletion/DeletionGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/deletion/DeletionGrid.java
@@ -21,7 +21,6 @@ import java.util.Arrays;
 import java.util.List;
 
 import com.extjs.gxt.ui.client.widget.Dialog;
-import com.extjs.gxt.ui.client.widget.MessageBox;
 import com.extjs.gxt.ui.client.widget.button.Button;
 import com.google.gwt.user.client.rpc.AsyncCallback;
 
@@ -31,7 +30,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.BaseEntityModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.PersonRenderer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.TypedTableGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ColumnDefsAndConfigs;
@@ -96,16 +94,21 @@ public class DeletionGrid extends TypedTableGrid<Deletion>
         addButton(revertButton);
 
         Button deletePermanentlyButton =
-                createSelectedItemButton(
-                        viewContext.getMessage(Dict.BUTTON_DELETE_PERMANENTLY),
-                        new ISelectedEntityInvoker<BaseEntityModel<TableModelRowWithObject<Deletion>>>()
+                createSelectedItemsButton(viewContext.getMessage(Dict.BUTTON_DELETE_PERMANENTLY),
+                        new AbstractCreateDialogListener()
                             {
-                                public void invoke(
-                                        BaseEntityModel<TableModelRowWithObject<Deletion>> selectedItem,
-                                        boolean keyPressed)
+                                @Override
+                                protected Dialog createDialog(
+                                        List<TableModelRowWithObject<Deletion>> data,
+                                        IBrowserGridActionInvoker invoker)
                                 {
-                                    // TODO
-                                    MessageBox.info("Not implemented yet", "", null);
+                                    List<Deletion> deletions = new ArrayList<Deletion>();
+                                    for (TableModelRowWithObject<Deletion> row : data)
+                                    {
+                                        deletions.add(row.getObjectOrNull());
+                                    }
+                                    return new PermanentDeletionConfirmationDialog(viewContext,
+                                            deletions, createRefreshCallback(invoker));
                                 }
                             });
         addButton(deletePermanentlyButton);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/deletion/PermanentDeletionConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/deletion/PermanentDeletionConfirmationDialog.java
new file mode 100644
index 00000000000..482f1eed040
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/deletion/PermanentDeletionConfirmationDialog.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2009 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.client.application.ui.deletion;
+
+import java.util.Collections;
+import java.util.List;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.AbstractDataConfirmationDialog;
+import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Deletion;
+
+public final class PermanentDeletionConfirmationDialog extends
+        AbstractDataConfirmationDialog<List<Deletion>>
+{
+    private static final int LABEL_WIDTH = 60;
+
+    private static final int FIELD_WIDTH = 180;
+
+    private final IViewContext<ICommonClientServiceAsync> viewContext;
+
+    private final AbstractAsyncCallback<Void> callback;
+
+    public PermanentDeletionConfirmationDialog(IViewContext<ICommonClientServiceAsync> viewContext,
+            List<Deletion> deletions, AbstractAsyncCallback<Void> callback)
+    {
+        super(viewContext, deletions, viewContext
+                .getMessage(Dict.PERMANENT_DELETIONS_CONFIRMATION_TITLE));
+        this.viewContext = viewContext;
+        this.callback = callback;
+    }
+
+    public PermanentDeletionConfirmationDialog(IViewContext<ICommonClientServiceAsync> viewContext,
+            Deletion deletion, AbstractAsyncCallback<Void> callback)
+    {
+        this(viewContext, Collections.singletonList(deletion), callback);
+    }
+
+    @Override
+    protected void executeConfirmedAction()
+    {
+        viewContext.getCommonService().deletePermanently(TechId.createList(data), callback);
+    }
+
+    @Override
+    protected String createMessage()
+    {
+        return viewContext.getMessage(Dict.PERMANENT_DELETIONS_CONFIRMATION_MSG, data.size());
+    }
+
+    @Override
+    protected void extendForm()
+    {
+        formPanel.setLabelWidth(LABEL_WIDTH);
+        formPanel.setFieldWidth(FIELD_WIDTH);
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
index 84e179ae71d..5a4d82c164b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
@@ -2220,4 +2220,10 @@ public final class CommonClientService extends AbstractClientService implements
     {
         commonServer.revertDeletions(getSessionToken(), deletionIds);
     }
+
+    public void deletePermanently(List<TechId> deletionIds)
+            throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
+    {
+        commonServer.deletePermanently(getSessionToken(), deletionIds);
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
index bf90fb63a04..22d4c188caf 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
@@ -2404,6 +2404,14 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         }
     }
 
+    public final void deletePermanently(final String sessionToken, final List<TechId> deletionIds)
+    {
+        @SuppressWarnings("unused")
+        final Session session = getSession(sessionToken);
+
+        throw new UserFailureException("This feature is not yet implemented.");
+    }
+
     private static UserFailureException wrapExceptionWithEntityIdentifier(
             UserFailureException exception, IEntityInformationHolderWithIdentifier entity)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
index 5a809f00862..6e4d2741b5e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
@@ -1134,6 +1134,11 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
 
     public void revertDeletions(String sessionToken, List<TechId> deletionIds)
     {
-        logTracking(sessionToken, "revertDeletions", "ID(%s)", deletionIds);
+        logTracking(sessionToken, "revertDeletions", "ID(%s)", abbreviate(deletionIds));
+    }
+
+    public void deletePermanently(String sessionToken, List<TechId> deletionIds)
+    {
+        logTracking(sessionToken, "deletePermanently", "ID(%s)", abbreviate(deletionIds));
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
index 5bf5c02c3a1..f59902aae10 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
@@ -1444,7 +1444,7 @@ public interface ICommonServer extends IServer
     public List<Deletion> listDeletions(String sessionToken);
 
     /**
-     * Reverts specified deletion (puts back all objects moved to trash in the deletion).
+     * Reverts specified deletions (puts back all entities moved to trash in the deletions).
      */
     @Transactional
     // TODO make it possible for deletion creator
@@ -1454,4 +1454,12 @@ public interface ICommonServer extends IServer
         { ObjectKind.EXPERIMENT, ObjectKind.SAMPLE, ObjectKind.DATA_SET })
     public void revertDeletions(final String sessionToken, final List<TechId> deletionIds);
 
+    /**
+     * Permanently deletes entities moved to trash in specified deletions.
+     */
+    @Transactional
+    @RolesAllowed(RoleWithHierarchy.INSTANCE_ADMIN)
+    @DatabaseCreateOrDeleteModification(value =
+        { ObjectKind.DELETION, ObjectKind.EXPERIMENT, ObjectKind.SAMPLE, ObjectKind.DATA_SET })
+    public void deletePermanently(final String sessionToken, final List<TechId> deletionIds);
 }
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 5aaed0ce026..f34ed83c3a1 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
@@ -78,7 +78,9 @@ var common = {
   button_revert_deletion: "Revert",
   button_delete_permanently: "Delete Permanently",
   revert_deletions_confirmation_title: "Confirm Revert",
-  revert_deletions_confirmation_msg: "Are you sure you want to revert {0} deletion(s)?",
+  revert_deletions_confirmation_msg: "Are you sure you want to revert {0} selected deletion(s)?",
+  permanent_deletions_confirmation_title: "Confirm Permanent Deletion",
+  permanent_deletions_confirmation_msg: "Are you sure you want to <b>permanently</b> delete all entities that were moved to trash in selected {0} deletion(s)?",
 	 
   //
   // Table Modifications
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java.expected b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java.expected
index 5bf5c02c3a1..f59902aae10 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java.expected
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java.expected
@@ -1444,7 +1444,7 @@ public interface ICommonServer extends IServer
     public List<Deletion> listDeletions(String sessionToken);
 
     /**
-     * Reverts specified deletion (puts back all objects moved to trash in the deletion).
+     * Reverts specified deletions (puts back all entities moved to trash in the deletions).
      */
     @Transactional
     // TODO make it possible for deletion creator
@@ -1454,4 +1454,12 @@ public interface ICommonServer extends IServer
         { ObjectKind.EXPERIMENT, ObjectKind.SAMPLE, ObjectKind.DATA_SET })
     public void revertDeletions(final String sessionToken, final List<TechId> deletionIds);
 
+    /**
+     * Permanently deletes entities moved to trash in specified deletions.
+     */
+    @Transactional
+    @RolesAllowed(RoleWithHierarchy.INSTANCE_ADMIN)
+    @DatabaseCreateOrDeleteModification(value =
+        { ObjectKind.DELETION, ObjectKind.EXPERIMENT, ObjectKind.SAMPLE, ObjectKind.DATA_SET })
+    public void deletePermanently(final String sessionToken, final List<TechId> deletionIds);
 }
-- 
GitLab