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 b04ec072d8e15ebbf4a3203661fc97504059a4ef..387261109be492b75c7d7dd8a300779e7f13030c 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 f4fddf977c2810ff09818b550d4c405e57f8f6d0..a9a21e73db7e4385e06f3ff0396ea54105aa0d9e 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 d6c2125d0fa72f4249c0649e8dbbacc70ea30050..b609589d2db09172ba5ba328da0a318b8731cb35 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 964d9af14118052a7efaa3d136c2c01f260915ec..7777c3cb1f06ebb14915b4a15487f4ad9a2e1ce4 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"