From d27e56df9959118924e87d853d974137207c031e Mon Sep 17 00:00:00 2001
From: anttil <anttil>
Date: Wed, 6 Jun 2012 09:44:25 +0000
Subject: [PATCH] BIS-51 / SP-96: Do authorization of deletion/reassignment of
 Experiment -> Project links separately

SVN: 25576
---
 .../generic/server/RelationshipService.java   | 45 ++++++++-----------
 .../server/business/bo/ExperimentBO.java      |  9 ++--
 .../server/business/bo/ExperimentTable.java   |  8 +++-
 .../source/java/genericApplicationContext.xml |  2 +-
 4 files changed, 33 insertions(+), 31 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/RelationshipService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/RelationshipService.java
index b04ec072d8e..387261109be 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/RelationshipService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/RelationshipService.java
@@ -16,13 +16,10 @@
 
 package ch.systemsx.cisd.openbis.generic.server;
 
-import org.hibernate.Criteria;
-import org.hibernate.criterion.Restrictions;
-
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.util.SampleUtils;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.DAOFactory;
 import ch.systemsx.cisd.openbis.generic.shared.IRelationshipService;
-import ch.systemsx.cisd.openbis.generic.shared.basic.CodeConverter;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.IAuthSession;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
@@ -39,15 +36,23 @@ public class RelationshipService implements IRelationshipService
     private static final String ERR_PROJECT_NOT_FOUND =
             "No project for experiment '%s' could be found in the database.";
 
-    private org.hibernate.SessionFactory sessionFactory;
+    private DAOFactory daoFactory;
 
     @Override
     public void reassignProject(IAuthSession session, ProjectIdentifier projectId,
             ExperimentIdentifier experimentId)
     {
+
+        ProjectPE previousProject =
+                findProject(new ProjectIdentifier(experimentId.getDatabaseInstanceCode(),
+                        experimentId.getSpaceCode(), experimentId.getProjectCode()));
+
         ProjectPE project = findProject(projectId);
-        ExperimentPE experiment = findExperiment(experimentId);
-        ProjectPE previousProject = experiment.getProject();
+
+        ExperimentPE experiment =
+                daoFactory.getExperimentDAO().tryFindByCodeAndProject(previousProject,
+                        experimentId.getExperimentCode());
+
         if (project.equals(previousProject))
         {
             return;
@@ -60,33 +65,21 @@ public class RelationshipService implements IRelationshipService
         experiment.setProject(project);
     }
 
-    private ProjectPE findProject(ProjectIdentifier id)
+    private ProjectPE findProject(ProjectIdentifier projectId)
     {
+        ProjectPE project =
+                daoFactory.getProjectDAO().tryFindProject(projectId.getDatabaseInstanceCode(),
+                        projectId.getSpaceCode(), projectId.getProjectCode());
 
-        final Criteria criteria =
-                this.sessionFactory.getCurrentSession().createCriteria(ProjectPE.class);
-        criteria.add(Restrictions.eq("code", CodeConverter.tryToDatabase(id.getProjectCode())));
-        final Criteria spaceCriteria = criteria.createCriteria("space");
-        spaceCriteria.add(Restrictions.eq("code", CodeConverter.tryToDatabase(id.getSpaceCode())));
-
-        ProjectPE project = (ProjectPE) criteria.uniqueResult();
         if (project == null)
         {
-            throw UserFailureException.fromTemplate(ERR_PROJECT_NOT_FOUND, id);
+            throw UserFailureException.fromTemplate(ERR_PROJECT_NOT_FOUND, projectId);
         }
         return project;
     }
 
-    private ExperimentPE findExperiment(ExperimentIdentifier id)
-    {
-        final Criteria criteria =
-                this.sessionFactory.getCurrentSession().createCriteria(ExperimentPE.class);
-        criteria.add(Restrictions.eq("code", CodeConverter.tryToDatabase(id.getExperimentCode())));
-        return (ExperimentPE) criteria.uniqueResult();
-    }
-
-    public void setSessionFactory(org.hibernate.SessionFactory sessionFactory)
+    public void setDaoFactory(DAOFactory daoFactory)
     {
-        this.sessionFactory = sessionFactory;
+        this.daoFactory = daoFactory;
     }
 }
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 f4fddf977c2..a9a21e73db7 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
@@ -422,11 +422,14 @@ public final class ExperimentBO extends AbstractBusinessObject implements IExper
         }
         updateProperties(updates.getProperties());
 
-        if (updates.getProjectIdentifier().getProjectCode().equals(
-                experiment.getProject().getCode()) == false)
+        ProjectPE project = findProject(updates.getProjectIdentifier());
+        ProjectPE previousProject = experiment.getProject();
+        if (project.equals(previousProject) == false)
         {
             relationshipService.reassignProject(session, updates.getProjectIdentifier(),
-                    new ExperimentIdentifier(updates.getProjectIdentifier(), experiment
+                    new ExperimentIdentifier(new ProjectIdentifier(previousProject.getSpace()
+                            .getDatabaseInstance().getCode(), previousProject.getSpace().getCode(),
+                            previousProject.getCode()), experiment
                             .getCode()));
         }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentTable.java
index d6c2125d0fa..b609589d2db 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentTable.java
@@ -249,9 +249,15 @@ public final class ExperimentTable extends AbstractBusinessObject implements IEx
 
         if (updates.isProjectUpdateRequested())
         {
+            ProjectPE previousProject = experiment.getProject();
+            ProjectIdentifier previousProjectId =
+                    new ProjectIdentifier(previousProject.getSpace().getDatabaseInstance()
+                            .getCode(), previousProject.getSpace().getCode(), previousProject
+                            .getCode());
+
             relationshipService
                     .reassignProject(session, updates.getProjectIdentifier(),
-                            new ExperimentIdentifier(updates.getProjectIdentifier(), experiment
+                            new ExperimentIdentifier(previousProjectId, experiment
                                     .getCode()));
         }
     }
diff --git a/openbis/source/java/genericApplicationContext.xml b/openbis/source/java/genericApplicationContext.xml
index 964d9af1411..7777c3cb1f0 100644
--- a/openbis/source/java/genericApplicationContext.xml
+++ b/openbis/source/java/genericApplicationContext.xml
@@ -25,7 +25,7 @@
     
     <bean id="relationship-service"
         class="ch.systemsx.cisd.openbis.generic.server.RelationshipService">
-        <property name="sessionFactory" ref="hibernate-session-factory" />
+        <property name="daoFactory" ref="dao-factory" />
     </bean>
 
     <bean id="sql-script-provider" class="ch.systemsx.cisd.dbmigration.DBMigrationEngine"
-- 
GitLab