From b3ab46f4274ae34c71c49793e8f20f366894e26c Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Tue, 11 Sep 2012 07:03:09 +0000
Subject: [PATCH] BIS-142 Moving authorization annotations from
 IScreeningServer and IScreeningApiServer to ScreeningServer. Introducing
 system test ScreeningServerAuthorizationTest. Moving
 ServerInterfaceRegressionTest from shared to server package.

SVN: 26577
---
 .../screening/server/ScreeningServer.java     | 194 ++++++++++++++----
 .../screening/shared/IScreeningServer.java    |  58 +-----
 .../shared/api/v1/IScreeningApiServer.java    | 107 +++-------
 .../ServerInterfaceRegressionTest.java        |  13 +-
 .../ScreeningServerAuthorizationTest.java     | 127 ++++++++++++
 5 files changed, 315 insertions(+), 184 deletions(-)
 rename screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/{shared => server}/ServerInterfaceRegressionTest.java (61%)
 create mode 100644 screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/ScreeningServerAuthorizationTest.java

diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java
index a0c0930608c..4431aef8267 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java
@@ -32,7 +32,6 @@ import org.springframework.stereotype.Component;
 import ch.rinn.restrictions.Private;
 import ch.systemsx.cisd.authentication.ISessionManager;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
-import ch.systemsx.cisd.common.spring.ExposablePropertyPlaceholderConfigurer;
 import ch.systemsx.cisd.common.spring.IInvocationLoggerContext;
 import ch.systemsx.cisd.openbis.generic.server.AbstractServer;
 import ch.systemsx.cisd.openbis.generic.server.business.IPropertiesBatchManager;
@@ -44,6 +43,15 @@ import ch.systemsx.cisd.openbis.generic.server.plugin.IDataSetTypeSlaveServerPlu
 import ch.systemsx.cisd.openbis.generic.server.plugin.ISampleTypeSlaveServerPlugin;
 import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.AuthorizationGuard;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.Capability;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.ReturnValueFilter;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.RolesAllowed;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.AbstractTechIdPredicate.DataSetTechIdPredicate;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.AbstractTechIdPredicate.ExperimentTechIdPredicate;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.DataSetCodeCollectionPredicate;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.DataSetCodePredicate;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.SampleTechIdPredicate;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicProjectIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CodeAndLabel;
@@ -54,6 +62,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewMaterial;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSamplesWithTypes;
 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.SampleParentWithDerived;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
@@ -78,6 +87,13 @@ import ch.systemsx.cisd.openbis.plugin.screening.server.logic.ScreeningUtils;
 import ch.systemsx.cisd.openbis.plugin.screening.server.logic.WellContentLoader;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.IScreeningServer;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.ResourceNames;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.api.internal.authorization.ExperimentIdentifierPredicate;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.api.internal.authorization.PlateIdentifierPredicate;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.api.internal.authorization.PlateWellReferenceWithDatasetsValidator;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.api.internal.authorization.ScreeningExperimentValidator;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.api.internal.authorization.ScreeningPlateListReadOnlyPredicate;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.api.internal.authorization.ScreeningPlateValidator;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.api.internal.authorization.WellIdentifierPredicate;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.IScreeningApiServer;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.ExperimentIdentifier;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.ExperimentImageMetadata;
@@ -92,6 +108,12 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.PlateMetadata
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.PlateWellMaterialMapping;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.PlateWellReferenceWithDatasets;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.WellIdentifier;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.authorization.DatasetReferencePredicate;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.authorization.ExperimentSearchCriteriaPredicate;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.authorization.MaterialExperimentFeatureVectorSummaryValidator;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.authorization.MaterialFeaturesOneExpPredicate;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.authorization.WellContentValidator;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.authorization.WellSearchCriteriaPredicate;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.AnalysisProcedures;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.DatasetReference;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ExperimentFeatureVectorSummary;
@@ -133,9 +155,6 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
      */
     public static final int MINOR_VERSION = 9;
 
-    @Resource(name = ExposablePropertyPlaceholderConfigurer.PROPERTY_CONFIGURER_BEAN_NAME)
-    private ExposablePropertyPlaceholderConfigurer configurer;
-    
     @Resource(name = ResourceNames.SCREENING_BUSINESS_OBJECT_FACTORY)
     private IScreeningBusinessObjectFactory businessObjectFactory;
 
@@ -194,8 +213,10 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     //
 
     @Override
-    public final SampleParentWithDerived getSampleInfo(final String sessionToken,
-            final TechId sampleId)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    public SampleParentWithDerived getSampleInfo(final String sessionToken,
+            @AuthorizationGuard(guardClass = SampleTechIdPredicate.class)
+            final TechId sampleId) throws UserFailureException
     {
         final Session session = getSession(sessionToken);
         final ISampleBO sampleBO = businessObjectFactory.createSampleBO(session);
@@ -206,14 +227,19 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     }
 
     @Override
-    public PlateContent getPlateContent(String sessionToken, TechId plateId)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    public PlateContent getPlateContent(String sessionToken,
+            @AuthorizationGuard(guardClass = SampleTechIdPredicate.class)
+            TechId plateId)
     {
         Session session = getSession(sessionToken);
         return PlateContentLoader.loadImagesAndMetadata(session, businessObjectFactory, plateId);
     }
 
     @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public FeatureVectorDataset getFeatureVectorDataset(String sessionToken,
+            @AuthorizationGuard(guardClass = DatasetReferencePredicate.class)
             DatasetReference dataset, CodeAndLabel featureName)
     {
         Session session = getSession(sessionToken);
@@ -222,7 +248,10 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     }
 
     @Override
