From a08edf84acf579a07a3eb00ee071cd2624b00a39 Mon Sep 17 00:00:00 2001
From: izabel <izabel>
Date: Mon, 17 May 2010 13:26:10 +0000
Subject: [PATCH] [LMS-1528] initialize modules once

SVN: 15994
---
 .../AbstractClientPluginFactory.java          |  8 +-
 .../application/menu/modules/ModulesMenu.java | 15 +--
 .../DefaultClientPluginFactoryProvider.java   | 15 ++-
 .../plugin/IClientPluginFactoryProvider.java  |  6 +-
 .../plugin/IModuleInitializationObserver.java | 30 ++++++
 .../ModuleInitializationController.java       | 47 +++++++---
 .../client/application/ui/AbstractViewer.java | 25 ++---
 .../ui/ModulesSectionsManager.java            | 91 +++++++++++++++++++
 .../application/ClientPluginFactory.java      |  2 +-
 .../application/ClientPluginFactory.java      | 16 +++-
 .../dataset/GenericDataSetViewer.java         | 12 +--
 .../experiment/GenericExperimentViewer.java   | 10 +-
 .../sample/GenericSampleViewer.java           |  8 +-
 .../application/ClientPluginFactory.java      |  2 +-
 .../application/ClientPluginFactory.java      |  2 +-
 .../application/ClientPluginFactory.java      | 10 +-
 16 files changed, 219 insertions(+), 80 deletions(-)
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/IModuleInitializationObserver.java
 rename openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/{menu/modules => plugin}/ModuleInitializationController.java (73%)
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/ModulesSectionsManager.java

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AbstractClientPluginFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AbstractClientPluginFactory.java
index 32d2eba41cf..e01833f9fbf 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AbstractClientPluginFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AbstractClientPluginFactory.java
@@ -31,10 +31,13 @@ public abstract class AbstractClientPluginFactory<V extends IViewContext<? exten
 {
     private final V viewContext;
 
+    private final IModule module;
+
     protected AbstractClientPluginFactory(
             final IViewContext<ICommonClientServiceAsync> originalViewContext)
     {
         this.viewContext = createViewContext(originalViewContext);
+        this.module = maybeCreateModule();
     }
 
     protected abstract V createViewContext(
@@ -45,9 +48,10 @@ public abstract class AbstractClientPluginFactory<V extends IViewContext<? exten
         return viewContext;
     }
 
-    public IModule tryGetModule()
+    public final IModule tryGetModule()
     {
-        return null;
+        return module;
     }
 
+    protected abstract IModule maybeCreateModule();
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/modules/ModulesMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/modules/ModulesMenu.java
index 91e67ada918..3c75b6e6ec0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/modules/ModulesMenu.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/modules/ModulesMenu.java
@@ -26,6 +26,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMe
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenuItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPluginFactoryProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IModule;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IModuleInitializationObserver;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider;
 
 /**
@@ -33,7 +34,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMess
  * 
  * @author Piotr Buczek
  */
-public class ModulesMenu extends TopMenuItem
+public class ModulesMenu extends TopMenuItem implements IModuleInitializationObserver
 {
 
     public ModulesMenu(IMessageProvider messageProvider,
@@ -45,12 +46,7 @@ public class ModulesMenu extends TopMenuItem
         Menu submenu = new Menu();
         setMenu(submenu);
         hide();
-        initialize(clientPluginFactoryProvider.getModules());
-    }
-
-    private void initialize(List<IModule> modules)
-    {
-        ModuleInitializationController.initialize(modules, this);
+        clientPluginFactoryProvider.addModuleInitializationObserver(this);
     }
 
     /**
@@ -92,4 +88,9 @@ public class ModulesMenu extends TopMenuItem
         }
     }
 
+    public void notify(List<IModule> successfullyInitializedModules)
+    {
+        addModuleItems(successfullyInitializedModules);
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/DefaultClientPluginFactoryProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/DefaultClientPluginFactoryProvider.java
index 60c53b7bad7..066baa7d3fc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/DefaultClientPluginFactoryProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/DefaultClientPluginFactoryProvider.java
@@ -42,7 +42,7 @@ public class DefaultClientPluginFactoryProvider implements IClientPluginFactoryP
     private final Map<EntityKindAndTypeCode, IClientPluginFactory> pluginFactoryByEntityKindAndTypeCode =
             new HashMap<EntityKindAndTypeCode, IClientPluginFactory>();
 
-    private IClientPluginFactory genericPluginFactory;
+    private final IClientPluginFactory genericPluginFactory;
 
     public DefaultClientPluginFactoryProvider(
             final IViewContext<ICommonClientServiceAsync> originalViewContext)
@@ -55,8 +55,10 @@ public class DefaultClientPluginFactoryProvider implements IClientPluginFactoryP
             final IViewContext<ICommonClientServiceAsync> originalViewContext)
     {
         // Automatically generated part - START
-        registerPluginFactory(new ch.systemsx.cisd.openbis.plugin.demo.client.web.client.application.ClientPluginFactory(originalViewContext));
-        registerPluginFactory(new ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.ClientPluginFactory(originalViewContext));
+        registerPluginFactory(new ch.systemsx.cisd.openbis.plugin.demo.client.web.client.application.ClientPluginFactory(
+                originalViewContext));
+        registerPluginFactory(new ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.ClientPluginFactory(
+                originalViewContext));
         // Automatically generated part - END
     }
 
@@ -102,7 +104,7 @@ public class DefaultClientPluginFactoryProvider implements IClientPluginFactoryP
         return genericPluginFactory;
     }
 
-    public final List<IModule> getModules()
+    private final List<IModule> getUninitializedModules()
     {
         ArrayList<IModule> modules = new ArrayList<IModule>();
         for (IClientPluginFactory factory : pluginFactories)
@@ -115,4 +117,9 @@ public class DefaultClientPluginFactoryProvider implements IClientPluginFactoryP
         }
         return modules;
     }
+
+    public void addModuleInitializationObserver(IModuleInitializationObserver observer)
+    {
+        ModuleInitializationController.createAndInitialize(getUninitializedModules()).addObserver(observer);
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/IClientPluginFactoryProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/IClientPluginFactoryProvider.java
index 6743ecf7bc0..4543c92f184 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/IClientPluginFactoryProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/IClientPluginFactoryProvider.java
@@ -16,8 +16,6 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin;
 
-import java.util.List;
-
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 
@@ -34,12 +32,12 @@ public interface IClientPluginFactoryProvider
      * 
      * @return never <code>null</code> but could return the <i>generic</i> implementation.
      */
-    public IClientPluginFactory getClientPluginFactory(final EntityKind entityKind,
+    IClientPluginFactory getClientPluginFactory(final EntityKind entityKind,
             final BasicEntityType entityType);
 
     /**
      * Returns a list of all defined 'technology' modules.
      */
-    public List<IModule> getModules();
+    void addModuleInitializationObserver(IModuleInitializationObserver observer);
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/IModuleInitializationObserver.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/IModuleInitializationObserver.java
new file mode 100644
index 00000000000..faf82686a4d
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/IModuleInitializationObserver.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2010 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.plugin;
+
+import java.util.List;
+
+
+/**
+ * @author Izabela Adamczyk
+ */
+public interface IModuleInitializationObserver
+{
+
+    void notify(List<IModule> successfullyInitializedModules);
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/modules/ModuleInitializationController.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/ModuleInitializationController.java
similarity index 73%
rename from openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/modules/ModuleInitializationController.java
rename to openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/ModuleInitializationController.java
index a14d57f874a..245d4d48e75 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/modules/ModuleInitializationController.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/ModuleInitializationController.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.modules;
+package ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -22,23 +22,37 @@ import java.util.List;
 import com.extjs.gxt.ui.client.widget.MessageBox;
 import com.google.gwt.user.client.rpc.AsyncCallback;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IModule;
-
 /**
- * This class controls initialization process of all modules and creates a submenu of
- * {@link ModulesMenu} when all initialization is finished.
+ * This class controls initialization process of all modules and notifies the
+ * {@link IModuleInitializationObserver}s when all initialization is finished.
  * 
  * @author Piotr Buczek
  */
 public class ModuleInitializationController
-{// FIXME 2010-05-12, IA: handle initialization for detail viewers
-    public static void initialize(List<IModule> modules, ModulesMenu modulesMenu)
+{
+    private static ModuleInitializationController INSTANCE;
+
+    public static ModuleInitializationController createAndInitialize(List<IModule> modules)
+    {
+        if (INSTANCE == null)
+        {
+            INSTANCE = new ModuleInitializationController(modules);
+            for (IModule module : modules)
+            {
+                module.initialize(new ModuleInitializationCallback(INSTANCE, module));
+            }
+        }
+        return INSTANCE;
+    }
+
+    public void addObserver(IModuleInitializationObserver observer)
     {
-        ModuleInitializationController controller =
-                new ModuleInitializationController(modules, modulesMenu);
-        for (IModule module : modules)
+        if (remainingModulesCounter != 0)
+        {
+            observers.add(observer);
+        } else
         {
-            module.initialize(new ModuleInitializationCallback(controller, module));
+            observer.notify(successfullyInitializedModules);
         }
     }
 
@@ -48,11 +62,11 @@ public class ModuleInitializationController
 
     private final List<IModule> uninitializedModules = new ArrayList<IModule>();
 
-    private final ModulesMenu modulesMenu;
+    private final List<IModuleInitializationObserver> observers;
 
-    private ModuleInitializationController(List<IModule> allModules, ModulesMenu modulesMenu)
+    private ModuleInitializationController(List<IModule> allModules)
     {
-        this.modulesMenu = modulesMenu;
+        this.observers = new ArrayList<IModuleInitializationObserver>();
         successfullyInitializedModules.addAll(allModules);
         remainingModulesCounter = allModules.size();
     }
@@ -74,7 +88,10 @@ public class ModuleInitializationController
         remainingModulesCounter--;
         if (remainingModulesCounter == 0)
         {
-            modulesMenu.addModuleItems(successfullyInitializedModules);
+            for (IModuleInitializationObserver observer : observers)
+            {
+                observer.notify(successfullyInitializedModules);
+            }
             showErrorMessageIfNecessary();
         }
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractViewer.java
index 438d8e2e87e..9af9fa76b7b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractViewer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractViewer.java
@@ -17,7 +17,6 @@
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 
@@ -36,21 +35,19 @@ import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.DisposableSectionPanel;
 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.AppEvents;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DispatcherHelper;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPlugin;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPluginFactory;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IModule;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IModuleInitializationObserver;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.GWTUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider;
 import ch.systemsx.cisd.openbis.generic.shared.basic.ICodeHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder;
-import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithIdentifier;
 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;
@@ -59,6 +56,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
  * @author Franz-Josef Elmer
  */
 public abstract class AbstractViewer<D extends IEntityInformationHolder> extends ContentPanel
+        implements IModuleInitializationObserver
 {
 
     public static final String ID_EDIT_SUFFIX = "_edit";
@@ -75,6 +73,8 @@ public abstract class AbstractViewer<D extends IEntityInformationHolder> extends
 
     private D originalData;
 
+    protected final ModulesSectionsManager moduleSectionManager = new ModulesSectionsManager();
+
     public AbstractViewer(final IViewContext<?> viewContext, String id)
     {
         this(viewContext, null, id, true); // title is set later with updateTitle method
@@ -98,6 +98,7 @@ public abstract class AbstractViewer<D extends IEntityInformationHolder> extends
                 addToolBarButton(createEditButton());
             }
         }
+        viewContext.getClientPluginFactoryProvider().addModuleInitializationObserver(this);
     }
 
     private Button createEditButton()
@@ -285,21 +286,9 @@ public abstract class AbstractViewer<D extends IEntityInformationHolder> extends
         return viewContext.getDisplaySettingsManager().getPanelCollapsedSetting(panelId);
     }
 
-    protected Collection<? extends DisposableSectionPanel> createModuleSectionPanels(
-            String displayIdSuffix, IEntityInformationHolderWithIdentifier entity)
+    public void notify(List<IModule> modules)
     {
-        ArrayList<DisposableSectionPanel> result = new ArrayList<DisposableSectionPanel>();
-        for (IModule module : viewContext.getClientPluginFactoryProvider().getModules())
-        {
-            Collection<? extends DisposableSectionPanel> sections = module.getSections(entity);
-            for (DisposableSectionPanel panel : sections)
-            {
-                panel.setDisplayID(DisplayTypeIDGenerator.MODULE_SECTION, module.getName() + "-"
-                        + displayIdSuffix);
-            }
-            result.addAll(sections);
-        }
-        return result;
+        moduleSectionManager.initialize(modules);
     }
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/ModulesSectionsManager.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/ModulesSectionsManager.java
new file mode 100644
index 00000000000..77dcc4dcaba
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/ModulesSectionsManager.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2010 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;
+
+import java.util.Collection;
+import java.util.List;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.DisposableSectionPanel;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IModule;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.SectionsPanel;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithIdentifier;
+
+/**
+ * Adds module sections the viewer after both {@link SectionsPanel} and {@link IModule}s are
+ * initialized.
+ * 
+ * @author Izabela Adamczyk
+ */
+public class ModulesSectionsManager
+{
+
+    private SectionsPanel container;
+
+    private IEntityInformationHolderWithIdentifier entity;
+
+    private String displayIdSuffix;
+
+    private List<IModule> modules;
+
+    /**
+     * Sets the values of chosen fields. Adds module sections to given container if called after
+     * {@link #initialize(List)}.
+     */
+    @SuppressWarnings("hiding")
+    public void initialize(final SectionsPanel container, final String displayIdSuffix,
+            final IEntityInformationHolderWithIdentifier entity)
+    {
+        this.container = container;
+        this.displayIdSuffix = displayIdSuffix;
+        this.entity = entity;
+        if (modules != null)
+        {
+            attachModulesSections();
+        }
+    }
+
+    /**
+     * Sets the values of chosen fields. Adds module sections to given container if called after
+     * {@link #initialize(SectionsPanel, String, IEntityInformationHolderWithIdentifier)}.
+     */
+    @SuppressWarnings("hiding")
+    public void initialize(final List<IModule> modules)
+    {
+        this.modules = modules;
+        if (container != null)
+        {
+            attachModulesSections();
+        }
+    }
+
+    private void attachModulesSections()
+    {
+        for (final IModule module : modules)
+        {
+            final Collection<? extends DisposableSectionPanel> sections =
+                    module.getSections(entity);
+            for (final DisposableSectionPanel panel : sections)
+            {
+                panel.setDisplayID(DisplayTypeIDGenerator.MODULE_SECTION, module.getName() + "-"
+                        + displayIdSuffix);
+                container.addPanel(panel);
+            }
+        }
+        container.layout();
+    }
+}
\ No newline at end of file
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 3bbade751df..bcaca4170cc 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
@@ -230,7 +230,7 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<DemoV
     }
 
     @Override
-    public IModule tryGetModule()
+    public IModule maybeCreateModule()
     {
         // uncomment to test DemoModule
         // return new DemoModule(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 01c27d4302a..ac006531c7c 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
@@ -35,6 +35,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpP
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.ClientPluginAdapter;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPlugin;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPluginFactory;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IModule;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractRegistrationForm;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractViewer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder;
@@ -117,12 +118,14 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Gener
                 "Generic plugin factory supports every sample type.");
     }
 
-    private String getViewerTitle(final String entityKindDictKey, final IIdAndCodeHolder identifiable)
+    private String getViewerTitle(final String entityKindDictKey,
+            final IIdAndCodeHolder identifiable)
     {
         return AbstractViewer.getTitle(getViewContext(), entityKindDictKey, identifiable);
     }
 
-    private String getEditorTitle(final String entityKindDictKey, final IIdAndCodeHolder identifiable)
+    private String getEditorTitle(final String entityKindDictKey,
+            final IIdAndCodeHolder identifiable)
     {
         return AbstractRegistrationForm.getEditTitle(getViewContext(), entityKindDictKey,
                 identifiable);
@@ -366,7 +369,8 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Gener
         }
     }
 
-    private final class DataSetClientPlugin extends ClientPluginAdapter<DataSetType, IIdAndCodeHolder>
+    private final class DataSetClientPlugin extends
+            ClientPluginAdapter<DataSetType, IIdAndCodeHolder>
     {
 
         @Override
@@ -428,4 +432,10 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Gener
         }
     }
 
