From 5e0117b78b655a6e687521075a6c1c0fbb8b162c Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Fri, 15 May 2009 19:38:03 +0000
Subject: [PATCH] [LMS-870] added usage of techId to download/upload
 attachments and load sample/experiment edit data

SVN: 11058
---
 .../application/AttachmentsSection.java       | 19 ++++----
 .../client/application/GenericConstants.java  |  4 +-
 .../web/client/dto/IAttachmentHolder.java     |  8 ++--
 .../generic/shared/IPluginCommonServer.java   | 15 +++++++
 .../web/client/IGenericClientService.java     | 10 +++++
 .../client/IGenericClientServiceAsync.java    | 11 +++++
 .../experiment/GenericExperimentEditForm.java |  6 +--
 .../material/GenericMaterialEditForm.java     |  5 +--
 .../sample/GenericSampleEditForm.java         |  7 +--
 .../web/server/AttachmentDownloadServlet.java | 38 +++++++---------
 .../web/server/GenericClientService.java      | 38 ++++++++++++++++
 .../plugin/generic/server/GenericServer.java  | 40 +++++++++++++----
 .../generic/server/GenericServerLogger.java   | 43 ++++++++++++-------
 .../plugin/generic/shared/IGenericServer.java | 27 +++++++-----
 .../screening/server/ScreeningServer.java     | 11 +++++
 .../server/ScreeningServerLogger.java         |  7 +++
 .../shared/AbstractServerTestCase.java        |  3 --
 .../generic/shared/CommonTestUtils.java       |  3 ++
 .../shared/IPluginCommonServer.java.expected  | 15 +++++++
 .../server/AttachmentDownloadServletTest.java |  6 +--
 .../generic/server/GenericServerTest.java     |  9 ++--
 .../shared/IGenericServer.java.expected       | 27 +++++++-----
 22 files changed, 246 insertions(+), 106 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AttachmentsSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AttachmentsSection.java
index 00fc6f1c2a6..eed36891eaa 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AttachmentsSection.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AttachmentsSection.java
@@ -52,6 +52,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.Windo
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Attachment;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.AttachmentHolderKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.IAttachmentHolder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentifiable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.URLMethodWithParameters;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind;
@@ -138,7 +139,8 @@ public class AttachmentsSection<T extends IAttachmentHolder> extends SectionPane
                 private void showVersionsPanel(final String fileName,
                         final List<Attachment> allFiles)
                 {
-                    final String tabTitle = attachmentHolder.getIdentifier() + ">" + fileName;
+                    final String tabTitle =
+                            "Attachment " + attachmentHolder.getCode() + "/" + fileName;
                     final ITabItemFactory tabFactory = new ITabItemFactory()
                         {
                             public ITabItem create()
@@ -149,8 +151,7 @@ public class AttachmentsSection<T extends IAttachmentHolder> extends SectionPane
 
                             public String getId()
                             {
-                                return createAttachmentVersionTabId(fileName, attachmentHolder
-                                        .getIdentifier());
+                                return createAttachmentVersionTabId(fileName, attachmentHolder);
                             }
                         };
                     DispatcherHelper.dispatchNaviEvent(tabFactory);
@@ -189,7 +190,7 @@ public class AttachmentsSection<T extends IAttachmentHolder> extends SectionPane
         ContentPanel panel = new ContentPanel();
         panel.setHeading("Versions of file '" + fileName + "' from "
                 + attachmentHolder.getAttachmentHolderKind().name().toLowerCase() + " '"
-                + attachmentHolder.getIdentifier() + "'");
+                + attachmentHolder.getCode() + "'");
         final ListStore<AttachmentVersionModel> attachmentStore =
                 new ListStore<AttachmentVersionModel>();
         attachmentStore.add(AttachmentVersionModel.convert(oldVersions));
@@ -217,15 +218,16 @@ public class AttachmentsSection<T extends IAttachmentHolder> extends SectionPane
                     attachmentGrid.getSelectionModel().deselectAll();
                 }
             });
-        panel.setId(createAttachmentVersionTabId(fileName, attachmentHolder.getIdentifier()));
+        panel.setId(createAttachmentVersionTabId(fileName, attachmentHolder));
         panel.add(attachmentGrid);
         return panel;
     }
 
     // @Private
-    static String createAttachmentVersionTabId(final String fileName, String experimentIdentifier)
+    static String createAttachmentVersionTabId(final String fileName,
+            final IIdentifiable identifiable)
     {
-        return GenericConstants.ID_PREFIX + "attachment-versions-" + experimentIdentifier + "_"
+        return GenericConstants.ID_PREFIX + "attachment-versions-" + identifiable.getId() + "_"
                 + fileName;
     }
 
@@ -243,8 +245,7 @@ public class AttachmentsSection<T extends IAttachmentHolder> extends SectionPane
         methodWithParameters.addParameter(GenericConstants.FILE_NAME_PARAMETER, fileName);
         methodWithParameters.addParameter(GenericConstants.ATTACHMENT_HOLDER_PARAMETER, exp
                 .getAttachmentHolderKind().name());
