From 04210d8e21bde67f08890e233c95f5d3f2ebf10f Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Mon, 18 Jul 2011 17:19:04 +0000
Subject: [PATCH] [LMS-2364] refatorization: moved common code for moving to
 trash to DeletionDAO

SVN: 22185
---
 .../server/CommonBusinessObjectFactory.java   |  6 +--
 .../server/business/bo/DataSetTable.java      | 14 ------
 .../server/business/bo/ExperimentBO.java      | 14 ------
 .../server/business/bo/IDataSetTable.java     | 11 -----
 .../server/business/bo/IExperimentBO.java     |  9 ----
 .../server/business/bo/ISampleTable.java      | 10 -----
 .../server/business/bo/SampleTable.java       | 14 ------
 .../generic/server/business/bo/TrashBO.java   | 16 +++----
 .../generic/server/dataaccess/IDataDAO.java   |  4 --
 .../server/dataaccess/IDeletionDAO.java       | 16 ++++++-
 .../server/dataaccess/IExperimentDAO.java     |  7 ---
 .../generic/server/dataaccess/ISampleDAO.java |  7 ---
 .../generic/server/dataaccess/db/DataDAO.java | 44 ++-----------------
 .../server/dataaccess/db/DeletionDAO.java     | 41 +++++++++++++++++
 .../server/dataaccess/db/ExperimentDAO.java   | 42 ------------------
 .../server/dataaccess/db/SampleDAO.java       | 43 +-----------------
 16 files changed, 69 insertions(+), 229 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonBusinessObjectFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonBusinessObjectFactory.java
index 517874a56a1..d4ec1e0e09d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonBusinessObjectFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonBusinessObjectFactory.java
@@ -40,7 +40,6 @@ import ch.systemsx.cisd.openbis.generic.server.business.bo.IExperimentBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.IExperimentTable;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.IGridCustomFilterOrColumnBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.IGroupBO;
-import ch.systemsx.cisd.openbis.generic.server.business.bo.ITrashBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.IMaterialBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.IMaterialTable;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.IProjectBO;
@@ -50,9 +49,9 @@ import ch.systemsx.cisd.openbis.generic.server.business.bo.IRoleAssignmentTable;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.ISampleBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.ISampleTable;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.IScriptBO;
+import ch.systemsx.cisd.openbis.generic.server.business.bo.ITrashBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.IVocabularyBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.IVocabularyTermBO;
-import ch.systemsx.cisd.openbis.generic.server.business.bo.TrashBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.MaterialBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.MaterialTable;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.ProjectBO;
@@ -62,6 +61,7 @@ import ch.systemsx.cisd.openbis.generic.server.business.bo.RoleAssignmentTable;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.SampleBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.SampleTable;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.ScriptBO;
+import ch.systemsx.cisd.openbis.generic.server.business.bo.TrashBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.VocabularyBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.VocabularyTermBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.datasetlister.DatasetLister;
@@ -216,6 +216,6 @@ public final class CommonBusinessObjectFactory extends AbstractBusinessObjectFac
 
     public ITrashBO createTrashBO(Session session)
     {
-        return new TrashBO(getDaoFactory(), session, this);
+        return new TrashBO(getDaoFactory(), session);
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java
index 4c73d12f65e..868d208f595 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java
@@ -57,7 +57,6 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUploadContext;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataStorePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
-import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePropertyTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EventPE;
@@ -235,19 +234,6 @@ public final class DataSetTable extends AbstractDataSetBusinessObject implements
         dataSets.addAll(getDataDAO().listDataSets(experiment));
     }
 
-    public int trashByTechIds(List<TechId> dataSetIds, DeletionPE deletion)
-            throws UserFailureException
-    {
-        try
-        {
-            return getDataDAO().trash(dataSetIds, deletion);
-        } catch (final DataAccessException ex)
-        {
-            throwException(ex, "Data Set", EntityKind.DATA_SET);
-        }
-        return -1; // not possible
-    }
-
     public void deleteLoadedDataSets(String reason)
     {
         assertDatasetsAreDeletable(dataSets);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
index 20348f239ed..98fd39655fc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
@@ -39,7 +39,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedProperty;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AttachmentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EventPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EventPE.EntityType;
@@ -208,19 +207,6 @@ public final class ExperimentBO extends AbstractBusinessObject implements IExper
                 + "') not found in experiment '" + experiment.getIdentifier() + "'.");
     }
 
