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 7176ad9d1a43ffa144c773837a12e20a0e2ee9fa..3d799fe4326383c706e3860bd6e25b550abe0e9f 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 @@ -68,23 +68,17 @@ public class RelationshipService implements IRelationshipService private DAOFactory daoFactory; @Override - public void assignExperimentToProject(IAuthSession session, ExperimentIdentifier experimentId, - ProjectIdentifier projectId) + public void assignExperimentToProject(IAuthSession session, ExperimentPE experiment, + ProjectPE project) { - ExperimentPE experiment = findExperiment(experimentId); - ProjectPE project = findProject(projectId); - SampleUtils.setSamplesGroup(experiment, project.getSpace()); experiment.setProject(project); } @Override - public void assignProjectToSpace(IAuthSession session, ProjectIdentifier projectId, - SpaceIdentifier spaceId) + public void assignProjectToSpace(IAuthSession session, ProjectPE project, + SpacePE space) { - ProjectPE project = findProject(projectId); - SpacePE space = findSpace(spaceId); - project.setSpace(space); for (ExperimentPE experiment : project.getExperiments()) { 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 74ea5e3c9ebe8056561476175df93b7fe6f3db17..64a7a3865595ddaa4848a05aea67ef7209c01133 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 @@ -428,10 +428,7 @@ public final class ExperimentBO extends AbstractBusinessObject implements IExper ProjectPE previousProject = experiment.getProject(); if (project.equals(previousProject) == false) { - relationshipService.assignExperimentToProject(session, new ExperimentIdentifier( - new ProjectIdentifier(previousProject.getSpace().getDatabaseInstance() - .getCode(), previousProject.getSpace().getCode(), previousProject - .getCode()), experiment.getCode()), updates.getProjectIdentifier()); + relationshipService.assignExperimentToProject(session, experiment, project); } for (NewAttachment attachment : updates.getAttachments()) 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 5cbab927c9386552abdd3bb46549e1f9a7de7d89..466f56f2dbced7748a93dd67bff440732044bbd8 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 @@ -250,14 +250,26 @@ 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()); + ProjectPE project = findProject(updates.getProjectIdentifier()); - relationshipService.assignExperimentToProject(session, new ExperimentIdentifier( - previousProjectId, experiment.getCode()), updates.getProjectIdentifier()); + if (previousProject.equals(project)) + { + return; + } + relationshipService.assignExperimentToProject(session, experiment, project); + } + } + + private ProjectPE findProject(ProjectIdentifier newProjectIdentifier) + { + ProjectPE project = + getProjectDAO().tryFindProject(newProjectIdentifier.getDatabaseInstanceCode(), + newProjectIdentifier.getSpaceCode(), newProjectIdentifier.getProjectCode()); + if (project == null) + { + throw UserFailureException.fromTemplate(ERR_PROJECT_NOT_FOUND, newProjectIdentifier); } + return project; } private void batchUpdateProperties(ExperimentPE experiment, List<IEntityProperty> properties, diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ProjectBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ProjectBO.java index c97b70c8ce80b7fd1e1b03f3dc9159630ecbc32c..ebe32a6eba888ba07b6647105fd23c4823ac362e 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ProjectBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ProjectBO.java @@ -46,9 +46,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE; import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectUpdatesDTO; import ch.systemsx.cisd.openbis.generic.shared.dto.Session; import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.IdentifierHelper; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier; import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind; import ch.systemsx.cisd.openbis.generic.shared.translator.AttachmentTranslator; import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils; @@ -289,15 +287,25 @@ public final class ProjectBO extends AbstractBusinessObject implements IProjectB String groupCode = updates.getGroupCode(); if (groupCode != null && groupCode.equals(project.getSpace().getCode()) == false) { - ProjectIdentifier projectId = IdentifierHelper.createProjectIdentifier(project); - SpaceIdentifier spaceId = - new SpaceIdentifier(project.getSpace().getDatabaseInstance().getCode(), - groupCode); - relationshipService.assignProjectToSpace(session, projectId, spaceId); + + relationshipService.assignProjectToSpace(session, project, findGroup(groupCode)); } dataChanged = true; } + private SpacePE findGroup(String groupCode) + { + SpacePE group = + getSpaceDAO().tryFindSpaceByCodeAndDatabaseInstance(groupCode, + project.getSpace().getDatabaseInstance()); + if (group == null) + { + throw UserFailureException + .fromTemplate("No space with the name '%s' found!", groupCode); + } + return group; + } + @Override public void deleteByTechId(TechId projectId, String reason) throws UserFailureException { diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IRelationshipService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IRelationshipService.java index bdd4ceb9526726364ee026346845d9bdfe3e77e3..086e0241565310d26124abd0566f2b53248480a0 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IRelationshipService.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IRelationshipService.java @@ -23,13 +23,18 @@ import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.Authoriz import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.Capability; import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.RolesAllowed; import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.DataSetCodePredicate; +import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.ExperimentPEPredicate; +import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.ProjectPEPredicate; import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.SampleOwnerIdentifierPredicate; import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.SpaceIdentifierPredicate; +import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.SpacePEPredicate; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy; +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; import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE; +import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier; @@ -46,20 +51,20 @@ public interface IRelationshipService { RoleWithHierarchy.SPACE_ETL_SERVER, RoleWithHierarchy.SPACE_POWER_USER }) @Capability("ASSIGN_EXPERIMENT_TO_PROJECT") public void assignExperimentToProject(IAuthSession session, - @AuthorizationGuard(guardClass = SpaceIdentifierPredicate.class) - ExperimentIdentifier experiment, - @AuthorizationGuard(guardClass = SpaceIdentifierPredicate.class) - ProjectIdentifier project); + @AuthorizationGuard(guardClass = ExperimentPEPredicate.class) + ExperimentPE experiment, + @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") public void assignProjectToSpace(IAuthSession session, - @AuthorizationGuard(guardClass = SpaceIdentifierPredicate.class) - ProjectIdentifier project, - @AuthorizationGuard(guardClass = SpaceIdentifierPredicate.class) - SpaceIdentifier space); + @AuthorizationGuard(guardClass = ProjectPEPredicate.class) + ProjectPE project, + @AuthorizationGuard(guardClass = SpacePEPredicate.class) + SpacePE space); @Transactional(propagation = Propagation.MANDATORY) @RolesAllowed(value = diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/DataPEPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/DataPEPredicate.java new file mode 100644 index 0000000000000000000000000000000000000000..3a3ff41ce4ee4e5e3b271216f5fa127d95017e23 --- /dev/null +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/DataPEPredicate.java @@ -0,0 +1,40 @@ +/* + * Copyright 2012 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.openbis.generic.shared.authorization.predicate; + +import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE; +import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE; +import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE; + +/** + * @author anttil + */ +public class DataPEPredicate extends PersistentEntityPredicate<DataPE> +{ + + @Override + public SpacePE getSpace(DataPE value) + { + return value.getExperiment().getProject().getSpace(); + } + + @Override + public DatabaseInstancePE getInstance(DataPE value) + { + return value.getExperiment().getProject().getSpace().getDatabaseInstance(); + } +} diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/ExperimentPEPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/ExperimentPEPredicate.java new file mode 100644 index 0000000000000000000000000000000000000000..8aebd07d66ab3829fe97c00b291d8355a894de4a --- /dev/null +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/ExperimentPEPredicate.java @@ -0,0 +1,41 @@ +/* + * Copyright 2012 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.openbis.generic.shared.authorization.predicate; + +import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE; +import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE; +import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE; + +/** + * @author anttil + */ +public class ExperimentPEPredicate extends PersistentEntityPredicate<ExperimentPE> +{ + + @Override + public SpacePE getSpace(ExperimentPE value) + { + return value.getProject().getSpace(); + } + + @Override + public DatabaseInstancePE getInstance(ExperimentPE value) + { + return value.getProject().getSpace().getDatabaseInstance(); + } + +} diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/PersistentEntityPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/PersistentEntityPredicate.java new file mode 100644 index 0000000000000000000000000000000000000000..38e129237b2470ad0f089795d98c4e236532c2e3 --- /dev/null +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/PersistentEntityPredicate.java @@ -0,0 +1,76 @@ +/* + * Copyright 2012 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.openbis.generic.shared.authorization.predicate; + +import java.util.List; + +import ch.systemsx.cisd.common.exceptions.Status; +import ch.systemsx.cisd.common.exceptions.UserFailureException; +import ch.systemsx.cisd.openbis.generic.shared.authorization.IAuthorizationDataProvider; +import ch.systemsx.cisd.openbis.generic.shared.authorization.RoleWithIdentifier; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy.RoleLevel; +import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE; +import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE; +import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE; + +/** + * A predicate for persistent entities. + * + * @author anttil + */ +public abstract class PersistentEntityPredicate<T> implements IPredicate<T> +{ + + @Override + public Status evaluate(PersonPE person, List<RoleWithIdentifier> allowedRoles, T valueOrNull) + throws UserFailureException + { + if (valueOrNull == null) + { + return Status.createError("null value cannot be authorized"); + } + + for (RoleWithIdentifier allowed : allowedRoles) + { + if (allowed.getRoleLevel().equals(RoleLevel.INSTANCE)) + { + if (allowed.getAssignedDatabaseInstance().equals(getInstance(valueOrNull))) + { + return Status.OK; + } + } else + { + if (allowed.getAssignedSpace().equals(getSpace(valueOrNull))) + { + return Status.OK; + } + } + } + return Status.createError(); + } + + public abstract SpacePE getSpace(T value); + + public abstract DatabaseInstancePE getInstance(T value); + + @Override + public void init(IAuthorizationDataProvider provider) + { + + } + +} diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/ProjectPEPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/ProjectPEPredicate.java new file mode 100644 index 0000000000000000000000000000000000000000..491a48566afdacaee1cbecc6a276ee11c528d3df --- /dev/null +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/ProjectPEPredicate.java @@ -0,0 +1,40 @@ +/* + * Copyright 2012 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.openbis.generic.shared.authorization.predicate; + +import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE; +import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE; +import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE; + +/** + * @author anttil + */ +public class ProjectPEPredicate extends PersistentEntityPredicate<ProjectPE> +{ + + @Override + public SpacePE getSpace(ProjectPE project) + { + return project.getSpace(); + } + + @Override + public DatabaseInstancePE getInstance(ProjectPE value) + { + return value.getSpace().getDatabaseInstance(); + } +} diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/SamplePEPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/SamplePEPredicate.java new file mode 100644 index 0000000000000000000000000000000000000000..d68a0d3a73631af1a884c64e5972cf85df8f7bc3 --- /dev/null +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/SamplePEPredicate.java @@ -0,0 +1,41 @@ +/* + * Copyright 2012 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.openbis.generic.shared.authorization.predicate; + +import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE; +import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE; +import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE; + +/** + * @author anttil + */ +public class SamplePEPredicate extends PersistentEntityPredicate<SamplePE> +{ + + @Override + public SpacePE getSpace(SamplePE value) + { + return value.getSpace(); + } + + @Override + public DatabaseInstancePE getInstance(SamplePE value) + { + return value.getDatabaseInstance(); + } + +} diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/SpacePEPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/SpacePEPredicate.java new file mode 100644 index 0000000000000000000000000000000000000000..64fbf5a6fe63e553a630d6992e76144fce674a0e --- /dev/null +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/SpacePEPredicate.java @@ -0,0 +1,38 @@ +/* + * Copyright 2012 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.openbis.generic.shared.authorization.predicate; + +import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE; +import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE; + +/** + * @author anttil + */ +public class SpacePEPredicate extends PersistentEntityPredicate<SpacePE> +{ + @Override + public SpacePE getSpace(SpacePE value) + { + return value; + } + + @Override + public DatabaseInstancePE getInstance(SpacePE value) + { + return value.getDatabaseInstance(); + } +} diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignExperimentToProjectTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignExperimentToProjectTest.java index 2915d98fb3e4446c35797e2c944bdf51b46d764a..d2b40648d1548eaa611cc751a03371aeca7e246b 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignExperimentToProjectTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignExperimentToProjectTest.java @@ -82,10 +82,17 @@ public class AssignExperimentToProjectTest extends BaseTest RoleWithHierarchy destinationSpaceRole, RoleWithHierarchy instanceRole) throws Exception { - Experiment experiment = create(anExperiment().inProject(sourceProject)); + Space unrelatedObserver = create(aSpace()); + Space unrelatedAdmin = create(aSpace()); + create(aSpace().withCode("unrelatedWithoutAccess")); String user = - create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace).withSpaceRole( - destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole)); + create(aSession() + .withSpaceRole(sourceSpaceRole, sourceSpace) + .withSpaceRole(destinationSpaceRole, destinationSpace) + .withInstanceRole(instanceRole) + .withSpaceRole(RoleWithHierarchy.SPACE_ADMIN, unrelatedAdmin) + .withSpaceRole(RoleWithHierarchy.SPACE_OBSERVER, unrelatedObserver)); + Experiment experiment = create(anExperiment().inProject(sourceProject)); perform(anUpdateOf(experiment).toProject(destinationProject).as(user)); } @@ -97,10 +104,17 @@ public class AssignExperimentToProjectTest extends BaseTest RoleWithHierarchy destinationSpaceRole, RoleWithHierarchy instanceRole) throws Exception { - Experiment experiment = create(anExperiment().inProject(sourceProject)); + Space unrelatedObserver = create(aSpace()); + Space unrelatedAdmin = create(aSpace()); + create(aSpace().withCode("unrelatedWithoutAccess")); String user = - create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace).withSpaceRole( - destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole)); + create(aSession() + .withSpaceRole(sourceSpaceRole, sourceSpace) + .withSpaceRole(destinationSpaceRole, destinationSpace) + .withInstanceRole(instanceRole) + .withSpaceRole(RoleWithHierarchy.SPACE_ADMIN, unrelatedAdmin) + .withSpaceRole(RoleWithHierarchy.SPACE_OBSERVER, unrelatedObserver)); + Experiment experiment = create(anExperiment().inProject(sourceProject)); perform(anUpdateOf(experiment).toProject(destinationProject).as(user)); } diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignProjectToSpaceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignProjectToSpaceTest.java index 97814cc5c9389d4dba4118578ac4df33295f59e8..e9894362f81ad44c76431a318e7288b878c1a19a 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignProjectToSpaceTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignProjectToSpaceTest.java @@ -77,10 +77,17 @@ public class AssignProjectToSpaceTest extends BaseTest RoleWithHierarchy destinationSpaceRole, RoleWithHierarchy instanceRole) throws Exception { - Project project = create(aProject().inSpace(sourceSpace)); + Space unrelatedObserver = create(aSpace()); + Space unrelatedAdmin = create(aSpace()); + create(aSpace().withCode("unrelatedWithoutAccess")); String user = - create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace).withSpaceRole( - destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole)); + create(aSession() + .withSpaceRole(sourceSpaceRole, sourceSpace) + .withSpaceRole(destinationSpaceRole, destinationSpace) + .withInstanceRole(instanceRole) + .withSpaceRole(RoleWithHierarchy.SPACE_ADMIN, unrelatedAdmin) + .withSpaceRole(RoleWithHierarchy.SPACE_OBSERVER, unrelatedObserver)); + Project project = create(aProject().inSpace(sourceSpace)); perform(anUpdateOf(project).toSpace(destinationSpace).as(user)); } @@ -92,10 +99,17 @@ public class AssignProjectToSpaceTest extends BaseTest RoleWithHierarchy destinationSpaceRole, RoleWithHierarchy instanceRole) throws Exception { - Project project = create(aProject().inSpace(sourceSpace)); + Space unrelatedObserver = create(aSpace()); + Space unrelatedAdmin = create(aSpace()); + create(aSpace().withCode("unrelatedWithoutAccess")); String user = - create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace).withSpaceRole( - destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole)); + create(aSession() + .withSpaceRole(sourceSpaceRole, sourceSpace) + .withSpaceRole(destinationSpaceRole, destinationSpace) + .withInstanceRole(instanceRole) + .withSpaceRole(RoleWithHierarchy.SPACE_ADMIN, unrelatedAdmin) + .withSpaceRole(RoleWithHierarchy.SPACE_OBSERVER, unrelatedObserver)); + Project project = create(aProject().inSpace(sourceSpace)); perform(anUpdateOf(project).toSpace(destinationSpace).as(user)); } diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/RelationshipServiceAuthorizationTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/RelationshipServiceAuthorizationTest.java index 5a10c8ac5c96806c47955d24ad139c45459ee9de..ab3b3bfb169c86b588dfe0a723f3956f53ac9a09 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/RelationshipServiceAuthorizationTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/RelationshipServiceAuthorizationTest.java @@ -33,6 +33,9 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space; +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.SpacePE; import ch.systemsx.cisd.openbis.systemtest.base.BaseTest; /** @@ -279,7 +282,7 @@ public class RelationshipServiceAuthorizationTest extends BaseTest destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole)); relationshipService.assignExperimentToProject(sessionManager.getSession(session), - id(sourceExperiment), id(destinationProject)); + pe(sourceExperiment), pe(destinationProject)); } private void assignProjectToSpace(RoleWithHierarchy sourceSpaceRole, @@ -291,8 +294,8 @@ public class RelationshipServiceAuthorizationTest extends BaseTest destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole)); relationshipService.assignProjectToSpace(sessionManager.getSession(session), - id(sourceProject), - id(destinationSpace)); + pe(sourceProject), + pe(destinationSpace)); } private void assignSampleToExperiment(RoleWithHierarchy sourceSpaceRole, @@ -578,6 +581,26 @@ public class RelationshipServiceAuthorizationTest extends BaseTest allSpaceRoles.add(null); } + private ExperimentPE pe(Experiment experiment) + { + return daoFactory.getExperimentDAO().tryGetByPermID(experiment.getPermId()); + } + + private ProjectPE pe(Project project) + { + return daoFactory.getProjectDAO().tryFindProject( + project.getSpace().getInstance().getCode(), project.getSpace().getCode(), + project.getCode()); + } + + private SpacePE pe(Space space) + { + return daoFactory.getSpaceDAO().tryFindSpaceByCodeAndDatabaseInstance( + space.getCode(), + daoFactory.getDatabaseInstanceDAO().tryFindDatabaseInstanceByCode( + space.getInstance().getCode())); + } + public static RoleWithHierarchy[][] toNestedArray(Collection<List<RoleWithHierarchy>> input) { RoleWithHierarchy[][] result = new RoleWithHierarchy[input.size()][]; diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/RelationshipServiceStub.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/RelationshipServiceStub.java index 85e2bb87a93c47d01686ceb66499b2520b1e6eba..86b1babef44f598506b538ab69509d8fc31314af 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/RelationshipServiceStub.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/RelationshipServiceStub.java @@ -17,10 +17,12 @@ package ch.systemsx.cisd.openbis.systemtest.base; import ch.systemsx.cisd.openbis.generic.shared.IRelationshipService; +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; import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE; +import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier; @@ -31,14 +33,14 @@ public class RelationshipServiceStub implements IRelationshipService { @Override - public void assignExperimentToProject(IAuthSession session, ExperimentIdentifier experiment, - ProjectIdentifier project) + public void assignExperimentToProject(IAuthSession session, ExperimentPE experiment, + ProjectPE project) { } @Override - public void assignProjectToSpace(IAuthSession session, ProjectIdentifier project, - SpaceIdentifier space) + public void assignProjectToSpace(IAuthSession session, ProjectPE project, + SpacePE space) { }