From b66cf1503b64585fe51a6248993238cd20be2602 Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Mon, 15 Mar 2010 14:37:13 +0000
Subject: [PATCH] [LMS-1446] added specific link to gene material detail view

SVN: 15153
---
 .../locator/MaterialLocatorResolver.java      | 20 ++--
 .../application/ClientPluginFactory.java      | 37 +++----
 .../application/ScreeningViewContext.java     | 13 ++-
 .../locator/GeneMaterialLocatorResolver.java  | 96 +++++++++++++++++++
 4 files changed, 133 insertions(+), 33 deletions(-)
 create mode 100644 screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/GeneMaterialLocatorResolver.java

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/MaterialLocatorResolver.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/MaterialLocatorResolver.java
index 49cfe5414b0..8121d1e89bd 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/MaterialLocatorResolver.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/MaterialLocatorResolver.java
@@ -19,9 +19,9 @@ public class MaterialLocatorResolver extends AbstractViewLocatorResolver
 {
     private final IViewContext<ICommonClientServiceAsync> viewContext;
 
-    public final static String CODE_PARAMETER_KEY = "code";
+    private final static String CODE_PARAMETER_KEY = "code";
 
-    public final static String TYPE_PARAMETER_KEY = "type";
+    protected final static String TYPE_PARAMETER_KEY = "type";
 
     public MaterialLocatorResolver(IViewContext<ICommonClientServiceAsync> viewContext)
     {
@@ -43,22 +43,26 @@ public class MaterialLocatorResolver extends AbstractViewLocatorResolver
         // otherwise show an error message.
         assert (EntityKind.MATERIAL.name().equals(locator.tryGetEntity()));
 
+        openInitialMaterialViewer(extractMaterialIdentifier(locator));
+    }
+
+    protected MaterialIdentifier extractMaterialIdentifier(ViewLocator locator)
+    {
         String codeValueOrNull = locator.getParameters().get(CODE_PARAMETER_KEY);
         String materialTypeValueOrNull = locator.getParameters().get(TYPE_PARAMETER_KEY);
         checkRequiredParameter(codeValueOrNull, codeValueOrNull);
         checkRequiredParameter(materialTypeValueOrNull, TYPE_PARAMETER_KEY);
-
-        openInitialMaterialViewer(codeValueOrNull, materialTypeValueOrNull);
+        
+        return new MaterialIdentifier(codeValueOrNull, materialTypeValueOrNull);
     }
 
     /**
-     * Open the material details tab for the specified code and material type.
+     * Open the material details tab for the specified identifier.
      */
-    private void openInitialMaterialViewer(String code, String materialType)
+    protected void openInitialMaterialViewer(MaterialIdentifier identifier)
             throws UserFailureException
     {
-        viewContext.getService().getMaterialInformationHolder(
-                new MaterialIdentifier(code, materialType),
+        viewContext.getService().getMaterialInformationHolder(identifier,
                 new OpenEntityDetailsTabCallback(viewContext));
     }
 
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 b58a62a0b94..a5dce6b4ad4 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
@@ -133,26 +133,7 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Scree
         @Override
         public final ITabItemFactory createEntityViewer(final IIdentifiable materialId)
         {
-            return new ITabItemFactory()
-                {
-                    public ITabItem create()
-                    {
-                        IViewContext<IScreeningClientServiceAsync> viewContext = getViewContext();
-                        final DatabaseModificationAwareComponent viewer =
-                                GeneMaterialViewer.create(viewContext, materialId, null);
-                        return createMaterialViewerTab(materialId, viewer, viewContext);
-                    }
-
-                    public String getId()
-                    {
-                        return GeneMaterialViewer.createId(materialId);
-                    }
-
-                    public HelpPageIdentifier getHelpPageIdentifier()
-                    {
-                        return GeneMaterialViewer.getHelpPageIdentifier();
-                    }
-                };
+            return createGeneMaterialViewerTabFactory(materialId, null, getViewContext());
         }
     }
 
@@ -161,13 +142,22 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Scree
             final ExperimentIdentifier experimentIdentifier,
             final IViewContext<IScreeningClientServiceAsync> viewContext)
     {
-        ITabItemFactory tab = new ITabItemFactory()
+        ITabItemFactory tab =
+                createGeneMaterialViewerTabFactory(materialId, experimentIdentifier, viewContext);
+        DispatcherHelper.dispatchNaviEvent(tab);
+    }
+
+    private static final ITabItemFactory createGeneMaterialViewerTabFactory(
+            final IIdentifiable materialId, final ExperimentIdentifier experimentIdentifierOrNull,
+            final IViewContext<IScreeningClientServiceAsync> viewContext)
+    {
+        return new ITabItemFactory()
             {
                 public ITabItem create()
                 {
                     final DatabaseModificationAwareComponent viewer =
-                            GeneMaterialViewer
-                                    .create(viewContext, materialId, experimentIdentifier);
+                            GeneMaterialViewer.create(viewContext, materialId,
+                                    experimentIdentifierOrNull);
                     return createMaterialViewerTab(materialId, viewer, viewContext);
                 }
 
@@ -181,7 +171,6 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Scree
                     return GeneMaterialViewer.getHelpPageIdentifier();
                 }
             };
