From 583fca89a1a93e5bafe1f89a3c42de24ae64787d Mon Sep 17 00:00:00 2001
From: izabel <izabel>
Date: Mon, 17 May 2010 08:02:51 +0000
Subject: [PATCH] [LMS-1528] make the special query parameters (entity keys)
 fixed (not possible to edit/reset/see)

SVN: 15990
---
 .../web/client/application/QueryModule.java   |  89 +----------
 .../application/QueryParameterValue.java      |  46 ++++++
 .../client/application/QuerySectionPanel.java | 150 ++++++++++++++++++
 .../locator/QueryLocatorResolver.java         |  12 +-
 .../module/RunCannedQueryToolbar.java         |  34 +++-
 5 files changed, 237 insertions(+), 94 deletions(-)
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/QueryParameterValue.java
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/QuerySectionPanel.java

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/QueryModule.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/QueryModule.java
index 3e320d87a03..e51342b2e27 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/QueryModule.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/QueryModule.java
@@ -16,14 +16,11 @@
 
 package ch.systemsx.cisd.openbis.plugin.query.client.web.client.application;
 
-import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Set;
 
-import com.extjs.gxt.ui.client.widget.Component;
 import com.extjs.gxt.ui.client.widget.menu.MenuItem;
 import com.google.gwt.user.client.rpc.AsyncCallback;
 
@@ -31,24 +28,17 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAs
 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.framework.DatabaseModificationAwareComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IModule;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithIdentifier;
-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.QueryType;
 import ch.systemsx.cisd.openbis.plugin.query.client.web.client.IQueryClientServiceAsync;
-import ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.module.AbstractQueryProviderToolbar;
 import ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.module.QueryModuleDatabaseMenuItem;
