From f71cc4538891b8a65edf5ef4c2087dfb8f1a5e74 Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Tue, 2 Oct 2012 06:14:39 +0000
Subject: [PATCH] SP-298, BIS-210: Extending ICommonServer and
 ICommonClientService with methods to retrieve IManagedInputWidgetDescription
 objects for managed properties. Simple implementation in CommonServer.
 Extending IClientPlugin to use IManagedInputWidgetDescription objects.
 EntityRegistrationPanel: Show registration panel after
 IManagedInputWidgetDescription objects have been received. No GUI changes.

SVN: 26926
---
 .../web/client/ICommonClientService.java      |  4 ++
 .../web/client/ICommonClientServiceAsync.java |  5 ++
 .../plugin/ClientPluginAdapter.java           |  5 ++
 .../application/plugin/IClientPlugin.java     |  5 ++
 .../ui/widget/EntityRegistrationPanel.java    | 32 ++++++++++---
 .../web/server/CommonClientService.java       |  9 ++++
 .../openbis/generic/server/CommonServer.java  | 48 ++++++++++++++++++-
 .../generic/server/CommonServerLogger.java    | 10 ++++
 .../openbis/generic/shared/ICommonServer.java |  5 ++
 .../application/ClientPluginFactory.java      |  7 ++-
 .../application/ClientPluginFactory.java      | 23 ++++++---
 .../application/DelegatedClientPlugin.java    | 15 ++++--
 ...ractGenericExperimentRegisterEditForm.java | 16 +++++--
 .../experiment/GenericExperimentEditForm.java |  5 +-
 .../GenericExperimentRegistrationForm.java    |  5 +-
 .../experiment/PropertiesEditor.java          |  9 ++--
 .../application/ClientPluginFactory.java      | 11 +++--
 17 files changed, 181 insertions(+), 33 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
index c03e8fe8e35..406bc0dc0fb 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
@@ -111,6 +111,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTerm;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTermReplacement;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTermWithStats;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedInputWidgetDescription;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedUiAction;
 
@@ -247,6 +248,9 @@ public interface ICommonClientService extends IClientService
      */
     public List<SampleType> listSampleTypes() throws UserFailureException;
 
+    public Map<String, List<IManagedInputWidgetDescription>> listManagedInputWidgetDescriptions(
+            EntityType entityType) throws UserFailureException;
+
     /**
      * Returns a list of samples matching given criteria.
      */
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
index 2566bfdd816..09f65b199ff 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
@@ -113,6 +113,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTerm;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTermReplacement;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTermWithStats;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedInputWidgetDescription;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedUiAction;
 
@@ -198,6 +199,10 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
     /** @see ICommonClientService#listSampleTypes() */
     public void listSampleTypes(AsyncCallback<List<SampleType>> asyncCallback);
 
+    /** @see ICommonClientService#listManagedInputWidgetDescriptions(EntityType) */
+    public void listManagedInputWidgetDescriptions(EntityType entityType,
+            AsyncCallback<Map<String, List<IManagedInputWidgetDescription>>> asyncCallback);
+
     /** @see ICommonClientService#listFileTypes() */
     public void listFileTypes(AsyncCallback<List<FileFormatType>> asyncCallback);
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/ClientPluginAdapter.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/ClientPluginAdapter.java
index 5043d784b1c..f294ec06532 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/ClientPluginAdapter.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/ClientPluginAdapter.java
@@ -16,6 +16,9 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin;
 
+import java.util.List;
+import java.util.Map;
+
 import com.google.gwt.user.client.ui.Widget;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ActionContext;
