From ded618a1cba8a648b5cf2211a73bf8e16bf73d0b Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Thu, 14 Jul 2011 12:37:19 +0000
Subject: [PATCH] [LMS-2366] methods for finding trashed entities in DAO +
 basic tests

SVN: 22141
---
 .../generic/server/business/bo/ITrashBO.java  |  6 +-
 .../generic/server/business/bo/TrashBO.java   | 24 +++----
 .../dataaccess/IAuthorizationDAOFactory.java  |  2 +
 .../server/dataaccess/IDeletionDAO.java       | 11 +++
 .../server/dataaccess/db/AbstractDAO.java     | 17 +++--
 .../db/AuthorizationDAOFactory.java           |  9 +++
 .../generic/server/dataaccess/db/DataDAO.java |  2 +-
 .../server/dataaccess/db/DeletionDAO.java     | 51 +++++++++++--
 .../server/dataaccess/db/ExternalDataDAO.java |  2 +-
 .../server/dataaccess/db/SampleDAO.java       |  5 +-
 .../shared/dto/properties/EntityKind.java     | 27 ++++---
 .../server/dataaccess/db/DeletionDAOTest.java | 72 +++++++++++++++++++
 12 files changed, 190 insertions(+), 38 deletions(-)
 create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DeletionDAOTest.java

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ITrashBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ITrashBO.java
index 547e1f275cf..e155d2689de 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ITrashBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ITrashBO.java
@@ -28,9 +28,6 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
  */
 public interface ITrashBO
 {
-    /** Puts back all objects moved to trash in deletion with specified id. */
-    public void revertDeletion(TechId deletionId);
-
     public void createDeletion(String reason);
 
     public void trashSamples(List<TechId> sampleIds);
@@ -39,4 +36,7 @@ public interface ITrashBO
 
     public void trashDataSets(List<DataPE> dataSets);
 
+    /** Puts back all entities moved to trash in deletion with specified id. */
+    public void revertDeletion(TechId deletionId);
+
 }
\ No newline at end of file
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 a4429a7d27d..8132222cf56 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
@@ -42,18 +42,6 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
         this.boFactory = boFactory;
     }
 
-    public void revertDeletion(TechId deletionId)
-    {
-        try
-        {
-            deletion = getDeletionDAO().getByTechId(deletionId);
-            getDeletionDAO().delete(deletion);
-        } catch (final DataAccessException ex)
-        {
-            throwException(ex, "Deletion");
-        }
-    }
-
     public void createDeletion(String reason)
     {
         try
@@ -90,4 +78,16 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
         dataSetTable.trashLoadedDataSets(deletion);
     }
 
+    public void revertDeletion(TechId deletionId)
+    {
+        try
+        {
+            deletion = getDeletionDAO().getByTechId(deletionId);
+            getDeletionDAO().revert(deletion);
+        } catch (final DataAccessException ex)
+        {
+            throwException(ex, "Deletion");
+        }
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IAuthorizationDAOFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IAuthorizationDAOFactory.java
index 2eabc8d6e16..1cc915c0e30 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IAuthorizationDAOFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IAuthorizationDAOFactory.java
@@ -72,4 +72,6 @@ public interface IAuthorizationDAOFactory
     public IQueryDAO getQueryDAO();
 
     public IRelationshipTypeDAO getRelationshipTypeDAO();
+
+    public IDeletionDAO getDeletionDAO();
 }
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 1e28237ff1e..191b15b9de3 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
@@ -16,8 +16,11 @@
 
 package ch.systemsx.cisd.openbis.generic.server.dataaccess;
 
+import java.util.List;
+
 import org.springframework.dao.DataAccessException;
 
+import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 
 /**
@@ -32,4 +35,12 @@ public interface IDeletionDAO extends IGenericDAO<DeletionPE>
      */
     void create(final DeletionPE deletion) throws DataAccessException;
 
+    void revert(DeletionPE deletion);
+
+    List<TechId> findTrashedSampleIds(List<TechId> deletionIds);
+
+    List<TechId> findTrashedExperimentIds(List<TechId> deletionIds);
+
+    List<String> findTrashedDataSetCodes(List<TechId> deletionIds);
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAO.java
index 7ab513a44c1..cd4cbe26087 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAO.java
@@ -71,7 +71,6 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityInformationWithPropert
 public abstract class AbstractDAO extends HibernateDaoSupport
 {
 
-
     /** The original source database instance. */
     private DatabaseInstancePE databaseInstance;
 
@@ -86,8 +85,8 @@ public abstract class AbstractDAO extends HibernateDaoSupport
     }
 
     private static Map<Class<?>, ClassValidator<?>> validators =