-import ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.module.QueryViewer;
-import ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.module.RunCannedQueryToolbar;
 
 /**
  * @author Piotr Buczek
  */
 public class QueryModule implements IModule
 {
+
     public static final String ID = GenericConstants.ID_PREFIX;
 
     private final IViewContext<IQueryClientServiceAsync> viewContext;
@@ -115,79 +105,6 @@ public class QueryModule implements IModule
     public Collection<? extends DisposableSectionPanel> getSections(
             IEntityInformationHolderWithIdentifier entity)
     {
-        ArrayList<DisposableSectionPanel> result = new ArrayList<DisposableSectionPanel>();
-        final IViewContext<IQueryClientServiceAsync> queryModuleContext = viewContext;
-        result.add(createEntitySectionPanel(queryModuleContext, entity));
-        return result;
-    }
-
-    private DisposableSectionPanel createEntitySectionPanel(
-            final IViewContext<IQueryClientServiceAsync> queryModuleContext,
-            final IEntityInformationHolderWithIdentifier entity)
-    {
-        DisposableSectionPanel panel =
-                new DisposableSectionPanel(
-                        viewContext
-                                .getMessage(ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.Dict.QUERY_MODULE_MENU_TITLE),
-                        queryModuleContext)
-                    {
-                        @Override
-                        protected IDisposableComponent createDisposableContent()
-                        {
-                            HashMap<String, String> parameters = new HashMap<String, String>();
-                            if (entity.getEntityKind().equals(EntityKind.MATERIAL))
-                            {
-                                parameters.put("_key", entity.getCode());
-                                parameters.put("_type", entity.getEntityType().getCode());
-                            } else
-                            {
-                                parameters.put("_key", entity.getPermId());
-                            }
-                            AbstractQueryProviderToolbar toolbar =
-                                    new RunCannedQueryToolbar(queryModuleContext, null, parameters,
-                                            translate(entity.getEntityKind()));
-                            final DatabaseModificationAwareComponent viewer =
-                                    QueryViewer.create(queryModuleContext, toolbar);
-                            return new IDisposableComponent()
-                                {
-                                    public void dispose()
-                                    {// FIXME
-                                    }
-
-                                    public Component getComponent()
-                                    {
-                                        return viewer.get();
-                                    }
-
-                                    public DatabaseModificationKind[] getRelevantModifications()
-                                    {
-                                        return viewer.getRelevantModifications();
-                                    }
-
-                                    public void update(
-                                            Set<DatabaseModificationKind> observedModifications)
-                                    {
-                                        viewer.update(observedModifications);
-                                    }
-                                };
-                        }
-                    };
-        return panel;
-    }
-
-    private static QueryType translate(EntityKind kind)
-    {
-        switch (kind)
-        {
-            case DATA_SET:
-                return QueryType.DATA_SET;
-            case EXPERIMENT:
-                return QueryType.EXPERIMENT;
-            case MATERIAL:
-                return QueryType.MATERIAL;
-            case SAMPLE:
-                return QueryType.SAMPLE;
-        }
-        return null;
+        return Arrays.asList(new QuerySectionPanel(viewContext, entity));
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/QueryParameterValue.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/QueryParameterValue.java
new file mode 100644
index 00000000000..793ff470d9d
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/QueryParameterValue.java
@@ -0,0 +1,46 @@
+/*
+ * 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.plugin.query.client.web.client.application;
+
+/**
+ * Bean describing query parameter value.
+ * 
+ * @author Izabela Adamczyk
+ */
+public class QueryParameterValue
+{
+    private final String value;
+
+    private final boolean fixed;
+
+    public QueryParameterValue(String value, boolean fixed)
+    {
+        this.value = value;
+        this.fixed = fixed;
+    }
+
+    public String getValue()
+    {
+        return value;
+    }
+
+    public boolean isFixed()
+    {
+        return fixed;
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/QuerySectionPanel.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/QuerySectionPanel.java
new file mode 100644
index 00000000000..3279b40d994
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/QuerySectionPanel.java
@@ -0,0 +1,150 @@
+/*
+ * 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.plugin.query.client.web.client.application;
+
+import java.util.HashMap;
+import java.util.Set;
+
+import com.extjs.gxt.ui.client.widget.Component;
+
+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.DatabaseModificationAwareComponent;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithIdentifier;
+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.QueryType;
+import ch.systemsx.cisd.openbis.plugin.query.client.web.client.IQueryClientServiceAsync;
+import ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.module.AbstractQueryProviderToolbar;
+import ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.module.QueryViewer;
+import ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.module.RunCannedQueryToolbar;
+
+/**
+ * Section panel presenting query results for given entity.
+ * 
+ * @author Izabela Adamczyk
+ */
+final class QuerySectionPanel extends DisposableSectionPanel
+{
+    private static final String PARAMETER_PREFIX = "_";
+
+    private static final String TYPE = "type";
+
+    private static final String KEY = "key";
+
+    private final IViewContext<IQueryClientServiceAsync> queryModuleContext;
+
+    private final IEntityInformationHolderWithIdentifier entity;
+
+    public QuerySectionPanel(IViewContext<IQueryClientServiceAsync> queryModuleContext,
+            final IEntityInformationHolderWithIdentifier entity)
+    {
+        super(
+                queryModuleContext
+                        .getMessage(ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.Dict.QUERY_MODULE_MENU_TITLE),
+                queryModuleContext);
+        this.queryModuleContext = queryModuleContext;
+        this.entity = entity;
+
+    }
+
+    @Override
+    protected IDisposableComponent createDisposableContent()
+    {
+        HashMap<String, QueryParameterValue> parameters = extractFixedQueryParameters(entity);
+        AbstractQueryProviderToolbar toolbar =
+                new RunCannedQueryToolbar(queryModuleContext, null, parameters, translate(entity
+                        .getEntityKind()));
+        final DatabaseModificationAwareComponent viewer =
+                QueryViewer.create(queryModuleContext, toolbar);
+        return new IDisposableComponent()
+            {
+                public void dispose()
+                {// FIXME
+                }
+
+                public Component getComponent()
+                {
+                    return viewer.get();
+                }
+
+                public DatabaseModificationKind[] getRelevantModifications()
+                {
+                    return viewer.getRelevantModifications();
+                }
+
+                public void update(Set<DatabaseModificationKind> observedModifications)
+                {
+                    viewer.update(observedModifications);
+                }
+            };
+    }
+
+    /**
+     * Extracts fixed query parameters from given entity.
+     * <ul>
+     * <li>material: code (<code>${key}</code>) + type (<code>${type}</code>)
+     * <li>data set: code (<code>${key}</code>)
+     * <li>sample, experiment: perm id (<code>${key}</code>)
+     * </ul>
+     */
+    private static HashMap<String, QueryParameterValue> extractFixedQueryParameters(
+            final IEntityInformationHolderWithIdentifier entity)
+    {
+        HashMap<String, QueryParameterValue> parameters =
+                new HashMap<String, QueryParameterValue>();
+        if (entity.getEntityKind().equals(EntityKind.MATERIAL))
+        {
+            parameters.put(asParameter(KEY), new QueryParameterValue(entity.getCode(), true));
+            parameters.put(asParameter(TYPE), new QueryParameterValue(entity.getEntityType()
+                    .getCode(), true));
+        } else
+        {
+            parameters.put(asParameter(KEY), new QueryParameterValue(entity.getPermId(), true));
+        }
+        return parameters;
+    }
+
+    /**
+     * Adds prefix to given parameter name.
+     */
+    private static String asParameter(String parameterName)
+    {
+        return PARAMETER_PREFIX + parameterName;
+    }
+
+    /**
+     * Translates {@link EntityKind} to {@link QueryType}.
+     */
+    private static QueryType translate(EntityKind entityKind)
+    {
+        switch (entityKind)
+        {
+            case DATA_SET:
+                return QueryType.DATA_SET;
+            case EXPERIMENT:
+                return QueryType.EXPERIMENT;
+            case MATERIAL:
+                return QueryType.MATERIAL;
+            case SAMPLE:
+                return QueryType.SAMPLE;
+        }
+        return null;
+    }
+
+}
\ No newline at end of file
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/locator/QueryLocatorResolver.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/locator/QueryLocatorResolver.java
index 72422c93572..9b849f96be9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/locator/QueryLocatorResolver.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/locator/QueryLocatorResolver.java
@@ -1,5 +1,8 @@
 package ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.locator;
 
+import java.util.HashMap;
+import java.util.Map;
+
 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.DatabaseModificationAwareComponent;
@@ -14,6 +17,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.ITabA
 import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.QueryType;
 import ch.systemsx.cisd.openbis.plugin.query.client.web.client.IQueryClientServiceAsync;
+import ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.QueryParameterValue;
 import ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.module.QueryModuleDatabaseMenuItem;
 import ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.module.QueryViewer;
 import ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.module.RunCannedQueryToolbar;
@@ -43,11 +47,17 @@ public class QueryLocatorResolver extends AbstractViewLocatorResolver
         // opens a predefined query results viewer with optional:
         // - query selection using query name
         // - filling of parameter values using parameter names
+        Map<String, String> originalParameters = locator.getParameters();
+        Map<String, QueryParameterValue> parameters = new HashMap<String, QueryParameterValue>();
+        for (String key : originalParameters.keySet())
+        {
+            parameters.put(key, new QueryParameterValue(originalParameters.get(key), false));
+        }
         final String queryNameOrNull = locator.getParameters().get(QUERY_NAME_PARAMETER_KEY);
 
         final DatabaseModificationAwareComponent component =
                 QueryViewer.create(viewContext, new RunCannedQueryToolbar(viewContext,
-                        queryNameOrNull, locator.getParameters(), QueryType.GENERIC));
+                        queryNameOrNull, parameters, QueryType.GENERIC));
 
         final ITabActionMenuItemDefinition<IQueryClientServiceAsync> definition =
                 ActionMenuDefinition.RUN_CANNED_QUERY;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/RunCannedQueryToolbar.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/RunCannedQueryToolbar.java
index 916e107bed3..d443b291a1c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/RunCannedQueryToolbar.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/RunCannedQueryToolbar.java
@@ -40,6 +40,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKin
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.QueryType;
 import ch.systemsx.cisd.openbis.plugin.query.client.web.client.IQueryClientServiceAsync;
 import ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.Dict;
+import ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.QueryParameterValue;
 import ch.systemsx.cisd.openbis.plugin.query.shared.basic.dto.QueryDatabase;
 import ch.systemsx.cisd.openbis.plugin.query.shared.basic.dto.QueryExpression;
 import ch.systemsx.cisd.openbis.plugin.query.shared.basic.dto.QueryParameterBindings;
@@ -66,20 +67,23 @@ public class RunCannedQueryToolbar extends AbstractQueryProviderToolbar
     private final Collection<ParameterField> parameterFields;
 
     // <name, value> where name starts with additional INITIAL_PARAMETER_NAME_PREFIX
-    private final Map<String, String> initialParameterValues;
+    private final Map<String, QueryParameterValue> initialParameterValues;
+
+    private final Map<String, String> initialFixedParameters;
 
     public RunCannedQueryToolbar(final IViewContext<IQueryClientServiceAsync> viewContext,
             QueryType queryType)
     {
-        this(viewContext, null, new HashMap<String, String>(0), queryType);
+        this(viewContext, null, new HashMap<String, QueryParameterValue>(0), queryType);
     }
 
     public RunCannedQueryToolbar(IViewContext<IQueryClientServiceAsync> viewContext,
-            String initialQueryNameOrNull, Map<String, String> initialParameterValues,
+            String initialQueryNameOrNull, Map<String, QueryParameterValue> initialParameterValues,
             QueryType queryType)
     {
         super(viewContext);
         this.initialParameterValues = initialParameterValues;
+        initialFixedParameters = new HashMap<String, String>();
         querySelectionWidget =
                 new QuerySelectionWidget(viewContext, initialQueryNameOrNull, queryType);
         parameterContainer = new ButtonGroup(MAX_PARAMETER_COLUMNS);
@@ -159,13 +163,25 @@ public class RunCannedQueryToolbar extends AbstractQueryProviderToolbar
             };
         for (String parameter : query.getParameters())
         {
-            final String initialValueOrNull = tryGetInitialValue(parameter);
-            addParameterField(new ParameterField(parameter, updateExecuteButtonAction,
-                    initialValueOrNull));
+            final QueryParameterValue initialValueOrNull = tryGetInitialValue(parameter);
+            if (initialValueOrNull != null && initialValueOrNull.isFixed())
+            {
+                addInitialBinding(parameter, initialValueOrNull.getValue());
+            } else
+            {
+                addParameterField(new ParameterField(parameter, updateExecuteButtonAction,
+                        initialValueOrNull == null ? null : initialValueOrNull.getValue()));
+            }
         }
     }
 
-    private String tryGetInitialValue(String parameter)
+    private void addInitialBinding(String parameter, String value)
+    {
+
+        initialFixedParameters.put(parameter, value);
+    }
+
+    private QueryParameterValue tryGetInitialValue(String parameter)
     {
         return initialParameterValues.get(INITIAL_PARAMETER_NAME_PREFIX + parameter);
     }
@@ -238,6 +254,10 @@ public class RunCannedQueryToolbar extends AbstractQueryProviderToolbar
     public QueryParameterBindings tryGetQueryParameterBindings()
     {
         QueryParameterBindings bindings = new QueryParameterBindings();
+        for (String key : initialFixedParameters.keySet())
+        {
+            bindings.addBinding(key, initialFixedParameters.get(key));
+        }
         for (ParameterField field : parameterFields)
         {
             ParameterWithValue parameterWithValue = field.getParameterWithValue();
-- 
GitLab