-        methodWithParameters.addParameter(GenericConstants.IDENTIFIER_PARAMETER, exp
-                .getIdentifier());
+        methodWithParameters.addParameter(GenericConstants.TECH_ID_PARAMETER, exp.getId());
         return methodWithParameters.toString();
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/GenericConstants.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/GenericConstants.java
index 0579c590123..cf2a381c350 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/GenericConstants.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/GenericConstants.java
@@ -74,6 +74,6 @@ public final class GenericConstants
 
     public static final String LABEL_SEPARATOR = ":";
 
-    /** The HTTP URL parameter used to specify the identifier. */
-    public static final String IDENTIFIER_PARAMETER = "identifier";
+    /** The HTTP URL parameter used to specify the technical id. */
+    public static final String TECH_ID_PARAMETER = "id";
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/IAttachmentHolder.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/IAttachmentHolder.java
index 79d87750fe5..446359f29b9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/IAttachmentHolder.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/IAttachmentHolder.java
@@ -18,16 +18,14 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.dto;
 
 import java.util.List;
 
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentifiable;
+
 /**
  * @author Izabela Adamczyk
  */
-public interface IAttachmentHolder
+public interface IAttachmentHolder extends IIdentifiable
 {
     public AttachmentHolderKind getAttachmentHolderKind();
 
-    public String getIdentifier();
-
-    public Long getId();
-
     public List<Attachment> getAttachments();
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IPluginCommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IPluginCommonServer.java
index 3274c3010a3..bcd1a5df0e3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IPluginCommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IPluginCommonServer.java
@@ -26,6 +26,8 @@ import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.RoleSet;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.RolesAllowed;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.NewSamplePredicate;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.SampleOwnerIdentifierPredicate;
+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.NewSample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AttachmentPE;
@@ -55,6 +57,19 @@ public interface IPluginCommonServer extends IServer
             @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class) final SampleIdentifier sampleIdentifier)
             throws UserFailureException;
 
+    /**
+     * For given {@link TechId} returns the {@link SamplePE} and its children.
+     * 
+     * @return never <code>null</code>.
+     * @throws UserFailureException if given <var>sessionToken</var> is invalid or whether sample
+     *             uniquely identified by given <var>sampleId</var> does not exist.
+     */
+    @Transactional(readOnly = true)
+    @RolesAllowed(RoleSet.OBSERVER)
+    public SampleGenerationDTO getSampleInfo(final String sessionToken,
+            @AuthorizationGuard(guardClass = SampleTechIdPredicate.class) final TechId sampleId)
+            throws UserFailureException;
+
     /**
      * Registers a new sample.
      */
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/IGenericClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/IGenericClientService.java
index e7816f49838..5bc2e8ed6f1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/IGenericClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/IGenericClientService.java
@@ -63,6 +63,11 @@ public interface IGenericClientService extends IClientService
      */
     public Sample getSampleInfo(final String sampleIdentifier) throws UserFailureException;
 
+    /**
+     * For given {@link TechId} returns corresponding {@link Sample}.
+     */
+    public Sample getSampleInfo(final TechId sampleId) throws UserFailureException;
+
     /**
      * Registers a new sample.
      */
@@ -84,6 +89,11 @@ public interface IGenericClientService extends IClientService
     public Experiment getExperimentInfo(final String experimentIdentifier)
             throws UserFailureException;
 
+    /**
+     * For given {@link TechId} returns corresponding {@link Experiment}.
+     */
+    public Experiment getExperimentInfo(final TechId experimentId) throws UserFailureException;
+
     /**
      * For given {@link TechId} returns corresponding {@link Material}.
      */
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/IGenericClientServiceAsync.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/IGenericClientServiceAsync.java
index 6b154f4b773..e87f976f6e6 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/IGenericClientServiceAsync.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/IGenericClientServiceAsync.java
@@ -59,6 +59,11 @@ public interface IGenericClientServiceAsync extends IClientServiceAsync
      */
     public void getSampleInfo(final String sampleIdentifier, AsyncCallback<Sample> asyncCallback);
 
+    /**
+     * @see IGenericClientService#getSampleInfo(TechId)
+     */
+    public void getSampleInfo(final TechId sampleId, AsyncCallback<Sample> asyncCallback);
+
     /**
      * @see IGenericClientService#registerSample(String, NewSample)
      */
@@ -79,6 +84,12 @@ public interface IGenericClientServiceAsync extends IClientServiceAsync
     public void getExperimentInfo(String experimentIdentifier,
             final AsyncCallback<Experiment> experimentInfoCallback);
 