-    public PlateImages getPlateContentForDataset(String sessionToken, TechId datasetId)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    public PlateImages getPlateContentForDataset(String sessionToken,
+            @AuthorizationGuard(guardClass = DataSetTechIdPredicate.class)
+            TechId datasetId)
     {
         Session session = getSession(sessionToken);
         return PlateContentLoader.loadImagesAndMetadataForDataset(session, businessObjectFactory,
@@ -230,7 +259,11 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     }
 
     @Override
-    public List<WellContent> listPlateWells(String sessionToken, WellSearchCriteria materialCriteria)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @ReturnValueFilter(validatorClass = WellContentValidator.class)
+    public List<WellContent> listPlateWells(String sessionToken,
+            @AuthorizationGuard(guardClass = WellSearchCriteriaPredicate.class)
+            WellSearchCriteria materialCriteria)
     {
         Session session = getSession(sessionToken);
         return WellContentLoader.load(session, businessObjectFactory, getDAOFactory(),
@@ -238,7 +271,9 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     }
 
     @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public List<WellReplicaImage> listWellImages(String sessionToken, TechId materialId,
+            @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class)
             TechId experimentId)
     {
         Session session = getSession(sessionToken);
@@ -247,7 +282,10 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     }
 
     @Override
-    public List<Material> listMaterials(String sessionToken, WellSearchCriteria materialCriteria)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    public List<Material> listMaterials(String sessionToken,
+            @AuthorizationGuard(guardClass = WellSearchCriteriaPredicate.class)
+            WellSearchCriteria materialCriteria)
     {
         Session session = getSession(sessionToken);
         return WellContentLoader.loadMaterials(session, businessObjectFactory, getDAOFactory(),
@@ -255,8 +293,10 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     }
 
     @Override
-    public FeatureVectorValues getWellFeatureVectorValues(String sessionToken, String datasetCode,
-            String datastoreCode, WellLocation wellLocation)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    public FeatureVectorValues getWellFeatureVectorValues(String sessionToken,
+            @AuthorizationGuard(guardClass = DataSetCodePredicate.class)
+            String datasetCode, String datastoreCode, WellLocation wellLocation)
     {
         getSession(sessionToken);
         return FeatureVectorValuesLoader.loadFeatureVectorValues(businessObjectFactory,
@@ -264,8 +304,10 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     }
 
     @Override
-    public LogicalImageInfo getImageDatasetInfo(String sessionToken, String datasetCode,
-            String datastoreCode, WellLocation wellLocationOrNull)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    public LogicalImageInfo getImageDatasetInfo(String sessionToken,
+            @AuthorizationGuard(guardClass = DataSetCodePredicate.class)
+            String datasetCode, String datastoreCode, WellLocation wellLocationOrNull)
     {
         Session session = getSession(sessionToken);
         return LogicalImageLoader.loadLogicalImageInfo(session, businessObjectFactory, datasetCode,
@@ -273,7 +315,9 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     }
 
     @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public ImageDatasetEnrichedReference getImageDatasetReference(String sessionToken,
+            @AuthorizationGuard(guardClass = DataSetCodePredicate.class)
             String datasetCode, String datastoreCode)
     {
         Session session = getSession(sessionToken);
@@ -282,7 +326,9 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     }
 
     @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public List<ImageResolution> getImageDatasetResolutions(String sessionToken,
+            @AuthorizationGuard(guardClass = DataSetCodePredicate.class)
             String datasetCode, String datastoreCode)
     {
         checkSession(sessionToken);
@@ -292,8 +338,10 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     }
 
     @Override
-    public ImageSampleContent getImageDatasetInfosForSample(String sessionToken, TechId sampleId,
-            WellLocation wellLocationOrNull)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    public ImageSampleContent getImageDatasetInfosForSample(String sessionToken,
+            @AuthorizationGuard(guardClass = SampleTechIdPredicate.class)
+            TechId sampleId, WellLocation wellLocationOrNull)
     {
         Session session = getSession(sessionToken);
         return PlateContentLoader.getImageDatasetInfosForSample(session, businessObjectFactory,
@@ -301,18 +349,23 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     }
 
     @Override
-    public ExternalData getDataSetInfo(String sessionToken, TechId datasetId)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    public ExternalData getDataSetInfo(String sessionToken,
+            @AuthorizationGuard(guardClass = DataSetTechIdPredicate.class)
+            TechId datasetId)
     {
         return commonServer.getDataSetInfo(sessionToken, datasetId);
     }
 
     @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public Material getMaterialInfo(String sessionToken, TechId materialId)
     {
         return commonServer.getMaterialInfo(sessionToken, materialId);
     }
 
     @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public Vocabulary getVocabulary(String sessionToken, String code) throws UserFailureException
     {
         checkSession(sessionToken);
@@ -322,6 +375,8 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     }
 
     @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_ADMIN)
+    @Capability("WRITE_EXPERIMENT_SAMPLE_MATERIAL")
     public void registerLibrary(String sessionToken, String userEmail,
             List<NewMaterial> newGenesOrNull, List<NewMaterial> newOligosOrNull,
             List<NewSamplesWithTypes> newSamplesWithType)
@@ -331,8 +386,10 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     }
 
     @Override
-    public List<Material> listExperimentMaterials(String sessionToken, TechId experimentId,
-            MaterialType materialType)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    public List<Material> listExperimentMaterials(String sessionToken,
+            @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class)
+            TechId experimentId, MaterialType materialType)
     {
         // TODO 2010-09-01, Piotr Buczek: move it to some BO when we have more queries like that
         IScreeningQuery dao = createDAO(getDAOFactory());
@@ -348,7 +405,9 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     }
 
     @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public ExperimentFeatureVectorSummary getExperimentFeatureVectorSummary(String sessionToken,
+            @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class)
             TechId experimentId, AnalysisProcedureCriteria analysisProcedureCriteria)
     {
         Session session = getSession(sessionToken);
@@ -362,6 +421,8 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     }
 
     @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @ReturnValueFilter(validatorClass = MaterialExperimentFeatureVectorSummaryValidator.class)
     public List<MaterialSimpleFeatureVectorSummary> getMaterialFeatureVectorsFromAllExperiments(
             String sessionToken, MaterialFeaturesManyExpCriteria criteria)
     {
@@ -409,7 +470,9 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     }
 
     @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public MaterialReplicaFeatureSummaryResult getMaterialFeatureVectorSummary(String sessionToken,
+            @AuthorizationGuard(guardClass = MaterialFeaturesOneExpPredicate.class)
             MaterialFeaturesOneExpCriteria criteria)
     {
         Session session = getSession(sessionToken);
@@ -422,36 +485,50 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     // --------- IScreeningOpenbisServer - method signature should be changed with care
 
     @Override
-    public List<FeatureVectorDatasetReference> listFeatureVectorDatasets(String sessionToken,
-            List<? extends PlateIdentifier> plates)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    public List<FeatureVectorDatasetReference> listFeatureVectorDatasets(
+            String sessionToken,
+            @AuthorizationGuard(guardClass = ScreeningPlateListReadOnlyPredicate.class) List<? extends PlateIdentifier> plates)
+            throws IllegalArgumentException
     {
         return createScreeningApiImpl(sessionToken).listFeatureVectorDatasets(plates);
     }
 
     @Override
-    public List<ImageDatasetReference> listImageDatasets(String sessionToken,
-            List<? extends PlateIdentifier> plates)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    public List<ImageDatasetReference> listImageDatasets(
+            String sessionToken,
+            @AuthorizationGuard(guardClass = ScreeningPlateListReadOnlyPredicate.class) List<? extends PlateIdentifier> plates)
+            throws IllegalArgumentException
     {
         return createScreeningApiImpl(sessionToken).listImageDatasets(plates);
     }
 
     @Override
-    public List<ImageDatasetReference> listRawImageDatasets(String sessionToken,
-            List<? extends PlateIdentifier> plates)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    public List<ImageDatasetReference> listRawImageDatasets(
+            String sessionToken,
+            @AuthorizationGuard(guardClass = ScreeningPlateListReadOnlyPredicate.class) List<? extends PlateIdentifier> plates)
+            throws IllegalArgumentException
     {
         return createScreeningApiImpl(sessionToken).listRawImageDatasets(plates);
     }
 
     @Override
-    public List<ImageDatasetReference> listSegmentationImageDatasets(String sessionToken,
-            List<? extends PlateIdentifier> plates)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    public List<ImageDatasetReference> listSegmentationImageDatasets(
+            String sessionToken,
+            @AuthorizationGuard(guardClass = ScreeningPlateListReadOnlyPredicate.class) List<? extends PlateIdentifier> plates)
+            throws IllegalArgumentException
     {
         return createScreeningApiImpl(sessionToken).listSegmentationImageDatasets(plates);
     }
 
     @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public List<PlateWellReferenceWithDatasets> listPlateWells(
             String sessionToken,
+            @AuthorizationGuard(guardClass = ExperimentIdentifierPredicate.class)
             ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.ExperimentIdentifier experimentIdentifer,
             MaterialIdentifier materialIdentifier, boolean findDatasets)
     {
@@ -460,6 +537,8 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     }
 
     @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @ReturnValueFilter(validatorClass = PlateWellReferenceWithDatasetsValidator.class)
     public List<PlateWellReferenceWithDatasets> listPlateWells(String sessionToken,
             MaterialIdentifier materialIdentifier, boolean findDatasets)
     {
@@ -468,58 +547,78 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     }
 
     @Override
-    public List<WellIdentifier> listPlateWells(String sessionToken, PlateIdentifier plateIdentifier)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    public List<WellIdentifier> listPlateWells(
+            String sessionToken,
+            @AuthorizationGuard(guardClass = PlateIdentifierPredicate.class) PlateIdentifier plateIdentifier)
     {
         return createScreeningApiImpl(sessionToken).listPlateWells(plateIdentifier);
     }
 
     @Override
-    public Sample getWellSample(String sessionToken, WellIdentifier wellIdentifier)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    public Sample getWellSample(
+            String sessionToken,
+            @AuthorizationGuard(guardClass = WellIdentifierPredicate.class) WellIdentifier wellIdentifier)
     {
         return createScreeningApiImpl(sessionToken).getWellSample(wellIdentifier, true);
     }
 
     @Override
-    public Sample getPlateSample(String sessionToken, PlateIdentifier plateIdentifier)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    public Sample getPlateSample(
+            String sessionToken,
+            @AuthorizationGuard(guardClass = PlateIdentifierPredicate.class) PlateIdentifier plateIdentifier)
     {
         return createScreeningApiImpl(sessionToken).getPlateSample(plateIdentifier);
     }
 
     @Override
-    public List<Plate> listPlates(String sessionToken)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @ReturnValueFilter(validatorClass = ScreeningPlateValidator.class)
+    public List<Plate> listPlates(String sessionToken) throws IllegalArgumentException
     {
         return createScreeningApiImpl(sessionToken).listPlates();
     }
 
     @Override
-    public List<Plate> listPlates(String sessionToken, ExperimentIdentifier experiment)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    public List<Plate> listPlates(
+            String sessionToken,
+            @AuthorizationGuard(guardClass = ExperimentIdentifierPredicate.class) ExperimentIdentifier experiment)
+            throws IllegalArgumentException
     {
         return createScreeningApiImpl(sessionToken).listPlates(experiment);
     }
 
     @Override
-    public List<ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.ExperimentIdentifier> listExperiments(
-            String sessionToken)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @ReturnValueFilter(validatorClass = ScreeningExperimentValidator.class)
+    public List<ExperimentIdentifier> listExperiments(String sessionToken)
     {
         return createScreeningApiImpl(sessionToken).listExperiments();
     }
 
     @Override
-    public List<ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.ExperimentIdentifier> listExperiments(
-            String sessionToken, String userId)
+    @RolesAllowed(RoleWithHierarchy.INSTANCE_OBSERVER)
+    public List<ExperimentIdentifier> listExperiments(String sessionToken, String userId)
     {
         return createScreeningApiImpl(sessionToken).listExperiments(userId);
     }
 
     @Override
-    public List<IDatasetIdentifier> getDatasetIdentifiers(String sessionToken,
-            List<String> datasetCodes)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    public List<IDatasetIdentifier> getDatasetIdentifiers(
+            String sessionToken,
+            @AuthorizationGuard(guardClass = DataSetCodeCollectionPredicate.class) List<String> datasetCodes)
     {
         return createScreeningApiImpl(sessionToken).getDatasetIdentifiers(datasetCodes);
     }
 
     @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public AnalysisProcedures listNumericalDatasetsAnalysisProcedures(String sessionToken,
+            @AuthorizationGuard(guardClass = ExperimentSearchCriteriaPredicate.class)
             ExperimentSearchCriteria experimentSearchCriteria)
     {
         checkSession(sessionToken);
@@ -542,8 +641,10 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     }
 
     @Override
-    public List<PlateWellMaterialMapping> listPlateMaterialMapping(String sessionToken,
-            List<? extends PlateIdentifier> plates,
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    public List<PlateWellMaterialMapping> listPlateMaterialMapping(
+            String sessionToken,
+            @AuthorizationGuard(guardClass = ScreeningPlateListReadOnlyPredicate.class) List<? extends PlateIdentifier> plates,
             MaterialTypeIdentifier materialTypeIdentifierOrNull)
     {
         return createScreeningApiImpl(sessionToken).listPlateMaterialMapping(plates,
@@ -594,15 +695,20 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     }
 
     @Override
-    public List<PlateMetadata> getPlateMetadataList(String sessionToken,
-            List<? extends PlateIdentifier> plateIdentifiers) throws IllegalArgumentException
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    public List<PlateMetadata> getPlateMetadataList(
+            String sessionToken,
+            @AuthorizationGuard(guardClass = ScreeningPlateListReadOnlyPredicate.class) List<? extends PlateIdentifier> plateIdentifiers)
+            throws IllegalArgumentException
     {
         return createScreeningApiImpl(sessionToken).getPlateMetadata(plateIdentifiers);
     }
 
     @Override
-    public ExperimentImageMetadata getExperimentImageMetadata(String sessionToken,
-            ExperimentIdentifier experimentIdentifer)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    public ExperimentImageMetadata getExperimentImageMetadata(
+            String sessionToken,
+            @AuthorizationGuard(guardClass = ExperimentIdentifierPredicate.class) ExperimentIdentifier experimentIdentifer)
     {
         checkSession(sessionToken);
         return createScreeningApiImpl(sessionToken).getExperimentImageMetadata(experimentIdentifer);
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/IScreeningServer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/IScreeningServer.java
index 5777ba93451..7981b423cca 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/IScreeningServer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/IScreeningServer.java
@@ -22,14 +22,6 @@ import org.springframework.transaction.annotation.Transactional;
 
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.shared.IServer;
-import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.AuthorizationGuard;
-import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.Capability;
-import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.ReturnValueFilter;
-import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.RolesAllowed;
-import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.AbstractTechIdPredicate.DataSetTechIdPredicate;
-import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.AbstractTechIdPredicate.ExperimentTechIdPredicate;
-import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.DataSetCodePredicate;
-import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.SampleTechIdPredicate;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CodeAndLabel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
@@ -37,16 +29,9 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewMaterial;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSamplesWithTypes;
-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.SampleParentWithDerived;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary;
-import ch.systemsx.cisd.openbis.plugin.screening.shared.authorization.DatasetReferencePredicate;
-import ch.systemsx.cisd.openbis.plugin.screening.shared.authorization.ExperimentSearchCriteriaPredicate;
-import ch.systemsx.cisd.openbis.plugin.screening.shared.authorization.MaterialExperimentFeatureVectorSummaryValidator;
-import ch.systemsx.cisd.openbis.plugin.screening.shared.authorization.MaterialFeaturesOneExpPredicate;
-import ch.systemsx.cisd.openbis.plugin.screening.shared.authorization.WellContentValidator;
-import ch.systemsx.cisd.openbis.plugin.screening.shared.authorization.WellSearchCriteriaPredicate;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.AnalysisProcedures;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.DatasetReference;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ExperimentFeatureVectorSummary;
@@ -81,18 +66,14 @@ public interface IScreeningServer extends IServer
      * image analysis only if one dataset with such a data exist.
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public PlateContent getPlateContent(String sessionToken,
-            @AuthorizationGuard(guardClass = SampleTechIdPredicate.class)
             TechId plateId);
 
     /**
      * Loads feature vector of specified dataset with one feature specified by name.
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public FeatureVectorDataset getFeatureVectorDataset(String sessionToken,
-            @AuthorizationGuard(guardClass = DatasetReferencePredicate.class)
             DatasetReference dataset, CodeAndLabel featureName);
 
     /**
@@ -100,9 +81,7 @@ public interface IScreeningServer extends IServer
      */
     // TODO can return null
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public FeatureVectorValues getWellFeatureVectorValues(String sessionToken,
-            @AuthorizationGuard(guardClass = DataSetCodePredicate.class)
             String datasetCode, String datastoreCode, WellLocation wellLocation);
 
     /**
@@ -110,9 +89,7 @@ public interface IScreeningServer extends IServer
      * specified dataset, which is supposed to contain images in BDS-HCS format.
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public PlateImages getPlateContentForDataset(String sessionToken,
-            @AuthorizationGuard(guardClass = DataSetTechIdPredicate.class)
             TechId datasetId);
 
     /**
@@ -120,10 +97,7 @@ public interface IScreeningServer extends IServer
      * image dataset and feature vectors.
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    @ReturnValueFilter(validatorClass = WellContentValidator.class)
     public List<WellContent> listPlateWells(String sessionToken,
-            @AuthorizationGuard(guardClass = WellSearchCriteriaPredicate.class)
             WellSearchCriteria materialCriteria);
 
     /**
@@ -133,9 +107,7 @@ public interface IScreeningServer extends IServer
      * the whole well is ignored.
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public List<WellReplicaImage> listWellImages(String sessionToken, TechId materialId,
-            @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class)
             TechId experimentId);
 
     /**
@@ -144,9 +116,7 @@ public interface IScreeningServer extends IServer
      *         specified experiment(s) will be returned.
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public List<Material> listMaterials(String sessionToken,
-            @AuthorizationGuard(guardClass = WellSearchCriteriaPredicate.class)
             WellSearchCriteria materialCriteria);
 
     /**
@@ -155,33 +125,23 @@ public interface IScreeningServer extends IServer
      * @param materialType
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public List<Material> listExperimentMaterials(String sessionToken,
-            @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class)
             TechId experimentId, MaterialType materialType);
 
     @Transactional
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public LogicalImageInfo getImageDatasetInfo(String sessionToken,
-            @AuthorizationGuard(guardClass = DataSetCodePredicate.class)
             String datasetCode, String datastoreCode, WellLocation wellLocationOrNull);
 
     @Transactional
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public ImageDatasetEnrichedReference getImageDatasetReference(String sessionToken,
-            @AuthorizationGuard(guardClass = DataSetCodePredicate.class)
             String datasetCode, String datastoreCode);
 
     @Transactional
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    List<ImageResolution> getImageDatasetResolutions(String sessionToken,
-            @AuthorizationGuard(guardClass = DataSetCodePredicate.class)
+    public List<ImageResolution> getImageDatasetResolutions(String sessionToken,
             String datasetCode, String datastoreCode);
 
     @Transactional
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public ImageSampleContent getImageDatasetInfosForSample(String sessionToken,
-            @AuthorizationGuard(guardClass = SampleTechIdPredicate.class)
             TechId sampleId, WellLocation wellLocationOrNull);
 
     /**
@@ -192,40 +152,32 @@ public interface IScreeningServer extends IServer
      *             uniquely identified by given <var>sampleId</var> does not exist.
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public SampleParentWithDerived getSampleInfo(final String sessionToken,
-            @AuthorizationGuard(guardClass = SampleTechIdPredicate.class)
             final TechId sampleId) throws UserFailureException;
 
     /**
      * For given {@link TechId} returns the corresponding {@link ExternalData}.
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public ExternalData getDataSetInfo(String sessionToken,
-            @AuthorizationGuard(guardClass = DataSetTechIdPredicate.class)
             TechId datasetId);
 
     /**
      * For given {@link TechId} returns the corresponding {@link Material}.
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public Material getMaterialInfo(String sessionToken, TechId materialId);
 
     /**
      * Returns vocabulary with given code.
      */
     @Transactional
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public Vocabulary getVocabulary(String sessionToken, String code) throws UserFailureException;
 
     /**
      * Registers the contents of an uploaded library.
      */
     @Transactional
-    @RolesAllowed(RoleWithHierarchy.SPACE_ADMIN)
-    @Capability("WRITE_EXPERIMENT_SAMPLE_MATERIAL")
     public void registerLibrary(String sessionToken, String userEmail,
             List<NewMaterial> newGenesOrNull, List<NewMaterial> newOligosOrNull,
             List<NewSamplesWithTypes> newSamplesWithType);
@@ -235,9 +187,7 @@ public interface IScreeningServer extends IServer
      * materials.
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public ExperimentFeatureVectorSummary getExperimentFeatureVectorSummary(String sessionToken,
-            @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class)
             TechId experimentId, AnalysisProcedureCriteria analysisProcedureCriteria);
 
     /**
@@ -245,17 +195,13 @@ public interface IScreeningServer extends IServer
      * material.
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public MaterialReplicaFeatureSummaryResult getMaterialFeatureVectorSummary(String sessionToken,
-            @AuthorizationGuard(guardClass = MaterialFeaturesOneExpPredicate.class)
             MaterialFeaturesOneExpCriteria criteria);
 
     /**
      * Returns feature vectors from all experiments for a specified material.
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    @ReturnValueFilter(validatorClass = MaterialExperimentFeatureVectorSummaryValidator.class)
     public List<MaterialSimpleFeatureVectorSummary> getMaterialFeatureVectorsFromAllExperiments(
             String sessionToken, MaterialFeaturesManyExpCriteria criteria);
 
@@ -271,9 +217,7 @@ public interface IScreeningServer extends IServer
      * </p>
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public AnalysisProcedures listNumericalDatasetsAnalysisProcedures(String sessionToken,
-            @AuthorizationGuard(guardClass = ExperimentSearchCriteriaPredicate.class)
             ExperimentSearchCriteria experimentSearchCriteria);
 
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/IScreeningApiServer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/IScreeningApiServer.java
index fbc7d119675..639b0102ade 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/IScreeningApiServer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/IScreeningApiServer.java
@@ -23,18 +23,6 @@ import org.springframework.transaction.annotation.Transactional;
 import ch.systemsx.cisd.common.api.IRpcService;
 import ch.systemsx.cisd.common.api.MinimalMinorVersion;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample;
-import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.AuthorizationGuard;
-import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.ReturnValueFilter;
-import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.RolesAllowed;
-import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.DataSetCodeCollectionPredicate;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
-import ch.systemsx.cisd.openbis.plugin.screening.shared.api.internal.authorization.ExperimentIdentifierPredicate;
-import ch.systemsx.cisd.openbis.plugin.screening.shared.api.internal.authorization.PlateIdentifierPredicate;
-import ch.systemsx.cisd.openbis.plugin.screening.shared.api.internal.authorization.PlateWellReferenceWithDatasetsValidator;
-import ch.systemsx.cisd.openbis.plugin.screening.shared.api.internal.authorization.ScreeningExperimentValidator;
-import ch.systemsx.cisd.openbis.plugin.screening.shared.api.internal.authorization.ScreeningPlateListReadOnlyPredicate;
-import ch.systemsx.cisd.openbis.plugin.screening.shared.api.internal.authorization.ScreeningPlateValidator;
-import ch.systemsx.cisd.openbis.plugin.screening.shared.api.internal.authorization.WellIdentifierPredicate;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.ExperimentIdentifier;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.ExperimentImageMetadata;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.FeatureVectorDatasetReference;
@@ -71,7 +59,7 @@ public interface IScreeningApiServer extends IRpcService
      * Service part of the URL to access this service remotely.
      */
     public static final String SERVICE_URL = "/rmi-" + SERVICE_NAME + "-api-v1";
-    
+
     public static final String JSON_SERVICE_URL = SERVICE_URL + ".json";
 
     /**
@@ -94,22 +82,16 @@ public interface IScreeningApiServer extends IRpcService
      * hierarchical context (space, project, experiment).
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    @ReturnValueFilter(validatorClass = ScreeningPlateValidator.class)
     List<Plate> listPlates(String sessionToken) throws IllegalArgumentException;
 
-
     /**
      * Return the list of all plates assigned to the given experiment.
      * 
      * @since 1.5
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @MinimalMinorVersion(5)
-    List<Plate> listPlates(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = ExperimentIdentifierPredicate.class) ExperimentIdentifier experiment)
+    List<Plate> listPlates(String sessionToken, ExperimentIdentifier experiment)
             throws IllegalArgumentException;
 
     /**
@@ -119,12 +101,9 @@ public interface IScreeningApiServer extends IRpcService
      * @since 1.8
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @MinimalMinorVersion(8)
-    List<PlateMetadata> getPlateMetadataList(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = ScreeningPlateListReadOnlyPredicate.class) List<? extends PlateIdentifier> plates)
-            throws IllegalArgumentException;
+    List<PlateMetadata> getPlateMetadataList(String sessionToken,
+            List<? extends PlateIdentifier> plates) throws IllegalArgumentException;
 
     /**
      * Return the list of all visible experiments, along with their hierarchical context (space,
@@ -133,8 +112,6 @@ public interface IScreeningApiServer extends IRpcService
      * @since 1.1
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    @ReturnValueFilter(validatorClass = ScreeningExperimentValidator.class)
     @MinimalMinorVersion(1)
     List<ExperimentIdentifier> listExperiments(String sessionToken);
 
@@ -145,7 +122,6 @@ public interface IScreeningApiServer extends IRpcService
      * @since 1.6
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.INSTANCE_OBSERVER)
     @MinimalMinorVersion(6)
     List<ExperimentIdentifier> listExperiments(String sessionToken, String userId);
 
@@ -154,22 +130,16 @@ public interface IScreeningApiServer extends IRpcService
      * sets containing feature vectors for each of these plates.
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    List<FeatureVectorDatasetReference> listFeatureVectorDatasets(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = ScreeningPlateListReadOnlyPredicate.class) List<? extends PlateIdentifier> plates)
-            throws IllegalArgumentException;
+    List<FeatureVectorDatasetReference> listFeatureVectorDatasets(String sessionToken,
+            List<? extends PlateIdentifier> plates) throws IllegalArgumentException;
 
     /**
      * For a given set of plates provide the list of all data sets containing images for each of
      * these plates.
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    List<ImageDatasetReference> listImageDatasets(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = ScreeningPlateListReadOnlyPredicate.class) List<? extends PlateIdentifier> plates)
-            throws IllegalArgumentException;
+    List<ImageDatasetReference> listImageDatasets(String sessionToken,
+            List<? extends PlateIdentifier> plates) throws IllegalArgumentException;
 
     /**
      * For a given set of plates provide the list of all data sets containing raw images for each of
@@ -178,12 +148,9 @@ public interface IScreeningApiServer extends IRpcService
      * @since 1.6
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @MinimalMinorVersion(6)
-    List<ImageDatasetReference> listRawImageDatasets(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = ScreeningPlateListReadOnlyPredicate.class) List<? extends PlateIdentifier> plates)
-            throws IllegalArgumentException;
+    List<ImageDatasetReference> listRawImageDatasets(String sessionToken,
+            List<? extends PlateIdentifier> plates) throws IllegalArgumentException;
 
     /**
      * For a given set of plates provide the list of all data sets containing segmentation images
@@ -192,21 +159,15 @@ public interface IScreeningApiServer extends IRpcService
      * @since 1.6
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @MinimalMinorVersion(6)
-    List<ImageDatasetReference> listSegmentationImageDatasets(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = ScreeningPlateListReadOnlyPredicate.class) List<? extends PlateIdentifier> plates)
-            throws IllegalArgumentException;
+    List<ImageDatasetReference> listSegmentationImageDatasets(String sessionToken,
+            List<? extends PlateIdentifier> plates) throws IllegalArgumentException;
 
     /**
      * Converts a given list of dataset codes to dataset identifiers.
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    List<IDatasetIdentifier> getDatasetIdentifiers(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = DataSetCodeCollectionPredicate.class) List<String> datasetCodes);
+    List<IDatasetIdentifier> getDatasetIdentifiers(String sessionToken, List<String> datasetCodes);
 
     /**
      * For the given <var>experimentIdentifier</var>, find all plate locations that are connected to
@@ -216,12 +177,10 @@ public interface IScreeningApiServer extends IRpcService
      * @since 1.1
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @MinimalMinorVersion(1)
-    List<PlateWellReferenceWithDatasets> listPlateWells(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = ExperimentIdentifierPredicate.class) ExperimentIdentifier experimentIdentifer,
-            MaterialIdentifier materialIdentifier, boolean findDatasets);
+    List<PlateWellReferenceWithDatasets> listPlateWells(String sessionToken,
+            ExperimentIdentifier experimentIdentifer, MaterialIdentifier materialIdentifier,
+            boolean findDatasets);
 
     /**
      * For the given <var>materialIdentifier</var>, find all plate locations that are connected to
@@ -231,8 +190,6 @@ public interface IScreeningApiServer extends IRpcService
      * @since 1.2
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    @ReturnValueFilter(validatorClass = PlateWellReferenceWithDatasetsValidator.class)
     @MinimalMinorVersion(2)
     List<PlateWellReferenceWithDatasets> listPlateWells(String sessionToken,
             MaterialIdentifier materialIdentifier, boolean findDatasets);
@@ -243,35 +200,27 @@ public interface IScreeningApiServer extends IRpcService
      * @since 1.3
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @MinimalMinorVersion(3)
-    public List<WellIdentifier> listPlateWells(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = PlateIdentifierPredicate.class) PlateIdentifier plateIdentifier);
+    public List<WellIdentifier> listPlateWells(String sessionToken, PlateIdentifier plateIdentifier);
 
     /**
-     * For a given <var>wellIdentifier</var>, return the corresponding {@link Sample} including properties.
+     * For a given <var>wellIdentifier</var>, return the corresponding {@link Sample} including
+     * properties.
      * 
      * @since 1.3
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @MinimalMinorVersion(3)
-    public Sample getWellSample(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = WellIdentifierPredicate.class) WellIdentifier wellIdentifier);
-    
+    public Sample getWellSample(String sessionToken, WellIdentifier wellIdentifier);
+
     /**
      * For a given <var>plateIdentifier</var>, return the corresponding {@link Sample}.
      * 
      * @since 1.7
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @MinimalMinorVersion(7)
-    public Sample getPlateSample(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = PlateIdentifierPredicate.class) PlateIdentifier plateIdentifier);
+    public Sample getPlateSample(String sessionToken, PlateIdentifier plateIdentifier);
 
     /**
      * For a given list of <var>plates</var>, return the mapping of plate wells to materials
@@ -284,11 +233,9 @@ public interface IScreeningApiServer extends IRpcService
      * @since 1.2
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @MinimalMinorVersion(2)
-    List<PlateWellMaterialMapping> listPlateMaterialMapping(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = ScreeningPlateListReadOnlyPredicate.class) List<? extends PlateIdentifier> plates,
+    List<PlateWellMaterialMapping> listPlateMaterialMapping(String sessionToken,
+            List<? extends PlateIdentifier> plates,
             MaterialTypeIdentifier materialTypeIdentifierOrNull);
 
     /**
@@ -297,10 +244,8 @@ public interface IScreeningApiServer extends IRpcService
      * @since 1.9
      */
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @MinimalMinorVersion(1)
-    ExperimentImageMetadata getExperimentImageMetadata(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = ExperimentIdentifierPredicate.class) ExperimentIdentifier experimentIdentifer);
+    ExperimentImageMetadata getExperimentImageMetadata(String sessionToken,
+            ExperimentIdentifier experimentIdentifer);
 
 }
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/shared/ServerInterfaceRegressionTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/ServerInterfaceRegressionTest.java
similarity index 61%
rename from screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/shared/ServerInterfaceRegressionTest.java
rename to screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/ServerInterfaceRegressionTest.java
index 1a41070434f..3673400dba0 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/shared/ServerInterfaceRegressionTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/ServerInterfaceRegressionTest.java
@@ -14,11 +14,13 @@
  * limitations under the License.
  */
 
-package ch.systemsx.cisd.openbis.plugin.screening.shared;
+package ch.systemsx.cisd.openbis.plugin.screening.server;
 
 import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.openbis.generic.shared.RegressionTestCase;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.IScreeningServer;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.IScreeningApiServer;
 
 /**
  * @author Tomasz Pylak
@@ -28,6 +30,13 @@ public class ServerInterfaceRegressionTest extends RegressionTestCase
     @Test
     public void testServerAnnotations()
     {
-        assertMandatoryMethodAnnotations(IScreeningServer.class);
+        assertMandatoryMethodAnnotations(IScreeningServer.class, ScreeningServer.class);
+    }
+    
+    @Test
+    public void testApiServerAnnotations()
+    {
+        assertMandatoryMethodAnnotations(IScreeningApiServer.class, ScreeningServer.class,
+                "tryLoginScreening: RolesAllowed\n" + "logoutScreening: RolesAllowed\n");
     }
 }
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/ScreeningServerAuthorizationTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/ScreeningServerAuthorizationTest.java
new file mode 100644
index 00000000000..d38cb546d10
--- /dev/null
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/ScreeningServerAuthorizationTest.java
@@ -0,0 +1,127 @@
+/*
+ * 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.screening.systemtests;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import ch.systemsx.cisd.common.exceptions.AuthorizationFailureException;
+import ch.systemsx.cisd.openbis.generic.server.ICommonServerForInternalUse;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Grantee;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewMaterial;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSamplesWithTypes;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Person;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy.RoleCode;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.DatabaseInstanceIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.IScreeningServer;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.ResourceNames;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.IScreeningApiServer;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.ExperimentIdentifier;
+
+/**
+ * 
+ *
+ * @author Franz-Josef Elmer
+ */
+public class ScreeningServerAuthorizationTest extends AbstractScreeningSystemTestCase
+{
+    private static final String TEST_USER = "test-user";
+    private static final String SPACE_CODE = "CISD";
+    
+    private ICommonServerForInternalUse commonServer;
+    private IScreeningServer screeningServer;
+    private IScreeningApiServer screeningApiServer;
+    private String userSessionToken;
+
+    @BeforeMethod
+    public void setUp()
+    {
+        commonServer =
+                (ICommonServerForInternalUse) applicationContext
+                        .getBean(ch.systemsx.cisd.openbis.generic.shared.ResourceNames.COMMON_SERVER);
+        Object serverBean = applicationContext
+                .getBean(ResourceNames.SCREENING_PLUGIN_SERVER);
+        screeningServer = (IScreeningServer) serverBean;
+        screeningApiServer = (IScreeningApiServer) serverBean;
+        String sessionToken = commonServer.tryToAuthenticateAsSystem().getSessionToken();
+        if (hasSpace(sessionToken, SPACE_CODE) == false)
+        {
+            commonServer.registerSpace(sessionToken, SPACE_CODE, null);
+        }
+        if (hasPerson(sessionToken, TEST_USER) == false)
+        {
+            commonServer.registerPerson(sessionToken, TEST_USER);
+            Grantee grantee = Grantee.createPerson(TEST_USER);
+            commonServer.registerSpaceRole(sessionToken, RoleCode.OBSERVER, new SpaceIdentifier(
+                    SPACE_CODE), grantee);
+        }
+        userSessionToken = commonServer.tryToAuthenticate(TEST_USER, "abc").getSessionToken();
+    }
+
+    private boolean hasSpace(String sessionToken, String spaceCode)
+    {
+        List<Space> spaces =
+                commonServer.listSpaces(sessionToken, DatabaseInstanceIdentifier.HOME_INSTANCE);
+        for (Space space : spaces)
+        {
+            if (space.getCode().equals(spaceCode))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+    
+    private boolean hasPerson(String sessionToken, String personID)
+    {
+        List<Person> persons = commonServer.listPersons(sessionToken);
+        for (Person person : persons)
+        {
+            if (person.getUserId().equals(personID))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+    
+    @Test(expectedExceptions = AuthorizationFailureException.class)
+    public void testSetSessionUserFailsBecauseOfNonAuthorized()
+    {
+        screeningServer.setSessionUser(userSessionToken, "system");
+    }
+    
+    @Test(expectedExceptions = AuthorizationFailureException.class)
+    public void testListPlatesFailsBecauseOfAuthorization()
+    {
+        screeningApiServer.listPlates(userSessionToken, new ExperimentIdentifier("a", "b", "c", "d"));
+    }
+    
+    @Test(expectedExceptions = AuthorizationFailureException.class)
+    public void testRegisterLibraryFailsBecauseOfNonAuthorized()
+    {
+        screeningServer.registerLibrary(userSessionToken, "",
+                Collections.<NewMaterial> emptyList(), Collections.<NewMaterial> emptyList(),
+                Collections.<NewSamplesWithTypes> emptyList());
+    }
+    
+}
-- 
GitLab