-        new HashMap<Class<?>, ClassValidator<?>>();
-    
+            new HashMap<Class<?>, ClassValidator<?>>();
+
     /**
      * Validates given <i>Persistence Entity</i> using an appropriate {@link ClassValidator}.
      */
@@ -384,7 +383,7 @@ public abstract class AbstractDAO extends HibernateDaoSupport
         }
     }
 
-    protected static Set<TechId> transformNumbers2TechIds(Collection<? extends Number> numbers)
+    protected static Set<TechId> transformNumbers2TechIdSet(Collection<? extends Number> numbers)
     {
         final Set<TechId> result = new HashSet<TechId>();
         for (Number number : numbers)
@@ -394,6 +393,16 @@ public abstract class AbstractDAO extends HibernateDaoSupport
         return result;
     }
 
+    protected static List<TechId> transformNumbers2TechIdList(Collection<? extends Number> numbers)
+    {
+        final List<TechId> result = new ArrayList<TechId>();
+        for (Number number : numbers)
+        {
+            result.add(new TechId(number));
+        }
+        return result;
+    }
+
     protected static <T extends IEntityInformationWithPropertiesHolder> List<Long> transformEntities2Longs(
             Collection<T> entities)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AuthorizationDAOFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AuthorizationDAOFactory.java
index 70d95ab7e9b..a388cb8b0f7 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AuthorizationDAOFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AuthorizationDAOFactory.java
@@ -30,6 +30,7 @@ import ch.systemsx.cisd.dbmigration.DatabaseConfigurationContext;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IAuthorizationDAOFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDataDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDatabaseInstanceDAO;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDeletionDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDynamicPropertyEvaluationScheduler;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IExperimentDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IGridCustomColumnDAO;
@@ -85,6 +86,8 @@ public class AuthorizationDAOFactory implements IAuthorizationDAOFactory
 
     private final IRelationshipTypeDAO relationshipTypeDAO;
 
+    private final IDeletionDAO deletionDAO;
+
     public AuthorizationDAOFactory(final DatabaseConfigurationContext context,
             final SessionFactory sessionFactory,
             final IFullTextIndexUpdateScheduler indexUpdateScheduler,
@@ -106,6 +109,7 @@ public class AuthorizationDAOFactory implements IAuthorizationDAOFactory
         gridCustomColumnDAO = new GridCustomColumnDAO(sessionFactory, homeDatabaseInstance);
         queryDAO = new QueryDAO(sessionFactory, homeDatabaseInstance);
         relationshipTypeDAO = new RelationshipTypeDAO(sessionFactory, homeDatabaseInstance);
+        deletionDAO = new DeletionDAO(sessionFactory, homeDatabaseInstance);
     }
 
     public final PersistencyResources getPersistencyResources()
@@ -242,6 +246,11 @@ public class AuthorizationDAOFactory implements IAuthorizationDAOFactory
         return relationshipTypeDAO;
     }
 
