diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/rights/GetRightsExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/rights/GetRightsExecutor.java index 77bcd6fdfe3f7f86c0a92085d5d8de138d25a5fc..6a37e6e240fd442b172a8e255ea24ebd9b9afe4a 100644 --- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/rights/GetRightsExecutor.java +++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/rights/GetRightsExecutor.java @@ -38,13 +38,16 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id.IDataSetId; import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.ExperimentIdentifier; import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.ExperimentPermId; import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.IExperimentId; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.IProjectId; import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.ProjectIdentifier; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.ProjectPermId; import ch.ethz.sis.openbis.generic.asapi.v3.dto.rights.Right; import ch.ethz.sis.openbis.generic.asapi.v3.dto.rights.Rights; import ch.ethz.sis.openbis.generic.asapi.v3.dto.rights.fetchoptions.RightsFetchOptions; import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.ISampleId; import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SampleIdentifier; import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SamplePermId; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.ISpaceId; import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.SpacePermId; import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext; import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.dataset.IDataSetAuthorizationExecutor; @@ -52,6 +55,7 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.dataset.IMapDataSetB import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.experiment.IExperimentAuthorizationExecutor; import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.experiment.IMapExperimentByIdExecutor; import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.project.IMapProjectByIdExecutor; +import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.project.IProjectAuthorizationExecutor; import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.sample.IMapSampleByIdExecutor; import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.sample.ISampleAuthorizationExecutor; import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.space.IMapSpaceByIdExecutor; @@ -65,6 +69,7 @@ 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.ExperimentIdentifierFactory; +import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifierFactory; /** * @author Franz-Josef Elmer @@ -78,6 +83,9 @@ public class GetRightsExecutor implements IGetRightsExecutor @Autowired private IMapProjectByIdExecutor mapProjectByIdExecutor; + @Autowired + private IProjectAuthorizationExecutor projectAuthorizationExecutor; + @Autowired private IMapSampleByIdExecutor mapSampleByIdExecutor; @@ -123,6 +131,10 @@ public class GetRightsExecutor implements IGetRightsExecutor private Map<Class<? extends IObjectId>, IHandler> getHandlersByObjectIdClassMap() { Map<Class<? extends IObjectId>, IHandler> map = new LinkedHashMap<>(); + + IHandler projectHandler = new ProjectHandler(); + map.put(ProjectIdentifier.class, projectHandler); + map.put(ProjectPermId.class, projectHandler); IHandler sampleHandler = new SampleHandler(); map.put(SampleIdentifier.class, sampleHandler); @@ -339,6 +351,57 @@ public class GetRightsExecutor implements IGetRightsExecutor } } + + private class ProjectHandler extends AbstractHandler<IProjectId, ProjectPE> + { + ProjectHandler() + { + super(IProjectId.class); + } + + @Override + Map<IProjectId, ProjectPE> getEntitiesByIds(IOperationContext context, Collection<IProjectId> ids) + { + return mapProjectByIdExecutor.map(context, ids); + } + + @Override + void canUpdate(IOperationContext context, IProjectId id, ProjectPE entity) + { + projectAuthorizationExecutor.canUpdate(context, id, entity); + } + + @Override + ProjectPE createDummyEntity(IOperationContext context, IProjectId id) + { + if (id instanceof ProjectPermId) + { + throw new UserFailureException("Unknown project with perm id " + id + "."); + } + if (id instanceof ProjectIdentifier == false) + { + throw new UserFailureException("Project identifier of unsupported type (" + + id.getClass().getName() + "): " + id); + } + ISpaceId spaceId = new SpacePermId(ProjectIdentifierFactory.parse(((ProjectIdentifier) id).getIdentifier()) + .getSpaceCode()); + SpacePE spacePE = mapSpaceByIdExecutor.map(context, Arrays.asList(spaceId)).get(spaceId); + if (spacePE == null) + { + throw new UserFailureException("Unknown space in project identifier '" + id + "'."); + } + ProjectPE projectPE = new ProjectPE(); + projectPE.setSpace(spacePE); + projectPE.setCode("DUMMY"); + return projectPE; + } + + @Override + void canCreate(IOperationContext context, ProjectPE entity) + { + projectAuthorizationExecutor.canCreate(context, entity); + } + } private class DataSetHandler implements IHandler { diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetRightsTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetRightsTest.java index d8bdb27da0954b010b491d23661e592d7eee35ef..420582c87d67759473179e58a8c3171de6fcc248 100644 --- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetRightsTest.java +++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetRightsTest.java @@ -28,6 +28,8 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.id.IObjectId; import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id.DataSetPermId; import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.ExperimentIdentifier; import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.ExperimentPermId; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.ProjectIdentifier; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.ProjectPermId; import ch.ethz.sis.openbis.generic.asapi.v3.dto.rights.Rights; import ch.ethz.sis.openbis.generic.asapi.v3.dto.rights.fetchoptions.RightsFetchOptions; import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SampleIdentifier; @@ -38,6 +40,52 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SamplePermId; */ public class GetRightsTest extends AbstractTest { + @Test + public void testGetProjectRights() + { + // Given + String sessionToken = v3api.login(TEST_ROLE_V3, PASSWORD); + IObjectId s1 = new ProjectIdentifier("/TEST-SPACE/TEST-PROJECT"); + IObjectId s2 = new ProjectIdentifier("/CISD/NEMO"); + IObjectId s3 = new SampleIdentifier("/CISD/NEW"); + IObjectId s4 = new SampleIdentifier("/TEST-SPACE/NEW"); + + // When + Map<IObjectId, Rights> map = v3api.getRights(sessionToken, Arrays.asList(s1, s2, s3, s4), new RightsFetchOptions()); + + // Then + assertEquals(map.get(s1).getRights().toString(), "[]"); + assertEquals(map.get(s2).getRights().toString(), "[UPDATE]"); + assertEquals(map.get(s3).getRights().toString(), "[CREATE]"); + assertEquals(map.get(s4).getRights().toString(), "[]"); + } + + @Test + public void testGetProjectCreationRightForUnknownProjectPermId() + { + // Given + String sessionToken = v3api.login(TEST_ROLE_V3, PASSWORD); + IObjectId s1 = new ProjectPermId("123-45"); + + // When + assertUserFailureException(Void -> v3api.getRights(sessionToken, Arrays.asList(s1), new RightsFetchOptions()), + // Then + "Unknown project with perm id 123-45."); + } + + @Test + public void testGetProjectCreationRightInMissingSpace() + { + // Given + String sessionToken = v3api.login(TEST_ROLE_V3, PASSWORD); + IObjectId s1 = new ProjectIdentifier("/NO-SPACE/NEW"); + + // When + assertUserFailureException(Void -> v3api.getRights(sessionToken, Arrays.asList(s1), new RightsFetchOptions()), + // Then + "Unknown space in project identifier '/NO-SPACE/NEW'."); + } + @Test public void testGetSampleRights() {