From bd2c811ca628db585fe309d2ed9e869b55543a63 Mon Sep 17 00:00:00 2001 From: felmer <felmer> Date: Mon, 19 Dec 2016 07:33:25 +0000 Subject: [PATCH] SSDM-4187: updating project (point 9 on https://wiki-bsse.ethz.ch/display/CISDInt/Project+samples) SVN: 37518 --- .../business/bo/AbstractBusinessObject.java | 12 ++++ .../bo/AbstractSampleBusinessObject.java | 56 +++++++++++++++++++ .../generic/server/business/bo/SampleBO.java | 1 + .../web/server/GenericClientService.java | 2 +- 4 files changed, 70 insertions(+), 1 deletion(-) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java index 251b068223b..cbe3dd1bbb2 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java @@ -107,6 +107,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.IModifierBean; import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialPE; import ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectPE; import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE; +import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE; import ch.systemsx.cisd.openbis.generic.shared.dto.RelationshipTypePE; import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE; import ch.systemsx.cisd.openbis.generic.shared.dto.Session; @@ -835,6 +836,17 @@ abstract class AbstractBusinessObject implements IDAOFactory } assignmentManager.performAssignment(relationshipService, session); } + + protected void assignSampleToProject(SamplePE sample, ProjectPE project) + { + if (project != null) + { + relationshipService.assignSampleToProject(session, sample, project); + } else + { + relationshipService.unassignSampleFromProject(session, sample); + } + } protected void assignDataSetToSampleAndExperiment(DataPE data, SamplePE newSample, ExperimentPE experiment) { diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java index da9762509b7..6b9ee97ee4e 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java @@ -232,6 +232,37 @@ abstract class AbstractSampleBusinessObject extends AbstractSampleIdentifierBusi } return experimentPE; } + + private ProjectPE tryFindProject(Map<String, ProjectPE> projectCache, ProjectIdentifier projectIdentifier) + { + if (projectIdentifier == null) + { + return null; + } + return tryFindProject(projectCache, projectIdentifier.toString(), null); + } + + private ProjectPE tryFindProject(Map<String, ProjectPE> projectCache, String projectIdentifier, + String defaultSpace) + { + if (projectIdentifier == null) + { + return null; + } + ProjectIdentifier identifier = new ProjectIdentifierFactory(projectIdentifier).createIdentifier(defaultSpace); + fillSpaceIdentifier(identifier); + String key = identifier.toString(); + ProjectPE project = projectCache == null ? null : projectCache.get(key); + if (project == null) + { + project = findProject(identifier); + if (projectCache != null) + { + projectCache.put(key, project); + } + } + return project; + } protected void setContainer(final SampleIdentifier sampleIdentifier, final SamplePE samplePE, String containerIdentifier, final String defaultSpace) @@ -559,7 +590,32 @@ abstract class AbstractSampleBusinessObject extends AbstractSampleIdentifierBusi assignSampleAndRelatedDataSetsToExperiment(sample, newExperiment); } + + protected void updateProject(SamplePE sample, ProjectIdentifier projectIdentifierOrNull, + Map<String, ProjectPE> projectCache) + { + if (sample.getProject() == null && projectIdentifierOrNull == null) + { + return; + } + ProjectPE newProject = tryFindProject(projectCache, projectIdentifierOrNull); + if (EntityHelper.equalEntities(newProject, sample.getProject()) == false) + { + ensureSampleAttachableToProject(sample, newProject); + assignSampleToProject(sample, newProject); + } + } + private void ensureSampleAttachableToProject(SamplePE sample, ProjectPE project) + { + if (sample.getSpace() == null && project != null) + { + throw UserFailureException.fromTemplate( + "It is not allowed to connect a shared sample '%s' to a project.", + sample.getIdentifier()); + } + } + private void ensureSampleAttachableToExperiment(SamplePE sample, ExperimentPE newExperiment) { if (sample.getSpace() == null && newExperiment != null) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java index c008c9b0a64..ffa01b3ee19 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java @@ -303,6 +303,7 @@ public final class SampleBO extends AbstractSampleBusinessObject implements ISam { updateExperiment(sample, updates.getExperimentIdentifierOrNull(), null); } + updateProject(sample, updates.getProjectIdentifier(), null); setContainer(updates.getSampleIdentifier(), sample, updates.getContainerIdentifierOrNull(), null); addAttachments(sample, updates.getAttachments(), attachments); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java index 8f334ca1377..a84fdb999bd 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java @@ -1124,7 +1124,7 @@ public class GenericClientService extends AbstractClientService implements IGene private ProjectIdentifier getProjectIdentifier(SampleUpdates updates) { - String identifier = updates.getParentIdentifierOrNull(); + String identifier = updates.getProjectIdentifierOrNull(); if (identifier == null) { return null; -- GitLab