+    public IDeletionDAO getDeletionDAO()
+    {
+        return deletionDAO;
+    }
+
     /**
      * Configures current session settings for batch update mode.
      * 
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 31b71a2b2db..d4d05f93949 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
@@ -507,7 +507,7 @@ final class DataDAO extends AbstractGenericEntityWithPropertiesDAO<DataPE> imple
                                     .list();
                         }
                     });
-        return transformNumbers2TechIds(results);
+        return transformNumbers2TechIdSet(results);
     }
 
     // data set relationship helper methods
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 e31399cbf6e..57e1bdf695d 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,8 +16,13 @@
 
 package ch.systemsx.cisd.openbis.generic.server.dataaccess.db;
 
+import java.util.List;
+
 import org.apache.log4j.Logger;
 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.HibernateTemplate;
@@ -25,6 +30,7 @@ import org.springframework.orm.hibernate3.HibernateTemplate;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDeletionDAO;
+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.properties.EntityKind;
@@ -67,8 +73,7 @@ final class DeletionDAO extends AbstractGenericEntityDAO<DeletionPE> implements
         }
     }
 
-    @Override
-    public void delete(DeletionPE deletion) throws DataAccessException
+    public void revert(DeletionPE deletion) throws DataAccessException
     {
         operationLog.info(String.format("REVERT: deletion %s.", deletion));
         for (EntityKind entityKind : EntityKind.values())
@@ -76,14 +81,13 @@ final class DeletionDAO extends AbstractGenericEntityDAO<DeletionPE> implements
             // NOTE: material deletion are always permanent and therefore can't be reverted
             if (entityKind != EntityKind.MATERIAL)
             {
-                revertDeletion(deletion, entityKind);
+                revertDeletionOfEntities(deletion, entityKind);
             }
         }
         super.delete(deletion);
     }
 
-    private void revertDeletion(final DeletionPE deletion,
-            final ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind entityKind)
+    private void revertDeletionOfEntities(final DeletionPE deletion, final EntityKind entityKind)
     {
         assert deletion != null : "Unspecified deletion";
         assert entityKind != null : "Unspecified entity kind";
@@ -96,4 +100,41 @@ final class DeletionDAO extends AbstractGenericEntityDAO<DeletionPE> implements
         hibernateTemplate.flush();
         operationLog.info(String.format("%s %s(s) reverted", updatedRows, entityKind.name()));
     }
+
+    public List<TechId> findTrashedSampleIds(final List<TechId> deletionIds)
+    {
+        return findTrashedEntityIds(deletionIds, EntityKind.SAMPLE);
+    }
+
+    public List<TechId> findTrashedExperimentIds(final List<TechId> deletionIds)
+    {
+        return findTrashedEntityIds(deletionIds, EntityKind.EXPERIMENT);
+    }
+
+    public List<String> findTrashedDataSetCodes(final List<TechId> deletionIds)
+    {
+        final DetachedCriteria criteria =
+                DetachedCriteria.forClass(EntityKind.DATA_SET.getEntityClass());
+        final List<Long> longIds = TechId.asLongs(deletionIds);
+        criteria.setProjection(Projections.property("code"));
+        criteria.add(Restrictions.in("deletion.id", longIds));
+        final List<String> results = cast(getHibernateTemplate().findByCriteria(criteria));
+        operationLog.info(String.format("found %s trashed %s(s)", results.size(),
+                EntityKind.DATA_SET.name()));
+        return results;
+    }
+
+    private List<TechId> findTrashedEntityIds(final List<TechId> deletionIds,
+            final EntityKind entityKind)
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass(entityKind.getEntityClass());
+        final List<Long> longIds = TechId.asLongs(deletionIds);
+        criteria.setProjection(Projections.id());
+        criteria.add(Restrictions.in("deletion.id", longIds));
+        final List<Long> results = cast(getHibernateTemplate().findByCriteria(criteria));
+        operationLog
+                .info(String.format("found %s trashed %s(s)", results.size(), entityKind.name()));
+        return transformNumbers2TechIdList(results);
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExternalDataDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExternalDataDAO.java
index 2d134753648..8d3b69ca036 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExternalDataDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExternalDataDAO.java
@@ -492,7 +492,7 @@ final class ExternalDataDAO extends AbstractGenericEntityWithPropertiesDAO<Exter
                                     .list();
                         }
                     });
-        return transformNumbers2TechIds(results);
+        return transformNumbers2TechIdSet(results);
     }
 
     // data set relationship helper methods
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 da3f85f4e80..721b9cf491e 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
@@ -43,9 +43,9 @@ 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.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.SamplePropertyPE;
@@ -460,7 +460,6 @@ public class SampleDAO extends AbstractGenericEntityWithPropertiesDAO<SamplePE>
     public Set<TechId> listParents(final Collection<TechId> children, final TechId relationship)
     {
         final String query =
-
                 "select sample_id_parent from sample_relationships where sample_id_child in (:ids) and relationship_id = :r ";
         final List<? extends Number> results =
                 (List<? extends Number>) getHibernateTemplate().execute(new HibernateCallback()
@@ -473,7 +472,7 @@ public class SampleDAO extends AbstractGenericEntityWithPropertiesDAO<SamplePE>
                                     .setParameter("r", relationship.getId()).list();
                         }
                     });
-        Set<TechId> result = transformNumbers2TechIds(results);
+        Set<TechId> result = transformNumbers2TechIdSet(results);
         if (operationLog.isDebugEnabled())
         {
             operationLog.debug(String.format("%d sample parents(s) have been found.",
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/properties/EntityKind.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/properties/EntityKind.java
index c13eb5334a3..ca6b3e94d94 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/properties/EntityKind.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/properties/EntityKind.java
@@ -36,6 +36,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePropertyPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleTypePropertyTypePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.TableNames;
 
 /**
  * Enumeration of entity kinds.
@@ -44,17 +45,19 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SampleTypePropertyTypePE;
  */
 public enum EntityKind
 {
-    MATERIAL("material", MaterialPE.class, MaterialTypePE.class, MaterialTypePropertyTypePE.class,
-            MaterialPropertyPE.class),
+    MATERIAL(TableNames.MATERIALS_TABLE, "material", MaterialPE.class, MaterialTypePE.class,
+            MaterialTypePropertyTypePE.class, MaterialPropertyPE.class),
 
-    EXPERIMENT("experiment", ExperimentPE.class, ExperimentTypePE.class,
-            ExperimentTypePropertyTypePE.class, ExperimentPropertyPE.class),
+    EXPERIMENT(TableNames.EXPERIMENTS_TABLE, "experiment", ExperimentPE.class,
+            ExperimentTypePE.class, ExperimentTypePropertyTypePE.class, ExperimentPropertyPE.class),
 
-    SAMPLE("sample", SamplePE.class, SampleTypePE.class, SampleTypePropertyTypePE.class,
-            SamplePropertyPE.class),
+    SAMPLE(TableNames.SAMPLES_TABLE, "sample", SamplePE.class, SampleTypePE.class,
+            SampleTypePropertyTypePE.class, SamplePropertyPE.class),
 
-    DATA_SET("dataSet", DataPE.class, DataSetTypePE.class, DataSetTypePropertyTypePE.class,
-            DataSetPropertyPE.class);
+    DATA_SET(TableNames.DATA_TABLE, "dataSet", DataPE.class, DataSetTypePE.class,
+            DataSetTypePropertyTypePE.class, DataSetPropertyPE.class);
+
+    private final String entityTableName;
 
     private final String entityLabel;
 
@@ -66,10 +69,11 @@ public enum EntityKind
 
     private transient final Class<?> propertyClass;
 
-    private EntityKind(final String entityLabel,
+    private EntityKind(final String entityTableName, final String entityLabel,
             final Class<? extends IEntityInformationWithPropertiesHolder> entityClass,
             final Class<?> typeClass, final Class<?> assignmentClass, Class<?> propertyClass)
     {
+        this.entityTableName = entityTableName;
         this.entityLabel = entityLabel;
         this.entityClass = entityClass;
         this.typeClass = typeClass;
@@ -88,6 +92,11 @@ public enum EntityKind
         return entityLabel;
     }
 
+    public final String getTableName()
+    {
+        return entityTableName;
+    }
+
     public final <T extends EntityTypePE> Class<T> getTypeClass()
     {
         return cast(typeClass);
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DeletionDAOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DeletionDAOTest.java
new file mode 100644
index 00000000000..134efd450da
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DeletionDAOTest.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010 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.server.dataaccess.db;
+
+import static org.testng.AssertJUnit.assertEquals;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.testng.annotations.Test;
+
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDeletionDAO;
+import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
+
+/**
+ * @author Piotr Buczek
+ */
+@Test(groups = "db")
+public class DeletionDAOTest extends AbstractDAOTest
+{
+
+    @Test
+    public void testFindTrashedEntities() throws Exception
+    {
+        // simple test with db specific numbers
+        IDeletionDAO deletionDAO = daoFactory.getDeletionDAO();
+        List<DeletionPE> allDeletions = deletionDAO.listAllEntities();
+        assertEquals(4, allDeletions.size());
+
+        assertTrashedEntities(0, 5, 1, allDeletions.get(0));
+        assertTrashedEntities(0, 3, 0, allDeletions.get(1));
+        assertTrashedEntities(0, 323, 0, allDeletions.get(2));
+        assertTrashedEntities(2, 3, 0, allDeletions.get(3));
+
+        assertTrashedEntities(2, 334, 1, allDeletions);
+    }
+
+    private void assertTrashedEntities(int expectedExperiments, int expectedSamples,
+            int expectedDataSets, DeletionPE deletion)
+    {
+        assertTrashedEntities(expectedExperiments, expectedSamples, expectedDataSets,
+                Collections.singletonList(deletion));
+    }
+
+    private void assertTrashedEntities(int expectedExperiments, int expectedSamples,
+            int expectedDataSets, List<DeletionPE> deletions)
+    {
+        List<TechId> deletionIds = TechId.createList(deletions);
+        IDeletionDAO deletionDAO = daoFactory.getDeletionDAO();
+        assertEquals(deletionIds.toString(), expectedExperiments, deletionDAO
+                .findTrashedExperimentIds(deletionIds).size());
+        assertEquals(deletionIds.toString(), expectedSamples,
+                deletionDAO.findTrashedSampleIds(deletionIds).size());
+        assertEquals(deletionIds.toString(), expectedDataSets,
+                deletionDAO.findTrashedDataSetCodes(deletionIds).size());
+    }
+}
-- 
GitLab