From 4106fea342a63cea362b623c3f5b80dceb4baf16 Mon Sep 17 00:00:00 2001
From: jakubs <jakubs>
Date: Mon, 3 Dec 2012 09:12:01 +0000
Subject: [PATCH] SP-416 BIS-270 extract read only methods from transaction to
 search service

SVN: 27823
---
 .../api/v1/impl/AuthorizationHelper.java      |  16 ++-
 .../v2/IDataSetRegistrationTransactionV2.java |  20 ++-
 .../api/v2/impl/AbstractTransactionState.java |  12 --
 .../impl/DataSetRegistrationTransaction.java  |  47 ++-----
 .../api/v2/impl/SearchService.java            |  86 ++++++++++++
 ...capsulatedFilteredBasicOpenBISService.java | 124 +++++++++++++-----
 .../server/EncapsulatedOpenBISService.java    |   7 +
 .../IEncapsulatedBasicOpenBISService.java     |  54 ++++++++
 .../shared/IEncapsulatedOpenBISService.java   |  59 +--------
 .../api/internal/v2/ISearchService.java       |  53 ++++++++
 10 files changed, 337 insertions(+), 141 deletions(-)

diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AuthorizationHelper.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AuthorizationHelper.java
index a06983aa502..ae246ce1f67 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AuthorizationHelper.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AuthorizationHelper.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.etlserver.registrator.api.v1.impl;
 
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
@@ -62,9 +63,20 @@ public class AuthorizationHelper
                 String user, List<String> codes);
     }
 
