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