From 27d4529e58de98c994ad9ac038aafa71172c4f8f Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Tue, 12 Jul 2011 16:30:29 +0000
Subject: [PATCH] [LMS-2367] introduced simple trash gui + minor renaming
 (group->space)

SVN: 22099
---
 .../web/client/ICommonClientService.java      |  15 ++
 .../web/client/ICommonClientServiceAsync.java |  17 +-
 .../client/web/client/application/Dict.java   |   6 +
 .../framework/ComponentProvider.java          |  39 +++++
 .../framework/DisplayTypeIDGenerator.java     |   2 +
 .../web/client/application/menu/TopMenu.java  |   2 +-
 .../administration/AdministrationMenu.java    |   2 +
 .../application/ui/deletion/DeletionGrid.java | 163 ++++++++++++++++++
 .../web/client/dto/DeletionGridColumnIDs.java |  34 ++++
 .../web/server/CommonClientService.java       |  17 ++
 .../server/resultset/DeletionsProvider.java   |  60 +++++++
 .../openbis/generic/server/CommonServer.java  |  25 ++-
 .../generic/server/CommonServerLogger.java    |   6 +
 .../openbis/generic/server/ETLService.java    |   6 +-
 ...{InvalidationDAO.java => DeletionDAO.java} |   3 +-
 .../db/HibernateSearchDataProvider.java       |   4 +-
 .../openbis/generic/shared/ICommonServer.java |  23 ++-
 .../validator/DeletionValidator.java          |  68 ++++++++
 .../basic/dto/DatabaseModificationKind.java   |   2 +-
 .../generic/shared/dto/DeletionPE.java        |  11 +-
 .../shared/translator/DataSetTranslator.java  |   2 +-
 .../shared/translator/DeletionTranslator.java |  13 ++
 .../shared/translator/ProjectTranslator.java  |   2 +-
 .../translator/RoleAssignmentTranslator.java  |   2 +-
 .../shared/translator/SampleTranslator.java   |   2 +-
 ...upTranslator.java => SpaceTranslator.java} |  28 +--
 .../generic/server/CommonServerTest.java      |   6 +-
 .../validator/GroupValidatorTest.java         |   8 +-
 .../MatchingEntityValidatorTest.java          |   4 +-
 29 files changed, 522 insertions(+), 50 deletions(-)
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/deletion/DeletionGrid.java
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/DeletionGridColumnIDs.java
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/DeletionsProvider.java
 rename openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/{InvalidationDAO.java => DeletionDAO.java} (98%)
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/validator/DeletionValidator.java
 rename openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/{GroupTranslator.java => SpaceTranslator.java} (73%)

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 1581955c3a7..237890b965a 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
@@ -60,6 +60,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Deletion;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletionType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DynamicPropertyEvaluationInfo;
@@ -347,6 +348,13 @@ public interface ICommonClientService extends IClientService
             DefaultResultSetConfig<String, TableModelRowWithObject<Project>> criteria)
             throws UserFailureException;
 
+    /**
+     * Returns a list of all deletions.
+     */
+    public TypedTableResultSet<Deletion> listDeletions(
+            DefaultResultSetConfig<String, TableModelRowWithObject<Deletion>> criteria)
+            throws UserFailureException;
+
     /**
      * Like {@link #prepareExportSamples(TableExportCriteria)}, but for projects.
      */
@@ -354,6 +362,13 @@ public interface ICommonClientService extends IClientService
             final TableExportCriteria<TableModelRowWithObject<Project>> criteria)
             throws UserFailureException;
 
+    /**
+     * Like {@link #prepareExportSamples(TableExportCriteria)}, but for deletions.
+     */
+    public String prepareExportDeletions(
+            final TableExportCriteria<TableModelRowWithObject<Deletion>> criteria)
+            throws UserFailureException;
+
     /**
      * Returns a list of all vocabularies.
      * <p>
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 77931500a18..045e0e58b99 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
@@ -62,6 +62,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Deletion;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletionType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DynamicPropertyEvaluationInfo;
@@ -289,11 +290,21 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
             DefaultResultSetConfig<String, TableModelRowWithObject<Project>> criteria,
             final AsyncCallback<TypedTableResultSet<Project>> asyncCallback);
 
+    /** @see ICommonClientService#listDeletions(DefaultResultSetConfig) */
+    public void listDeletions(
+            DefaultResultSetConfig<String, TableModelRowWithObject<Deletion>> criteria,
+            final AsyncCallback<TypedTableResultSet<Deletion>> asyncCallback);
+
     /** @see ICommonClientService#prepareExportProjects(TableExportCriteria) */
     public void prepareExportProjects(
             TableExportCriteria<TableModelRowWithObject<Project>> exportCriteria,
             AsyncCallback<String> callback);
 
+    /** @see ICommonClientService#prepareExportDeletions(TableExportCriteria) */
+    public void prepareExportDeletions(
+            TableExportCriteria<TableModelRowWithObject<Deletion>> exportCriteria,
+            AsyncCallback<String> callback);
+
     /**
      * @see ICommonClientService#listVocabularies(boolean, boolean, DefaultResultSetConfig)
      */