-    public int trashByTechIds(List<TechId> experimentIds, DeletionPE deletion)
-            throws UserFailureException
-    {
-        try
-        {
-            return getExperimentDAO().trash(experimentIds, deletion);
-        } catch (final DataAccessException ex)
-        {
-            throwException(ex, "Experiment", EntityKind.EXPERIMENT);
-        }
-        return -1; // not possible
-    }
-
     public void deleteByTechIds(List<TechId> experimentIds, String reason)
             throws UserFailureException
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IDataSetTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IDataSetTable.java
index d3bb6d8ffc3..895671ce203 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IDataSetTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IDataSetTable.java
@@ -19,7 +19,6 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo;
 import java.util.List;
 import java.util.Map;
 
-import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewDataSet;
@@ -27,7 +26,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUploadContext;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataStorePE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE;
 
 /**
@@ -70,15 +68,6 @@ public interface IDataSetTable
      */
     void setDataSets(List<DataPE> dataSets);
 
-    /**
-     * Moves data sets to trash with given deletion.
-     * 
-     * @param dataSetIds data set technical identifiers
-     * @throws UserFailureException if one of the data sets can not be moved to trash.
-     */
-    public int trashByTechIds(List<TechId> dataSetIds, DeletionPE deletion)
-            throws UserFailureException;
-
     /**
      * Permanently Deletes loaded data sets for specified reason.
      */
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IExperimentBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IExperimentBO.java
index 6d4512b9211..830393007de 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IExperimentBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IExperimentBO.java
@@ -23,7 +23,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedProperty;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AttachmentPE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
@@ -83,14 +82,6 @@ public interface IExperimentBO extends IEntityBusinessObject
      */
     void deleteByTechIds(List<TechId> experimentIds, String reason);
 
-    /**
-     * Moves experiment to trash with given deletion.
-     * 
-     * @param experimentIds experiment technical identifiers
-     * @throws UserFailureException if one of the experiments can not be moved to trash.
-     */
-    int trashByTechIds(List<TechId> experimentIds, DeletionPE deletion);
-
     /**
      * Changes the value of a managed property.
      */
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ISampleTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ISampleTable.java
index 1fa3e8fcc17..edf03ef6e9e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ISampleTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ISampleTable.java
@@ -21,7 +21,6 @@ import java.util.List;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample;
-import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ListSamplesByPropertyCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleBatchUpdatesDTO;
@@ -72,13 +71,4 @@ public interface ISampleTable
      */
     public void deleteByTechIds(List<TechId> sampleIds, String reason) throws UserFailureException;
 
-    /**
-     * Moves samples to trash with given deletion.
-     * 
-     * @param sampleIds sample technical identifiers
-     * @throws UserFailureException if one of the samples can not be moved to trash.
-     */
-    public int trashByTechIds(List<TechId> sampleIds, DeletionPE deletion)
-            throws UserFailureException;
-
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleTable.java
index 5942b4b7f07..42c245bbe3f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleTable.java
@@ -31,7 +31,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleBatchUpdateDetails;
-import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePropertyTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
@@ -341,17 +340,4 @@ public final class SampleTable extends AbstractSampleBusinessObject implements I
         }
     }
 