+    @Override
+    protected IModule maybeCreateModule()
+    {
+        return null;
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetViewer.java
index 15b4c9d839e..b53414a1ef3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetViewer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetViewer.java
@@ -18,7 +18,6 @@ package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.da
 
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.List;
 import java.util.Set;
 
@@ -33,7 +32,6 @@ import com.google.gwt.user.client.rpc.AsyncCallback;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.DisposableSectionPanel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.SingleSectionPanel;
@@ -180,14 +178,6 @@ abstract public class GenericDataSetViewer extends AbstractViewer<ExternalData>
         {
             container.addPanel(panel);
         }
-
-        Collection<? extends DisposableSectionPanel> moduleSections =
-                createModuleSectionPanels(displayIdSuffix, dataset);
-        for (DisposableSectionPanel panel : moduleSections)
-        {
-            container.addPanel(panel);
-        }
-
         // parents
         final SingleSectionPanel parentsSection = new DataSetParentsSection(viewContext, dataset);
         parentsSection.setDisplayID(DisplayTypeIDGenerator.DATA_SET_PARENTS_SECTION,
@@ -204,8 +194,8 @@ abstract public class GenericDataSetViewer extends AbstractViewer<ExternalData>
         final SingleSectionPanel dataSection = new DataViewSection(viewContext, dataset);
         dataSection.setDisplayID(DisplayTypeIDGenerator.DATA_SET_DATA_SECTION, displayIdSuffix);
         container.addPanel(dataSection);
-
         container.layout();
+        moduleSectionManager.initialize(container, displayIdSuffix, dataset);
         return container;
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentViewer.java
index de1483b606d..5185e7e766a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentViewer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentViewer.java
@@ -158,9 +158,11 @@ public class GenericExperimentViewer extends AbstractViewer<Experiment> implemen
                 public void execute()
                 {
                     remove(loadingLabel);
+                    String displayIdPrefix = getDisplayIdSuffix(experimentType.getCode());
                     GenericExperimentViewer.this.rightPanelSectionsOrNull =
-                            createRightPanel(experiment);
+                            createRightPanel(experiment, displayIdPrefix);
                     SectionsPanel rightPanel = layoutSections(rightPanelSectionsOrNull);
+                    moduleSectionManager.initialize(rightPanel, displayIdPrefix, experiment);
                     add(rightPanel, createRightBorderLayoutData());
                     layout();
                 }
@@ -231,15 +233,13 @@ public class GenericExperimentViewer extends AbstractViewer<Experiment> implemen
     }
 
     private List<DisposableSectionPanel> createRightPanel(
-            IEntityInformationHolderWithIdentifier experiment)
+            IEntityInformationHolderWithIdentifier experiment, final String displayIdSuffix)
     {
-        final String displayIdSuffix = getDisplayIdSuffix(experimentType.getCode());
+
         List<DisposableSectionPanel> allPanels = new ArrayList<DisposableSectionPanel>();
 
         allPanels.addAll(createAdditionalBrowserSectionPanels(displayIdSuffix));
 
-        allPanels.addAll(createModuleSectionPanels(displayIdSuffix, experiment));
-
         final ExperimentSamplesSection sampleSection =
                 new ExperimentSamplesSection(viewContext, experimentType, experimentId);
         sampleSection.setDisplayID(DisplayTypeIDGenerator.SAMPLE_SECTION, displayIdSuffix);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java
index dcc17557df4..01d548fb063 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java
@@ -17,7 +17,6 @@
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sample;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -195,12 +194,6 @@ abstract public class GenericSampleViewer extends AbstractViewer<Sample> impleme
         {
             container.addPanel(panel);
         }
-        Collection<? extends DisposableSectionPanel> moduleSections =
-                createModuleSectionPanels(displayIdSuffix, generator);
-        for (DisposableSectionPanel panel : moduleSections)
-        {
-            container.addPanel(panel);
-        }
         // 'Part of' samples
         containerSamplesSection = new ContainerSamplesSection(viewContext, generator);
         containerSamplesSection
@@ -220,6 +213,7 @@ abstract public class GenericSampleViewer extends AbstractViewer<Sample> impleme
         container.addPanel(attachmentsSection);
 
         container.layout();
+        moduleSectionManager.initialize(container, displayIdSuffix, generator);
         return container;
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/ClientPluginFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/ClientPluginFactory.java
index eefc180ddd8..034e41ff0f0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/ClientPluginFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/ClientPluginFactory.java
@@ -59,7 +59,7 @@ public class ClientPluginFactory extends AbstractClientPluginFactory<QueryViewCo
     }
 
     @Override