@@ -899,14 +910,16 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
     /**
      * @see ICommonClientService#listGridCustomColumns(String, DefaultResultSetConfig)
      */
-    public void listGridCustomColumns(String gridId,
+    public void listGridCustomColumns(
+            String gridId,
             DefaultResultSetConfig<String, TableModelRowWithObject<GridCustomColumn>> resultSetConfig,
             AsyncCallback<TypedTableResultSet<GridCustomColumn>> callback);
 
     /**
      * @see ICommonClientService#prepareExportColumns(TableExportCriteria)
      */
-    public void prepareExportColumns(final TableExportCriteria<TableModelRowWithObject<GridCustomColumn>> criteria,
+    public void prepareExportColumns(
+            final TableExportCriteria<TableModelRowWithObject<GridCustomColumn>> criteria,
             AsyncCallback<String> asyncCallback);
 
     /** @see ICommonClientService#registerColumn(NewColumnOrFilter) */
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 fe3ba287f1f..c7f489f94b0 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
@@ -514,6 +514,12 @@ public abstract class Dict
     public static final String CANNOT_MODIFY_DELETED_ENTITY_MSG =
             "cannot_modify_deleted_entity_msg";
 
+    public static final String DELETION_BROWSER = "deletion_browser";
+
+    public static final String BUTTON_REVERT_DELETION = "button_revert_deletion";
+
+    public static final String BUTTON_DELETE_PERMANENTLY = "button_delete_permanently";
+
     //
     // Sample Viewer
     //
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
index 7664ceff605..326ca8e8905 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
@@ -35,6 +35,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.Da
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.DataSetTypeGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.DataSetUploadForm;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.FileFormatTypeGrid;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.deletion.DeletionGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ExperimentBatchRegistrationPanel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ExperimentBrowserGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ExperimentRegistrationPanel;
@@ -953,6 +954,44 @@ public final class ComponentProvider
             };
     }
 
+    public final AbstractTabItemFactory getDeletionBrowser()
+    {
+        return new AbstractTabItemFactory()
+            {
+                @Override
+                public ITabItem create()
+                {
+                    IDisposableComponent component = DeletionGrid.create(viewContext);
+                    return createTab(getTabTitle(), component);
+                }
+
+                @Override
+                public String getId()
+                {
+                    return DeletionGrid.BROWSER_ID;
+                }
+
+                @Override
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return HelpPageIdentifier.createSpecific(getMessage(Dict.DELETION_BROWSER));
+                }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.DELETION_BROWSER);
+                }
+
+                @Override
+                public String tryGetLink()
+                {
+                    return null;
+                }
+
+            };
+    }
+
     public AbstractTabItemFactory getExperimentBrowser(final String initialSpaceOrNull,
             final String initialProjectOrNull, final String initialExperimentTypeOrNull)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplayTypeIDGenerator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplayTypeIDGenerator.java
index 3b2075b08ac..19be3afc561 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplayTypeIDGenerator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplayTypeIDGenerator.java
@@ -48,6 +48,8 @@ public enum DisplayTypeIDGenerator implements IDisplayTypeIDGenerator
 
     PROJECT_BROWSER_GRID("project-browser-grid"),
 
+    DELETION_BROWSER_GRID("deletion-browser-grid"),
+
     FILTER_BROWSER_GRID("filter-browser-grid"),
 
     CUSTOM_GRID_COLUMN_GRID("custom-grid-column-browser-grid"),
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 67623d3a69f..8dcf4440cf9 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
@@ -55,7 +55,7 @@ public class TopMenu extends LayoutContainer
         AUTHORIZATION_MENU_USERS, AUTHORIZATION_MENU_ROLES,
         AUTHORIZATION_MENU_AUTHORIZATION_GROUPS,
 
-        LOGGING_CONSOLE,
+        TRASH, LOGGING_CONSOLE,
 
         DATA_SET_MENU_SEARCH, DATA_SET_MENU_TYPES, DATA_SET_MENU_FILE_FORMATS,
         DATA_SET_MENU_UPLOAD, DATA_SET_MENU_UPLOAD_CLIENT, DATA_SET_MENU_MASS_UPDATE,
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/administration/AdministrationMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/administration/AdministrationMenu.java
index e20df7990c3..2623232c722 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/administration/AdministrationMenu.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/administration/AdministrationMenu.java
@@ -51,6 +51,8 @@ public class AdministrationMenu extends TopMenuItem
         submenu.add(new AuthorizationMenu(messageProvider, componentProvider));
         submenu.add(new ActionMenu(TopMenu.ActionMenuKind.DATA_SET_MENU_FILE_FORMATS,
                 messageProvider, componentProvider.getFileFormatTypeBrowser()));
