From 2b601c3d60ae5b56df916329422de2aa9933879f Mon Sep 17 00:00:00 2001
From: gpawel <gpawel>
Date: Thu, 18 Oct 2012 09:25:40 +0000
Subject: [PATCH] SP-345 BIS-178: Method to fetch all metaprojects for given
 entity

SVN: 27230
---
 .../server/dataaccess/IMetaprojectDAO.java    |  7 +++++
 .../server/dataaccess/db/MetaprojectDAO.java  | 29 +++++++++++++++++++
 .../dataaccess/db/MetaprojectDAOTest.java     | 18 ++++++++++++
 .../124/042=metaproject_assignments_all.tsv   |  1 +
 4 files changed, 55 insertions(+)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IMetaprojectDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IMetaprojectDAO.java
index 87bdac895ce..54248625ac8 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IMetaprojectDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IMetaprojectDAO.java
@@ -16,8 +16,10 @@
 
 package ch.systemsx.cisd.openbis.generic.server.dataaccess;
 
+import java.util.Collection;
 import java.util.List;
 
+import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityInformationWithPropertiesHolder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 
@@ -42,4 +44,9 @@ public interface IMetaprojectDAO extends IGenericDAO<MetaprojectPE>
      */
     public void createOrUpdateMetaproject(MetaprojectPE metaproject, PersonPE owner);
 
+    /**
+     * Lists all metaprojects owned by given user, connected with given entity.
+     */
+    public Collection<MetaprojectPE> listMetaprojectsForEntity(PersonPE owner,
+            IEntityInformationWithPropertiesHolder entity);
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/MetaprojectDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/MetaprojectDAO.java
index 4b00f5e072b..dc1c8e4315f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/MetaprojectDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/MetaprojectDAO.java
@@ -16,7 +16,10 @@
 
 package ch.systemsx.cisd.openbis.generic.server.dataaccess.db;
 
+import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.apache.log4j.Logger;
 import org.hibernate.SessionFactory;
@@ -31,6 +34,8 @@ import ch.systemsx.cisd.common.reflection.MethodUtils;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IMetaprojectDAO;
 import ch.systemsx.cisd.openbis.generic.shared.basic.MetaprojectName;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityInformationWithPropertiesHolder;
+import ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectAssignmentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 
@@ -103,4 +108,28 @@ public class MetaprojectDAO extends AbstractGenericEntityDAO<MetaprojectPE> impl
         }
     }
 
+    @Override
+    public Collection<MetaprojectPE> listMetaprojectsForEntity(PersonPE owner,
+            IEntityInformationWithPropertiesHolder entity)
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass(MetaprojectAssignmentPE.class);
+        criteria.createAlias("metaproject", "m");
+        criteria.add(Restrictions.eq("m.owner", owner));
+        criteria.add(Restrictions.eq(entity.getEntityKind().getLabel(), entity));
+        final List<MetaprojectAssignmentPE> assignments =
+                cast(getHibernateTemplate().findByCriteria(criteria));
+
+        Set<MetaprojectPE> metaprojects = new HashSet<MetaprojectPE>();
+        for (MetaprojectAssignmentPE assignment : assignments)
+        {
+            metaprojects.add(assignment.getMetaproject());
+        }
+        if (operationLog.isDebugEnabled())
+        {
+            operationLog.debug(String.format("%s(%s, %s): %d metaproject(s) have been found.",
+                    MethodUtils.getCurrentMethod().getName(), owner, entity, metaprojects.size()));
+        }
+
+        return metaprojects;
+    }
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/MetaprojectDAOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/MetaprojectDAOTest.java
index 705c436ebb8..11e6e96ccb3 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/MetaprojectDAOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/MetaprojectDAOTest.java
@@ -21,11 +21,13 @@ import static org.testng.AssertJUnit.assertNotNull;
 import static org.testng.AssertJUnit.assertTrue;
 import static org.testng.AssertJUnit.fail;
 
+import java.util.Collection;
 import java.util.List;
 
 import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectPE;
 
 /**
@@ -163,4 +165,20 @@ public class MetaprojectDAOTest extends AbstractDAOTest
 
         assertTrue(checked);
     }
+
+    @Test
+    public void testListMetaprojectsForEntity()
+    {
+        ExperimentPE experiment = daoFactory.getExperimentDAO().getByTechId(new TechId(4));
+        Collection<MetaprojectPE> connectedMetaprojects =
+                daoFactory.getMetaprojectDAO().listMetaprojectsForEntity(getTestPerson(),
+                        experiment);
+
+        assertEquals(2, connectedMetaprojects.size());
+        for (MetaprojectPE metaproject : connectedMetaprojects)
+        {
+            assertTrue(metaproject.getId().longValue() == 1l
+                    || metaproject.getId().longValue() == 3l);
+        }
+    }
 }
diff --git a/openbis/sourceTest/sql/postgresql/124/042=metaproject_assignments_all.tsv b/openbis/sourceTest/sql/postgresql/124/042=metaproject_assignments_all.tsv
index 3f208975f52..c405d1ac7c8 100644
--- a/openbis/sourceTest/sql/postgresql/124/042=metaproject_assignments_all.tsv
+++ b/openbis/sourceTest/sql/postgresql/124/042=metaproject_assignments_all.tsv
@@ -10,3 +10,4 @@
 10	1	6	\N	\N	\N	4	2012-09-05 10:18:10.581+02
 11	1	\N	978	\N	\N	3	2012-09-05 10:18:10.581+02
 12	1	\N	\N	2	\N	1	2012-09-05 10:18:10.581+02
+13	3	4	\N	\N	\N	\N	2012-09-05 10:18:10.581+02
-- 
GitLab