+    /**
+     * @see IGenericClientService#getExperimentInfo(TechId)
+     */
+    public void getExperimentInfo(TechId experimentId,
+            final AsyncCallback<Experiment> experimentInfoCallback);
+
     /**
      * @see IGenericClientService#getMaterialInfo(TechId)
      */
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentEditForm.java
index a652b9a31fc..06b53b205d9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentEditForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentEditForm.java
@@ -40,8 +40,7 @@ public final class GenericExperimentEditForm extends AbstractGenericExperimentRe
     private Experiment originalExperiment;
 
     public static DatabaseModificationAwareComponent create(
-            IViewContext<IGenericClientServiceAsync> viewContext,
-            IIdentifiable identifiable)
+            IViewContext<IGenericClientServiceAsync> viewContext, IIdentifiable identifiable)
     {
         GenericExperimentEditForm form = new GenericExperimentEditForm(viewContext, identifiable);
         return new DatabaseModificationAwareComponent(form, form);
@@ -149,8 +148,7 @@ public final class GenericExperimentEditForm extends AbstractGenericExperimentRe
     @Override
     protected void loadForm()
     {
-        String experimentIdentifier = identifiableOrNull.getIdentifier();
-        viewContext.getService().getExperimentInfo(experimentIdentifier,
+        viewContext.getService().getExperimentInfo(techIdOrNull,
                 new ExperimentInfoCallback(viewContext));
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/material/GenericMaterialEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/material/GenericMaterialEditForm.java
index f52efa4e8f0..b6db2040452 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/material/GenericMaterialEditForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/material/GenericMaterialEditForm.java
@@ -28,7 +28,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractRegistrationForm;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Material;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentifiable;
-import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType;
@@ -135,8 +134,8 @@ public final class GenericMaterialEditForm
     @Override
     protected void loadForm()
     {
-        TechId materialId = new TechId(identifiableOrNull);
-        viewContext.getService().getMaterialInfo(materialId, new MaterialInfoCallback(viewContext));
+        viewContext.getService().getMaterialInfo(techIdOrNull,
+                new MaterialInfoCallback(viewContext));
     }
 
     public final class MaterialInfoCallback extends AbstractAsyncCallback<Material>
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java
index 63052ff9239..75c724e2c87 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java
@@ -70,8 +70,7 @@ public final class GenericSampleEditForm extends
     private ExperimentChooserFieldAdaptor experimentFieldOrNull;
 
     public static DatabaseModificationAwareComponent create(
-            IViewContext<IGenericClientServiceAsync> viewContext,
-            IIdentifiable identifiable)
+            IViewContext<IGenericClientServiceAsync> viewContext, IIdentifiable identifiable)
     {
         GenericSampleEditForm form = new GenericSampleEditForm(viewContext, identifiable);
         return new DatabaseModificationAwareComponent(form, form);
@@ -237,9 +236,7 @@ public final class GenericSampleEditForm extends
     @Override
     protected void loadForm()
     {
-        String sampleIdentifier = identifiableOrNull.getIdentifier();
-        viewContext.getService().getSampleInfo(sampleIdentifier,
-                new SampleInfoCallback(viewContext));
+        viewContext.getService().getSampleInfo(techIdOrNull, new SampleInfoCallback(viewContext));
     }
 
     public final class SampleInfoCallback extends AbstractAsyncCallback<Sample>
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/AttachmentDownloadServlet.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/AttachmentDownloadServlet.java
index b1ebb13d740..9bbbf64f70f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/AttachmentDownloadServlet.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/AttachmentDownloadServlet.java
@@ -28,13 +28,8 @@ import ch.rinn.restrictions.Private;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.AttachmentHolderKind;
 import ch.systemsx.cisd.openbis.generic.client.web.server.AbstractFileDownloadServlet;
+import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AttachmentPE;
-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.plugin.generic.shared.IGenericServer;
 
 /**
@@ -70,56 +65,53 @@ public class AttachmentDownloadServlet extends AbstractFileDownloadServlet
         final int version =
                 Integer.parseInt(request.getParameter(GenericConstants.VERSION_PARAMETER));
         final String fileName = request.getParameter(GenericConstants.FILE_NAME_PARAMETER);
-        final String identifier = request.getParameter(GenericConstants.IDENTIFIER_PARAMETER);
+        final String techIdString = request.getParameter(GenericConstants.TECH_ID_PARAMETER);
         final String attachmentHolderKind =
                 request.getParameter(GenericConstants.ATTACHMENT_HOLDER_PARAMETER);
 
-        if (StringUtils.isNotBlank(fileName) && StringUtils.isNotBlank(identifier)
+        if (StringUtils.isNotBlank(fileName) && StringUtils.isNotBlank(techIdString)
                 && StringUtils.isNotBlank(attachmentHolderKind))
         {
+            final TechId techId = new TechId(Long.parseLong(techIdString));
             if (attachmentHolderKind.equals(AttachmentHolderKind.EXPERIMENT.name()))
             {
-                return getExperimentFile(request, version, fileName, identifier);
+                return getExperimentFile(request, version, fileName, techId);
             } else if (attachmentHolderKind.equals(AttachmentHolderKind.SAMPLE.name()))
             {
-                return getSampleFile(request, version, fileName, identifier);
+                return getSampleFile(request, version, fileName, techId);
             } else if (attachmentHolderKind.equals(AttachmentHolderKind.PROJECT.name()))
             {
-                return getProjectFile(request, version, fileName, identifier);
+                return getProjectFile(request, version, fileName, techId);
             }
         }
         return null;
     }
 
     private FileContent getExperimentFile(final HttpServletRequest request, final int version,
-            final String fileName, final String identifier)
+            final String fileName, final TechId experimentId)
     {
-        final ExperimentIdentifier experiment =
-                new ExperimentIdentifierFactory(identifier).createIdentifier();
         final AttachmentPE attachment =
-                server.getExperimentFileAttachment(getSessionToken(request), experiment, fileName,
-                        version);
+                server.getExperimentFileAttachment(getSessionToken(request), experimentId,
+                        fileName, version);
         return new FileContent(attachment.getAttachmentContent().getValue(), attachment
                 .getFileName());
     }
 
     private FileContent getSampleFile(final HttpServletRequest request, final int version,
-            final String fileName, final String identifier)
+            final String fileName, final TechId sampleId)
     {
-        final SampleIdentifier sample = new SampleIdentifierFactory(identifier).createIdentifier();
         final AttachmentPE attachment =
-                server.getSampleFileAttachment(getSessionToken(request), sample, fileName, version);
+                server.getSampleFileAttachment(getSessionToken(request), sampleId, fileName,
+                        version);
         return new FileContent(attachment.getAttachmentContent().getValue(), attachment
                 .getFileName());
     }
 
     private FileContent getProjectFile(final HttpServletRequest request, final int version,
-            final String fileName, final String identifier)
+            final String fileName, final TechId projectId)
     {
-        final ProjectIdentifier project =
-                new ProjectIdentifierFactory(identifier).createIdentifier();
         final AttachmentPE attachment =
-                server.getProjectFileAttachment(getSessionToken(request), project, fileName,
+                server.getProjectFileAttachment(getSessionToken(request), projectId, fileName,
                         version);
         return new FileContent(attachment.getAttachmentContent().getValue(), attachment
                 .getFileName());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
index 14939ae50d7..4e699356ba7 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
@@ -140,6 +140,27 @@ public final class GenericClientService extends AbstractClientService implements
         return getSampleGenerationInfo(sampleIdentifier).getGenerator();
     }
 
+    public final SampleGeneration getSampleGenerationInfo(final TechId sampleId)
+            throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
+    {
+        try
+        {
+            final String sessionToken = getSessionToken();
+            final SampleGenerationDTO sampleGenerationDTO =
+                    genericServer.getSampleInfo(sessionToken, sampleId);
+            return SampleTranslator.translate(sampleGenerationDTO);
+        } catch (final ch.systemsx.cisd.common.exceptions.UserFailureException e)
+        {
+            throw UserFailureExceptionTranslator.translate(e);
+        }
+    }
+
+    public final Sample getSampleInfo(final TechId sampleId)
+            throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
+    {
+        return getSampleGenerationInfo(sampleId).getGenerator();
+    }
+
     public final void registerSample(final String sessionKey, final NewSample newSample)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
@@ -320,6 +341,23 @@ public final class GenericClientService extends AbstractClientService implements
         }
     }
 
+    public final Experiment getExperimentInfo(final TechId experimentId)
+            throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
+    {
+        try
+        {
+            final String sessionToken = getSessionToken();
+            final ExperimentPE experiment =
+                    genericServer.getExperimentInfo(sessionToken, experimentId);
+            return ExperimentTranslator.translate(experiment,
+                    ExperimentTranslator.LoadableFields.PROPERTIES,
+                    ExperimentTranslator.LoadableFields.ATTACHMENTS);
+        } catch (final ch.systemsx.cisd.common.exceptions.UserFailureException e)
+        {
+            throw UserFailureExceptionTranslator.translate(e);
+        }
+    }
+
     public final Material getMaterialInfo(final TechId materialId)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
index f4e6824bd93..65da88679d9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
@@ -60,7 +60,6 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SampleTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.IdentifierHelper;
-import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
 import ch.systemsx.cisd.openbis.plugin.generic.shared.IGenericServer;
@@ -133,6 +132,20 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
                 .getSampleInfo(session, sample);
     }
 
+    public final SampleGenerationDTO getSampleInfo(final String sessionToken, final TechId sampleId)
+    {
+        assert sessionToken != null : "Unspecified session token.";
+        assert sampleId != null : "Unspecified sample techId.";
+
+        final Session session = getSessionManager().getSession(sessionToken);
+        final ISampleBO sampleBO = businessObjectFactory.createSampleBO(session);
+        sampleBO.loadDataByTechId(sampleId);
+        sampleBO.enrichWithAttachments();
+        final SamplePE sample = sampleBO.getSample();
+        return getSampleTypeSlaveServerPlugin(sample.getSampleType())
+                .getSampleInfo(session, sample);
+    }
+
     public final void registerSample(final String sessionToken, final NewSample newSample,
             List<AttachmentPE> attachments)
     {
@@ -162,6 +175,17 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
         return experiment;
     }
 
+    public ExperimentPE getExperimentInfo(final String sessionToken, final TechId experimentId)
+    {
+        final Session session = getSessionManager().getSession(sessionToken);
+        final IExperimentBO experimentBO = businessObjectFactory.createExperimentBO(session);
+        experimentBO.loadDataByTechId(experimentId);
+        experimentBO.enrichWithProperties();
+        experimentBO.enrichWithAttachments();
+        final ExperimentPE experiment = experimentBO.getExperiment();
+        return experiment;
+    }
+
     public MaterialPE getMaterialInfo(final String sessionToken, final TechId materialId)
     {
         final Session session = getSessionManager().getSession(sessionToken);
@@ -184,12 +208,12 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
     }
 
     public AttachmentPE getExperimentFileAttachment(final String sessionToken,
-            final ExperimentIdentifier experimentIdentifier, final String filename,
-            final int version) throws UserFailureException
+            final TechId experimentId, final String filename, final int version)
+            throws UserFailureException
     {
         final Session session = getSessionManager().getSession(sessionToken);
         final IExperimentBO experimentBO = businessObjectFactory.createExperimentBO(session);
-        experimentBO.loadByExperimentIdentifier(experimentIdentifier);
+        experimentBO.loadDataByTechId(experimentId);
         return experimentBO.getExperimentFileAttachment(filename, version);
     }
 
@@ -303,21 +327,21 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
         materialTable.save();
     }
 
-    public AttachmentPE getProjectFileAttachment(String sessionToken, ProjectIdentifier project,
+    public AttachmentPE getProjectFileAttachment(String sessionToken, TechId projectId,
             String fileName, int version)
     {
         final Session session = getSessionManager().getSession(sessionToken);
         final IProjectBO bo = businessObjectFactory.createProjectBO(session);
-        bo.loadByProjectIdentifier(project);
+        bo.loadDataByTechId(projectId);
         return bo.getProjectFileAttachment(fileName, version);
     }
 
-    public AttachmentPE getSampleFileAttachment(String sessionToken, SampleIdentifier sample,
+    public AttachmentPE getSampleFileAttachment(String sessionToken, TechId sampleId,
             String fileName, int version)
     {
         final Session session = getSessionManager().getSession(sessionToken);
         final ISampleBO bo = businessObjectFactory.createSampleBO(session);
-        bo.loadBySampleIdentifier(sample);
+        bo.loadDataByTechId(sampleId);
         return bo.getSampleFileAttachment(fileName, version);
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerLogger.java
index 59aa8d82ac5..0fe6fd67410 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerLogger.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerLogger.java
@@ -42,7 +42,6 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleGenerationDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 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.plugin.generic.shared.IGenericServer;
 
@@ -74,6 +73,12 @@ final class GenericServerLogger extends AbstractServerLogger implements IGeneric
         return null;
     }
 
+    public final SampleGenerationDTO getSampleInfo(final String sessionToken, final TechId sampleId)
+    {
+        logAccess(sessionToken, "get_sample_info", "ID(%s)", sampleId);
+        return null;
+    }
+
     public void registerSample(final String sessionToken, final NewSample newSample,
             List<AttachmentPE> attachments)
     {
@@ -88,6 +93,12 @@ final class GenericServerLogger extends AbstractServerLogger implements IGeneric
         return null;
     }
 
+    public ExperimentPE getExperimentInfo(final String sessionToken, final TechId experimentId)
+    {
+        logAccess(sessionToken, "get_experiment_info", "ID(%s)", experimentId);
+        return null;
+    }
+
     public MaterialPE getMaterialInfo(final String sessionToken, final TechId materialId)
     {
         logAccess(sessionToken, "get_material_info", "ID(%s)", materialId);
@@ -101,15 +112,6 @@ final class GenericServerLogger extends AbstractServerLogger implements IGeneric
         return null;
     }
 
-    public AttachmentPE getExperimentFileAttachment(final String sessionToken,
-            final ExperimentIdentifier experimentIdentifier, final String filename,
-            final int version) throws UserFailureException
-    {
-        logAccess(sessionToken, "get_attachment", "EXPERIMENT_IDENTIFIER(%s) FILE(%s) VERSION(%s)",
-                experimentIdentifier, filename, version);
-        return null;
-    }
-
     public final void registerSamples(final String sessionToken, final SampleType sampleType,
             final List<NewSample> newSamples) throws UserFailureException
     {
@@ -132,19 +134,28 @@ final class GenericServerLogger extends AbstractServerLogger implements IGeneric
                 materialTypeCode, CollectionUtils.abbreviate(newMaterials, 20));
     }
 
-    public AttachmentPE getProjectFileAttachment(String sessionToken, ProjectIdentifier project,
+    public AttachmentPE getExperimentFileAttachment(final String sessionToken,
+            final TechId experimentId, final String filename, final int version)
+            throws UserFailureException
+    {
+        logAccess(sessionToken, "get_attachment", "EXPERIMENT_ID(%s) FILE(%s) VERSION(%s)",
+                experimentId, filename, version);
+        return null;
+    }
+
+    public AttachmentPE getProjectFileAttachment(String sessionToken, TechId projectId,
             String fileName, int version)
     {
-        logAccess(sessionToken, "get_attachment", "PROJECT_IDENTIFIER(%s) FILE(%s) VERSION(%s)",
-                project, fileName, version);
+        logAccess(sessionToken, "get_attachment", "PROJECT_ID(%s) FILE(%s) VERSION(%s)", projectId,
+                fileName, version);
         return null;
     }
 
-    public AttachmentPE getSampleFileAttachment(String sessionToken, SampleIdentifier sample,
+    public AttachmentPE getSampleFileAttachment(String sessionToken, TechId sampleId,
             String fileName, int version)
     {
-        logAccess(sessionToken, "get_attachment", "SAMPLE_IDENTIFIER(%s) FILE(%s) VERSION(%s)",
-                sample, fileName, version);
+        logAccess(sessionToken, "get_attachment", "SAMPLE_ID(%s) FILE(%s) VERSION(%s)", sampleId,
+                fileName, version);
         return null;
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/shared/IGenericServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/shared/IGenericServer.java
index d682ea2c12b..cd60e63a512 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/shared/IGenericServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/shared/IGenericServer.java
@@ -35,6 +35,9 @@ import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.NewExperi
 import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.NewSamplePredicate;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.NullableGroupIdentifierPredicate;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.SampleOwnerIdentifierPredicate;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.SampleTechIdPredicate;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.AbstractTechIdPredicate.ExperimentTechIdPredicate;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.AbstractTechIdPredicate.ProjectTechIdPredicate;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentUpdateResult;
@@ -51,7 +54,6 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialPE;
 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;
 
 /**
@@ -71,6 +73,14 @@ public interface IGenericServer extends IPluginCommonServer
             String sessionToken,
             @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) ExperimentIdentifier identifier);
 
+    /**
+     * For given {@link TechId} returns the corresponding {@link ExperimentPE}.
+     */
+    @Transactional(readOnly = true)
+    @RolesAllowed(RoleSet.OBSERVER)
+    public ExperimentPE getExperimentInfo(String sessionToken,
+            @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class) TechId experimentId);
+
     /**
      * For given {@link TechId} returns the corresponding {@link MaterialPE}.
      */
@@ -91,9 +101,8 @@ public interface IGenericServer extends IPluginCommonServer
      */
     @Transactional
     @RolesAllowed(RoleSet.OBSERVER)
-    public AttachmentPE getExperimentFileAttachment(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) ExperimentIdentifier experimentIdentifier,
+    public AttachmentPE getExperimentFileAttachment(String sessionToken,
+            @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class) TechId experimentId,
             String filename, int version) throws UserFailureException;
 
     /**
@@ -133,9 +142,8 @@ public interface IGenericServer extends IPluginCommonServer
      */
     @Transactional
     @RolesAllowed(RoleSet.OBSERVER)
-    public AttachmentPE getSampleFileAttachment(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class) SampleIdentifier sample,
+    public AttachmentPE getSampleFileAttachment(String sessionToken,
+            @AuthorizationGuard(guardClass = SampleTechIdPredicate.class) TechId sampleId,
             String fileName, int version);
 
     /**
@@ -143,9 +151,8 @@ public interface IGenericServer extends IPluginCommonServer
      */
     @Transactional
     @RolesAllowed(RoleSet.OBSERVER)
-    public AttachmentPE getProjectFileAttachment(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) ProjectIdentifier project,
+    public AttachmentPE getProjectFileAttachment(String sessionToken,
+            @AuthorizationGuard(guardClass = ProjectTechIdPredicate.class) TechId projectId,
             String fileName, int version);
 
     /**
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java
index d2171609765..5fa2379958c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java
@@ -30,6 +30,7 @@ import ch.systemsx.cisd.openbis.generic.server.business.bo.ISampleBO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.server.plugin.IDataSetTypeSlaveServerPlugin;
 import ch.systemsx.cisd.openbis.generic.server.plugin.ISampleTypeSlaveServerPlugin;
+import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AttachmentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleGenerationDTO;
@@ -102,6 +103,16 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
                 .getSampleInfo(session, sample);
     }
 
+    public final SampleGenerationDTO getSampleInfo(final String sessionToken, final TechId sampleId)
+    {
+        final Session session = getSessionManager().getSession(sessionToken);
+        final ISampleBO sampleBO = businessObjectFactory.createSampleBO(session);
+        sampleBO.loadDataByTechId(sampleId);
+        final SamplePE sample = sampleBO.getSample();
+        return getSampleTypeSlaveServerPlugin(sample.getSampleType())
+                .getSampleInfo(session, sample);
+    }
+
     public final void registerSample(final String sessionToken, final NewSample newSample,
             List<AttachmentPE> attachments)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServerLogger.java
index 96bab1b0843..dbf560041c1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServerLogger.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServerLogger.java
@@ -20,6 +20,7 @@ import java.util.List;
 
 import ch.systemsx.cisd.authentication.ISessionManager;
 import ch.systemsx.cisd.openbis.generic.server.AbstractServerLogger;
+import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AttachmentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleGenerationDTO;
@@ -51,6 +52,12 @@ final class ScreeningServerLogger extends AbstractServerLogger implements IScree
         return null;
     }
 
+    public final SampleGenerationDTO getSampleInfo(final String sessionToken, final TechId sampleId)
+    {
+        logAccess(sessionToken, "get_plate_info", "ID(%s)", sampleId);
+        return null;
+    }
+
     public void registerSample(final String sessionToken, final NewSample newSample,
             List<AttachmentPE> attachments)
     {
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/AbstractServerTestCase.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/AbstractServerTestCase.java
index 2c7bd75f3a4..762761f9210 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/AbstractServerTestCase.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/AbstractServerTestCase.java
@@ -55,7 +55,6 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.IRoleAssignmentDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.ISampleDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.ISampleTypeDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IVocabularyDAO;
-import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
@@ -79,8 +78,6 @@ public abstract class AbstractServerTestCase extends AssertJUnit
     protected static final Session SESSION =
             new Session(CommonTestUtils.USER_ID, SESSION_TOKEN, PRINCIPAL, "remote-host", 1);
 
-    protected static final TechId DUMMY_TECH_ID = new TechId(1L);
-
     protected BufferedAppender logRecorder;
 
     protected Mockery context;
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/CommonTestUtils.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/CommonTestUtils.java
index bb6c3466aed..c4baa9f8f1a 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/CommonTestUtils.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/CommonTestUtils.java
@@ -20,6 +20,7 @@ import java.util.Arrays;
 import java.util.List;
 
 import ch.systemsx.cisd.authentication.Principal;
+import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AttachmentContentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AttachmentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataTypePE;
@@ -57,6 +58,8 @@ public class CommonTestUtils
 
     private static final VocabularyTermPE HEAD = createVocabularyTerm("HEAD");
 
+    public static final TechId DUMMY_TECH_ID = new TechId(1L);
+
     public final static String ATTACHMENT_CONTENT_TEXT = "Lorem ipsum...";
 
     public final static String HOME_DATABASE_INSTANCE_CODE = "HOME_DATABASE";
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/IPluginCommonServer.java.expected b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/IPluginCommonServer.java.expected
index 0482200f5f7..4bbeea92309 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/IPluginCommonServer.java.expected
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/IPluginCommonServer.java.expected
@@ -26,6 +26,8 @@ import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.RoleSet;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.RolesAllowed;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.NewSamplePredicate;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.SampleOwnerIdentifierPredicate;
+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.NewSample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AttachmentPE;
@@ -55,6 +57,19 @@ public interface IPluginCommonServer extends IServer
             @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class) final SampleIdentifier sampleIdentifier)
             throws UserFailureException;
 
+    /**
+     * For given {@link TechId} returns the {@link SamplePE} and its children.
+     * 
+     * @return never <code>null</code>.
+     * @throws UserFailureException if given <var>sessionToken</var> is invalid or whether sample
+     *             uniquely identified by given <var>sampleId</var> does not exist.
+     */
+    @Transactional(readOnly = true)
+    @RolesAllowed(RoleSet.OBSERVER)
+    public SampleGenerationDTO getSampleInfo(final String sessionToken,
+            @AuthorizationGuard(guardClass = SampleTechIdPredicate.class) final TechId sampleId)
+            throws UserFailureException;
+
     /**
      * Registers a new sample.
      */
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/AttachmentDownloadServletTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/AttachmentDownloadServletTest.java
index 678f76be20b..76c7a8e1b01 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/AttachmentDownloadServletTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/AttachmentDownloadServletTest.java
@@ -100,8 +100,8 @@ public final class AttachmentDownloadServletTest
                     will(returnValue(CommonTestUtils.FILENAME));
                     one(servletRequest).getParameter(GenericConstants.ATTACHMENT_HOLDER_PARAMETER);
                     will(returnValue(AttachmentHolderKind.EXPERIMENT.name()));
-                    one(servletRequest).getParameter(GenericConstants.IDENTIFIER_PARAMETER);
-                    will(returnValue(CommonTestUtils.createExperimentIdentifier().toString()));
+                    one(servletRequest).getParameter(GenericConstants.TECH_ID_PARAMETER);
+                    will(returnValue(CommonTestUtils.DUMMY_TECH_ID.toString()));
 
                     one(servletRequest).getSession(false);
                     will(Expectations.returnValue(httpSession));
@@ -110,7 +110,7 @@ public final class AttachmentDownloadServletTest
                     will(Expectations.returnValue(session));
 
                     one(genericServer).getExperimentFileAttachment(session.getSessionToken(),
-                            CommonTestUtils.createExperimentIdentifier(), CommonTestUtils.FILENAME,
+                            CommonTestUtils.DUMMY_TECH_ID, CommonTestUtils.FILENAME,
                             CommonTestUtils.VERSION_22);
                     will(returnValue(attachment));
 
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java
index 60b01353def..69883626ab5 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java
@@ -197,8 +197,7 @@ public final class GenericServerTest extends AbstractServerTestCase
     public void testGetExperimentFileAttachment() throws Exception
     {
         prepareGetSession();
-        final ExperimentIdentifier experimentIdentifier =
-                CommonTestUtils.createExperimentIdentifier();
+        final TechId experimentId = CommonTestUtils.DUMMY_TECH_ID;
         final AttachmentPE attachmentPE = CommonTestUtils.createAttachment();
         context.checking(new Expectations()
             {
@@ -206,7 +205,7 @@ public final class GenericServerTest extends AbstractServerTestCase
                     one(genericBusinessObjectFactory).createExperimentBO(SESSION);
                     will(returnValue(experimentBO));
 
-                    one(experimentBO).loadByExperimentIdentifier(experimentIdentifier);
+                    one(experimentBO).loadDataByTechId(experimentId);
 
                     one(experimentBO).getExperimentFileAttachment(attachmentPE.getFileName(),
                             attachmentPE.getVersion());
@@ -215,7 +214,7 @@ public final class GenericServerTest extends AbstractServerTestCase
                 }
             });
         assertEquals(attachmentPE, createServer().getExperimentFileAttachment(SESSION_TOKEN,
-                experimentIdentifier, attachmentPE.getFileName(), attachmentPE.getVersion()));
+                experimentId, attachmentPE.getFileName(), attachmentPE.getVersion()));
         context.assertIsSatisfied();
     }
 