+        submenu.add(new ActionMenu(TopMenu.ActionMenuKind.TRASH, messageProvider, componentProvider
+                .getDeletionBrowser()));
         if (viewContext.isLoggingEnabled())
         {
             submenu.add(new ActionMenu(TopMenu.ActionMenuKind.LOGGING_CONSOLE, messageProvider,
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
new file mode 100644
index 00000000000..0687e35f454
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/deletion/DeletionGrid.java
@@ -0,0 +1,163 @@
+/*
+ * 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.Arrays;
+import java.util.List;
+
+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;
+
+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.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;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DeletionGridColumnIDs;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
+import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Deletion;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
+
+/**
+ * Grid displaying deletions.
+ * 
+ * @author Piotr Buczek
+ */
+public class DeletionGrid extends TypedTableGrid<Deletion>
+{
+    // browser consists of the grid and the paging toolbar
+    public static final String BROWSER_ID = GenericConstants.ID_PREFIX + "deletion-browser";
+
+    public static final String GRID_ID = BROWSER_ID + TypedTableGrid.GRID_POSTFIX;
+
+    public static IDisposableComponent create(
+            final IViewContext<ICommonClientServiceAsync> viewContext)
+    {
+        final DeletionGrid grid = new DeletionGrid(viewContext);
+        grid.extendBottomToolbar();
+        return grid.asDisposableWithoutToolbar();
+    }
+
+    private DeletionGrid(IViewContext<ICommonClientServiceAsync> viewContext)
+    {
+        super(viewContext, BROWSER_ID, true, DisplayTypeIDGenerator.DELETION_BROWSER_GRID);
+    }
+
+    private void extendBottomToolbar()
+    {
+        addEntityOperationsLabel();
+
+        Button revertButton =
+                createSelectedItemButton(
+                        viewContext.getMessage(Dict.BUTTON_REVERT_DELETION),
+                        new ISelectedEntityInvoker<BaseEntityModel<TableModelRowWithObject<Deletion>>>()
+                            {
+                                public void invoke(
+                                        BaseEntityModel<TableModelRowWithObject<Deletion>> selectedItem,
+                                        boolean keyPressed)
+                                {
+                                    // TODO
+                                    MessageBox.info("Not implemented yet", "", null);
+                                }
+                            });
+        addButton(revertButton);
+
+        Button deletePermanentlyButton =
+                createSelectedItemButton(
+                        viewContext.getMessage(Dict.BUTTON_DELETE_PERMANENTLY),
+                        new ISelectedEntityInvoker<BaseEntityModel<TableModelRowWithObject<Deletion>>>()
+                            {
+                                public void invoke(
+                                        BaseEntityModel<TableModelRowWithObject<Deletion>> selectedItem,
+                                        boolean keyPressed)
+                                {
+                                    // TODO
+                                    MessageBox.info("Not implemented yet", "", null);
+                                }
+                            });
+        addButton(deletePermanentlyButton);
+        allowMultipleSelection(); // we allow deletion/revert of multiple deletions
+
+        addEntityOperationsSeparator();
+    }
+
+    @Override
+    protected String translateColumnIdToDictionaryKey(String columnID)
+    {
+        return columnID.toLowerCase();
+    }
+
+    @Override
+    protected ColumnDefsAndConfigs<TableModelRowWithObject<Deletion>> createColumnsDefinition()
+    {
+        ColumnDefsAndConfigs<TableModelRowWithObject<Deletion>> schema =
+                super.createColumnsDefinition();
+        schema.setGridCellRendererFor(DeletionGridColumnIDs.REASON,
+                createMultilineStringCellRenderer());
+        schema.setGridCellRendererFor(DeletionGridColumnIDs.REGISTRATOR,
+                PersonRenderer.REGISTRATOR_RENDERER);
+        return schema;
+    }
+
+    @Override
+    protected void listTableRows(
+            DefaultResultSetConfig<String, TableModelRowWithObject<Deletion>> resultSetConfig,
+            AsyncCallback<TypedTableResultSet<Deletion>> callback)
+    {
+        viewContext.getService().listDeletions(resultSetConfig, callback);
+    }
+
+    @Override
+    protected void prepareExportEntities(
+            TableExportCriteria<TableModelRowWithObject<Deletion>> exportCriteria,
+            AbstractAsyncCallback<String> callback)
+    {
+        viewContext.getService().prepareExportDeletions(exportCriteria, callback);
+    }
+
+    @Override
+    protected List<String> getColumnIdsOfFilters()
+    {
+        return Arrays.asList(DeletionGridColumnIDs.REGISTRATOR, DeletionGridColumnIDs.REASON);
+    }
+
+    @Override
+    protected void showEntityViewer(final TableModelRowWithObject<Deletion> row, boolean editMode,
+            boolean inBackground)
+    {
+        throw new UserFailureException("Operation is not supported.");
+    }
+
+    @Override
+    public DatabaseModificationKind[] getRelevantModifications()
+    {
+        return new DatabaseModificationKind[]
+            { DatabaseModificationKind.createOrDelete(ObjectKind.DELETION) };
+    }
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/DeletionGridColumnIDs.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/DeletionGridColumnIDs.java
new file mode 100644
index 00000000000..97683c8beb5
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/DeletionGridColumnIDs.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2011 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.dto;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.deletion.DeletionGrid;
+
+/**
+ * IDs of column of {@link DeletionGrid}.
+ * 
+ * @author Piotr Buczek
+ */
+public class DeletionGridColumnIDs
+{
+    public static final String REASON = "REASON";
+
+    public static final String REGISTRATOR = "REGISTRATOR";
+
+    public static final String REGISTRATION_DATE = "REGISTRATION_DATE";
+
+}
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 54af012ef0f..12e5b0036f2 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
@@ -72,6 +72,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.Authorizatio
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.CacheManager;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.CustomGridColumnProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.DataSetTypeProvider;
+import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.DeletionsProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.EntityTypeProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.ExperimentProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.FileFormatTypesProvider;
@@ -118,6 +119,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetTypePropertyType
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Deletion;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletionType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DynamicPropertyEvaluationInfo;
@@ -400,6 +402,12 @@ public final class CommonClientService extends AbstractClientService implements
         return prepareExportEntities(criteria);
     }
 
+    public String prepareExportDeletions(
+            TableExportCriteria<TableModelRowWithObject<Deletion>> criteria)
+    {
+        return prepareExportEntities(criteria);
+    }
+
     public String prepareExportVocabularies(
             final TableExportCriteria<TableModelRowWithObject<Vocabulary>> criteria)
     {
@@ -661,6 +669,15 @@ public final class CommonClientService extends AbstractClientService implements
         return listEntities(projectsProvider, criteria);
     }
 
+    public TypedTableResultSet<Deletion> listDeletions(
+            DefaultResultSetConfig<String, TableModelRowWithObject<Deletion>> criteria)
+            throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
+    {
+        DeletionsProvider deletionsProvider =
+                new DeletionsProvider(commonServer, getSessionToken());
+        return listEntities(deletionsProvider, criteria);
+    }
+
     public TypedTableResultSet<Vocabulary> listVocabularies(boolean withTerms,
             boolean excludeInternal,
             DefaultResultSetConfig<String, TableModelRowWithObject<Vocabulary>> criteria)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/DeletionsProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/DeletionsProvider.java
new file mode 100644
index 00000000000..11ec9dbc909
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/DeletionsProvider.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2011 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.resultset;
+
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.DeletionGridColumnIDs.REASON;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.DeletionGridColumnIDs.REGISTRATION_DATE;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.DeletionGridColumnIDs.REGISTRATOR;
+
+import java.util.List;
+
+import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Deletion;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel;
+import ch.systemsx.cisd.openbis.generic.shared.util.TypedTableModelBuilder;
+
+/**
+ * Table model provider of {@link Deletion} instances.
+ * 
+ * @author Piotr Buczek
+ */
+public class DeletionsProvider extends AbstractCommonTableModelProvider<Deletion>
+{
+    public DeletionsProvider(ICommonServer commonServer, String sessionToken)
+    {
+        super(commonServer, sessionToken);
+    }
+
+    @Override
+    protected TypedTableModel<Deletion> createTableModel()
+    {
+        List<Deletion> deletions = commonServer.listDeletions(sessionToken);
+        TypedTableModelBuilder<Deletion> builder = new TypedTableModelBuilder<Deletion>();
+        builder.addColumn(REGISTRATION_DATE).withDefaultWidth(300);
+        builder.addColumn(REGISTRATOR).withDefaultWidth(200);
+        builder.addColumn(REASON).withDefaultWidth(500);
+        for (Deletion deletion : deletions)
+        {
+            builder.addRow(deletion);
+            builder.column(REGISTRATION_DATE).addDate(deletion.getRegistrationDate());
+            builder.column(REGISTRATOR).addPerson(deletion.getRegistrator());
+            builder.column(REASON).addString(deletion.getReason());
+        }
+        return builder.getModel();
+    }
+
+}
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 91f8738751d..47c0c90045a 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
@@ -103,6 +103,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletedDataSet;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Deletion;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletionType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DynamicPropertyEvaluationInfo;
@@ -173,6 +174,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.DataStorePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataStoreServicePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityPropertyPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePropertyTypePE;
@@ -216,10 +218,10 @@ import ch.systemsx.cisd.openbis.generic.shared.translator.DataSetTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.DataSetTypeTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.DataStoreServiceTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.DataTypeTranslator;
+import ch.systemsx.cisd.openbis.generic.shared.translator.DeletionTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.DtoConverters;
 import ch.systemsx.cisd.openbis.generic.shared.translator.ExperimentTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.GridCustomExpressionTranslator.GridCustomFilterTranslator;
-import ch.systemsx.cisd.openbis.generic.shared.translator.GroupTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.MaterialTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.MaterialTypeTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.PersonTranslator;
@@ -229,6 +231,7 @@ import ch.systemsx.cisd.openbis.generic.shared.translator.RoleAssignmentTranslat
 import ch.systemsx.cisd.openbis.generic.shared.translator.SampleTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.SampleTypeTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.ScriptTranslator;
+import ch.systemsx.cisd.openbis.generic.shared.translator.SpaceTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.TypeTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.VocabularyTermTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.VocabularyTranslator;
@@ -306,20 +309,28 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     // IGenericServer
     //
 
+    public final List<Deletion> listDeletions(final String sessionToken)
+    {
+        checkSession(sessionToken);
+        final List<DeletionPE> deletions = getDAOFactory().getDeletionDAO().listAllEntities();
+        Collections.sort(deletions);
+        return DeletionTranslator.translate(deletions);
+    }
+
     public final List<Space> listSpaces(final String sessionToken,
             final DatabaseInstanceIdentifier identifier)
     {
         final Session session = getSession(sessionToken);
         final DatabaseInstancePE databaseInstance =
                 GroupIdentifierHelper.getDatabaseInstance(identifier, getDAOFactory());
-        final List<SpacePE> groups = getDAOFactory().getSpaceDAO().listSpaces(databaseInstance);
-        final SpacePE homeGroupOrNull = session.tryGetHomeGroup();
-        for (final SpacePE group : groups)
+        final List<SpacePE> spaces = getDAOFactory().getSpaceDAO().listSpaces(databaseInstance);
+        final SpacePE homeSpaceOrNull = session.tryGetHomeGroup();
+        for (final SpacePE space : spaces)
         {
-            group.setHome(group.equals(homeGroupOrNull));
+            space.setHome(space.equals(homeSpaceOrNull));
         }
-        Collections.sort(groups);
-        return GroupTranslator.translate(groups);
+        Collections.sort(spaces);
+        return SpaceTranslator.translate(spaces);
     }
 
     public final void registerSpace(final String sessionToken, final String spaceCode,
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 0f9a000dce0..dda316c338b 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
@@ -41,6 +41,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetUpdateResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Deletion;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletionType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DynamicPropertyEvaluationInfo;
@@ -1125,4 +1126,9 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
         return null;
     }
 
+    public List<Deletion> listDeletions(String sessionToken)
+    {
+        logAccess(sessionToken, "listDeletions");
+        return null;
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java
index 76781234873..f2cc86e2880 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java
@@ -154,7 +154,7 @@ import ch.systemsx.cisd.openbis.generic.shared.translator.EntityPropertyTranslat
 import ch.systemsx.cisd.openbis.generic.shared.translator.ExperimentTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.ExperimentTranslator.LoadableFields;
 import ch.systemsx.cisd.openbis.generic.shared.translator.ExperimentTypeTranslator;
-import ch.systemsx.cisd.openbis.generic.shared.translator.GroupTranslator;
+import ch.systemsx.cisd.openbis.generic.shared.translator.SpaceTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.MaterialTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.PersonTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.ProjectTranslator;
@@ -1099,7 +1099,7 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
         try
         {
             groupBO.load(identifier);
-            return GroupTranslator.translate(groupBO.getGroup());
+            return SpaceTranslator.translate(groupBO.getGroup());
         } catch (UserFailureException ufe)
         {
             // space does not exist
@@ -1173,7 +1173,7 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
                     registerSpaceInternal(session, newSpace, operationDetails.tryUserIdOrNull());
             spacePEsCreated.add(spacePE);
         }
-        return GroupTranslator.translate(spacePEsCreated);
+        return SpaceTranslator.translate(spacePEsCreated);
     }
 
     private List<Material> createMaterials(Session session,
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/InvalidationDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DeletionDAO.java
similarity index 98%
rename from openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/InvalidationDAO.java
rename to openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DeletionDAO.java
index af281fe5d73..ff6713ec3fd 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/InvalidationDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DeletionDAO.java
@@ -33,8 +33,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
  * 
  * @author Christian Ribeaud
  */
-final class DeletionDAO extends AbstractGenericEntityDAO<DeletionPE> implements
-        IDeletionDAO
+final class DeletionDAO extends AbstractGenericEntityDAO<DeletionPE> implements IDeletionDAO
 {
 
     /**
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDataProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDataProvider.java
index 2f78138485b..00c94c0bb6e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDataProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDataProvider.java
@@ -23,7 +23,7 @@ import java.util.Map;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
-import ch.systemsx.cisd.openbis.generic.shared.translator.GroupTranslator;
+import ch.systemsx.cisd.openbis.generic.shared.translator.SpaceTranslator;
 
 /**
  * Encapsulates data provided to {@link HibernateSearchDAO} by other DAOs.
@@ -40,7 +40,7 @@ public class HibernateSearchDataProvider
         groupsById = new HashMap<String, Space>();
         for (SpacePE group : groups)
         {
-            groupsById.put(group.getId().toString(), GroupTranslator.translate(group));
+            groupsById.put(group.getId().toString(), SpaceTranslator.translate(group));
         }
     }
 
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 7a9be171bec..8d2ed5673eb 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
@@ -45,6 +45,7 @@ import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.SampleTec
 import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.SampleTechIdPredicate;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.SampleUpdatesPredicate;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.SpaceIdentifierPredicate;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.validator.DeletionValidator;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.validator.ExpressionValidator;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.validator.ExternalDataValidator;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.validator.MatchingEntityValidator;
@@ -68,6 +69,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Deletion;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletionType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DynamicPropertyEvaluationInfo;
@@ -159,7 +161,7 @@ public interface ICommonServer extends IServer
             EntityKind entityKindOrNull);
 
     /**
-     * Returns all spaces which belong to the specified database instance. *
+     * Returns deletions which belong to the specified database instance. *
      * 
      * @return a sorted list of {@link Space}.
      */
@@ -753,7 +755,8 @@ public interface ICommonServer extends IServer
      */
     @Transactional
     @RolesAllowed(RoleWithHierarchy.SPACE_POWER_USER)
-    @DatabaseCreateOrDeleteModification(value = ObjectKind.DATA_SET)
+    @DatabaseCreateOrDeleteModification(value =
+        { ObjectKind.DATA_SET, ObjectKind.DELETION })
     public void deleteDataSets(String sessionToken,
             @AuthorizationGuard(guardClass = DataSetCodePredicate.class) List<String> dataSetCodes,
             String reason, DeletionType type);
@@ -763,7 +766,8 @@ public interface ICommonServer extends IServer
      */
     @Transactional
     @RolesAllowed(RoleWithHierarchy.SPACE_POWER_USER)
-    @DatabaseCreateOrDeleteModification(value = ObjectKind.SAMPLE)
+    @DatabaseCreateOrDeleteModification(value =
+        { ObjectKind.SAMPLE, ObjectKind.DELETION })
     public void deleteSamples(
             String sessionToken,
             @AuthorizationGuard(guardClass = SampleTechIdCollectionPredicate.class) List<TechId> sampleIds,
@@ -774,7 +778,8 @@ public interface ICommonServer extends IServer
      */
     @Transactional
     @RolesAllowed(RoleWithHierarchy.SPACE_POWER_USER)
-    @DatabaseCreateOrDeleteModification(value = ObjectKind.EXPERIMENT)
+    @DatabaseCreateOrDeleteModification(value =
+        { ObjectKind.EXPERIMENT, ObjectKind.DELETION })
     public void deleteExperiments(
             String sessionToken,
             @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class) List<TechId> experimentIds,
@@ -1424,4 +1429,14 @@ public interface ICommonServer extends IServer
     public void updateMaterialProperties(String sessionToken, TechId entityId,
             List<PropertyUpdates> modifiedProperties);
 
+    /**
+     * Returns all deletions.
+     * 
+     * @return a sorted list of {@link Deletion}.
+     */
+    @Transactional(readOnly = true)
+    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @ReturnValueFilter(validatorClass = DeletionValidator.class)
+    public List<Deletion> listDeletions(String sessionToken);
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/validator/DeletionValidator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/validator/DeletionValidator.java
new file mode 100644
index 00000000000..ca764177d9d
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/validator/DeletionValidator.java
@@ -0,0 +1,68 @@
+/*
+ * 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.shared.authorization.validator;
+
+import java.util.Set;
+
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Deletion;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Person;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy.RoleCode;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.RoleAssignmentPE;
+
+/**
+ * A {@link IValidator} implementation for a {@link Deletion}.
+ * 
+ * @author Izabela Adamczyk
+ */
+public final class DeletionValidator extends AbstractValidator<Deletion>
+{
+    //
+    // IValidator
+    //
+
+    @Override
+    public final boolean doValidation(final PersonPE person, final Deletion value)
+    {
+        // only creator of deletion and instance admin can see it
+        return isRegistrator(person, value) || isInstanceAdmin(person);
+    }
+
+    private boolean isRegistrator(final PersonPE person, final Deletion value)
+    {
+        Person registrator = value.getRegistrator();
+        return person.getUserId().equals(registrator.getUserId())
+                && person.getDatabaseInstance().getCode()
+                        .equals(registrator.getDatabaseInstance().getCode());
+    }
+
+    private static boolean isInstanceAdmin(final PersonPE person)
+    {
+        final Set<RoleAssignmentPE> roleAssignments = person.getAllPersonRoles();
+        for (final RoleAssignmentPE roleAssignment : roleAssignments)
+        {
+            final DatabaseInstancePE roleInstance = roleAssignment.getDatabaseInstance();
+            if (roleInstance != null && roleAssignment.getRole().equals(RoleCode.ADMIN))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DatabaseModificationKind.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DatabaseModificationKind.java
index ff0fb026984..a2c14cd880c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DatabaseModificationKind.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DatabaseModificationKind.java
@@ -40,7 +40,7 @@ public class DatabaseModificationKind implements ISerializable
         AUTHORIZATION_GROUP, SAMPLE, EXPERIMENT, MATERIAL, DATA_SET, SAMPLE_TYPE, EXPERIMENT_TYPE,
         MATERIAL_TYPE, DATASET_TYPE, FILE_FORMAT_TYPE, PROJECT, SPACE, PROPERTY_TYPE,
         PROPERTY_TYPE_ASSIGNMENT, VOCABULARY, VOCABULARY_TERM, ROLE_ASSIGNMENT, PERSON,
-        GRID_CUSTOM_FILTER, GRID_CUSTOM_COLUMN, SCRIPT,
+        GRID_CUSTOM_FILTER, GRID_CUSTOM_COLUMN, SCRIPT, DELETION,
         // TODO 2010-02-19, PTR: no easy way to extend current modification notification solution in
         // modules
         QUERY
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DeletionPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DeletionPE.java
index acf01af7d9f..074a474e733 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DeletionPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DeletionPE.java
@@ -43,7 +43,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
 @Entity
 @Table(name = TableNames.DELETIONS_TABLE)
 public class DeletionPE extends HibernateAbstractRegistrationHolder implements IIdHolder,
-        Serializable
+        Serializable, Comparable<DeletionPE>
 {
     private static final long serialVersionUID = IServer.VERSION;
 
@@ -106,4 +106,13 @@ public class DeletionPE extends HibernateAbstractRegistrationHolder implements I
         return ToStringBuilder.reflectionToString(this,
                 ModifiedShortPrefixToStringStyle.MODIFIED_SHORT_PREFIX_STYLE);
     }
+
+    //
+    // Comparable - registration date based
+    //
+
+    public final int compareTo(final DeletionPE o)
+    {
+        return this.getRegistrationDate().compareTo(o.getRegistrationDate());
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java
index 8c983621afb..0a0d867e6c6 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java
@@ -234,7 +234,7 @@ public class DataSetTranslator
         sample.setIdentifier(samplePE.getSampleIdentifier().toString());
         sample.setRegistrationDate(samplePE.getRegistrationDate());
         sample.setRegistrator(PersonTranslator.translate(samplePE.getRegistrator()));
-        sample.setSpace(GroupTranslator.translate(samplePE.getSpace()));
+        sample.setSpace(SpaceTranslator.translate(samplePE.getSpace()));
         if (loadSampleProperties)
         {
             sample.setProperties(EntityPropertyTranslator.translate(samplePE.getProperties(),
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DeletionTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DeletionTranslator.java
index aa5a8f8f16d..09e8eb1d8a3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DeletionTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DeletionTranslator.java
@@ -16,6 +16,9 @@
 
 package ch.systemsx.cisd.openbis.generic.shared.translator;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Deletion;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 
@@ -32,6 +35,16 @@ public final class DeletionTranslator
         // Can not be instantiated.
     }
 
+    public final static List<Deletion> translate(final List<DeletionPE> deletions)
+    {
+        final List<Deletion> result = new ArrayList<Deletion>();
+        for (final DeletionPE deletion : deletions)
+        {
+            result.add(translate(deletion));
+        }
+        return result;
+    }
+
     public final static Deletion translate(final DeletionPE deletion)
     {
         if (deletion == null)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/ProjectTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/ProjectTranslator.java
index 457ea9f2260..994388cd2df 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/ProjectTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/ProjectTranslator.java
@@ -61,7 +61,7 @@ public final class ProjectTranslator
         result.setModificationDate(project.getModificationDate());
         result.setCode(project.getCode());
         result.setDescription(project.getDescription());
-        result.setSpace(GroupTranslator.translate(project.getSpace()));
+        result.setSpace(SpaceTranslator.translate(project.getSpace()));
         result.setProjectLeader(PersonTranslator.translate(project.getProjectLeader()));
         result.setRegistrator(PersonTranslator.translate(project.getRegistrator()));
         result.setRegistrationDate(project.getRegistrationDate());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/RoleAssignmentTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/RoleAssignmentTranslator.java
index 6409fd7a7dc..3bb46d41df4 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/RoleAssignmentTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/RoleAssignmentTranslator.java
@@ -53,7 +53,7 @@ public final class RoleAssignmentTranslator
             return null;
         }
         final RoleAssignment result = new RoleAssignment();
-        result.setSpace(GroupTranslator.translate(role.getSpace()));
+        result.setSpace(SpaceTranslator.translate(role.getSpace()));
         result.setInstance(DatabaseInstanceTranslator.translate(role.getDatabaseInstance()));
         result.setPerson(PersonTranslator.translate(role.getPerson()));
         result.setAuthorizationGroup(AuthorizationGroupTranslator.translate(role
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SampleTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SampleTranslator.java
index b3eca0dbc92..8baf9591748 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SampleTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SampleTranslator.java
@@ -99,7 +99,7 @@ public final class SampleTranslator
                 new HashMap<PropertyTypePE, PropertyType>()));
         if (withDetails)
         {
-            result.setSpace(GroupTranslator.translate(samplePE.getSpace()));
+            result.setSpace(SpaceTranslator.translate(samplePE.getSpace()));
             result.setDatabaseInstance(DatabaseInstanceTranslator.translate(samplePE
                     .getDatabaseInstance()));
             result.setRegistrator(PersonTranslator.translate(samplePE.getRegistrator()));
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/GroupTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SpaceTranslator.java
similarity index 73%
rename from openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/GroupTranslator.java
rename to openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SpaceTranslator.java
index cbf2b928f51..1b9272b0fbe 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/GroupTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SpaceTranslator.java
@@ -29,37 +29,37 @@ import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
  * 
  * @author Franz-Josef Elmer
  */
-public final class GroupTranslator
+public final class SpaceTranslator
 {
-    private GroupTranslator()
+    private SpaceTranslator()
     {
         // Can not be instantiated.
     }
 
-    public final static List<Space> translate(final List<SpacePE> groups)
+    public final static List<Space> translate(final List<SpacePE> spaces)
     {
         final List<Space> result = new ArrayList<Space>();
-        for (final SpacePE group : groups)
+        for (final SpacePE space : spaces)
         {
-            result.add(GroupTranslator.translate(group));
+            result.add(SpaceTranslator.translate(space));
         }
         return result;
     }
 
-    public static Space translate(final SpacePE group)
+    public static Space translate(final SpacePE space)
     {
-        if (group == null)
+        if (space == null)
         {
             return null;
         }
         final Space result = new Space();
-        result.setId(HibernateUtils.getId(group));
-        result.setCode(group.getCode());
-        result.setDescription(group.getDescription());
-        result.setInstance(DatabaseInstanceTranslator.translate(group.getDatabaseInstance()));
-        result.setRegistrationDate(group.getRegistrationDate());
-        result.setRegistrator(PersonTranslator.translate(group.getRegistrator()));
-        result.setIdentifier(IdentifierHelper.createGroupIdentifier(group).toString());
+        result.setId(HibernateUtils.getId(space));
+        result.setCode(space.getCode());
+        result.setDescription(space.getDescription());
+        result.setInstance(DatabaseInstanceTranslator.translate(space.getDatabaseInstance()));
+        result.setRegistrationDate(space.getRegistrationDate());
+        result.setRegistrator(PersonTranslator.translate(space.getRegistrator()));
+        result.setIdentifier(IdentifierHelper.createGroupIdentifier(space).toString());
         return result;
     }
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java
index e7723b0d5f4..8673d8ad09a 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java
@@ -96,7 +96,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.translator.DataSetTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.DtoConverters;
 import ch.systemsx.cisd.openbis.generic.shared.translator.ExperimentTranslator;
-import ch.systemsx.cisd.openbis.generic.shared.translator.GroupTranslator;
+import ch.systemsx.cisd.openbis.generic.shared.translator.SpaceTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.MaterialTypeTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.PersonTranslator;
 
@@ -357,8 +357,8 @@ public final class CommonServerTest extends AbstractServerTestCase
 
         final List<Space> groups = createServer().listSpaces(SESSION_TOKEN, identifier);
 
-        assertEquals(GroupTranslator.translate(g1), groups.get(0));
-        assertEquals(GroupTranslator.translate(g2), groups.get(1));
+        assertEquals(SpaceTranslator.translate(g1), groups.get(0));
+        assertEquals(SpaceTranslator.translate(g2), groups.get(1));
         assertEquals(2, groups.size());
         assertEquals(true, g1.isHome().booleanValue());
         assertEquals(false, g2.isHome().booleanValue());
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/authorization/validator/GroupValidatorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/authorization/validator/GroupValidatorTest.java
index c4cf4e9b884..e268d676462 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/authorization/validator/GroupValidatorTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/authorization/validator/GroupValidatorTest.java
@@ -23,7 +23,7 @@ import ch.systemsx.cisd.openbis.generic.shared.authorization.AuthorizationTestCa
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
-import ch.systemsx.cisd.openbis.generic.shared.translator.GroupTranslator;
+import ch.systemsx.cisd.openbis.generic.shared.translator.SpaceTranslator;
 
 /**
  * Test cases for corresponding {@link SpaceValidator} class.
@@ -53,7 +53,7 @@ public final class GroupValidatorTest extends AuthorizationTestCase
         final SpaceValidator groupValidator = new SpaceValidator();
         final PersonPE personPE = createPerson();
         final SpacePE groupPE = createGroup();
-        final Space space = GroupTranslator.translate(groupPE);
+        final Space space = SpaceTranslator.translate(groupPE);
         
         assertFalse(groupValidator.isValid(personPE, space));
 
@@ -66,7 +66,7 @@ public final class GroupValidatorTest extends AuthorizationTestCase
         final SpaceValidator groupValidator = new SpaceValidator();
         final PersonPE personPE = createPersonWithRoleAssignments();
         final SpacePE groupPE = createAnotherGroup();
-        final Space space = GroupTranslator.translate(groupPE);
+        final Space space = SpaceTranslator.translate(groupPE);
         assertTrue(groupValidator.isValid(personPE, space));
         context.assertIsSatisfied();
     }
@@ -77,7 +77,7 @@ public final class GroupValidatorTest extends AuthorizationTestCase
         final SpaceValidator groupValidator = new SpaceValidator();
         final PersonPE personPE = createPersonWithRoleAssignments();
         final SpacePE groupPE = createGroup();
-        final Space space = GroupTranslator.translate(groupPE);
+        final Space space = SpaceTranslator.translate(groupPE);
         assertTrue(groupValidator.isValid(personPE, space));
         context.assertIsSatisfied();
     }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/authorization/validator/MatchingEntityValidatorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/authorization/validator/MatchingEntityValidatorTest.java
index 89fa6699737..3bfdbb31a80 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/authorization/validator/MatchingEntityValidatorTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/authorization/validator/MatchingEntityValidatorTest.java
@@ -28,7 +28,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.IMatchingEntity;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
-import ch.systemsx.cisd.openbis.generic.shared.translator.GroupTranslator;
+import ch.systemsx.cisd.openbis.generic.shared.translator.SpaceTranslator;
 
 /**
  * Test cases for corresponding {@link MatchingEntityValidator} class.
@@ -45,7 +45,7 @@ public final class MatchingEntityValidatorTest extends AuthorizationTestCase
     private static MatchingEntity asMatchingEntityStub(IMatchingEntity matchingEntity)
     {
         final MatchingEntity result = new MatchingEntity();
-        result.setSpace(GroupTranslator.translate(tryGetGroup(matchingEntity)));
+        result.setSpace(SpaceTranslator.translate(tryGetGroup(matchingEntity)));
         return result;
     }
 
-- 
GitLab