-    public int trashByTechIds(List<TechId> sampleIds, DeletionPE deletion)
-            throws UserFailureException
-    {
-        try
-        {
-            return getSampleDAO().trash(sampleIds, deletion);
-        } catch (final DataAccessException ex)
-        {
-            throwException(ex, "Sample", EntityKind.SAMPLE);
-        }
-        return -1; // not possible
-    }
-
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBO.java
index de43071759f..d8b21fdaa42 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBO.java
@@ -27,21 +27,18 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.ISampleDAO;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
+import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
 
 /**
  * @author Piotr Buczek
  */
 public class TrashBO extends AbstractBusinessObject implements ITrashBO
 {
-
-    private final ICommonBusinessObjectFactory boFactory;
-
     private DeletionPE deletion;
 
-    public TrashBO(IDAOFactory daoFactory, Session session, ICommonBusinessObjectFactory boFactory)
+    public TrashBO(IDAOFactory daoFactory, Session session)
     {
         super(daoFactory, session);
-        this.boFactory = boFactory;
     }
 
     public void createDeletion(String reason)
@@ -61,8 +58,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
     public void trashSamples(List<TechId> sampleIds)
     {
         assert deletion != null;
-        ISampleTable sampleTableBO = boFactory.createSampleTable(session);
-        int trashedCount = sampleTableBO.trashByTechIds(sampleIds, deletion);
+        int trashedCount = getDeletionDAO().trash(EntityKind.SAMPLE, sampleIds, deletion);
         if (trashedCount > 0)
         {
             trashSampleDependentChildrenAndComponents(sampleIds);
@@ -73,8 +69,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
     public void trashExperiments(List<TechId> experimentIds)
     {
         assert deletion != null;
-        IExperimentBO experimentBO = boFactory.createExperimentBO(session);
-        int trashedCount = experimentBO.trashByTechIds(experimentIds, deletion);
+        int trashedCount = getDeletionDAO().trash(EntityKind.EXPERIMENT, experimentIds, deletion);
         if (trashedCount > 0)
         {
             trashExperimentDependentDataSets(experimentIds);
@@ -85,8 +80,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
     public void trashDataSets(List<TechId> dataSetIds)
     {
         assert deletion != null;
-        IDataSetTable dataSetTable = boFactory.createDataSetTable(session);
-        dataSetTable.trashByTechIds(dataSetIds, deletion);
+        getDeletionDAO().trash(EntityKind.DATA_SET, dataSetIds, deletion);
         // NOTE: data set children are not cascade trashed - a conscious decision made by Tomek
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDataDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDataDAO.java
index d79f4e2a933..bfd7356f50e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDataDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDataDAO.java
@@ -27,7 +27,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetArchivingStatus;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataStorePE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
@@ -120,9 +119,6 @@ public interface IDataDAO extends IGenericDAO<DataPE>
 
     public void updateDataSets(List<DataPE> externalData);
 
-    /** Move given data sets to trash using specified deletion. */
-    public int trash(List<TechId> dataSetIds, DeletionPE deletion) throws DataAccessException;
-
     /** Returns ids of data sets connected with samples specified by given ids. */
     public List<TechId> listDataSetIdsBySampleIds(final Collection<TechId> samples);
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDeletionDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDeletionDAO.java
index 191b15b9de3..61ae9a0ede5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDeletionDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDeletionDAO.java
@@ -22,6 +22,7 @@ import org.springframework.dao.DataAccessException;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
 
 /**
  * An interface that contains all data access operations on {@link DeletionPE}s.
@@ -30,17 +31,28 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
  */
 public interface IDeletionDAO extends IGenericDAO<DeletionPE>
 {
+    /** Inserts given {@link DeletionPE} into the database. */
+    void create(final DeletionPE deletion) throws DataAccessException;
+
     /**
-     * Inserts given {@link DeletionPE} into the database.
+     * Moves entities with given ids to trash using specified deletion. Ignores ids of entities that
+     * don't exist or are already in the trash.
+     * 
+     * @return number of trashed entities
      */
-    void create(final DeletionPE deletion) throws DataAccessException;
+    int trash(EntityKind entityKind, List<TechId> entityIds, DeletionPE deletion)
+            throws DataAccessException;
 
+    /** Reverts given deletion. The deletion record will be removed from DB. */
     void revert(DeletionPE deletion);
 
+    /** Returns list of ids of samples moved to trash in specified deletions. */
     List<TechId> findTrashedSampleIds(List<TechId> deletionIds);
 
+    /** Returns list of ids of experiments moved to trash in specified deletions. */
     List<TechId> findTrashedExperimentIds(List<TechId> deletionIds);
 
+    /** Returns list of codes of data sets moved to trash in specified deletions. */
     List<String> findTrashedDataSetCodes(List<TechId> deletionIds);
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IExperimentDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IExperimentDAO.java
index 924057cf6fe..f691f6341f6 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IExperimentDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IExperimentDAO.java
@@ -22,8 +22,6 @@ import java.util.Set;
 
 import org.springframework.dao.DataAccessException;
 
-import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
-import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
@@ -107,9 +105,4 @@ public interface IExperimentDAO extends IGenericDAO<ExperimentPE>
      */
     public void createOrUpdateExperiments(List<ExperimentPE> experiments);
 
-    /**
-     * Move experiments with given ids to trash using specified deletion.
-     */
-    public int trash(List<TechId> experimentIds, DeletionPE deletion);
-
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/ISampleDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/ISampleDAO.java
index bb35bce7217..47c21043239 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/ISampleDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/ISampleDAO.java
@@ -24,7 +24,6 @@ import org.springframework.dao.DataAccessException;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 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.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
@@ -131,10 +130,4 @@ public interface ISampleDAO extends IGenericDAO<SamplePE>
      */
     void delete(List<TechId> sampleIds, PersonPE registrator, String reason)
             throws DataAccessException;
-
-    /**
-     * Move samples with given ids to trash using specified deletion.
-     */
-    int trash(List<TechId> sampleIds, DeletionPE deletion) throws DataAccessException;
-
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAO.java
index 650a1753641..1dcebb657f7 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAO.java
@@ -51,7 +51,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetArchivingStatus;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataStorePE;
 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.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
@@ -464,42 +463,6 @@ final class DataDAO extends AbstractGenericEntityWithPropertiesDAO<DataPE> imple
         super.delete(entity);
     }
 
-    public int trash(final List<TechId> dataSetIds, final DeletionPE deletion)
-            throws DataAccessException
-    {
-        if (dataSetIds.isEmpty())
-        {
-            return 0;
-        }
-        final HibernateTemplate hibernateTemplate = getHibernateTemplate();
-        int updatedRows = (Integer) hibernateTemplate.execute(new HibernateCallback()
-            {
-
-                //
-                // HibernateCallback
-                //
-
-                public final Object doInHibernate(final Session session) throws HibernateException,
-                        SQLException
-                {
-                    // NOTE: 'VERSIONED' makes modification time modified too
-                    return session
-                            .createQuery(
-                                    "UPDATE VERSIONED "
-                                            + DataPE.class.getSimpleName()
-                                            + " SET deletion = :deletion WHERE deletion IS NULL AND id IN (:ids) ")
-                            .setParameter("deletion", deletion)
-                            .setParameterList("ids", TechId.asLongs(dataSetIds)).executeUpdate();
-                }
-            });
-        if (operationLog.isInfoEnabled())
-        {
-            operationLog.info(String.format("trashing %d data sets", updatedRows));
-        }
-        hibernateTemplate.flush();
-        return updatedRows;
-    }
-
     @SuppressWarnings("unchecked")
     public Set<TechId> findParentIds(final Collection<TechId> dataSetIds)
     {
@@ -587,7 +550,8 @@ final class DataDAO extends AbstractGenericEntityWithPropertiesDAO<DataPE> imple
         final List<Long> results = cast(getHibernateTemplate().findByCriteria(criteria));
         if (operationLog.isDebugEnabled())
         {
-           operationLog.info(String.format("found %s data sets for given samples", results.size()));
+            operationLog
+                    .info(String.format("found %s data sets for given samples", results.size()));
         }
         return transformNumbers2TechIdList(results);
     }
@@ -601,8 +565,8 @@ final class DataDAO extends AbstractGenericEntityWithPropertiesDAO<DataPE> imple
         final List<Long> results = cast(getHibernateTemplate().findByCriteria(criteria));
         if (operationLog.isDebugEnabled())
         {
-           operationLog
-                .info(String.format("found %s data sets for given experiments", results.size()));
+            operationLog.info(String.format("found %s data sets for given experiments",
+                    results.size()));
         }
         return transformNumbers2TechIdList(results);
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DeletionDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DeletionDAO.java
index 57e1bdf695d..eb8ffd44d73 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DeletionDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DeletionDAO.java
@@ -16,15 +16,19 @@
 
 package ch.systemsx.cisd.openbis.generic.server.dataaccess.db;
 
+import java.sql.SQLException;
 import java.util.List;
 
 import org.apache.log4j.Logger;
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
 import org.hibernate.SessionFactory;
 import org.hibernate.criterion.DetachedCriteria;
 import org.hibernate.criterion.Projections;
 import org.hibernate.criterion.Restrictions;
 import org.springframework.dao.DataAccessException;
 import org.springframework.jdbc.support.JdbcAccessor;
+import org.springframework.orm.hibernate3.HibernateCallback;
 import org.springframework.orm.hibernate3.HibernateTemplate;
 
 import ch.systemsx.cisd.common.logging.LogCategory;
@@ -137,4 +141,41 @@ final class DeletionDAO extends AbstractGenericEntityDAO<DeletionPE> implements
         return transformNumbers2TechIdList(results);
     }
 
+    public int trash(final EntityKind entityKind, final List<TechId> entityIds,
+            final DeletionPE deletion) throws DataAccessException
+    {
+        if (entityIds.isEmpty())
+        {
+            return 0;
+        }
+        final HibernateTemplate hibernateTemplate = getHibernateTemplate();
+        int updatedRows = (Integer) hibernateTemplate.execute(new HibernateCallback()
+            {
+
+                //
+                // HibernateCallback
+                //
+
+                public final Object doInHibernate(final Session session) throws HibernateException,
+                        SQLException
+                {
+                    // NOTE: 'VERSIONED' makes modification time modified too
+                    return session
+                            .createQuery(
+                                    "UPDATE VERSIONED "
+                                            + entityKind.getEntityClass().getSimpleName()
+                                            + " SET deletion = :deletion"
+                                            + " WHERE deletion IS NULL AND id IN (:ids) ")
+                            .setParameter("deletion", deletion)
+                            .setParameterList("ids", TechId.asLongs(entityIds)).executeUpdate();
+                }
+            });
+        if (operationLog.isInfoEnabled())
+        {
+            operationLog.info(String.format("trashing %d %ss", updatedRows, entityKind.getLabel()));
+        }
+        hibernateTemplate.flush();
+        return updatedRows;
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAO.java
index 756de7db266..2ab18131f7c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAO.java
@@ -16,7 +16,6 @@
 
 package ch.systemsx.cisd.openbis.generic.server.dataaccess.db;
 
-import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -26,12 +25,9 @@ import java.util.Set;
 import org.apache.log4j.Logger;
 import org.hibernate.Criteria;
 import org.hibernate.FetchMode;
-import org.hibernate.HibernateException;
-import org.hibernate.Session;
 import org.hibernate.criterion.DetachedCriteria;
 import org.hibernate.criterion.Restrictions;
 import org.springframework.dao.DataAccessException;
-import org.springframework.orm.hibernate3.HibernateCallback;
 import org.springframework.orm.hibernate3.HibernateTemplate;
 
 import ch.systemsx.cisd.common.logging.LogCategory;
@@ -40,9 +36,7 @@ import ch.systemsx.cisd.common.utilities.MethodUtils;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IExperimentDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.PersistencyResources;
 import ch.systemsx.cisd.openbis.generic.shared.basic.CodeConverter;
-import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 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.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPropertyPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentTypePE;
@@ -304,40 +298,4 @@ public class ExperimentDAO extends AbstractGenericEntityWithPropertiesDAO<Experi
         }
     }
 
-    public int trash(final List<TechId> experimentIds, final DeletionPE deletion)
-            throws DataAccessException
-    {
-        if (experimentIds.isEmpty())
-        {
-            return 0;
-        }
-        final HibernateTemplate hibernateTemplate = getHibernateTemplate();
-        int updatedRows = (Integer) hibernateTemplate.execute(new HibernateCallback()
-            {
-
-                //
-                // HibernateCallback
-                //
-
-                public final Object doInHibernate(final Session session) throws HibernateException,
-                        SQLException
-                {
-                    // NOTE: 'VERSIONED' makes modification time modified too
-                    return session
-                            .createQuery(
-                                    "UPDATE VERSIONED "
-                                            + ExperimentPE.class.getSimpleName()
-                                            + " SET deletion = :deletion WHERE deletion IS NULL AND id IN (:ids) ")
-                            .setParameter("deletion", deletion)
-                            .setParameterList("ids", TechId.asLongs(experimentIds)).executeUpdate();
-                }
-            });
-        if (operationLog.isInfoEnabled())
-        {
-            operationLog.info(String.format("trashing %d experiments", updatedRows));
-        }
-        hibernateTemplate.flush();
-        return updatedRows;
-    }
-
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java
index 5f1d9619aad..19f2d871766 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java
@@ -16,7 +16,6 @@
 
 package ch.systemsx.cisd.openbis.generic.server.dataaccess.db;
 
-import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -26,7 +25,6 @@ import java.util.Set;
 import org.apache.log4j.Logger;
 import org.hibernate.Criteria;
 import org.hibernate.FetchMode;
-import org.hibernate.HibernateException;
 import org.hibernate.SQLQuery;
 import org.hibernate.Session;
 import org.hibernate.StatelessSession;
@@ -46,7 +44,6 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.PersistencyResources;
 import ch.systemsx.cisd.openbis.generic.shared.basic.CodeConverter;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 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.EventPE.EntityType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EventType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
@@ -467,42 +464,6 @@ public class SampleDAO extends AbstractGenericEntityWithPropertiesDAO<SamplePE>
         scheduleRemoveFromFullTextIndex(ids);
     }
 
-    public int trash(final List<TechId> sampleIds, final DeletionPE deletion)
-            throws DataAccessException
-    {
-        if (sampleIds.isEmpty())
-        {
-            return 0;
-        }
-        final HibernateTemplate hibernateTemplate = getHibernateTemplate();
-        int updatedRows = (Integer) hibernateTemplate.execute(new HibernateCallback()
-            {
-
-                //
-                // HibernateCallback
-                //
-
-                public final Object doInHibernate(final Session session) throws HibernateException,
-                        SQLException
-                {
-                    // NOTE: 'VERSIONED' makes modification time modified too
-                    return session
-                            .createQuery(
-                                    "UPDATE VERSIONED "
-                                            + SamplePE.class.getSimpleName()
-                                            + " SET deletion = :deletion WHERE deletion IS NULL AND id IN (:ids) ")
-                            .setParameter("deletion", deletion)
-                            .setParameterList("ids", TechId.asLongs(sampleIds)).executeUpdate();
-                }
-            });
-        if (operationLog.isInfoEnabled())
-        {
-            operationLog.info(String.format("trashing %d samples", updatedRows));
-        }
-        hibernateTemplate.flush();
-        return updatedRows;
-    }
-
     public Set<TechId> listSampleIdsByChildrenIds(final Collection<TechId> children,
             final TechId relationship)
     {
@@ -550,7 +511,7 @@ public class SampleDAO extends AbstractGenericEntityWithPropertiesDAO<SamplePE>
         if (operationLog.isDebugEnabled())
         {
             operationLog.info(String.format("found %d sample children for given parents",
-                results.size()));
+                    results.size()));
         }
         return result;
     }
@@ -565,7 +526,7 @@ public class SampleDAO extends AbstractGenericEntityWithPropertiesDAO<SamplePE>
         if (operationLog.isDebugEnabled())
         {
             operationLog.info(String.format("found %s sample components for given containers",
-                results.size()));
+                    results.size()));
         }
         return transformNumbers2TechIdList(results);
     }
-- 
GitLab