@@ -426,7 +425,7 @@ public final class GenericServerTest extends AbstractServerTestCase
     @Test
     public void testEditMaterialNothingChanged() throws Exception
     {
-        final TechId materialId = DUMMY_TECH_ID;
+        final TechId materialId = CommonTestUtils.DUMMY_TECH_ID;
         final List<MaterialProperty> properties = new ArrayList<MaterialProperty>();
         prepareGetSession();
         final Date version = new Date(1);
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/shared/IGenericServer.java.expected b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/shared/IGenericServer.java.expected
index d682ea2c12b..cd60e63a512 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/shared/IGenericServer.java.expected
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/shared/IGenericServer.java.expected
@@ -35,6 +35,9 @@ import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.NewExperi
 import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.NewSamplePredicate;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.NullableGroupIdentifierPredicate;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.SampleOwnerIdentifierPredicate;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.SampleTechIdPredicate;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.AbstractTechIdPredicate.ExperimentTechIdPredicate;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.AbstractTechIdPredicate.ProjectTechIdPredicate;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentUpdateResult;
@@ -51,7 +54,6 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialPE;
 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;
 
 /**
@@ -71,6 +73,14 @@ public interface IGenericServer extends IPluginCommonServer
             String sessionToken,
             @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) ExperimentIdentifier identifier);
 
+    /**
+     * For given {@link TechId} returns the corresponding {@link ExperimentPE}.
+     */
+    @Transactional(readOnly = true)
+    @RolesAllowed(RoleSet.OBSERVER)
+    public ExperimentPE getExperimentInfo(String sessionToken,
+            @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class) TechId experimentId);
+
     /**
      * For given {@link TechId} returns the corresponding {@link MaterialPE}.
      */
