diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/ISample.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/ISample.java index aeb1f118e63e90813376bb1ef677a1ccb149c416..380ab52b8d677741709ea65c32c88233ff8bff0b 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/ISample.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/ISample.java @@ -19,6 +19,7 @@ package ch.systemsx.cisd.etlserver.registrator.api.v2; import java.util.List; import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IExperimentImmutable; +import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IProjectImmutable; import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.ISampleImmutable; /** @@ -30,6 +31,11 @@ public interface ISample extends ISampleImmutable * Set the experiment for this sample. The experiment need not be immutable, but the immutable one is the superclass. */ void setExperiment(IExperimentImmutable experiment); + + /** + * Set the project for this sample. The project need not be immutable, but the immutable one is the superclass. + */ + void setProject(IProjectImmutable project); /** * Set the type for this sample. diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/Sample.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/Sample.java index 30dd74af380e9fe48ec4b331391252b375dfd66d..9c9c58fcad788b751b90e392e8992a1eabab7fa7 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/Sample.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/Sample.java @@ -23,6 +23,7 @@ import java.util.Set; import ch.systemsx.cisd.etlserver.registrator.api.v2.ISample; import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IExperimentImmutable; +import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IProjectImmutable; import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.ISampleImmutable; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment; @@ -126,6 +127,19 @@ public class Sample extends SampleImmutable implements ISample updateDetails.setExperimentUpdateRequested(true); } + @Override + public void setProject(IProjectImmutable project) + { + ProjectImmutable proj = (ProjectImmutable) project; + if (proj == null) + { + getSample().setProject(null); + } else + { + getSample().setProject(proj.getProject()); + } + } + @Override public void setPropertyValue(String propertyCode, String propertyValue) { diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/SampleImmutable.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/SampleImmutable.java index 672368a4541b0fc5820c590613c10a637b9abd1d..cd1ad51fec0b8bd713b3ca99113dc207c7dd5711 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/SampleImmutable.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/SampleImmutable.java @@ -23,10 +23,12 @@ import java.util.Set; import ch.systemsx.cisd.common.exceptions.UserFailureException; import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IExperimentImmutable; +import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IProjectImmutable; import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.ISampleImmutable; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SampleFetchOption; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.IObjectId; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.sample.SampleIdentifierId; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project; import ch.systemsx.cisd.openbis.generic.shared.util.EntityHelper; /** @@ -90,6 +92,13 @@ public class SampleImmutable implements ISampleImmutable return (null != experiment) ? new ExperimentImmutable(experiment) : null; } + @Override + public IProjectImmutable getProject() + { + Project project = sample.getProject(); + return project == null ? null : new ProjectImmutable(project); + } + @Override public String getSampleIdentifier() { diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/internal/v2/ISampleImmutable.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/internal/v2/ISampleImmutable.java index 04147c79e86d80598896ed8dee020dd5d918d505..6e2ab317bcf65fcf7933f64c611c1544ac9f103e 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/internal/v2/ISampleImmutable.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/internal/v2/ISampleImmutable.java @@ -44,6 +44,11 @@ public interface ISampleImmutable extends IMetaprojectContent * Return the experiment for this sample. May be null. */ IExperimentImmutable getExperiment(); + + /** + * Returns the project for this sample or null. + */ + IProjectImmutable getProject(); /** * Return the type for this sample. May be null. diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/RelationshipService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/RelationshipService.java index 0523465c56cde5e677d7223508b2c58103bc9efb..df1b6018d386a084b1dfa6ece484cbd554264065 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/RelationshipService.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/RelationshipService.java @@ -97,6 +97,7 @@ public class RelationshipService implements IRelationshipService, ApplicationCon @Override public void assignSampleToProject(IAuthSession session, SamplePE sample, ProjectPE project) { + SampleUtils.assertProjectSamplesEnabled(sample, project); Date timeStamp = getTransactionTimeStamp(); ProjectPE previousProject = sample.getProject(); RelationshipUtils.updateModificationDateAndModifier(previousProject, session, timeStamp); 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 ab550bb41051c6ca23795af1020e90e71b0b09ef..fab96e1d340f6e10e51c8895d3337f9663d22ee3 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 @@ -32,6 +32,7 @@ import ch.systemsx.cisd.openbis.generic.server.business.IEntityOperationChecker; import ch.systemsx.cisd.openbis.generic.server.business.IRelationshipService; import ch.systemsx.cisd.openbis.generic.server.business.bo.util.DataSetTypeWithoutExperimentChecker; import ch.systemsx.cisd.openbis.generic.server.business.bo.util.SampleOwner; +import ch.systemsx.cisd.openbis.generic.server.business.bo.util.SampleUtils; import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDataDAO; import ch.systemsx.cisd.openbis.generic.server.dataaccess.IEntityPropertiesConverter; @@ -178,18 +179,23 @@ abstract class AbstractSampleBusinessObject extends AbstractSampleIdentifierBusi if (sampleIdentifier.isProjectLevel()) { ProjectPE project = findProject(sampleIdentifier.getProjectLevel()); - samplePE.setProject(project); - samplePE.setSpace(project.getSpace()); + setProjectAndSpace(samplePE, project); } String projectIdentifier = newSample.getProjectIdentifier(); if (projectIdentifier != null) { ProjectPE project = findProject(new ProjectIdentifierFactory(projectIdentifier).createIdentifier()); - samplePE.setProject(project); - samplePE.setSpace(project.getSpace()); + setProjectAndSpace(samplePE, project); } } + private void setProjectAndSpace(SamplePE samplePE, ProjectPE project) + { + SampleUtils.assertProjectSamplesEnabled(samplePE, project); + samplePE.setProject(project); + samplePE.setSpace(project.getSpace()); + } + private void updateModifierAndModificationDate(ExperimentPE experimentOrNull) { if (experimentOrNull != null) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleTable.java index c860377085d065a9b2c82695d534540818efe4c6..f388d7ee44ff8694c5aeebad27baeca63f65a767 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleTable.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleTable.java @@ -315,7 +315,7 @@ public final class SampleTable extends AbstractSampleBusinessObject implements I */ private void prepareBatchUpdate(SamplePE sample, List<AttachmentPE> attachments, SampleUpdatesDTO updates, Map<SampleOwnerIdentifier, SampleOwner> sampleOwnerCache, - Map<String, ExperimentPE> experimentCache, + Map<String, ExperimentPE> experimentCache, Map<String, ProjectPE> projectCache, Map<EntityTypePE, List<EntityTypePropertyTypePE>> propertiesCache) { if (sample == null) @@ -329,11 +329,17 @@ public final class SampleTable extends AbstractSampleBusinessObject implements I checkPropertiesBusinessRules(sample, propertiesCache); updateSpace(sample, updates.getSampleIdentifier(), sampleOwnerCache); + ExperimentIdentifier experimentIdentifier = updates.getExperimentIdentifierOrNull(); if (updates.isUpdateExperimentLink()) { - updateExperiment(sample, updates.getExperimentIdentifierOrNull(), experimentCache); + updateExperiment(sample, experimentIdentifier, experimentCache); checkExperimentBusinessRules(sample); } + + if (experimentIdentifier == null) + { + updateProject(sample, updates.getProjectIdentifier(), projectCache); + } boolean parentsUpdated = updateParents(sample, updates); @@ -519,6 +525,7 @@ public final class SampleTable extends AbstractSampleBusinessObject implements I final Map<SampleOwnerIdentifier, SampleOwner> sampleOwnerCache = new HashMap<SampleOwnerIdentifier, SampleOwner>(); final Map<String, ExperimentPE> experimentCache = new HashMap<String, ExperimentPE>(); + final Map<String, ProjectPE> projectCache = new HashMap<String, ProjectPE>(); final Map<EntityTypePE, List<EntityTypePropertyTypePE>> propertiesCache = new HashMap<EntityTypePE, List<EntityTypePropertyTypePE>>(); samples = loadSamplesByTechId(updates); @@ -550,7 +557,7 @@ public final class SampleTable extends AbstractSampleBusinessObject implements I } final List<AttachmentPE> attachments = new ArrayList<AttachmentPE>(); prepareBatchUpdate(sample, attachments, sampleUpdates, sampleOwnerCache, - experimentCache, propertiesCache); + experimentCache, projectCache, propertiesCache); putAttachments(sample.getPermId(), attachments); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/util/SampleUtils.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/util/SampleUtils.java index 30521c76f70d5c31d095540e1e932536a1fee7c8..f8a200e459f688cdef61acb6c56c99e56efa09d7 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/util/SampleUtils.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/util/SampleUtils.java @@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo.util; import ch.systemsx.cisd.common.exceptions.UserFailureException; import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE; import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE; +import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE; import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE; import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE; @@ -47,4 +48,13 @@ public class SampleUtils data.getCode(), sample == null ? "?" : sample.getIdentifier(), reason); } + public static void assertProjectSamplesEnabled(SamplePE samplePE, ProjectPE project) + { + if (SamplePE.projectSamplesEnabled == false) + { + throw new UserFailureException("Can not assign sample " + samplePE.getIdentifier() + + " to project " + project.getIdentifier() + " because project samples are not enabled."); + } + + } }