From ef3a5c17759d228943768f03aa1c599cf28fdbd6 Mon Sep 17 00:00:00 2001
From: anttil <anttil>
Date: Wed, 10 Jul 2013 08:01:40 +0000
Subject: [PATCH] BIS-468 / SP-747: After registering a sample, display a link
 pointing to registering a child to that sample. Add link to newly registered
 experiment.

SVN: 29527
---
 .../web/client/application/ActionContext.java |  13 +++
 .../framework/ComponentProvider.java          |   6 +-
 .../SampleRegistrationLocatorResolver.java    |   8 +-
 .../ui/sample/SampleRegistrationConfig.java   |  37 ------
 .../ui/sample/SampleRegistrationPanel.java    |  15 +--
 .../sample/SampleRegistrationTypeFilter.java  |  62 ++++++++++
 .../ui/sample/SampleTypeSelectionWidget.java  |  29 ++---
 .../ui/widget/EntityLinkMessageElement.java   |   7 +-
 .../ui/widget/HtmlMessageElement.java         |  36 +++++-
 .../application/ui/widget/IInfoHandler.java   |   8 +-
 .../ui/widget/IMessageElement.java            |   1 +
 .../client/application/ui/widget/InfoBox.java |  81 +++++++------
 .../SampleRegistrationLinkMessageElement.java | 107 ++++++++++++++++++
 .../web/client/IGenericClientService.java     |   3 +-
 .../client/IGenericClientServiceAsync.java    |   3 +-
 .../GenericExperimentRegistrationForm.java    |  16 ++-
 ...AbstractGenericSampleRegisterEditForm.java |   8 ++
 .../sample/GenericSampleRegistrationForm.java |   6 +-
 .../web/server/GenericClientService.java      |  22 ++--
 .../plugin/generic/server/GenericServer.java  |   7 +-
 .../generic/server/GenericServerLogger.java   |   4 +-
 .../plugin/generic/shared/IGenericServer.java |   3 +-
 22 files changed, 349 insertions(+), 133 deletions(-)
 delete mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleRegistrationConfig.java
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleRegistrationTypeFilter.java
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/SampleRegistrationLinkMessageElement.java

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ActionContext.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ActionContext.java
index 40738d32b37..d574737e543 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ActionContext.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ActionContext.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application;
 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.Project;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
 
 /**
@@ -38,6 +39,8 @@ public class ActionContext
 
     private ExperimentType experimentTypeOrNull;
 
+    private Sample parent;
+
     public ActionContext()
     {
     }
@@ -49,6 +52,16 @@ public class ActionContext
         this.spaceCodeOrNull = projectOrNull.getSpace().getCode();
     }
 
+    public Sample getParent()
+    {
+        return parent;
+    }
+
+    public void setParent(Sample parent)
+    {
+        this.parent = parent;
+    }
+
     public Experiment tryGetExperiment()
     {
         return experimentOrNull;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
index b0cfd181c80..392f8bcb424 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
@@ -55,7 +55,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.propert
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property_type.PropertyTypeRegistrationForm;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBatchRegisterUpdatePanel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleRegistrationConfig;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleRegistrationTypeFilter;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleRegistrationPanel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleSearchHitGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleTypeGrid;
@@ -415,7 +415,7 @@ public final class ComponentProvider
     }
 
     public final AbstractTabItemFactory getSampleRegistration(final ActionContext context,
-            final SampleRegistrationConfig config)
+            final SampleRegistrationTypeFilter filter)
     {
         AbstractTabItemFactory tab = new AbstractTabItemFactory()
             {
@@ -423,7 +423,7 @@ public final class ComponentProvider
                 public ITabItem create()
                 {
                     DatabaseModificationAwareComponent component =
-                            SampleRegistrationPanel.create(viewContext, context, config);
+                            SampleRegistrationPanel.create(viewContext, context, filter);
                     return createRegistrationTab(getTabTitle(), component);
                 }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/SampleRegistrationLocatorResolver.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/SampleRegistrationLocatorResolver.java
index 17cf2b5b4c3..a56b8e97eca 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/SampleRegistrationLocatorResolver.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/SampleRegistrationLocatorResolver.java
@@ -21,7 +21,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ActionCont
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ComponentProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DispatcherHelper;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleRegistrationConfig;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleRegistrationTypeFilter;
 import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException;
 
 /**
@@ -44,9 +44,9 @@ public class SampleRegistrationLocatorResolver extends AbstractViewLocatorResolv
     @Override
     public void resolve(final ViewLocator locator) throws UserFailureException
     {
-        SampleRegistrationConfig config = new SampleRegistrationConfig();
-        config.setFilterPattern(locator.getParameters().get(PATTERN));
+        String pattern = locator.getParameters().get(PATTERN);
+        SampleRegistrationTypeFilter filter = new SampleRegistrationTypeFilter(pattern, true);
         DispatcherHelper.dispatchNaviEvent(new ComponentProvider(viewContext)
-                .getSampleRegistration(new ActionContext(), config));
+                .getSampleRegistration(new ActionContext(), filter));
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleRegistrationConfig.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleRegistrationConfig.java
deleted file mode 100644
index ac053f2b565..00000000000
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleRegistrationConfig.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2012 ETH Zuerich, CISD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample;
-
-/**
- * @author pkupczyk
- */
-public class SampleRegistrationConfig
-{
-
-    private String filterPattern;
-
-    public String getFilterPattern()
-    {
-        return filterPattern;
-    }
-
-    public void setFilterPattern(String filterPattern)
-    {
-        this.filterPattern = filterPattern;
-    }
-
-}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleRegistrationPanel.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleRegistrationPanel.java
index 0d9df4f0285..9f7b40ec4e6 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleRegistrationPanel.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleRegistrationPanel.java
@@ -44,32 +44,29 @@ public final class SampleRegistrationPanel extends
 
     public static final DatabaseModificationAwareComponent create(
             final IViewContext<ICommonClientServiceAsync> viewContext, final ActionContext context,
-            final SampleRegistrationConfig config)
+            final SampleRegistrationTypeFilter filter)
     {
-        SampleRegistrationPanel panel = new SampleRegistrationPanel(viewContext, context, config);
+        SampleRegistrationPanel panel = new SampleRegistrationPanel(viewContext, context, filter);
         panel.setId("registration-panel");
         return new DatabaseModificationAwareComponent(panel, panel);
     }
 
     private SampleRegistrationPanel(final IViewContext<ICommonClientServiceAsync> viewContext,
-            final ActionContext context, final SampleRegistrationConfig config)
+            final ActionContext context, final SampleRegistrationTypeFilter filter)
     {
         super(viewContext, EntityKind.SAMPLE, createSampleTypeSelectionWidget(viewContext, context,
-                config), context);
+                filter), context);
     }
 
     private static SampleTypeSelectionWidget createSampleTypeSelectionWidget(
             final IViewContext<ICommonClientServiceAsync> viewContext, final ActionContext context,
-            final SampleRegistrationConfig config)
+            final SampleRegistrationTypeFilter filter)
     {
         SampleTypeSelectionWidget widget =
                 new SampleTypeSelectionWidget(viewContext,
                         EntityRegistrationPanel.createId(EntityKind.SAMPLE), false,
                         SampleTypeDisplayID.SAMPLE_REGISTRATION, context.tryGetSampleTypeCode());
-        if (config != null)
-        {
-            widget.setFilterPattern(config.getFilterPattern());
-        }
+        widget.setFilter(filter);
         return widget;
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleRegistrationTypeFilter.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleRegistrationTypeFilter.java
new file mode 100644
index 00000000000..5866fa37553
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleRegistrationTypeFilter.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2012 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample;
+
+import java.util.Iterator;
+import java.util.List;
+
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
+
+/**
+ * @author pkupczyk
+ */
+public class SampleRegistrationTypeFilter
+{
+
+    private String filterPattern;
+
+    private boolean showParentsFlagIgnored;
+
+    public SampleRegistrationTypeFilter(String pattern, boolean showParentsFlagIgnored)
+    {
+        filterPattern = pattern;
+        this.showParentsFlagIgnored = showParentsFlagIgnored;
+
+    }
+
+    public void filter(List<SampleType> sampleTypes)
+    {
+        for (Iterator<SampleType> iterator = sampleTypes.iterator(); iterator.hasNext();)
+        {
+            SampleType type = iterator.next();
+            if (pass(type) == false)
+            {
+                iterator.remove();
+            }
+        }
+    }
+
+    private boolean pass(SampleType sampleType)
+    {
+        if (filterPattern != null && sampleType.getCode().matches(filterPattern) == false)
+        {
+            return false;
+        }
+        return showParentsFlagIgnored || sampleType.isShowParents();
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleTypeSelectionWidget.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleTypeSelectionWidget.java
index 3a07ed134bd..e2de610801e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleTypeSelectionWidget.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleTypeSelectionWidget.java
@@ -19,7 +19,6 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample
 import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.createOrDelete;
 import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.edit;
 
-import java.util.Iterator;
 import java.util.List;
 
 import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
@@ -58,7 +57,7 @@ public class SampleTypeSelectionWidget extends DropDownList<SampleTypeModel, Sam
 
     private final String initialCodeOrNull;
 
-    private String filterPattern;
+    private SampleRegistrationTypeFilter filter;
 
     public SampleTypeSelectionWidget(final IViewContext<?> viewContext, final String idSuffix,
             final boolean onlyListable, final boolean withAll, final boolean withTypeInFile,
@@ -120,9 +119,9 @@ public class SampleTypeSelectionWidget extends DropDownList<SampleTypeModel, Sam
         return super.tryGetSelected();
     }
 
-    public void setFilterPattern(String filterPattern)
+    public void setFilter(SampleRegistrationTypeFilter filter)
     {
-        this.filterPattern = filterPattern;
+        this.filter = filter;
     }
 
     @Override
@@ -142,28 +141,20 @@ public class SampleTypeSelectionWidget extends DropDownList<SampleTypeModel, Sam
     public DatabaseModificationKind[] getRelevantModifications()
     {
         return new DatabaseModificationKind[]
-            { createOrDelete(ObjectKind.SAMPLE_TYPE), edit(ObjectKind.SAMPLE_TYPE),
-                    createOrDelete(ObjectKind.PROPERTY_TYPE_ASSIGNMENT),
-                    edit(ObjectKind.PROPERTY_TYPE_ASSIGNMENT) };
+        { createOrDelete(ObjectKind.SAMPLE_TYPE), edit(ObjectKind.SAMPLE_TYPE),
+                createOrDelete(ObjectKind.PROPERTY_TYPE_ASSIGNMENT),
+                edit(ObjectKind.PROPERTY_TYPE_ASSIGNMENT) };
     }
 
     /**
-     * Filters sample types returned from server. By default it filters out all the types that do
-     * not match the filterPattern. If the filterPattern is null then it leaves the original list of
-     * types untouched. Behavior of this method can be overwritten in subclasses.
+     * Filters sample types returned from server. By default it filters out all the types that do not match the filterPattern. If the filterPattern is
+     * null then it leaves the original list of types untouched. Behavior of this method can be overwritten in subclasses.
      */
     protected void filterTypes(List<SampleType> types)
     {
-        if (filterPattern != null)
+        if (filter != null)
         {
-            for (Iterator<SampleType> iterator = types.iterator(); iterator.hasNext();)
-            {
-                SampleType type = iterator.next();
-                if (!type.getCode().matches(filterPattern))
-                {
-                    iterator.remove();
-                }
-            }
+            filter.filter(types);
         }
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/EntityLinkMessageElement.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/EntityLinkMessageElement.java
index a61a24f49fa..940cbf70a99 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/EntityLinkMessageElement.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/EntityLinkMessageElement.java
@@ -54,13 +54,18 @@ public class EntityLinkMessageElement implements IMessageElement
         return 0;
     }
 
+    @Override
+    public Widget render(int maxLength)
+    {
+        return render();
+    }
+
     @Override
     public Widget render()
     {
         Anchor linkElement = new Anchor(label);
         linkElement.addClickHandler(new ClickHandler()
             {
-
                 @Override
                 public void onClick(ClickEvent event)
                 {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/HtmlMessageElement.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/HtmlMessageElement.java
index 8e2819dfed4..58951a8dea3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/HtmlMessageElement.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/HtmlMessageElement.java
@@ -16,18 +16,21 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget;
 
-import com.extjs.gxt.ui.client.widget.Html;
+import com.google.gwt.user.client.ui.HTML;
 import com.google.gwt.user.client.ui.Widget;
 
 /**
  * Message element for a HTML.
  * 
  * @author anttil
- */public class HtmlMessageElement implements IMessageElement
+ */
+public class HtmlMessageElement implements IMessageElement
 {
 
     private final String content;
 
+    private static final String TRUNCATE_SUFFIX = "...";
+
     public HtmlMessageElement(String content)
     {
         this.content = content;
@@ -43,7 +46,34 @@ import com.google.gwt.user.client.ui.Widget;
     @Override
     public Widget render()
     {
-        return new Html(content);
+        return createHTMLWidget(content);
+    }
+
+    @Override
+    public Widget render(int maxLength)
+    {
+        return createHTMLWidget(truncate(content, maxLength));
+    }
+
+    private Widget createHTMLWidget(String truncatedContent)
+    {
+        return new HTML(truncatedContent);
+    }
+
+    private String truncate(String text, int maxLength)
+    {
+        if (shouldTruncate(text, maxLength))
+        {
+            return text.substring(0, maxLength) + TRUNCATE_SUFFIX;
+        } else
+        {
+            return text;
+        }
+    }
+
+    private boolean shouldTruncate(String text, int maxLength)
+    {
+        return text != null && text.length() > maxLength;
     }
 
     public String getHtml()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/IInfoHandler.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/IInfoHandler.java
index 16629ba9c7a..f726a5c08cf 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/IInfoHandler.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/IInfoHandler.java
@@ -29,21 +29,21 @@ public interface IInfoHandler
     /**
      * Display given <var>text</var> as <i>error</i> text.
      */
-    public abstract void displayError(final String text);
+    public void displayError(final String text);
 
     /**
      * Display given <var>text</var> as <i>info</i> text.
      */
-    public abstract void displayInfo(final String text);
+    public void displayInfo(final String text);
 
     /**
      * Display given <var>text</var> as <i>info</i> text.
      */
-    public abstract void displayInfo(final List<? extends IMessageElement> elements);
+    public void displayInfo(final List<? extends IMessageElement> elements);
 
     /**
      * Display given <var>text</var> as <i>progress</i> text.
      */
-    public abstract void displayProgress(final String text);
+    public void displayProgress(final String text);
 
 }
\ No newline at end of file
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/IMessageElement.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/IMessageElement.java
index 818d3e25d69..53fc32420ef 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/IMessageElement.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/IMessageElement.java
@@ -29,4 +29,5 @@ public interface IMessageElement
 
     public Widget render();
 
+    public Widget render(int maxLength);
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/InfoBox.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/InfoBox.java
index 5431f670fdb..77b24d99995 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/InfoBox.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/InfoBox.java
@@ -21,11 +21,11 @@ import java.util.List;
 import com.extjs.gxt.ui.client.util.Margins;
 import com.extjs.gxt.ui.client.widget.LayoutContainer;
 import com.extjs.gxt.ui.client.widget.MessageBox;
-import com.extjs.gxt.ui.client.widget.layout.HBoxLayout;
-import com.extjs.gxt.ui.client.widget.layout.HBoxLayoutData;
+import com.extjs.gxt.ui.client.widget.layout.FlowData;
 import com.extjs.gxt.ui.client.widget.layout.TableLayout;
 import com.google.gwt.dom.client.Style;
 import com.google.gwt.dom.client.Style.BorderStyle;
+import com.google.gwt.dom.client.Style.Display;
 import com.google.gwt.dom.client.Style.Unit;
 import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.ClickHandler;
@@ -36,6 +36,7 @@ import com.google.gwt.user.client.ui.HasHorizontalAlignment;
 import com.google.gwt.user.client.ui.HasHorizontalAlignment.HorizontalAlignmentConstant;
 import com.google.gwt.user.client.ui.Panel;
 import com.google.gwt.user.client.ui.SimplePanel;
+import com.google.gwt.user.client.ui.Widget;
 
 import ch.systemsx.cisd.common.shared.basic.string.StringUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
@@ -50,8 +51,6 @@ public final class InfoBox extends Composite implements IInfoHandler
 {
     private static final int TRUNCATE_THRESHOLD = 200;
 
-    private static final String TRUNCATE_SUFFIX = "...";
-
     private static final String WHITE = "#ffffff";
 
     private Panel mainPanel;
@@ -79,8 +78,7 @@ public final class InfoBox extends Composite implements IInfoHandler
     public InfoBox(final IMessageProvider messageProvider,
             final HorizontalAlignmentConstant alignment)
     {
-        HBoxLayout messageLayout = new HBoxLayout();
-        message = new LayoutContainer(messageLayout);
+        message = new LayoutContainer();
 
         showFullMessageLink =
                 new Anchor(messageProvider.getMessage(Dict.INFO_BOX_SHOW_FULL_MESSAGE));
@@ -137,21 +135,56 @@ public final class InfoBox extends Composite implements IInfoHandler
     public void displayInfo(List<? extends IMessageElement> elements)
     {
         setInfoBoxStyle(InfoType.INFO);
-
+        boolean nonHtmlMessageElements = containsNonHtmlMessageElements(elements);
+        int currentLength = 0;
+        StringBuilder builder = new StringBuilder();
         for (IMessageElement element : elements)
         {
-            message.add(element.render(), new HBoxLayoutData(new Margins(0, 5, 0, 0)));
+            if (builder.length() > 0)
+            {
+                builder.append(' ');
+            }
+            builder.append(element);
+            Widget widget;
+            FlowData layoutData = new FlowData(new Margins(0, 5, 0, 0));
+            if (nonHtmlMessageElements)
+            {
+                widget = element.render();
+                widget.getElement().getStyle().setDisplay(Display.INLINE);
+                message.add(widget, layoutData);
+            } else if (TRUNCATE_THRESHOLD >= currentLength)
+            {
+                widget = element.render(TRUNCATE_THRESHOLD - currentLength);
+                widget.getElement().getStyle().setDisplay(Display.INLINE);
+                currentLength += element.length();
+                message.add(widget, layoutData);
+            }
         }
-        message.layout(true);
+        fullMessage = builder.toString();
+        showFullMessageLink.setVisible(nonHtmlMessageElements == false && TRUNCATE_THRESHOLD < currentLength);
+        message.layout(false);
         getElement().scrollIntoView();
     }
 
+    private boolean containsNonHtmlMessageElements(List<? extends IMessageElement> elements)
+    {
+        for (IMessageElement element : elements)
+        {
+            if (element instanceof HtmlMessageElement == false)
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
     private void setInfoBoxStyle(InfoType type)
     {
         Style mainPanelStyle = mainPanel.getElement().getStyle();
         mainPanelStyle.setColor("#000000");
         mainPanelStyle.setBackgroundColor(type.getBackgroundColor());
         mainPanelStyle.setBorderColor(type.getBorderColor());
+        messageType = type;
     }
 
     /**
@@ -177,7 +210,7 @@ public final class InfoBox extends Composite implements IInfoHandler
                         dots = "...";
                     }
 
-                    addHtmlToMessage(truncate(text) + dots);
+                    setHtmlMessage(text + dots);
                 }
             };
         progressTimer.run();
@@ -199,17 +232,8 @@ public final class InfoBox extends Composite implements IInfoHandler
             setInfoBoxStyle(type);
 
             fullMessage = text;
-            messageType = type;
-
-            if (shouldTruncate(text))
-            {
-                addHtmlToMessage(truncate(text));
-                showFullMessageLink.setVisible(true);
-            } else
-            {
-                addHtmlToMessage(text);
-                showFullMessageLink.setVisible(false);
-            }
+            setHtmlMessage(text);
+            showFullMessageLink.setVisible(shouldTruncate(text));
 
             if (fullMessageDialog != null)
             {
@@ -220,10 +244,10 @@ public final class InfoBox extends Composite implements IInfoHandler
         }
     }
 
-    private void addHtmlToMessage(String messageElement)
+    private void setHtmlMessage(String messageElement)
     {
         message.removeAll();
-        message.add(new HtmlMessageElement(messageElement).render());
+        message.add(new HtmlMessageElement(messageElement).render(TRUNCATE_THRESHOLD));
         message.layout(true);
     }
 
@@ -263,15 +287,4 @@ public final class InfoBox extends Composite implements IInfoHandler
         return text != null && text.length() > TRUNCATE_THRESHOLD;
     }
 
-    private String truncate(String text)
-    {
-        if (shouldTruncate(text))
-        {
-            return text.substring(0, TRUNCATE_THRESHOLD) + TRUNCATE_SUFFIX;
-        } else
-        {
-            return text;
-        }
-    }
-
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/SampleRegistrationLinkMessageElement.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/SampleRegistrationLinkMessageElement.java
new file mode 100644
index 00000000000..9fa52b7687e
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/SampleRegistrationLinkMessageElement.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2013 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget;
+
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.user.client.ui.Anchor;
+import com.google.gwt.user.client.ui.Widget;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ActionContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.AbstractTabItemFactory;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ComponentProvider;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DispatcherHelper;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleRegistrationTypeFilter;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
+
+/**
+ * A message element linking to sample registration tab.
+ * 
+ * @author anttil
+ */
+public class SampleRegistrationLinkMessageElement implements IMessageElement
+{
+    private static final String LABEL = "Register child";
+
+    private final Sample sample;
+
+    private final IViewContext<?> viewContext;
+
+    public SampleRegistrationLinkMessageElement(IViewContext<?> viewContext, Sample sample)
+    {
+        this.viewContext = viewContext;
+        this.sample = sample;
+    }
+
+    @Override
+    public int length()
+    {
+        return 0;
+    }
+
+    @Override
+    public Widget render()
+    {
+        Anchor linkElement = new Anchor(LABEL);
+        linkElement.addClickHandler(new ClickHandler()
+            {
+                @Override
+                public void onClick(ClickEvent event)
+                {
+                    ComponentProvider componentProvider = new ComponentProvider(viewContext.getCommonViewContext());
+                    ActionContext context = createActionContext();
+                    SampleRegistrationTypeFilter filter = new SampleRegistrationTypeFilter(null, false);
+                    AbstractTabItemFactory sampleRegistration = componentProvider.getSampleRegistration(context, filter);
+                    DispatcherHelper.dispatchNaviEvent(sampleRegistration);
+                }
+            });
+        return linkElement;
+    }
+
+    @Override
+    public Widget render(int maxLength)
+    {
+        return render();
+    }
+
+    @Override
+    public String toString()
+    {
+        return LABEL;
+    }
+
+    private ActionContext createActionContext()
+    {
+        ActionContext context = new ActionContext();
+        context.setParent(sample);
+        Experiment experiment = sample.getExperiment();
+        if (experiment != null)
+        {
+            context.setExperiment(experiment);
+        }
+        Space space = sample.getSpace();
+        if (space != null)
+        {
+            context.setSpaceCode(space.getCode());
+        }
+        return context;
+    }
+
+}
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 9c8af0f5a4d..096da450d60 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
@@ -28,6 +28,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchRegistrationResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetUpdateResult;
+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.ExperimentUpdateResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentUpdates;
@@ -117,7 +118,7 @@ public interface IGenericClientService extends IClientService
     /**
      * Registers a new experiment.
      */
-    public void registerExperiment(final String attachmentsSessionKey,
+    public Experiment registerExperiment(final String attachmentsSessionKey,
             final String samplesSessionKey, final NewExperiment experiment)
             throws UserFailureException;
 
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 6c0c356f3e4..6df4773da99 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
@@ -30,6 +30,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchRegistrationResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetUpdateResult;
+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.ExperimentUpdateResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentUpdates;
@@ -99,7 +100,7 @@ public interface IGenericClientServiceAsync extends IClientServiceAsync
      * @see IGenericClientService#registerExperiment(String,String,NewExperiment)
      */
     public void registerExperiment(final String attachmentsSessionKey, String samplesSessionKey,
-            NewExperiment newExp, AsyncCallback<Void> assyncCallback) throws UserFailureException;
+            NewExperiment newExp, AsyncCallback<Experiment> assyncCallback) throws UserFailureException;
 
     /**
      * @see IGenericClientService#registerMaterials(MaterialType, boolean, String, boolean, String)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentRegistrationForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentRegistrationForm.java
index 53ea81e8a5b..37b8aac362f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentRegistrationForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentRegistrationForm.java
@@ -16,7 +16,7 @@
 
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.experiment;
 
-import java.util.Arrays;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -26,7 +26,11 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAs
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ActionContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractRegistrationForm;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.EntityLinkMessageElement;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.HtmlMessageElement;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.IMessageElement;
+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.ExperimentTypePropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
@@ -78,7 +82,7 @@ public final class GenericExperimentRegistrationForm extends
     }
 
     private final class RegisterExperimentCallback extends
-            AbstractRegistrationForm.AbstractRegistrationCallback<Void>
+            AbstractRegistrationForm.AbstractRegistrationCallback<Experiment>
     {
 
         RegisterExperimentCallback(final IViewContext<?> viewContext)
@@ -87,9 +91,13 @@ public final class GenericExperimentRegistrationForm extends
         }
 
         @Override
-        protected List<HtmlMessageElement> createSuccessfullRegistrationInfo(Void result)
+        protected List<IMessageElement> createSuccessfullRegistrationInfo(Experiment experiment)
         {
-            return Arrays.asList(new HtmlMessageElement("Experiment <b>" + createExperimentIdentifier() + "</b> successfully registered"));
+            List<IMessageElement> message = new ArrayList<IMessageElement>();
+            message.add(new HtmlMessageElement("Experiment"));
+            message.add(new EntityLinkMessageElement(viewContext, createExperimentIdentifier(), EntityKind.EXPERIMENT, experiment.getPermId()));
+            message.add(new HtmlMessageElement("successfully registered"));
+            return message;
         }
 
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/AbstractGenericSampleRegisterEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/AbstractGenericSampleRegisterEditForm.java
index 1d5689206fa..dc10e92d301 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/AbstractGenericSampleRegisterEditForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/AbstractGenericSampleRegisterEditForm.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sa
 import static ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DatabaseModificationAwareField.wrapUnaware;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -109,6 +110,8 @@ abstract public class AbstractGenericSampleRegisterEditForm extends
 
     private Button saveUploadButton;
 
+    private Sample parentOrNull;
+
     protected AbstractGenericSampleRegisterEditForm(
             IViewContext<IGenericClientServiceAsync> viewContext,
             Map<String, List<IManagedInputWidgetDescription>> inputWidgetDescriptions,
@@ -144,6 +147,7 @@ abstract public class AbstractGenericSampleRegisterEditForm extends
     {
         this.initialExperimentIdentifierOrNull = tryGetExperimentIdentifier(context);
         this.initialGroupCodeOrNull = tryGetSpaceCode(context);
+        parentOrNull = context.getParent();
     }
 
     private ExperimentIdentifier tryGetExperimentIdentifier(ActionContext context)
@@ -323,6 +327,10 @@ abstract public class AbstractGenericSampleRegisterEditForm extends
                         SampleTypeDisplayID.SAMPLE_REGISTRATION_PARENT_CHOOSER
                                 .withSuffix(getSampleTypeCode()), true);
         parentsArea = new ParentSamplesArea(viewContext, getId());
+        if (parentOrNull != null)
+        {
+            parentsArea.setSamples(Arrays.asList(parentOrNull));
+        }
         SampleChooserButton parentChooserButton = parentButton.getChooserButton();
         parentChooserButton
                 .addChosenEntityListener(new IChosenEntitiesListener<TableModelRowWithObject<Sample>>()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleRegistrationForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleRegistrationForm.java
index fee83302537..e8ca6e3b81b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleRegistrationForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleRegistrationForm.java
@@ -28,6 +28,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.SpaceSe
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.EntityLinkMessageElement;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.HtmlMessageElement;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.IMessageElement;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.SampleRegistrationLinkMessageElement;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample;
@@ -82,14 +83,15 @@ public final class GenericSampleRegistrationForm extends AbstractGenericSampleRe
             {
                 result.add(new HtmlMessageElement("Shared sample"));
                 result.add(new EntityLinkMessageElement(viewContext, code, EntityKind.SAMPLE, sample.getPermId()));
-                result.add(new HtmlMessageElement("successfully registered"));
+                result.add(new HtmlMessageElement("successfully registered."));
             } else
             {
                 result.add(new HtmlMessageElement("Sample"));
                 result.add(new EntityLinkMessageElement(viewContext, code, EntityKind.SAMPLE, sample.getPermId()));
                 result.add(new HtmlMessageElement("successfully registered in space <b>"
-                        + selectedGroup.getCode() + "</b>"));
+                        + selectedGroup.getCode() + "</b>."));
             }
+            result.add(new SampleRegistrationLinkMessageElement(viewContext, sample));
             return result;
         }
     }
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 857dcad478c..9bc73d0126c 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
@@ -49,6 +49,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetUpdateResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType;
+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.ExperimentUpdateResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentUpdates;
@@ -308,7 +309,7 @@ public class GenericClientService extends AbstractClientService implements IGene
     }
 
     @Override
-    public void registerExperiment(final String attachmentsSessionKey,
+    public Experiment registerExperiment(final String attachmentsSessionKey,
             final String samplesSessionKey, final NewExperiment experiment)
     {
         final String sessionToken = getSessionToken();
@@ -326,14 +327,19 @@ public class GenericClientService extends AbstractClientService implements IGene
             experiment.setNewSamples(result.getSamples());
             experiment.setSamples(result.getCodes());
         }
-        new AttachmentRegistrationHelper()
+        class ExperimentRegistrationHelper extends AttachmentRegistrationHelper
+        {
+            Experiment exp;
+
+            @Override
+            public void register(Collection<NewAttachment> attachments)
             {
-                @Override
-                public void register(Collection<NewAttachment> attachments)
-                {
-                    genericServer.registerExperiment(sessionToken, experiment, attachments);
-                }
-            }.process(attachmentsSessionKey, getHttpSession(), experiment.getAttachments());
+                exp = genericServer.registerExperiment(sessionToken, experiment, attachments);
+            }
+        }
+        ExperimentRegistrationHelper helper = new ExperimentRegistrationHelper();
+        helper.process(attachmentsSessionKey, getHttpSession(), experiment.getAttachments());
+        return helper.exp;
     }
 
     private BatchSamplesOperation parseSamples(final SampleType sampleType,
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 fadc4f9fbd5..ab1fbe5222e 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
@@ -78,6 +78,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentUpdateResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListOrSearchSampleCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialBatchUpdateResultMessage;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Metaproject;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewBasicExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewDataSet;
@@ -600,7 +601,7 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_USER)
     @Capability("WRITE_EXPERIMENT_SAMPLE")
-    public void registerExperiment(String sessionToken,
+    public Experiment registerExperiment(String sessionToken,
             @AuthorizationGuard(guardClass = NewExperimentPredicate.class)
             final NewExperiment newExperiment, final Collection<NewAttachment> attachments)
             throws UserFailureException
@@ -653,6 +654,10 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
                 sampleBO.setExperiment(experiment);
             }
         }
+
+        return ExperimentTranslator
+                .translate(experiment, session.getBaseIndexURL(), new HashSet<Metaproject>(), managedPropertyEvaluatorFactory);
+
     }
 
     @Override
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 a30ab7b1c62..ebcb4e75207 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
@@ -31,6 +31,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AttachmentWithContent;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetUpdateResult;
 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.ExperimentUpdateResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment;
@@ -104,12 +105,13 @@ final class GenericServerLogger extends AbstractServerLogger implements IGeneric
     }
 
     @Override
-    public void registerExperiment(String sessionToken, NewExperiment experiment,
+    public Experiment registerExperiment(String sessionToken, NewExperiment experiment,
             final Collection<NewAttachment> attachments)
     {
         logTracking(sessionToken, "register_experiment",
                 "EXPERIMENT_TYPE(%s) EXPERIMENT(%S) ATTACHMENTS(%S)",
                 experiment.getExperimentTypeCode(), experiment.getIdentifier(), attachments.size());
+        return null;
     }
 
     @Override
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 05b5500337f..54371687b31 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
@@ -32,6 +32,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AttachmentWithContent;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetUpdateResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind;
 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.ExperimentUpdateResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment;
@@ -154,7 +155,7 @@ public interface IGenericServer extends IServer
     @DatabaseCreateOrDeleteModification(value =
     { ObjectKind.EXPERIMENT, ObjectKind.SAMPLE })
     @DatabaseUpdateModification(value = ObjectKind.SAMPLE)
-    public void registerExperiment(String sessionToken, final NewExperiment experiment,
+    public Experiment registerExperiment(String sessionToken, final NewExperiment experiment,
             final Collection<NewAttachment> attachments) throws UserFailureException;
 
     /**
-- 
GitLab