diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/UpdateSampleProjectExecutor.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/UpdateSampleProjectExecutor.java index 1f307682b7874b807858c85042488cc605287643..abf213c0bac031bcd2b455e56252c38f59bb397a 100644 --- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/UpdateSampleProjectExecutor.java +++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/UpdateSampleProjectExecutor.java @@ -98,7 +98,7 @@ public class UpdateSampleProjectExecutor extends AbstractUpdateEntityToOneRelati relationshipService.unassignSampleFromProject(context.getSession(), entity); } else { - relationshipService.reassignSampleToProject(context.getSession(), entity, related); + relationshipService.assignSampleToProject(context.getSession(), entity, related); } } diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/IRelationshipService.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/IRelationshipService.java index f4cb21cbdeeaa58bf1744f5760c97508f78ea575..42566c8965a7d902b94bf7e63cbb7340b4827b63 100644 --- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/IRelationshipService.java +++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/IRelationshipService.java @@ -60,13 +60,6 @@ public interface IRelationshipService @AuthorizationGuard(guardClass = SamplePEPredicate.class) SamplePE sample, @AuthorizationGuard(guardClass = ProjectPEPredicate.class) ProjectPE project); - @Transactional(propagation = Propagation.MANDATORY) - @RolesAllowed(value = { RoleWithHierarchy.SPACE_ETL_SERVER, RoleWithHierarchy.PROJECT_POWER_USER }) - @Capability("REASSIGN_SAMPLE_TO_PROJECT") - public void reassignSampleToProject(IAuthSession session, - @AuthorizationGuard(guardClass = SamplePEPredicate.class) SamplePE sample, - @AuthorizationGuard(guardClass = ProjectPEPredicate.class) ProjectPE project); - @Transactional(propagation = Propagation.MANDATORY) @RolesAllowed(value = { RoleWithHierarchy.SPACE_ETL_SERVER, RoleWithHierarchy.SPACE_POWER_USER }) @Capability("ASSIGN_PROJECT_TO_SPACE") @@ -81,6 +74,12 @@ public interface IRelationshipService @AuthorizationGuard(guardClass = SamplePEPredicate.class) SamplePE sample, @AuthorizationGuard(guardClass = ExperimentPEPredicate.class) ExperimentPE experiment); + @Transactional(propagation = Propagation.MANDATORY) + @RolesAllowed(value = { RoleWithHierarchy.SPACE_ETL_SERVER, RoleWithHierarchy.PROJECT_POWER_USER }) + @Capability("UNASSIGN_SAMPLE_FROM_PROJECT") + public void checkCanUnassignSampleFromProject(IAuthSession session, + @AuthorizationGuard(guardClass = SamplePEPredicate.class) SamplePE sample); + @Transactional(propagation = Propagation.MANDATORY) @RolesAllowed(value = { RoleWithHierarchy.SPACE_ETL_SERVER, RoleWithHierarchy.PROJECT_POWER_USER }) @Capability("UNASSIGN_SAMPLE_FROM_EXPERIMENT") diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/RelationshipService.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/RelationshipService.java index 84a5effaa9ed175d209fa8e478a4df36d643d90d..1992f498e1c4ae23282c14f83dd496ebf0e3e8c4 100644 --- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/RelationshipService.java +++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/RelationshipService.java @@ -97,16 +97,17 @@ public class RelationshipService implements IRelationshipService, ApplicationCon @Override public void assignSampleToProject(IAuthSession session, SamplePE sample, ProjectPE project) - { - reassignSampleToProject(session, sample, project); - } - - @Override public void reassignSampleToProject(final IAuthSession session, final SamplePE sample, final ProjectPE project) { if (SamplePE.projectSamplesEnabled) { Date timeStamp = getTransactionTimeStamp(); ProjectPE previousProject = sample.getProject(); + + if (previousProject != null && !previousProject.equals(project)) + { + service.checkCanUnassignSampleFromProject(session, sample); + } + RelationshipUtils.updateModificationDateAndModifier(previousProject, session, timeStamp); sample.setProject(project); RelationshipUtils.updateModificationDateAndModifier(project, session, timeStamp); @@ -157,6 +158,12 @@ public class RelationshipService implements IRelationshipService, ApplicationCon session, timeStamp); } + @Override + public void checkCanUnassignSampleFromProject(IAuthSession session, SamplePE sample) + { + // all the logic is done by the authorization mechanism + } + @Override public void checkCanUnassignSampleFromExperiment(IAuthSession session, SamplePE sample) { diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java index 78eb2d9ede901e00d4f7d4f9034ad724db6bda78..55bd2616071c259179279b63c139588f00a7a6d5 100644 --- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java +++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java @@ -879,7 +879,7 @@ abstract class AbstractBusinessObject implements IDAOFactory { if (project != null) { - relationshipService.reassignSampleToProject(session, sample, project); + relationshipService.assignSampleToProject(session, sample, project); } else { relationshipService.unassignSampleFromProject(session, sample); diff --git a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/RelationshipServiceStub.java b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/RelationshipServiceStub.java index 75cf5ae068ddaee04934c7feda4aa67844a64672..861af746a6d176edc1276ba4d066606a5e80a976 100644 --- a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/RelationshipServiceStub.java +++ b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/RelationshipServiceStub.java @@ -49,6 +49,10 @@ public class RelationshipServiceStub implements IRelationshipService { } + @Override public void checkCanUnassignSampleFromProject(final IAuthSession session, final SamplePE sample) + { + } + @Override public void checkCanUnassignSampleFromExperiment(IAuthSession session, SamplePE sample) { @@ -140,12 +144,6 @@ public class RelationshipServiceStub implements IRelationshipService } - @Override - public void reassignSampleToProject(final IAuthSession session, final SamplePE sample, final ProjectPE project) - { - - } - @Override public void unassignSampleFromProject(IAuthSession session, SamplePE sample) {