-    public IModule tryGetModule()
+    public IModule maybeCreateModule()
     {
         return new QueryModule(getViewContext());
     }
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ClientPluginFactory.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ClientPluginFactory.java
index 642932fc0d1..d7b46c71da2 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ClientPluginFactory.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ClientPluginFactory.java
@@ -65,7 +65,7 @@ public class ClientPluginFactory extends AbstractClientPluginFactory<ViewContext
     }
 
     @Override
-    public IModule tryGetModule()
+    public IModule maybeCreateModule()
     {
         return new PhosphoNetXModule(getViewContext());
     }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ClientPluginFactory.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ClientPluginFactory.java
index bf063dcee55..24a3f48cf05 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ClientPluginFactory.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ClientPluginFactory.java
@@ -33,6 +33,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPlugin;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPluginFactory;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IModule;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractViewer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentIdentifier;
@@ -151,7 +152,8 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Scree
     }
 
     private static final AbstractTabItemFactory createGeneMaterialViewerTabFactory(
-            final IIdAndCodeHolder materialId, final ExperimentIdentifier experimentIdentifierOrNull,
+            final IIdAndCodeHolder materialId,
+            final ExperimentIdentifier experimentIdentifierOrNull,
             final IViewContext<IScreeningClientServiceAsync> viewContext)
     {
         return new AbstractTabItemFactory()
@@ -342,4 +344,10 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Scree
             return delegator.createRegistrationForEntityType(entityType);
         }
     }
+
+    @Override
+    protected IModule maybeCreateModule()
+    {
+        return null;
+    }
 }
-- 
GitLab