@@ -91,9 +101,8 @@ public interface IGenericServer extends IPluginCommonServer
      */
     @Transactional
     @RolesAllowed(RoleSet.OBSERVER)
-    public AttachmentPE getExperimentFileAttachment(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) ExperimentIdentifier experimentIdentifier,
+    public AttachmentPE getExperimentFileAttachment(String sessionToken,
+            @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class) TechId experimentId,
             String filename, int version) throws UserFailureException;
 
     /**
@@ -133,9 +142,8 @@ public interface IGenericServer extends IPluginCommonServer
      */
     @Transactional
     @RolesAllowed(RoleSet.OBSERVER)
-    public AttachmentPE getSampleFileAttachment(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class) SampleIdentifier sample,
+    public AttachmentPE getSampleFileAttachment(String sessionToken,
+            @AuthorizationGuard(guardClass = SampleTechIdPredicate.class) TechId sampleId,
             String fileName, int version);
 
     /**
@@ -143,9 +151,8 @@ public interface IGenericServer extends IPluginCommonServer
      */
     @Transactional
     @RolesAllowed(RoleSet.OBSERVER)
-    public AttachmentPE getProjectFileAttachment(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) ProjectIdentifier project,
+    public AttachmentPE getProjectFileAttachment(String sessionToken,
+            @AuthorizationGuard(guardClass = ProjectTechIdPredicate.class) TechId projectId,
             String fileName, int version);
 
     /**
-- 
GitLab