-        DispatcherHelper.dispatchNaviEvent(tab);
     }
 
     private static ITabItem createMaterialViewerTab(final IIdentifiable materialId,
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ScreeningViewContext.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ScreeningViewContext.java
index 67c4929605d..41ace8f147c 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ScreeningViewContext.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ScreeningViewContext.java
@@ -5,15 +5,18 @@ import com.google.gwt.core.client.GWT;
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractPluginViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.ViewLocatorResolverRegistry;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningClientService;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningClientServiceAsync;
+import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.locator.GeneMaterialLocatorResolver;
 
 /**
  * The <i>screening</i> plugin specific {@link IViewContext} implementation.
  * 
  * @author Tomasz Pylak
  */
-public final class ScreeningViewContext extends AbstractPluginViewContext<IScreeningClientServiceAsync>
+public final class ScreeningViewContext extends
+        AbstractPluginViewContext<IScreeningClientServiceAsync>
 {
     private static final String TECHNOLOGY_NAME = "screening";
 
@@ -33,4 +36,12 @@ public final class ScreeningViewContext extends AbstractPluginViewContext<IScree
     {
         return GWT.create(IScreeningClientService.class);
     }
+
+    @Override
+    protected void initializeLocatorHandlerRegistry(ViewLocatorResolverRegistry handlerRegistry)
+    {
+        super.initializeLocatorHandlerRegistry(handlerRegistry);
+
+        handlerRegistry.registerHandler(new GeneMaterialLocatorResolver(this));
+    }
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/GeneMaterialLocatorResolver.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/GeneMaterialLocatorResolver.java
new file mode 100644
index 00000000000..672b51ebf75
--- /dev/null
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/GeneMaterialLocatorResolver.java
@@ -0,0 +1,96 @@
+package ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.locator;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.MaterialLocatorResolver;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.ViewLocator;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentIdentifier;
+import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
+import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningClientServiceAsync;
+import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.ScreeningConstants;
+import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ClientPluginFactory;
+
+/**
+ * {@link MaterialLocatorResolver} for genes.
+ * 
+ * @author Piotr Buczek
+ */
+public class GeneMaterialLocatorResolver extends MaterialLocatorResolver
+{
+    private final IViewContext<IScreeningClientServiceAsync> viewContext;
+
+    private final static String EXPERIMENT_PARAMETER_KEY = "experiment";
+
+    public GeneMaterialLocatorResolver(IViewContext<IScreeningClientServiceAsync> viewContext)
+    {
+        super(viewContext.getCommonViewContext());
+        this.viewContext = viewContext;
+    }
+
+    @Override
+    public boolean canHandleLocator(ViewLocator locator)
+    {
+        String materialTypeOrNull = locator.getParameters().get(TYPE_PARAMETER_KEY);
+        return super.canHandleLocator(locator)
+                && ScreeningConstants.GENE_PLUGIN_TYPE_CODE.equals(materialTypeOrNull);
+    }
+
+    @Override
+    public void resolve(ViewLocator locator) throws UserFailureException
+    {
+        // If there is exactly one material matching given parameters open its detail view,
+        // otherwise show an error message.
+        assert (EntityKind.MATERIAL.name().equals(locator.tryGetEntity()));
+
+        String experimentIdentifierOrNull = locator.getParameters().get(EXPERIMENT_PARAMETER_KEY);
+        openInitialMaterialViewer(extractMaterialIdentifier(locator), experimentIdentifierOrNull);
+    }
+
+    /**
+     * Open the gene material details tab for the specified identifier. Optionally select experiment
+     * in the viewer.
+     */
+    protected void openInitialMaterialViewer(MaterialIdentifier identifier,
+            String experimentIdentifierOrNull) throws UserFailureException
+    {
+        viewContext.getCommonService().getMaterialInformationHolder(identifier,
+                new OpenEntityDetailsTabCallback(viewContext, experimentIdentifierOrNull));
+    }
+
+    private static class OpenEntityDetailsTabCallback extends
+            AbstractAsyncCallback<IEntityInformationHolder>
+    {
+        private final IViewContext<IScreeningClientServiceAsync> viewContext;
+
+        private final ExperimentIdentifier experimentIdentifierOrNull;
+
+        private OpenEntityDetailsTabCallback(
+                final IViewContext<IScreeningClientServiceAsync> viewContext,
+                String experimentIdentifierOrNull)
+        {
+            super(viewContext);
+            this.viewContext = viewContext;
+            this.experimentIdentifierOrNull =
+                    experimentIdentifierOrNull != null ? new ExperimentIdentifier(
+                            experimentIdentifierOrNull) : null;
+        }
+
+        //
+        // AbstractAsyncCallback
+        //
+
+        /**
+         * Opens the tab with <var>result</var> entity details.
+         */
+        @Override
+        protected final void process(final IEntityInformationHolder result)
+        {
+            ClientPluginFactory.openGeneMaterialViewer(result, experimentIdentifierOrNull,
+                    viewContext);
+        }
+    }
+
+}
\ No newline at end of file
-- 
GitLab