+    /**
+     * Returns null if given entity is not visible, or the entity if it is visible
+     */
+    public static <T> T filterToVisible(IEncapsulatedOpenBISService openBisService, String user,
+            T entity, IMapper<T, String> codeMapper, EntityKind entityKind)
+    {
+        List<String> visible =
+                entityKind.filterToVisible(openBisService, user,
+                        Collections.singletonList(codeMapper.map(entity)));
+        return visible.size() == 1 ? entity : null;
+    }
+
     public static <T> List<T> filterToVisible(IEncapsulatedOpenBISService openBisService,
-            String user, List<T> entities,
-            IMapper<T, String> codeMapper, EntityKind entityKind)
+            String user, List<T> entities, IMapper<T, String> codeMapper, EntityKind entityKind)
     {
         // create a list of codes
         List<String> codes = new LinkedList<String>();
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IDataSetRegistrationTransactionV2.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IDataSetRegistrationTransactionV2.java
index e2a8512b50c..9311ca858b2 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IDataSetRegistrationTransactionV2.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IDataSetRegistrationTransactionV2.java
@@ -22,6 +22,7 @@ import net.lemnik.eodsql.DynamicTransactionQuery;
 
 import ch.systemsx.cisd.etlserver.TopLevelDataSetRegistratorGlobalState;
 import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationContext;
+import ch.systemsx.cisd.etlserver.registrator.api.v2.impl.SearchService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IDataSetImmutable;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IExperimentImmutable;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IExternalDataManagementSystemImmutable;
@@ -59,7 +60,9 @@ public interface IDataSetRegistrationTransactionV2
      * Get a data set from the openBIS AS. Returns null if the data set does not exist.
      * 
      * @return A data set or null
+     * @deprecated Use {@link SearchService#getDataSet(String)}
      */
+    @Deprecated
     IDataSetImmutable getDataSet(String dataSetCode);
 
     /**
@@ -81,7 +84,9 @@ public interface IDataSetRegistrationTransactionV2
      * Get a sample from the openBIS AS. Returns null if the sample does not exist.
      * 
      * @return A sample or null
+     * @deprecated Use {@link SearchService#getSample(String)}
      */
+    @Deprecated
     ISampleImmutable getSample(String sampleIdentifierString);
 
     /**
@@ -118,7 +123,10 @@ public interface IDataSetRegistrationTransactionV2
 
     /**
      * Get an experiment from the openBIS AS.
+     * 
+     * @deprecated Use {@link SearchService#getExperiment(String)}
      */
+    @Deprecated
     IExperimentImmutable getExperiment(String experimentIdentifierString);
 
     /**
@@ -152,7 +160,9 @@ public interface IDataSetRegistrationTransactionV2
      * Get a project from the openBIS AS. Returns null if the project does not exist.
      * 
      * @return A project or null
+     * @deprecated Use {@link SearchService#getProject(String)}
      */
+    @Deprecated
     IProjectImmutable getProject(String projectIdentifier);
 
     /**
@@ -180,7 +190,9 @@ public interface IDataSetRegistrationTransactionV2
      * Get a space from the openBIS AS. Returns null if the space does not exist.
      * 
      * @return A space or null
+     * @deprecated Use {@link SearchService#getSpace(String)}
      */
+    @Deprecated
     ISpaceImmutable getSpace(String spaceCode);
 
     /**
@@ -194,7 +206,9 @@ public interface IDataSetRegistrationTransactionV2
      * Get a material from the openBIS AS. Returns null if the material does not exist.
      * 
      * @return A material or null
+     * @deprecated Use {@link SearchService#getMaterial(String)}
      */
+    @Deprecated
     IMaterialImmutable getMaterial(String identifier);
 
     /**
@@ -243,14 +257,14 @@ public interface IDataSetRegistrationTransactionV2
     /**
      * Only allowed when the user is available.
      * 
-     * @return Read-only metaproject with given name for current user.
+     * @return metaproject with given name for current user.
      */
     IMetaproject getMetaproject(String name);
 
     /**
      * Only allowed when the user is not available.
      * 
-     * @return Read-only metaproject with given name for specified user.
+     * @return metaproject with given name for specified user.
      */
     IMetaproject getMetaproject(String name, String ownerId);
 
@@ -258,7 +272,9 @@ public interface IDataSetRegistrationTransactionV2
      * Get the read-only vocabulary with given code
      * 
      * @returns null if the vocabulary is not found
+     * @deprecated Use {@link SearchService#getVocabulary(String)}
      */
+    @Deprecated
     IVocabularyImmutable getVocabulary(String code);
 
     /**
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/AbstractTransactionState.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/AbstractTransactionState.java
index aa61040dfec..fc8595803d2 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/AbstractTransactionState.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/AbstractTransactionState.java
@@ -407,18 +407,6 @@ public abstract class AbstractTransactionState<T extends DataSetInformation>
             }
         }
 
-        public IDataSetImmutable getDataSet(String dataSetCode)
-        {
-            ExternalData dataSet = openBisService.tryGetDataSet(dataSetCode);
-            if (dataSet == null)
-            {
-                return null;
-            } else
-            {
-                return new DataSetImmutable(dataSet, openBisService);
-            }
-        }
-
         public IDataSetUpdatable getDataSetForUpdate(String dataSetCode)
         {
             // See if we already have an updatable version of the data set
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/DataSetRegistrationTransaction.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/DataSetRegistrationTransaction.java
index 8edf2d99385..c9fbe9b92db 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/DataSetRegistrationTransaction.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/DataSetRegistrationTransaction.java
@@ -78,13 +78,6 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetRegistrationInform
 import ch.systemsx.cisd.openbis.generic.shared.basic.EntityOperationsState;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
-import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
-import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifierFactory;
-import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
-import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifierFactory;
-import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
-import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory;
-import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
 
 /**
  * The implementation of a transaction. This class is designed to be used in one thread.
@@ -275,7 +268,7 @@ public class DataSetRegistrationTransaction<T extends DataSetInformation> implem
     @Override
     public IDataSetImmutable getDataSet(String dataSetCode)
     {
-        return getStateAsLiveState().getDataSet(dataSetCode);
+        return getSearchServiceUnfiltered().getDataSet(dataSetCode);
     }
 
     @Override
@@ -293,11 +286,7 @@ public class DataSetRegistrationTransaction<T extends DataSetInformation> implem
     @Override
     public ISampleImmutable getSample(String sampleIdentifierString)
     {
-        SampleIdentifier sampleIdentifier =
-                new SampleIdentifierFactory(sampleIdentifierString).createIdentifier();
-        ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample sampleOrNull =
-                openBisService.tryGetSampleWithExperiment(sampleIdentifier);
-        return (null == sampleOrNull) ? null : new SampleImmutable(sampleOrNull);
+        return getSearchServiceUnfiltered().getSample(sampleIdentifierString);
     }
 
     @Override
@@ -339,11 +328,7 @@ public class DataSetRegistrationTransaction<T extends DataSetInformation> implem
     @Override
     public IExperimentImmutable getExperiment(String experimentIdentifierString)
     {
-        ExperimentIdentifier experimentIdentifier =
-                new ExperimentIdentifierFactory(experimentIdentifierString).createIdentifier();
-        ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment experimentOrNull =
-                openBisService.tryGetExperiment(experimentIdentifier);
-        return (null == experimentOrNull) ? null : new ExperimentImmutable(experimentOrNull);
+        return getSearchServiceUnfiltered().getExperiment(experimentIdentifierString);
     }
 
     @Override
@@ -361,13 +346,9 @@ public class DataSetRegistrationTransaction<T extends DataSetInformation> implem
     }
 
     @Override
-    public IProjectImmutable getProject(String projectIdentifierString)
+    public IProjectImmutable getProject(String projectIdentifier)
     {
-        ProjectIdentifier projectIdentifier =
-                new ProjectIdentifierFactory(projectIdentifierString).createIdentifier();
-        ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project projectOrNull =
-                openBisService.tryGetProject(projectIdentifier);
-        return (null == projectOrNull) ? null : new ProjectImmutable(projectOrNull);
+        return getSearchServiceUnfiltered().getProject(projectIdentifier);
     }
 
     @Override
@@ -391,31 +372,19 @@ public class DataSetRegistrationTransaction<T extends DataSetInformation> implem
     @Override
     public ISpaceImmutable getSpace(String spaceCode)
     {
-        SpaceIdentifier spaceIdentifier = new SpaceIdentifier(spaceCode);
-        ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space spaceOrNull =
-                openBisService.tryGetSpace(spaceIdentifier);
-        return (null == spaceOrNull) ? null : new SpaceImmutable(spaceOrNull);
+        return getSearchServiceUnfiltered().getSpace(spaceCode);
     }
 
     @Override
     public IMaterialImmutable getMaterial(String materialCode, String materialType)
     {
-        MaterialIdentifier materialIdentifier = new MaterialIdentifier(materialCode, materialType);
-        ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material materialOrNull =
-                openBisService.tryGetMaterial(materialIdentifier);
-        return (null == materialOrNull) ? null : new MaterialImmutable(materialOrNull);
+        return getSearchServiceUnfiltered().getMaterial(materialCode, materialType);
     }
 
     @Override
     public IMaterialImmutable getMaterial(String identifier)
     {
-        MaterialIdentifier materialId = MaterialIdentifier.tryParseIdentifier(identifier);
-        if (materialId == null)
-        {
-            throw new IllegalArgumentException("Incorrect material identifier format " + identifier
-                    + ". Expected code (type)");
-        }
-        return getMaterial(materialId.getCode(), materialId.getTypeCode());
+        return getSearchServiceUnfiltered().getMaterial(identifier);
     }
 
     @Override
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/SearchService.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/SearchService.java
index 4fdf53af288..ed1a2620a80 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/SearchService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/SearchService.java
@@ -35,9 +35,11 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IMaterialImmu
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IMetaprojectAssignments;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IMetaprojectContent;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IMetaprojectImmutable;
+import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IProjectImmutable;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IPropertyAssignmentImmutable;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.ISampleImmutable;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.ISearchService;
+import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.ISpaceImmutable;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IVocabularyImmutable;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.MaterialIdentifierCollection;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SampleFetchOption;
@@ -54,8 +56,13 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Metaproject;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifierFactory;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifierFactory;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
 
 /**
@@ -70,6 +77,25 @@ public class SearchService implements ISearchService
         this.openBisService = openBisService;
     }
 
+    @Override
+    public IProjectImmutable getProject(String projectIdentifierString)
+    {
+        ProjectIdentifier projectIdentifier =
+                new ProjectIdentifierFactory(projectIdentifierString).createIdentifier();
+        ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project projectOrNull =
+                openBisService.tryGetProject(projectIdentifier);
+        return (null == projectOrNull) ? null : new ProjectImmutable(projectOrNull);
+    }
+
+    @Override
+    public ISpaceImmutable getSpace(String spaceCode)
+    {
+        SpaceIdentifier spaceIdentifier = new SpaceIdentifier(spaceCode);
+        ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space spaceOrNull =
+                openBisService.tryGetSpace(spaceIdentifier);
+        return (null == spaceOrNull) ? null : new SpaceImmutable(spaceOrNull);
+    }
+
     @Override
     public List<IExperimentImmutable> listExperiments(String projectIdentifierString)
     {
@@ -290,6 +316,12 @@ public class SearchService implements ISearchService
         return ConversionUtils.convertToMetaprojectsImmutable(metaprojects);
     }
 
+    @Override
+    public IMetaprojectImmutable getMetaproject(String name)
+    {
+        return new MetaprojectImmutable(openBisService.tryGetMetaproject(name));
+    }
+
     @Override
     public IMetaprojectAssignments getMetaprojectAssignments(String name)
     {
@@ -305,4 +337,58 @@ public class SearchService implements ISearchService
                 openBisService.listMetaprojectsForEntity(entity.getEntityId());
         return ConversionUtils.convertToMetaprojectsImmutable(metaprojects);
     }
+
+    @Override
+    public IDataSetImmutable getDataSet(String dataSetCode)
+    {
+        ExternalData dataSet = openBisService.tryGetDataSet(dataSetCode);
+        if (dataSet == null)
+        {
+            return null;
+        } else
+        {
+            return new DataSetImmutable(dataSet, openBisService);
+        }
+    }
+
+    @Override
+    public IExperimentImmutable getExperiment(String experimentIdentifierString)
+    {
+        ExperimentIdentifier experimentIdentifier =
+                new ExperimentIdentifierFactory(experimentIdentifierString).createIdentifier();
+        ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment experimentOrNull =
+                openBisService.tryGetExperiment(experimentIdentifier);
+        return (null == experimentOrNull) ? null : new ExperimentImmutable(experimentOrNull);
+    }
+
+    @Override
+    public ISampleImmutable getSample(String sampleIdentifierString)
+    {
+        SampleIdentifier sampleIdentifier =
+                new SampleIdentifierFactory(sampleIdentifierString).createIdentifier();
+        ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample sampleOrNull =
+                openBisService.tryGetSampleWithExperiment(sampleIdentifier);
+        return (null == sampleOrNull) ? null : new SampleImmutable(sampleOrNull);
+    }
+
+    @Override
+    public IMaterialImmutable getMaterial(String materialCode, String materialType)
+    {
+        MaterialIdentifier materialIdentifier = new MaterialIdentifier(materialCode, materialType);
+        ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material materialOrNull =
+                openBisService.tryGetMaterial(materialIdentifier);
+        return (null == materialOrNull) ? null : new MaterialImmutable(materialOrNull);
+    }
+
+    @Override
+    public IMaterialImmutable getMaterial(String identifier)
+    {
+        MaterialIdentifier materialId = MaterialIdentifier.tryParseIdentifier(identifier);
+        if (materialId == null)
+        {
+            throw new IllegalArgumentException("Incorrect material identifier format " + identifier
+                    + ". Expected code (type)");
+        }
+        return getMaterial(materialId.getCode(), materialId.getTypeCode());
+    }
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedFilteredBasicOpenBISService.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedFilteredBasicOpenBISService.java
index 1c6db5b7534..cec395ee9a9 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedFilteredBasicOpenBISService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedFilteredBasicOpenBISService.java
@@ -35,13 +35,19 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListMaterialCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Metaproject;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MetaprojectAssignments;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MetaprojectAssignmentsFetchOption;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
 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.basic.dto.Vocabulary;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTerm;
+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;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
 
 /**
@@ -71,6 +77,47 @@ public class EncapsulatedFilteredBasicOpenBISService implements IEncapsulatedBas
         this.userName = userName;
     }
 
+    private final static IMapper<ExternalData, String> externalDataCodeMapper =
+            new IMapper<ExternalData, String>()
+                {
+                    @Override
+                    public String map(ExternalData item)
+                    {
+                        return item.getCode();
+                    }
+                };
+
+    private final static IMapper<Sample, String> sampleIdMapper = new IMapper<Sample, String>()
+        {
+            @Override
+            public String map(Sample item)
+            {
+                return item.getIdentifier();
+            }
+        };
+
+    private final static IMapper<Experiment, String> experimentIdMapper =
+            new IMapper<Experiment, String>()
+                {
+                    @Override
+                    public String map(Experiment item)
+                    {
+                        return item.getIdentifier();
+                    }
+                };
+
+    @Override
+    public Project tryGetProject(ProjectIdentifier projectIdentifier) throws UserFailureException
+    {
+        return encapsulatedService.tryGetProject(projectIdentifier);
+    }
+
+    @Override
+    public Space tryGetSpace(SpaceIdentifier spaceIdentifier) throws UserFailureException
+    {
+        return encapsulatedService.tryGetSpace(spaceIdentifier);
+    }
+
     @Override
     public DataSetTypeWithVocabularyTerms getDataSetType(String dataSetTypeCode)
     {
@@ -81,58 +128,52 @@ public class EncapsulatedFilteredBasicOpenBISService implements IEncapsulatedBas
     @Override
     public List<Sample> searchForSamples(SearchCriteria searchCriteria)
     {
-        IMapper<Sample, String> idMapper = new IMapper<Sample, String>()
-            {
-                @Override
-                public String map(Sample item)
-                {
-                    return item.getIdentifier();
-                }
-            };
 
         List<Sample> samples = etlService.searchForSamples(systemSessionToken, searchCriteria);
 
         return AuthorizationHelper.filterToVisible(encapsulatedService, userName, samples,
-                idMapper, AuthorizationHelper.EntityKind.SAMPLE);
+                sampleIdMapper, AuthorizationHelper.EntityKind.SAMPLE);
+    }
 
+    @Override
+    @ManagedAuthentication
+    public Sample tryGetSampleWithExperiment(SampleIdentifier sampleIdentifier)
+            throws UserFailureException
+    {
+        Sample sample = encapsulatedService.tryGetSampleWithExperiment(sampleIdentifier);
+        return AuthorizationHelper.filterToVisible(encapsulatedService, userName, sample,
+                sampleIdMapper, AuthorizationHelper.EntityKind.SAMPLE);
     }
 
     @Override
     public List<ExternalData> searchForDataSets(SearchCriteria searchCriteria)
     {
-        IMapper<ExternalData, String> codeMapper = new IMapper<ExternalData, String>()
-            {
-                @Override
-                public String map(ExternalData item)
-                {
-                    return item.getCode();
-                }
-            };
-
         List<ExternalData> datasets =
                 etlService.searchForDataSets(systemSessionToken, searchCriteria);
 
         return AuthorizationHelper.filterToVisible(encapsulatedService, userName, datasets,
-                codeMapper, AuthorizationHelper.EntityKind.DATA_SET);
+                externalDataCodeMapper, AuthorizationHelper.EntityKind.DATA_SET);
     }
 
     @Override
     public List<Experiment> listExperiments(ProjectIdentifier projectIdentifier)
     {
-        IMapper<Experiment, String> codeMapper = new IMapper<Experiment, String>()
-            {
-                @Override
-                public String map(Experiment item)
-                {
-                    return item.getIdentifier();
-                }
-            };
 
-        List<Experiment> datasets =
+        List<Experiment> experiments =
                 etlService.listExperiments(systemSessionToken, projectIdentifier);
 
-        return AuthorizationHelper.filterToVisible(encapsulatedService, userName, datasets,
-                codeMapper, AuthorizationHelper.EntityKind.EXPERIMENT);
+        return AuthorizationHelper.filterToVisible(encapsulatedService, userName, experiments,
+                experimentIdMapper, AuthorizationHelper.EntityKind.EXPERIMENT);
+    }
+
+    @Override
+    @ManagedAuthentication
+    public Experiment tryGetExperiment(ExperimentIdentifier experimentIdentifier)
+            throws UserFailureException
+    {
+        Experiment experiment = encapsulatedService.tryGetExperiment(experimentIdentifier);
+        return AuthorizationHelper.filterToVisible(encapsulatedService, userName, experiment,
+                experimentIdMapper, AuthorizationHelper.EntityKind.EXPERIMENT);
     }
 
     @Override
@@ -154,6 +195,13 @@ public class EncapsulatedFilteredBasicOpenBISService implements IEncapsulatedBas
         return etlService.listMaterials(systemSessionToken, criteria, withProperties);
     }
 
+    @Override
+    @ManagedAuthentication
+    public Material tryGetMaterial(MaterialIdentifier materialIdentifier)
+    {
+        return encapsulatedService.tryGetMaterial(materialIdentifier);
+    }
+
     @Override
     public List<? extends EntityTypePropertyType<?>> listPropertyDefinitionsForEntityType(
             String code, EntityKind entityKind)
@@ -168,7 +216,12 @@ public class EncapsulatedFilteredBasicOpenBISService implements IEncapsulatedBas
     }
 
     @Override
-    @ManagedAuthentication
+    public Metaproject tryGetMetaproject(String name)
+    {
+        return etlService.tryGetMetaproject(systemSessionToken, name, userName);
+    }
+
+    @Override
     public MetaprojectAssignments getMetaprojectAssignments(String name)
     {
         return etlService.getMetaprojectAssignments(systemSessionToken, name, userName,
@@ -176,9 +229,16 @@ public class EncapsulatedFilteredBasicOpenBISService implements IEncapsulatedBas
     }
 
     @Override
-    @ManagedAuthentication
     public List<Metaproject> listMetaprojectsForEntity(IObjectId entityId)
     {
         return etlService.listMetaprojectsForEntity(systemSessionToken, userName, entityId);
     }
+
+    @Override
+    public ExternalData tryGetDataSet(String dataSetCode) throws UserFailureException
+    {
+        ExternalData data = encapsulatedService.tryGetDataSet(dataSetCode);
+        return AuthorizationHelper.filterToVisible(encapsulatedService, userName, data,
+                externalDataCodeMapper, AuthorizationHelper.EntityKind.DATA_SET);
+    }
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISService.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISService.java
index ade9004e3fa..3e25a0c7e1d 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISService.java
@@ -820,6 +820,13 @@ public final class EncapsulatedOpenBISService implements IEncapsulatedOpenBISSer
                 "Listing metaprojects is available only for the user-filtered version of service");
     }
 
+    @Override
+    public Metaproject tryGetMetaproject(String name)
+    {
+        throw new UnsupportedOperationException(
+                "Getting metaproject is available only for the user-filtered version of service");
+    }
+
     @Override
     @ManagedAuthentication
     public MetaprojectAssignments getMetaprojectAssignments(String name)
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IEncapsulatedBasicOpenBISService.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IEncapsulatedBasicOpenBISService.java
index d11db413829..c350b7728b8 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IEncapsulatedBasicOpenBISService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IEncapsulatedBasicOpenBISService.java
@@ -29,12 +29,18 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListMaterialCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Metaproject;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MetaprojectAssignments;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
 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.basic.dto.Vocabulary;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTerm;
+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;
 
 /**
  * The basic subset of the {@link IEncapsulatedOpenBISService}, that requires only service and a
@@ -44,6 +50,18 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
  */
 public interface IEncapsulatedBasicOpenBISService
 {
+    /**
+     * Tries to get the space of specified identifier or <code>null</code> if not found.
+     */
+    @ManagedAuthentication
+    public Space tryGetSpace(SpaceIdentifier spaceIdentifier) throws UserFailureException;
+
+    /**
+     * Tries to get the project of specified identifier or <code>null</code> if not found.
+     */
+    @ManagedAuthentication
+    public Project tryGetProject(ProjectIdentifier projectIdentifier) throws UserFailureException;
+
     /**
      * Returns the data set type together with assigned property types for the specified data set
      * type code.
@@ -51,12 +69,29 @@ public interface IEncapsulatedBasicOpenBISService
     @ManagedAuthentication
     public DataSetTypeWithVocabularyTerms getDataSetType(String dataSetTypeCode);
 
+    /**
+     * Tries to get the data set for the specified data set code, using the ETL server's session
+     * token.
+     */
+    @ManagedAuthentication
+    public ExternalData tryGetDataSet(final String dataSetCode) throws UserFailureException;
+
     /**
      * {@link IETLLIMSService#searchForSamples(String, SearchCriteria)}
      */
     @ManagedAuthentication
     public List<Sample> searchForSamples(SearchCriteria searchCriteria);
 
+    /**
+     * Gets a sample with the specified identifier. Sample is enriched with properties and the
+     * experiment with properties.
+     * 
+     * @return <code>null</code> if no sample could be found for given <var>sampleIdentifier</var>.
+     */
+    @ManagedAuthentication
+    public Sample tryGetSampleWithExperiment(final SampleIdentifier sampleIdentifier)
+            throws UserFailureException;
+
     /**
      * {@link IETLLIMSService#searchForDataSets(String, SearchCriteria)}
      */
@@ -69,6 +104,13 @@ public interface IEncapsulatedBasicOpenBISService
     @ManagedAuthentication
     public List<Experiment> listExperiments(ProjectIdentifier projectIdentifier);
 
+    /**
+     * Tries to get the experiment of specified identifier or <code>null</code> if not found.
+     */
+    @ManagedAuthentication
+    public Experiment tryGetExperiment(ExperimentIdentifier experimentIdentifier)
+            throws UserFailureException;
+
     /**
      * Lists vocabulary terms.
      */
@@ -90,6 +132,12 @@ public interface IEncapsulatedBasicOpenBISService
     @ManagedAuthentication
     public List<Material> listMaterials(ListMaterialCriteria criteria, boolean withProperties);
 
+    /**
+     * For given {@link MaterialIdentifier} returns the corresponding {@link Material}.
+     */
+    @ManagedAuthentication
+    public Material tryGetMaterial(MaterialIdentifier materialIdentifier);
+
     /**
      * List property definitions for the given entity type
      */
@@ -104,6 +152,12 @@ public interface IEncapsulatedBasicOpenBISService
     @ManagedAuthentication
     public List<Metaproject> listMetaprojects();
 
+    /**
+     * For given (@code name} and current user returns the corresponding {@link Metaproject}
+     */
+    @ManagedAuthentication
+    public Metaproject tryGetMetaproject(String name);
+
     /**
      * List metaproject assignments for given metaproject and current user.
      */
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IEncapsulatedOpenBISService.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IEncapsulatedOpenBISService.java
index fd71893a3f5..dea973ce2bf 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IEncapsulatedOpenBISService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IEncapsulatedOpenBISService.java
@@ -29,15 +29,12 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetArchivingStatus;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletedDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalDataManagementSystem;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocationNode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Metaproject;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample;
@@ -46,7 +43,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Person;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingDataSetCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationResult;
@@ -58,8 +54,6 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.NewProperty;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SimpleDataSetInformationDTO;
-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;
 
@@ -89,13 +83,6 @@ public interface IEncapsulatedOpenBISService extends IEncapsulatedBasicOpenBISSe
     public IDatasetLocationNode tryGetDataSetLocation(final String dataSetCode)
             throws UserFailureException;
 
-    /**
-     * Tries to get the data set for the specified data set code, using the ETL server's session
-     * token.
-     */
-    @ManagedAuthentication
-    public ExternalData tryGetDataSet(final String dataSetCode) throws UserFailureException;
-
     /**
      * Tries to get the data set for the specified data set code and specified session.
      */
@@ -132,55 +119,19 @@ public interface IEncapsulatedOpenBISService extends IEncapsulatedBasicOpenBISSe
     public void checkDataSetCollectionAccess(String sessionToken, List<String> dataSetCodes)
             throws UserFailureException;
 
-    /**
-     * Tries to get the experiment of specified identifier or <code>null</code> if not found.
-     */
-    @ManagedAuthentication
-    public Experiment tryGetExperiment(ExperimentIdentifier experimentIdentifier)
-            throws UserFailureException;
-
-    /**
-     * Tries to get the space of specified identifier or <code>null</code> if not found.
-     */
-    @ManagedAuthentication
-    public Space tryGetSpace(SpaceIdentifier spaceIdentifier) throws UserFailureException;
-
-    /**
-     * Tries to get the project of specified identifier or <code>null</code> if not found.
-     */
-    @ManagedAuthentication
-    public Project tryGetProject(ProjectIdentifier projectIdentifier) throws UserFailureException;
-
     /**
      * Gets all sample in accordance to the specified criteria.
      */
     @ManagedAuthentication
     public List<Sample> listSamples(final ListSampleCriteria criteria) throws UserFailureException;
 
-    /**
-     * Gets a sample with the specified identifier. Sample is enriched with properties and the
-     * experiment with properties.
-     * 
-     * @return <code>null</code> if no sample could be found for given <var>sampleIdentifier</var>.
-     */
-    @ManagedAuthentication
-    public Sample tryGetSampleWithExperiment(final SampleIdentifier sampleIdentifier)
-            throws UserFailureException;
-
     /**
      * Tries to get the sample identifier for the sample with specified permanent ID.
      * 
      * @return <code>null</code> if nothing found.
      */
     @ManagedAuthentication
-    public SampleIdentifier tryGetSampleIdentifier(String samplePermID)
-            throws UserFailureException;
-
-    /**
-     * For given {@link MaterialIdentifier} returns the corresponding {@link Material}.
-     */
-    @ManagedAuthentication
-    public Material tryGetMaterial(MaterialIdentifier materialIdentifier);
+    public SampleIdentifier tryGetSampleIdentifier(String samplePermID) throws UserFailureException;
 
     /**
      * For given (@code name} and {@code ownerId} returns the corresponding {@link Metaproject}
@@ -276,8 +227,8 @@ public interface IEncapsulatedOpenBISService extends IEncapsulatedBasicOpenBISSe
      *         sample is found with no properties.
      */
     @ManagedAuthentication
-    public IEntityProperty[] tryGetPropertiesOfTopSample(
-            final SampleIdentifier sampleIdentifier) throws UserFailureException;
+    public IEntityProperty[] tryGetPropertiesOfTopSample(final SampleIdentifier sampleIdentifier)
+            throws UserFailureException;
 
     /**
      * Tries to return the properties of the sample with given <var>sampleIdentifier</var>.. If
@@ -288,8 +239,8 @@ public interface IEncapsulatedOpenBISService extends IEncapsulatedBasicOpenBISSe
      *         sample found with no properties.
      */
     @ManagedAuthentication
-    public IEntityProperty[] tryGetPropertiesOfSample(
-            final SampleIdentifier sampleIdentifier) throws UserFailureException;
+    public IEntityProperty[] tryGetPropertiesOfSample(final SampleIdentifier sampleIdentifier)
+            throws UserFailureException;
 
     /** See {@link IETLLIMSService#listSamplesByCriteria(String, ListSamplesByPropertyCriteria)} */
     @ManagedAuthentication
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/internal/v2/ISearchService.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/internal/v2/ISearchService.java
index 1286bb33d6d..570995643b9 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/internal/v2/ISearchService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/internal/v2/ISearchService.java
@@ -142,6 +142,11 @@ public interface ISearchService
      */
     public List<IMetaprojectImmutable> listMetaprojects();
 
+    /**
+     * Get the given metaproject for the current user
+     */
+    IMetaprojectImmutable getMetaproject(String name);
+
     /**
      * @return the assignments for the given metaproject for current user.
      */
@@ -151,4 +156,52 @@ public interface ISearchService
      * @return metaprojects for current user, which are assigned to the given entity
      */
     public List<IMetaprojectImmutable> listMetaprojectsForEntity(IMetaprojectContent entity);
+
+    /**
+     * Get a data set from the openBIS AS. Returns null if the data set does not exist.
+     * 
+     * @return A data set or null
+     */
+    IDataSetImmutable getDataSet(String dataSetCode);
+
+    /**
+     * Get a sample from the openBIS AS. Returns null if the sample does not exist.
+     * 
+     * @return A sample or null
+     */
+    ISampleImmutable getSample(String sampleIdentifierString);
+
+    /**
+     * Get an experiment from the openBIS AS.
+     */
+    IExperimentImmutable getExperiment(String experimentIdentifierString);
+
+    /**
+     * Get a project from the openBIS AS. Returns null if the project does not exist.
+     * 
+     * @return A project or null
+     */
+    IProjectImmutable getProject(String projectIdentifier);
+
+    /**
+     * Get a space from the openBIS AS. Returns null if the space does not exist.
+     * 
+     * @return A space or null
+     */
+    ISpaceImmutable getSpace(String spaceCode);
+
+    /**
+     * Get a material from the openBIS AS. Returns null if the material does not exist.
+     * 
+     * @return A material or null
+     */
+    IMaterialImmutable getMaterial(String materialCode, String materialType);
+
+    /**
+     * Get a material from the openBIS AS. Returns null if the material does not exist.
+     * 
+     * @return A material or null
+     */
+    IMaterialImmutable getMaterial(String identifier);
+
 }
-- 
GitLab