@@ -24,6 +27,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedInputWidgetDescription;
 
 /**
  * A dummy {@link IClientPlugin} implementation which throws {@link UnsupportedOperationException}
@@ -59,6 +63,7 @@ public class ClientPluginAdapter<E extends BasicEntityType, I extends IIdAndCode
 
     @Override
     public DatabaseModificationAwareWidget createRegistrationForEntityType(final E entityType,
+            Map<String, List<IManagedInputWidgetDescription>> inputWidgetDescriptions,
             final ActionContext context)
     {
         throw new UnsupportedOperationException("Not yet implemented.");
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/IClientPlugin.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/IClientPlugin.java
index ea8fd086d58..3c886a56b2d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/IClientPlugin.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/IClientPlugin.java
@@ -16,6 +16,9 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin;
 
+import java.util.List;
+import java.util.Map;
+
 import com.google.gwt.user.client.ui.Widget;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ActionContext;
@@ -24,6 +27,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedInputWidgetDescription;
 
 /**
  * The client plugin.
@@ -49,6 +53,7 @@ public interface IClientPlugin<T extends BasicEntityType, I extends IIdAndCodeHo
      * Shows a registration form for entities of given <var>entityType</var>.
      */
     public DatabaseModificationAwareWidget createRegistrationForEntityType(final T entityType,
+            Map<String, List<IManagedInputWidgetDescription>> inputWidgetDescriptions,
             final ActionContext context);
 
     /**
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/EntityRegistrationPanel.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/EntityRegistrationPanel.java
index 0666c37dd91..57b295c8ccb 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/EntityRegistrationPanel.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/EntityRegistrationPanel.java
@@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import com.extjs.gxt.ui.client.Style.Scroll;
@@ -30,6 +31,7 @@ import com.extjs.gxt.ui.client.widget.toolbar.LabelToolItem;
 import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ActionContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
@@ -45,6 +47,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind;
 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.api.IManagedInputWidgetDescription;
 
 /**
  * The {@link LayoutContainer} extension for registering an entity.
@@ -112,8 +115,7 @@ abstract public class EntityRegistrationPanel<T extends ModelData, S extends Dro
         final EntityType entityType = entityTypeModel.get(ModelDataPropertyNames.OBJECT);
         if (registrationWidget == null || shouldAskForCloseConfirmation() == false)
         {
-            showRegistrationForm(entityType);
-            previousSelection.update(entityTypeModel);
+            showAndUpdateRegistrationForm(entityTypeModel, entityType);
         } else
         {
             new ConfirmationDialog(viewContext.getMessage(Dict.CONFIRM_TITLE),
@@ -122,8 +124,7 @@ abstract public class EntityRegistrationPanel<T extends ModelData, S extends Dro
                     @Override
                     protected void onYes()
                     {
-                        showRegistrationForm(entityType);
-                        previousSelection.update(entityTypeModel);
+                        showAndUpdateRegistrationForm(entityTypeModel, entityType);
                     }
 
                     @Override
@@ -139,7 +140,25 @@ abstract public class EntityRegistrationPanel<T extends ModelData, S extends Dro
         }
     }
 
-    private void showRegistrationForm(final EntityType entityType)
+    private void showAndUpdateRegistrationForm(final T entityTypeModel, final EntityType entityType)
+    {
+        viewContext.getService().listManagedInputWidgetDescriptions(
+                entityType,
+                new AbstractAsyncCallback<Map<String, List<IManagedInputWidgetDescription>>>(
+                        viewContext)
+                    {
+                        @Override
+                        protected void process(
+                                Map<String, List<IManagedInputWidgetDescription>> inputWidgetDescriptions)
+                        {
+                            showRegistrationForm(entityType, inputWidgetDescriptions);
+                            previousSelection.update(entityTypeModel);
+                        }
+                    });
+    }
+
+    private void showRegistrationForm(final EntityType entityType,
+            Map<String, List<IManagedInputWidgetDescription>> inputWidgetDescriptions)
     {
         removeAll();
         final IClientPlugin<EntityType, IIdAndCodeHolder> clientPlugin =
@@ -147,7 +166,8 @@ abstract public class EntityRegistrationPanel<T extends ModelData, S extends Dro
                         .getClientPluginFactory(entityKind, entityType)
                         .createClientPlugin(entityKind);
         registrationWidget =
-                clientPlugin.createRegistrationForEntityType(entityType, actionContext);
+                clientPlugin.createRegistrationForEntityType(entityType, inputWidgetDescriptions,
+                        actionContext);
         add(registrationWidget.get());
         layout();
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
index 8cbeaded0e3..8f56181f032 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
@@ -184,6 +184,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTerm;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTermBatchUpdateDetails;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTermReplacement;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTermWithStats;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedInputWidgetDescription;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedUiAction;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.ValidationException;
@@ -394,6 +395,14 @@ public final class CommonClientService extends AbstractClientService implements
     // --------- methods preparing exported content. Note: GWT does not support
     // generic methods :(
 
+    @Override
+    public Map<String, List<IManagedInputWidgetDescription>> listManagedInputWidgetDescriptions(
+            EntityType entityType)
+    {
+        final String sessionToken = getSessionToken();
+        return commonServer.listManagedInputWidgetDescriptions(sessionToken, entityType);
+    }
+
     @Override
     public String prepareExportSamples(TableExportCriteria<TableModelRowWithObject<Sample>> criteria)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
index dad0ccd151b..e7a2f2062a3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
@@ -194,6 +194,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListMaterialCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListOrSearchSampleCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ManagedTextInputWidgetDescription;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ManagedUiActionDescription;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MatchingEntity;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
@@ -229,6 +230,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.UpdatedSample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTerm;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTermReplacement;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedInputWidgetDescription;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedUiAction;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IPerson;
@@ -592,8 +594,50 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         checkSession(sessionToken);
         final List<SampleTypePE> sampleTypes = getDAOFactory().getSampleTypeDAO().listSampleTypes();
         Collections.sort(sampleTypes);
-        return SampleTypeTranslator.translate(sampleTypes,
-                new HashMap<PropertyTypePE, PropertyType>());
+        List<SampleType> translateSampleTypes =
+                SampleTypeTranslator.translate(sampleTypes,
+                        new HashMap<PropertyTypePE, PropertyType>());
+
+        return translateSampleTypes;
+    }
+
+    @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    public Map<String, List<IManagedInputWidgetDescription>> listManagedInputWidgetDescriptions(
+            String sessionToken, EntityType entityType)
+    {
+        checkSession(sessionToken);
+
+        List<? extends EntityTypePropertyType<?>> assignedPropertyTypes =
+                entityType.getAssignedPropertyTypes();
+        HashMap<String, List<IManagedInputWidgetDescription>> result =
+                new HashMap<String, List<IManagedInputWidgetDescription>>();
+        for (EntityTypePropertyType<?> entityTypePropertyType : assignedPropertyTypes)
+        {
+            String propertyTypeCode = entityTypePropertyType.getPropertyType().getCode();
+            if (entityTypePropertyType.isManaged())
+            {
+                String script = entityTypePropertyType.getScript().getScript();
+                ManagedPropertyEvaluator evaluator =
+                        ManagedPropertyEvaluatorFactory.createManagedPropertyEvaluator(script);
+                List<String> batchColumnNames = evaluator.getBatchColumnNames();
+                if (batchColumnNames.isEmpty() == false)
+                {
+                    List<IManagedInputWidgetDescription> descriptions =
+                            new ArrayList<IManagedInputWidgetDescription>();
+                    for (String batchColumnName : batchColumnNames)
+                    {
+                        ManagedTextInputWidgetDescription description =
+                                new ManagedTextInputWidgetDescription();
+                        description.setLabel(batchColumnName);
+                        descriptions.add(description);
+                    }
+                    result.put(propertyTypeCode, descriptions);
+                }
+            }
+
+        }
+        return result;
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
index b3152659ed9..3c9a1674d8e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
@@ -101,6 +101,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTerm;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTermReplacement;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedInputWidgetDescription;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedUiAction;
 import ch.systemsx.cisd.openbis.generic.shared.coreplugin.ICorePluginResourceLoader;
@@ -254,6 +255,15 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
         return null;
     }
 
+    @Override
+    public Map<String, List<IManagedInputWidgetDescription>> listManagedInputWidgetDescriptions(
+            String sessionToken, EntityType entityType)
+    {
+        logAccess(sessionToken, "list_managed_input_widget_descriptions", "TYPE(%s)",
+                entityType.getCode());
+        return null;
+    }
+
     @Override
     public List<Sample> listSamples(String sessionToken, ListSampleCriteria criteria)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
index 8463a84c16d..f27fb18f353 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
@@ -98,6 +98,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTerm;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTermReplacement;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedInputWidgetDescription;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedUiAction;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUpdatesDTO;
@@ -262,6 +263,10 @@ public interface ICommonServer extends IServer
     @Transactional(readOnly = true)
     public List<SampleType> listSampleTypes(String sessionToken);
 
+    @Transactional(readOnly = true)
+    public Map<String, List<IManagedInputWidgetDescription>> listManagedInputWidgetDescriptions(
+            String sessionToken, EntityType entityType);
+
     /**
      * Lists samples using given configuration.
      * 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/client/web/client/application/ClientPluginFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/client/web/client/application/ClientPluginFactory.java
index 9eb03872e21..e871e661930 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/client/web/client/application/ClientPluginFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/client/web/client/application/ClientPluginFactory.java
@@ -17,6 +17,8 @@
 package ch.systemsx.cisd.openbis.plugin.demo.client.web.client.application;
 
 import java.util.Collections;
+import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import com.extjs.gxt.ui.client.widget.Component;
@@ -46,6 +48,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedInputWidgetDescription;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.GenericViewContext;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sample.GenericSampleRegistrationForm;
 
@@ -161,7 +164,9 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<DemoV
 
         @Override
         public final DatabaseModificationAwareWidget createRegistrationForEntityType(
-                final SampleType sampleType, final ActionContext context)
+                final SampleType sampleType,
+                Map<String, List<IManagedInputWidgetDescription>> inputWidgetDescriptions,
+                final ActionContext context)
         {
             GenericSampleRegistrationForm form =
                     new GenericSampleRegistrationForm(new GenericViewContext(getViewContext()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/ClientPluginFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/ClientPluginFactory.java
index cf4259c486d..90dd9fb1962 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/ClientPluginFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/ClientPluginFactory.java
@@ -16,6 +16,8 @@
 
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application;
 
+import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import com.google.gwt.user.client.ui.Widget;
@@ -50,6 +52,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedInputWidgetDescription;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.dataset.GenericDataSetBatchUpdateForm;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.dataset.GenericDataSetEditForm;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.dataset.GenericDataSetViewer;
@@ -215,7 +218,9 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Gener
 
         @Override
         public final DatabaseModificationAwareWidget createRegistrationForEntityType(
-                final SampleType sampleType, final ActionContext context)
+                final SampleType sampleType,
+                Map<String, List<IManagedInputWidgetDescription>> inputWidgetDescriptions,
+                final ActionContext context)
         {
             GenericSampleRegistrationForm form =
                     new GenericSampleRegistrationForm(getViewContext(), sampleType, context);
@@ -251,7 +256,8 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Gener
                     @Override
                     public String getId()
                     {
-                        return AbstractGenericEntityRegistrationForm.createId(identifiable, EntityKind.SAMPLE);
+                        return AbstractGenericEntityRegistrationForm.createId(identifiable,
+                                EntityKind.SAMPLE);
                     }
 
                     @Override
@@ -352,7 +358,8 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Gener
                     @Override
                     public String getId()
                     {
-                        return AbstractGenericEntityRegistrationForm.createId(identifiable, EntityKind.MATERIAL);
+                        return AbstractGenericEntityRegistrationForm.createId(identifiable,
+                                EntityKind.MATERIAL);
                     }
 
                     @Override
@@ -429,10 +436,13 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Gener
 
         @Override
         public DatabaseModificationAwareWidget createRegistrationForEntityType(
-                ExperimentType entityType, ActionContext context)
+                ExperimentType entityType,
+                Map<String, List<IManagedInputWidgetDescription>> inputWidgetDescriptions,
+                ActionContext context)
         {
             GenericExperimentRegistrationForm form =
-                    new GenericExperimentRegistrationForm(getViewContext(), context, entityType);
+                    new GenericExperimentRegistrationForm(getViewContext(),
+                            inputWidgetDescriptions, context, entityType);
             return new DatabaseModificationAwareWidget(form, form);
         }
 
@@ -553,7 +563,8 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Gener
                     @Override
                     public String getId()
                     {
-                        return AbstractGenericEntityRegistrationForm.createId(identifiable, EntityKind.DATA_SET);
+                        return AbstractGenericEntityRegistrationForm.createId(identifiable,
+                                EntityKind.DATA_SET);
                     }
 
                     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/DelegatedClientPlugin.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/DelegatedClientPlugin.java
index b1053e0b8de..ad865252e5c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/DelegatedClientPlugin.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/DelegatedClientPlugin.java
@@ -16,6 +16,9 @@
 
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application;
 
+import java.util.List;
+import java.util.Map;
+
 import com.google.gwt.user.client.ui.Widget;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ActionContext;
@@ -27,10 +30,11 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWit
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedInputWidgetDescription;
 
 /**
- * delegates all operations to generic plugin, should be subclasssed and the needed
- * functionality can override the default behaviour
+ * delegates all operations to generic plugin, should be subclasssed and the needed functionality
+ * can override the default behaviour
  */
 public class DelegatedClientPlugin<T extends BasicEntityType> implements
         IClientPlugin<T, IIdAndCodeHolder>
