From f112d4fd76f4d24f9171fac6efab02bab3f5c4f2 Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Wed, 27 Jul 2011 08:27:08 +0000
Subject: [PATCH] [LMS-2417] configurable switch of logical deletion / trash

SVN: 22264
---
 openbis/dist/server/web-client.properties     |  4 +++
 openbis/etc/web-client.properties             |  4 +++
 .../web/client/application/menu/TopMenu.java  |  6 +++-
 .../client/application/ui/AbstractViewer.java |  6 ++++
 ...DataSetListDeletionConfirmationDialog.java | 12 +++----
 ...erimentListDeletionConfirmationDialog.java | 11 +++----
 .../SampleListDeletionConfirmationDialog.java | 11 +++----
 ...actDataListDeletionConfirmationDialog.java | 33 ++++++++++++++++---
 ...stPermanentDeletionConfirmationDialog.java |  8 +++--
 ...taListTrashDeletionConfirmationDialog.java |  3 +-
 .../WebClientConfigurationProvider.java       | 11 +++++++
 .../basic/dto/WebClientConfiguration.java     | 12 +++++++
 .../dataset/GenericDataSetViewer.java         |  5 ++-
 .../experiment/GenericExperimentViewer.java   |  7 ++--
 .../sample/GenericSampleViewer.java           |  6 ++--
 15 files changed, 105 insertions(+), 34 deletions(-)

diff --git a/openbis/dist/server/web-client.properties b/openbis/dist/server/web-client.properties
index 14d50a0e7c0..fe408435c10 100644
--- a/openbis/dist/server/web-client.properties
+++ b/openbis/dist/server/web-client.properties
@@ -1,3 +1,7 @@
+# Experimental: Enable moving entities to trash (non-permanent deletion).
+# Default value: false
+#enable-trash = true
+
 # Default view mode that should be used if user doesn't have it specified in URL. 
 # Options: 
 #  'NORMAL' (standard mode - default), 
diff --git a/openbis/etc/web-client.properties b/openbis/etc/web-client.properties
index 80f1f99e8b2..f946e8e9637 100644
--- a/openbis/etc/web-client.properties
+++ b/openbis/etc/web-client.properties
@@ -1,3 +1,7 @@
+# Experimental: Enable moving entities to trash (non-permanent deletion).
+# Default value: false
+enable-trash = true
+
 # Default view mode that should be used if user doesn't have it specified in URL. 
 # Options: 'NORMAL' (standard mode - default), 'SIMPLE' (readonly mode with simplified GUI). 
 #
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/TopMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/TopMenu.java
index ae9bf247e8e..1be451d3979 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/TopMenu.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/TopMenu.java
@@ -124,7 +124,11 @@ public class TopMenu extends LayoutContainer
         toolBar.add(new SearchWidget(viewContext));
         toolBar.add(new SeparatorToolItem());
         toolBar.add(new InfoButton(viewContext));
-        toolBar.add(new TrashButton(viewContext, componentProvider));
+        if (viewContext.getModel().getApplicationInfo().getWebClientConfiguration()
+                .getEnableTrash())
+        {
+            toolBar.add(new TrashButton(viewContext, componentProvider));
+        }
         toolBar.add(new LoggedUserMenu(viewContext, componentProvider));
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractViewer.java
index 222125a708a..75761a86183 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractViewer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractViewer.java
@@ -310,6 +310,12 @@ public abstract class AbstractViewer<D extends IEntityInformationHolder> extends
         return BorderLayoutDataFactory.create(region);
     }
 