@@ -52,8 +56,7 @@ public class DelegatedClientPlugin<T extends BasicEntityType> implements
     }
 
     @Override
-    public AbstractTabItemFactory createEntityViewer(
-            final IEntityInformationHolderWithPermId entity)
+    public AbstractTabItemFactory createEntityViewer(final IEntityInformationHolderWithPermId entity)
     {
         return delegator.createEntityViewer(entity);
     }
@@ -78,8 +81,10 @@ public class DelegatedClientPlugin<T extends BasicEntityType> implements
 
     @Override
     public DatabaseModificationAwareWidget createRegistrationForEntityType(T entityType,
+            Map<String, List<IManagedInputWidgetDescription>> inputWidgetDescriptions,
             ActionContext context)
     {
-        return delegator.createRegistrationForEntityType(entityType, context);
+        return delegator.createRegistrationForEntityType(entityType, inputWidgetDescriptions,
+                context);
     }
 }
\ No newline at end of file
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/AbstractGenericExperimentRegisterEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/AbstractGenericExperimentRegisterEditForm.java
index b6a98ca3d75..74c5c44343f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/AbstractGenericExperimentRegisterEditForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/AbstractGenericExperimentRegisterEditForm.java
@@ -20,6 +20,7 @@ import static ch.systemsx.cisd.openbis.generic.client.web.client.application.fra
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 import com.extjs.gxt.ui.client.Style.Orientation;
 import com.extjs.gxt.ui.client.event.BaseEvent;