+    protected final boolean isTrashEnabled()
+    {
+        return viewContext.getModel().getApplicationInfo().getWebClientConfiguration()
+                .getEnableTrash();
+    }
+
     protected final AbstractAsyncCallback<Void> createPermanentDeletionCallback()
     {
         return new CloseViewerCallback(viewContext);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetListDeletionConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetListDeletionConfirmationDialog.java
index 984e2a0e733..514b51702fc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetListDeletionConfirmationDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetListDeletionConfirmationDialog.java
@@ -22,21 +22,20 @@ import com.extjs.gxt.ui.client.widget.form.RadioGroup;
 import com.google.gwt.user.client.rpc.AsyncCallback;
 
 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.data.AbstractExternalDataGrid.SelectedAndDisplayedItems;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.AbstractDataListTrashDeletionConfirmationDialog;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.AbstractDataListDeletionConfirmationDialog;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.WidgetUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DisplayedOrSelectedDatasetCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletionType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 
+// TODO extend AbstractDataListTrashDeletionConfirmationDialog when trash is working properly
 public final class DataSetListDeletionConfirmationDialog extends
-        AbstractDataListTrashDeletionConfirmationDialog<ExternalData>
+        AbstractDataListDeletionConfirmationDialog<ExternalData>
 {
-
     private final IViewContext<ICommonClientServiceAsync> viewContext;
 
     private final SelectedAndDisplayedItems selectedAndDisplayedItemsOrNull;
@@ -44,8 +43,7 @@ public final class DataSetListDeletionConfirmationDialog extends
     private final ExternalData singleData;
 
     public DataSetListDeletionConfirmationDialog(
-            IViewContext<ICommonClientServiceAsync> viewContext,
-            AbstractAsyncCallback<Void> callback,
+            IViewContext<ICommonClientServiceAsync> viewContext, AsyncCallback<Void> callback,
             SelectedAndDisplayedItems selectedAndDisplayedItems)
     {
         super(viewContext, selectedAndDisplayedItems.getSelectedItems(), callback);
@@ -57,7 +55,7 @@ public final class DataSetListDeletionConfirmationDialog extends
 
     public DataSetListDeletionConfirmationDialog(
             IViewContext<ICommonClientServiceAsync> viewContext,
-            AbstractAsyncCallback<Void> deletionCallback, ExternalData data)
+            AsyncCallback<Void> deletionCallback, ExternalData data)
     {
         super(viewContext, Collections.singletonList(data), deletionCallback);
         this.viewContext = viewContext;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentListDeletionConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentListDeletionConfirmationDialog.java
index c68192fc957..968726b147d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentListDeletionConfirmationDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentListDeletionConfirmationDialog.java
@@ -22,11 +22,10 @@ import com.extjs.gxt.ui.client.widget.form.RadioGroup;
 import com.google.gwt.user.client.rpc.AsyncCallback;
 
 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.experiment.ExperimentBrowserGrid.DisplayedAndSelectedExperiments;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.AbstractDataListTrashDeletionConfirmationDialog;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.AbstractDataListDeletionConfirmationDialog;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.WidgetUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DisplayedOrSelectedIdHolderCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
@@ -35,8 +34,9 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
+// TODO extend AbstractDataListTrashDeletionConfirmationDialog when trash is working properly
 public final class ExperimentListDeletionConfirmationDialog extends
-        AbstractDataListTrashDeletionConfirmationDialog<Experiment>
+        AbstractDataListDeletionConfirmationDialog<Experiment>
 {
 
     private final IViewContext<ICommonClientServiceAsync> viewContext;
@@ -46,8 +46,7 @@ public final class ExperimentListDeletionConfirmationDialog extends
     private final Experiment singleDataOrNull;
 
     public ExperimentListDeletionConfirmationDialog(
-            IViewContext<ICommonClientServiceAsync> viewContext,
-            AbstractAsyncCallback<Void> callback,
+            IViewContext<ICommonClientServiceAsync> viewContext, AsyncCallback<Void> callback,
             DisplayedAndSelectedExperiments selectedAndDisplayedItems)
     {
         super(viewContext, selectedAndDisplayedItems.getExperiments(), callback);
@@ -59,7 +58,7 @@ public final class ExperimentListDeletionConfirmationDialog extends
 
     public ExperimentListDeletionConfirmationDialog(
             IViewContext<ICommonClientServiceAsync> viewContext,
-            AbstractAsyncCallback<Void> deletionCallback, Experiment experiment)
+            AsyncCallback<Void> deletionCallback, Experiment experiment)
     {
         super(viewContext, Collections.singletonList(experiment), deletionCallback);
         this.viewContext = viewContext;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleListDeletionConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleListDeletionConfirmationDialog.java
index a3f59bddbdb..cc53c1fdaec 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleListDeletionConfirmationDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleListDeletionConfirmationDialog.java
@@ -23,11 +23,10 @@ import com.extjs.gxt.ui.client.widget.form.RadioGroup;
 import com.google.gwt.user.client.rpc.AsyncCallback;
 
 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.DisplayedAndSelectedEntities;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.AbstractDataListTrashDeletionConfirmationDialog;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.AbstractDataListDeletionConfirmationDialog;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.WidgetUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DisplayedOrSelectedIdHolderCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
@@ -35,8 +34,9 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletionType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 
+//TODO extend AbstractDataListTrashDeletionConfirmationDialog when trash is working properly
 public final class SampleListDeletionConfirmationDialog<T extends IIdHolder> extends
-        AbstractDataListTrashDeletionConfirmationDialog<T>
+        AbstractDataListDeletionConfirmationDialog<T>
 {
 
     private final IViewContext<ICommonClientServiceAsync> viewContext;
@@ -47,8 +47,7 @@ public final class SampleListDeletionConfirmationDialog<T extends IIdHolder> ext
 
     public SampleListDeletionConfirmationDialog(
             IViewContext<ICommonClientServiceAsync> viewContext, List<T> data,
-            AbstractAsyncCallback<Void> callback,
-            DisplayedAndSelectedEntities<T> selectedAndDisplayedItems)
+            AsyncCallback<Void> callback, DisplayedAndSelectedEntities<T> selectedAndDisplayedItems)
     {
         super(viewContext, data, callback);
         this.withRadio();
@@ -59,7 +58,7 @@ public final class SampleListDeletionConfirmationDialog<T extends IIdHolder> ext
 
     public SampleListDeletionConfirmationDialog(
             IViewContext<ICommonClientServiceAsync> viewContext, List<T> data,
-            AbstractAsyncCallback<Void> deletionCallback, T sample)
+            AsyncCallback<Void> deletionCallback, T sample)
     {
         super(viewContext, data, deletionCallback);
         this.viewContext = viewContext;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/AbstractDataListDeletionConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/AbstractDataListDeletionConfirmationDialog.java
index b371b36f162..4a521da11c3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/AbstractDataListDeletionConfirmationDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/AbstractDataListDeletionConfirmationDialog.java
@@ -22,12 +22,12 @@ import com.extjs.gxt.ui.client.widget.form.Radio;
 import com.extjs.gxt.ui.client.widget.form.RadioGroup;
 import com.google.gwt.user.client.rpc.AsyncCallback;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AsyncCallbackWithProgressBar;
 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.field.ReasonField;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.WidgetUtils;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletionType;
 
 /**
  * {@link AbstractDataConfirmationDialog} abstract implementation for deleting given list of data on
@@ -48,7 +48,7 @@ public abstract class AbstractDataListDeletionConfirmationDialog<T> extends
 
     protected final IViewContext<?> viewContext;
 
-    private final AbstractAsyncCallback<Void> deletionCallback;
+    private final AsyncCallback<Void> deletionCallback;
 
     private boolean withRadio = false;
 
@@ -57,7 +57,7 @@ public abstract class AbstractDataListDeletionConfirmationDialog<T> extends
     protected ReasonField reason;
 
     public AbstractDataListDeletionConfirmationDialog(IViewContext<?> viewContext, List<T> data,
-            AbstractAsyncCallback<Void> deletionCallback)
+            AsyncCallback<Void> deletionCallback)
     {
         super(viewContext, data, viewContext.getMessage(Dict.DELETE_CONFIRMATION_TITLE));
         this.viewContext = viewContext;
@@ -110,9 +110,32 @@ public abstract class AbstractDataListDeletionConfirmationDialog<T> extends
 
     protected abstract void executeDeletion(AsyncCallback<Void> callback);
 
-    abstract String getOperationName();
+    // property based enabling of trash is only a temporary solution
 
-    abstract String getProgressMessage();
+    protected DeletionType getDeletionType()
+    {
+        return isTrashEnabled() ? DeletionType.TRASH : DeletionType.PERMANENT;
+    }
+
+    String getOperationName()
+    {
+        final String dictKey = isTrashEnabled() ? Dict.DELETING : Dict.DELETING_PERMANENTLY;
+        return viewContext.getMessage(dictKey);
+    }
+
+    String getProgressMessage()
+    {
+        final String dictKey =
+                isTrashEnabled() ? Dict.DELETE_PROGRESS_MESSAGE
+                        : Dict.DELETE_PERMANENTLY_PROGRESS_MESSAGE;
+        return viewContext.getMessage(dictKey);
+    }
+
+    private final boolean isTrashEnabled()
+    {
+        return viewContext.getModel().getApplicationInfo().getWebClientConfiguration()
+                .getEnableTrash();
+    }
 
     @Override
     protected final void executeConfirmedAction()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/AbstractDataListPermanentDeletionConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/AbstractDataListPermanentDeletionConfirmationDialog.java
index 1ad5174950a..162c6e9875c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/AbstractDataListPermanentDeletionConfirmationDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/AbstractDataListPermanentDeletionConfirmationDialog.java
@@ -18,7 +18,8 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget
 
 import java.util.List;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
 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.shared.basic.dto.DeletionType;
@@ -33,12 +34,13 @@ public abstract class AbstractDataListPermanentDeletionConfirmationDialog<T> ext
         AbstractDataListDeletionConfirmationDialog<T>
 {
     public AbstractDataListPermanentDeletionConfirmationDialog(IViewContext<?> viewContext,
-            List<T> data, AbstractAsyncCallback<Void> deletionCallback)
+            List<T> data, AsyncCallback<Void> deletionCallback)
     {
         super(viewContext, data, deletionCallback);
     }
 
-    protected final DeletionType getDeletionType()
+    @Override
+    protected DeletionType getDeletionType()
     {
         return DeletionType.PERMANENT;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/AbstractDataListTrashDeletionConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/AbstractDataListTrashDeletionConfirmationDialog.java
index e19c35c365f..7af2733fd41 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/AbstractDataListTrashDeletionConfirmationDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/AbstractDataListTrashDeletionConfirmationDialog.java
@@ -38,7 +38,8 @@ public abstract class AbstractDataListTrashDeletionConfirmationDialog<T> extends
         super(viewContext, data, deletionCallback);
     }
 
-    protected final DeletionType getDeletionType()
+    @Override
+    protected DeletionType getDeletionType()
     {
         return DeletionType.TRASH;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/WebClientConfigurationProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/WebClientConfigurationProvider.java
index 25046d5a59a..590ebd95268 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/WebClientConfigurationProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/WebClientConfigurationProvider.java
@@ -74,6 +74,10 @@ public class WebClientConfigurationProvider
 
     private static final boolean DEFAULT_ALLOW_ADDING_UNOFFICIAL_TERMS = false;
 
+    private static final String ENABLE_TRASH = "enable-trash";
+
+    private static final boolean DEFAULT_ENABLE_TRASH = false;
+
     static final String TECHNOLOGIES = "technologies";
 
     private WebClientConfiguration webClientConfiguration = new WebClientConfiguration();
@@ -101,6 +105,7 @@ public class WebClientConfigurationProvider
         webClientConfiguration.setMaxVisibleColumns(DEFAULT_MAX_VISIBLE_COLUMNS);
         webClientConfiguration.setMaxEntityVisits(DEFAULT_MAX_ENTITY_VISITS);
         webClientConfiguration.setAllowAddingUnofficialTerms(DEFAULT_ALLOW_ADDING_UNOFFICIAL_TERMS);
+        webClientConfiguration.setEnableTrash(DEFAULT_ENABLE_TRASH);
     }
 
     private void init(Properties properties)
@@ -115,6 +120,7 @@ public class WebClientConfigurationProvider
         webClientConfiguration
                 .setDataSetTypesWithImageOverview(extractDataSetTypesWithImageOverview(properties));
         webClientConfiguration.setViews(extractHiddenSections(properties));
+        webClientConfiguration.setEnableTrash(extractEnableTrash(properties));
         SectionProperties[] props =
                 PropertyParametersUtil.extractSectionProperties(properties, TECHNOLOGIES, false);
         for (SectionProperties sectionProperties : props)
@@ -221,6 +227,11 @@ public class WebClientConfigurationProvider
                 DEFAULT_ALLOW_ADDING_UNOFFICIAL_TERMS);
     }
 
+    private boolean extractEnableTrash(Properties properties)
+    {
+        return PropertyUtils.getBoolean(properties, ENABLE_TRASH, DEFAULT_ENABLE_TRASH);
+    }
+
     public WebClientConfiguration getWebClientConfiguration()
     {
         return webClientConfiguration;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/WebClientConfiguration.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/WebClientConfiguration.java
index 50dce4f3273..7705c3ac1e0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/WebClientConfiguration.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/WebClientConfiguration.java
@@ -53,6 +53,8 @@ public class WebClientConfiguration implements ISerializable
 
     private int maxEntityVisits;
 
+    private boolean enableTrash;
+
     private boolean allowAddingUnofficielTerms;
 
     public String getPropertyOrNull(String technology, String key)
@@ -136,6 +138,16 @@ public class WebClientConfiguration implements ISerializable
         this.allowAddingUnofficielTerms = allowAddingUnofficialTerms;
     }
 
+    public boolean getEnableTrash()
+    {
+        return enableTrash;
+    }
+
+    public void setEnableTrash(boolean enableTrash)
+    {
+        this.enableTrash = enableTrash;
+    }
+
     public WebClientConfiguration()
     {
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetViewer.java
index babe33785f8..081c0fbd020 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetViewer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetViewer.java
@@ -146,8 +146,11 @@ abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSpl
             {
                 public void execute()
                 {
+                    final AsyncCallback<Void> callback =
+                            isTrashEnabled() ? createDeletionCallback()
+                                    : createPermanentDeletionCallback();
                     new DataSetListDeletionConfirmationDialog(viewContext.getCommonViewContext(),
-                            createDeletionCallback(), getOriginalData()).show();
+                            callback, getOriginalData()).show();
                 }
 
             }));
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentViewer.java
index bca0633a55f..79d3fd3aa88 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentViewer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentViewer.java
@@ -24,6 +24,7 @@ import java.util.Set;
 import com.extjs.gxt.ui.client.widget.Component;
 import com.extjs.gxt.ui.client.widget.Html;
 import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
+import com.google.gwt.user.client.rpc.AsyncCallback;
 import com.google.gwt.user.client.ui.Widget;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
@@ -128,9 +129,11 @@ public class GenericExperimentViewer extends AbstractViewerWithVerticalSplit<Exp
             {
                 public void execute()
                 {
+                    final AsyncCallback<Void> callback =
+                            isTrashEnabled() ? createDeletionCallback()
+                                    : createPermanentDeletionCallback();
                     new ExperimentListDeletionConfirmationDialog(
-                            viewContext.getCommonViewContext(), createDeletionCallback(),
-                            getOriginalData()).show();
+                            viewContext.getCommonViewContext(), callback, getOriginalData()).show();
                 }
             }));
         addToolBarButton(createRevertDeletionButton(new IDelegatedAction()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java
index 29734c47a43..ebd80bdb8ff 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java
@@ -162,9 +162,11 @@ abstract public class GenericSampleViewer extends AbstractViewerWithVerticalSpli
                 @SuppressWarnings("unchecked")
                 public void execute()
                 {
+                    final AsyncCallback<Void> callback =
+                            isTrashEnabled() ? createDeletionCallback()
+                                    : createPermanentDeletionCallback();
                     new SampleListDeletionConfirmationDialog(viewContext.getCommonViewContext(),
-                            getOriginalDataAsSingleton(), createDeletionCallback(),
-                            getOriginalData()).show();
+                            getOriginalDataAsSingleton(), callback, getOriginalData()).show();
                 }
             }));
         addToolBarButton(createRevertDeletionButton(new IDelegatedAction()
-- 
GitLab