@@ -59,6 +60,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 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.SampleType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedInputWidgetDescription;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.IGenericClientServiceAsync;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.AbstractGenericEntityRegistrationForm;
 
@@ -97,18 +99,24 @@ abstract public class AbstractGenericExperimentRegisterEditForm extends
 
     private LabelField templateField;
 
+    private final Map<String, List<IManagedInputWidgetDescription>> inputWidgetDescriptions;
+
     protected AbstractGenericExperimentRegisterEditForm(
-            IViewContext<IGenericClientServiceAsync> viewContext, ActionContext context)
+            IViewContext<IGenericClientServiceAsync> viewContext,
+            Map<String, List<IManagedInputWidgetDescription>> inputWidgetDescriptions,
+            ActionContext context)
     {
-        this(viewContext, context, null);
+        this(viewContext, inputWidgetDescriptions, context, null);
     }
 
     protected AbstractGenericExperimentRegisterEditForm(
-            IViewContext<IGenericClientServiceAsync> viewContext, ActionContext actionContext,
-            IIdAndCodeHolder identifiable)
+            IViewContext<IGenericClientServiceAsync> viewContext,
+            Map<String, List<IManagedInputWidgetDescription>> inputWidgetDescriptions,
+            ActionContext actionContext, IIdAndCodeHolder identifiable)
     {
         super(viewContext, identifiable, EntityKind.EXPERIMENT);
 
+        this.inputWidgetDescriptions = inputWidgetDescriptions;
         simpleId = createSimpleId(identifiable, EntityKind.EXPERIMENT);
         attachmentsSessionKey = simpleId + "_attachments";
         samplesSessionKey = simpleId + "_samples";
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 639e1d5f33e..c273ecd504a 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
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.experiment;
 
+import java.util.Collections;
 import java.util.List;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
@@ -32,6 +33,7 @@ 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.ExperimentUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedInputWidgetDescription;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.IGenericClientServiceAsync;
 
 /**
@@ -53,7 +55,8 @@ public final class GenericExperimentEditForm extends AbstractGenericExperimentRe
     private GenericExperimentEditForm(IViewContext<IGenericClientServiceAsync> viewContext,
             IIdAndCodeHolder identifiable)
     {
-        super(viewContext, new ActionContext(), identifiable);
+        super(viewContext, Collections.<String, List<IManagedInputWidgetDescription>> emptyMap(),
+                new ActionContext(), identifiable);
         setRevertButtonVisible(true);
     }
 
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 0d0dde340f6..bd76942dff7 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
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.experiment;
 
 import java.util.List;
+import java.util.Map;
 
 import com.extjs.gxt.ui.client.widget.form.FileUploadField;
 
@@ -29,6 +30,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentTypePropertyT
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedInputWidgetDescription;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.IGenericClientServiceAsync;
 
 /**
@@ -44,9 +46,10 @@ public final class GenericExperimentRegistrationForm extends
 
     public GenericExperimentRegistrationForm(
             final IViewContext<IGenericClientServiceAsync> viewContext,
+            Map<String, List<IManagedInputWidgetDescription>> inputWidgetDescriptions,
             final ActionContext context, final ExperimentType experimentType)
     {
-        super(viewContext, context);
+        super(viewContext, inputWidgetDescriptions, context);
         setResetButtonVisible(true);
         this.experimentType = experimentType;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/PropertiesEditor.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/PropertiesEditor.java
index add53c3c446..5ccaf55064f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/PropertiesEditor.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/PropertiesEditor.java
@@ -21,6 +21,10 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import com.extjs.gxt.ui.client.widget.form.FieldSet;
+import com.extjs.gxt.ui.client.widget.form.FormPanel;
+import com.extjs.gxt.ui.client.widget.layout.FormLayout;
+
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DatabaseModificationAwareField;
@@ -36,10 +40,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTypePropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
 
-import com.extjs.gxt.ui.client.widget.form.FieldSet;
-import com.extjs.gxt.ui.client.widget.form.FormPanel;
-import com.extjs.gxt.ui.client.widget.layout.FormLayout;
-
 /**
  * @author Izabela Adamczyk
  */
@@ -132,6 +132,7 @@ abstract public class PropertiesEditor<T extends EntityType, S extends EntityTyp
         final String label =
                 PropertyTypeRenderer.getDisplayName(etpt.getPropertyType(), propertyTypes);
         final String propertyTypeCode = etpt.getPropertyType().getCode();
+        boolean isManaged = etpt.isManaged();
         field =
                 PropertyFieldFactory.createField(etpt.getPropertyType(), isMandatory, label,
                         createFormFieldId(getId(), propertyTypeCode), value, viewContext);
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ClientPluginFactory.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ClientPluginFactory.java
index 6604337e5cc..d08e0afa441 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ClientPluginFactory.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ClientPluginFactory.java
@@ -19,6 +19,8 @@ package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
@@ -44,6 +46,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedInputWidgetDescription;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.IGenericClientServiceAsync;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.AbstractGenericEntityRegistrationForm;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.DelegatedClientPlugin;
@@ -165,11 +168,13 @@ public class ClientPluginFactory extends AbstractClientPluginFactory<ViewContext
 
         @Override
         public DatabaseModificationAwareWidget createRegistrationForEntityType(
-                ExperimentType entityType, ActionContext context)
+                ExperimentType entityType,
+                Map<String, List<IManagedInputWidgetDescription>> inputWidgetDescriptions,
+                ActionContext context)
         {
             GenericExperimentRegistrationForm form =
-                    new GenericExperimentRegistrationForm(getGenericViewContext(), context,
-                            entityType);
+                    new GenericExperimentRegistrationForm(getGenericViewContext(),
+                            inputWidgetDescriptions, context, entityType);
             return new DatabaseModificationAwareWidget(form, form);
         }
 
-- 
GitLab