From 37db04d0f3c9982779dc7143c2100e7d019c8e8e Mon Sep 17 00:00:00 2001
From: kaloyane <kaloyane>
Date: Mon, 18 Jul 2011 15:38:29 +0000
Subject: [PATCH] [LMS-2138] use AnalysisProcedureCriteria consistently across
 filtering methods

SVN: 22180
---
 .../web/client/IScreeningClientService.java   |  4 +-
 .../client/IScreeningClientServiceAsync.java  |  5 +-
 .../AnalysisProcedureChooser.java             |  9 +++-
 .../ExperimentAnalysisSummaryGrid.java        | 11 ++--
 .../detailviewers/WellSearchGrid.java         |  5 +-
 .../locator/WellSearchLocatorResolver.java    |  3 +-
 .../web/server/ScreeningClientService.java    |  5 +-
 .../FeatureVectorSummaryProvider.java         |  9 ++--
 .../screening/server/ScreeningServer.java     |  7 +--
 .../server/ScreeningServerLogger.java         |  7 +--
 .../server/logic/AbstractContentLoader.java   |  5 +-
 .../ExperimentFeatureVectorSummaryLoader.java | 19 ++++---
 .../logic/FeatureVectorDatasetLoader.java     | 25 ++++++---
 .../logic/WellFeatureCollectionLoader.java    |  6 ++-
 .../screening/shared/IScreeningServer.java    |  3 +-
 .../shared/basic/dto/WellSearchCriteria.java  | 51 ++++++++++++++++---
 16 files changed, 121 insertions(+), 53 deletions(-)

diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/IScreeningClientService.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/IScreeningClientService.java
index 65825c2954c..b6e20c98237 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/IScreeningClientService.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/IScreeningClientService.java
@@ -51,6 +51,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellLocation;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellMetadata;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellReplicaImage;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchByProjectCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
 
@@ -198,7 +199,8 @@ public interface IScreeningClientService extends IClientService
      */
     public TypedTableResultSet<MaterialFeatureVectorSummary> listExperimentFeatureVectorSummary(
             IResultSetConfig<String, TableModelRowWithObject<MaterialFeatureVectorSummary>> resultSetConfig,
-            TechId experimentId, String analysisProcedureOrNull) throws UserFailureException;
+            TechId experimentId, AnalysisProcedureCriteria analysisProcedureCriteria)
+            throws UserFailureException;
 
     public String prepareExportFeatureVectorSummary(
             TableExportCriteria<TableModelRowWithObject<MaterialFeatureVectorSummary>> criteria)
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/IScreeningClientServiceAsync.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/IScreeningClientServiceAsync.java
index 28814382111..c49465c4161 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/IScreeningClientServiceAsync.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/IScreeningClientServiceAsync.java
@@ -52,6 +52,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellLocation;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellMetadata;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellReplicaImage;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchByProjectCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
 
@@ -176,11 +177,11 @@ public interface IScreeningClientServiceAsync extends IClientServiceAsync
 
     /**
      * @see IScreeningClientService#listExperimentFeatureVectorSummary(IResultSetConfig, TechId,
-     *      String)
+     *      AnalysisProcedureCriteria)
      */
     public void listExperimentFeatureVectorSummary(
             IResultSetConfig<String, TableModelRowWithObject<MaterialFeatureVectorSummary>> resultSetConfig,
-            TechId experimentId, String analysisProcedureOrNull,
+            TechId experimentId, AnalysisProcedureCriteria analysisProcedureCriteria,
             AsyncCallback<TypedTableResultSet<MaterialFeatureVectorSummary>> callback);
 
     /**
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/AnalysisProcedureChooser.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/AnalysisProcedureChooser.java
index 44ca3b404d6..f5d5fe36733 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/AnalysisProcedureChooser.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/AnalysisProcedureChooser.java
@@ -39,6 +39,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningCli
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ScreeningDisplaySettingsManager;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.AnalysisProcedures;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteriaHolder;
 
 /**
@@ -55,7 +56,7 @@ class AnalysisProcedureChooser extends LayoutContainer
      */
     public static interface IAnalysisProcedureSelectionListener
     {
-        void analysisProcedureSelected(String analysisProcedureOrNull);
+        void analysisProcedureSelected(AnalysisProcedureCriteria criteria);
     }
 
     public static final AnalysisProcedureChooser createHorizontal(
@@ -235,7 +236,11 @@ class AnalysisProcedureChooser extends LayoutContainer
 
     private void notifySelectionListener(String analysisProcedureOrNull)
     {
-        selectionListener.analysisProcedureSelected(analysisProcedureOrNull);
+        AnalysisProcedureCriteria criteria = StringUtils.isBlank(analysisProcedureOrNull) ?
+                AnalysisProcedureCriteria.createAllProcedures() : 
+                    AnalysisProcedureCriteria.createFromCode(analysisProcedureOrNull);
+            
+        selectionListener.analysisProcedureSelected(criteria);
     }
 
     private String getDefaultAnalysisProcedure()
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentAnalysisSummaryGrid.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentAnalysisSummaryGrid.java
index 012dcf70619..6857fcc1b43 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentAnalysisSummaryGrid.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentAnalysisSummaryGrid.java
@@ -44,6 +44,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.D
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.detailviewers.AnalysisProcedureChooser.IAnalysisProcedureSelectionListener;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ui.columns.specific.ScreeningLinkExtractor;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.MaterialFeatureVectorSummary;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.grids.FeatureVectorSummaryGridColumnIDs;
 
@@ -66,7 +67,7 @@ public class ExperimentAnalysisSummaryGrid extends TypedTableGrid<MaterialFeatur
 
     private final boolean restrictGlobalScopeLinkToProject;
 
-    private String analysisProcedureOrNull = null;
+    private AnalysisProcedureCriteria analysisProcedureCriteria;
 
     public static IDisposableComponent create(
             IViewContext<IScreeningClientServiceAsync> viewContext,
@@ -141,15 +142,13 @@ public class ExperimentAnalysisSummaryGrid extends TypedTableGrid<MaterialFeatur
         setBorders(true);
     }
 
-
     @Override
     protected void listTableRows(
             DefaultResultSetConfig<String, TableModelRowWithObject<MaterialFeatureVectorSummary>> resultSetConfig,
             AsyncCallback<TypedTableResultSet<MaterialFeatureVectorSummary>> callback)
     {
         screeningViewContext.getService().listExperimentFeatureVectorSummary(resultSetConfig,
-                new TechId(experiment), analysisProcedureOrNull, callback);
-
+                new TechId(experiment), analysisProcedureCriteria, callback);
     }
 
     @Override
@@ -181,9 +180,9 @@ public class ExperimentAnalysisSummaryGrid extends TypedTableGrid<MaterialFeatur
     //
     // IAnalysisProcedureSelectionListener
     //
-    public void analysisProcedureSelected(String analysisProcedure)
+    public void analysisProcedureSelected(AnalysisProcedureCriteria selectedProcedureCriteria)
     {
-        this.analysisProcedureOrNull = analysisProcedure;
+        this.analysisProcedureCriteria = selectedProcedureCriteria;
         refresh(true);
     }
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchGrid.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchGrid.java
index f0b23d0b594..e02158bd89e 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchGrid.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchGrid.java
@@ -665,12 +665,11 @@ public class WellSearchGrid extends TypedTableGrid<WellContent> implements
         return Arrays.asList(WellSearchGridColumnIds.PLATE, WellSearchGridColumnIds.WELL);
     }
 
-    public void analysisProcedureSelected(String analysisProcedureOrNull)
+    public void analysisProcedureSelected(AnalysisProcedureCriteria selectedProcedureCriteria)
     {
         if (experimentCriteriaHolder.tryGetCriteria() != null)
         {
-            this.analysisProcedureCriteria =
-                AnalysisProcedureCriteria.createFromCode(analysisProcedureOrNull);
+            this.analysisProcedureCriteria = selectedProcedureCriteria;
             refresh(true);
         }
     }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/WellSearchLocatorResolver.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/WellSearchLocatorResolver.java
index 0b61aa277e8..8b9a5273cfa 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/WellSearchLocatorResolver.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/WellSearchLocatorResolver.java
@@ -65,7 +65,8 @@ public class WellSearchLocatorResolver extends AbstractViewLocatorResolver
                 MaterialSearchCriteria.create(materialCodesCriteria);
 
         AnalysisProcedureCriteria analysisProcedureCriteria =
-                (analysisProcedureOrNull == null) ? AnalysisProcedureCriteria.createAllProcedures()
+                StringUtils.isBlank(analysisProcedureOrNull) ? AnalysisProcedureCriteria
+                        .createAllProcedures()
                         : AnalysisProcedureCriteria.createFromCode(analysisProcedureOrNull);
 
         if (StringUtils.isBlank(experimentPermId))
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/ScreeningClientService.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/ScreeningClientService.java
index 4ca6c89d465..5aea6145f48 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/ScreeningClientService.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/ScreeningClientService.java
@@ -75,6 +75,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellLocation;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellMetadata;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellReplicaImage;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchByProjectCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
 
@@ -296,11 +297,11 @@ public final class ScreeningClientService extends AbstractClientService implemen
 
     public TypedTableResultSet<MaterialFeatureVectorSummary> listExperimentFeatureVectorSummary(
             IResultSetConfig<String, TableModelRowWithObject<MaterialFeatureVectorSummary>> criteria,
-            TechId experimentId, String analysisProcedureOrNull)
+            TechId experimentId, AnalysisProcedureCriteria analysisProcedureCriteria)
     {
         FeatureVectorSummaryProvider provider =
                 new FeatureVectorSummaryProvider(server, getSessionToken(), experimentId,
-                        analysisProcedureOrNull);
+                        analysisProcedureCriteria);
         return listEntities(provider, criteria);
 
     }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/resultset/FeatureVectorSummaryProvider.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/resultset/FeatureVectorSummaryProvider.java
index 492be321346..b22e2c13deb 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/resultset/FeatureVectorSummaryProvider.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/resultset/FeatureVectorSummaryProvider.java
@@ -32,6 +32,7 @@ import ch.systemsx.cisd.openbis.generic.shared.util.TypedTableModelBuilder;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.IScreeningServer;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ExperimentFeatureVectorSummary;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.MaterialFeatureVectorSummary;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.grids.FeatureVectorSummaryGridColumnIDs;
 
 /**
@@ -49,15 +50,15 @@ public class FeatureVectorSummaryProvider extends AbstractTableModelProvider<Mat
 
     private final TechId experimentId;
 
-    private final String analysisProcedureOrNull;
+    private final AnalysisProcedureCriteria analysisProcedureCriteria;
 
     public FeatureVectorSummaryProvider(IScreeningServer server, String sessionToken,
-            TechId experimentId, String analysisProcedureOrNull)
+            TechId experimentId, AnalysisProcedureCriteria analysisProcedureCriteria)
     {
         this.server = server;
         this.sessionToken = sessionToken;
         this.experimentId = experimentId;
-        this.analysisProcedureOrNull = analysisProcedureOrNull;
+        this.analysisProcedureCriteria = analysisProcedureCriteria;
     }
 
     @Override
@@ -67,7 +68,7 @@ public class FeatureVectorSummaryProvider extends AbstractTableModelProvider<Mat
                 new TypedTableModelBuilder<MaterialFeatureVectorSummary>();
         ExperimentFeatureVectorSummary fvSummary =
                 server.getExperimentFeatureVectorSummary(sessionToken, experimentId,
-                        analysisProcedureOrNull);
+                        analysisProcedureCriteria);
 
         builder.addColumn(MATERIAL_ID);
         builder.columnGroup(MATERIAL_PROPS_GROUP);
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java
index d178fee26ff..c567d0eaf39 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java
@@ -111,6 +111,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellContent;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellLocation;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellReplicaImage;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.SingleExperimentSearchCriteria;
 
@@ -306,13 +307,13 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     }
 
     public ExperimentFeatureVectorSummary getExperimentFeatureVectorSummary(String sessionToken,
-            TechId experimentId, String analysisProcedureOrNull)
+            TechId experimentId, AnalysisProcedureCriteria analysisProcedureCriteria)
     {
         Session session = getSession(sessionToken);
         // NOTE: we want the settings to be passed form the client in future
         MaterialSummarySettings settings = createDefaultSettings();
         return ExperimentFeatureVectorSummaryLoader.loadExperimentFeatureVectors(session,
-                businessObjectFactory, getDAOFactory(), experimentId, analysisProcedureOrNull,
+                businessObjectFactory, getDAOFactory(), experimentId, analysisProcedureCriteria,
                 settings);
     }
 
@@ -472,7 +473,7 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
         } else
         {
             procedureCodes =
-                    dao.listAnalysisProcedures(singleExpCriteria.getExperimentId().getId());
+                    dao.listAnalysisProceduresForExperiment(singleExpCriteria.getExperimentId().getId());
         }
         return new AnalysisProcedures(procedureCodes);
     }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServerLogger.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServerLogger.java
index 525786d4d85..1296f0bee1f 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServerLogger.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServerLogger.java
@@ -66,6 +66,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellContent;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellLocation;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellReplicaImage;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchByProjectCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
 
@@ -350,11 +351,11 @@ final class ScreeningServerLogger extends AbstractServerLogger implements IScree
     }
 
     public ExperimentFeatureVectorSummary getExperimentFeatureVectorSummary(String sessionToken,
-            TechId experimentId, String analysisProcedureOrNull)
+            TechId experimentId, AnalysisProcedureCriteria analysisProcedureCriteria)
     {
         logAccess(sessionToken, "getExperimentFeatureVectorSummary",
-                "sessionToken(%s), experimentId(%s), analysisProcedure(%s)", sessionToken,
-                experimentId, analysisProcedureOrNull);
+                "sessionToken(%s), experimentId(%s), analysisProcedureCriteria(%s)", sessionToken,
+                experimentId, analysisProcedureCriteria);
         return null;
     }
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/AbstractContentLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/AbstractContentLoader.java
index 4badb30efd7..2e4debdcaa4 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/AbstractContentLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/AbstractContentLoader.java
@@ -36,6 +36,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.server.IScreeningBusinessObject
 import ch.systemsx.cisd.openbis.plugin.screening.server.dataaccess.IScreeningQuery;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.PlateIdentifier;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ExperimentReference;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 
 /**
  * Abstract superclass for screening loaders.
@@ -100,9 +101,9 @@ abstract class AbstractContentLoader
     }
 
     protected final FeatureVectorDatasetLoader createFeatureVectorDatasetsRetriever(
-            Set<PlateIdentifier> plates, String analysisProcedureOrNull)
+            Set<PlateIdentifier> plates, AnalysisProcedureCriteria analysisProcedureCriteria)
     {
         return new FeatureVectorDatasetLoader(session, businessObjectFactory, null, plates,
-                analysisProcedureOrNull);
+                analysisProcedureCriteria);
     }
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ExperimentFeatureVectorSummaryLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ExperimentFeatureVectorSummaryLoader.java
index 9e5951d90e9..121438dbc59 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ExperimentFeatureVectorSummaryLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ExperimentFeatureVectorSummaryLoader.java
@@ -54,6 +54,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.MaterialFeatur
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.MaterialSummarySettings;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellLocation;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellReference;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.FeatureVectorLoader.WellFeatureCollection;
 
 /**
@@ -68,12 +69,12 @@ public class ExperimentFeatureVectorSummaryLoader extends AbstractContentLoader
     {
         TechId experimentId;
 
-        String analysisProcedureOrNull;
+        AnalysisProcedureCriteria analysisProcedureCriteria;
 
-        LoaderParameters(TechId experimentId, String analysisProcedureOrNull)
+        LoaderParameters(TechId experimentId, AnalysisProcedureCriteria analysisProcedureCriteria)
         {
             this.experimentId = experimentId;
-            this.analysisProcedureOrNull = analysisProcedureOrNull;
+            this.analysisProcedureCriteria = analysisProcedureCriteria;
         }
     }
 
@@ -82,9 +83,10 @@ public class ExperimentFeatureVectorSummaryLoader extends AbstractContentLoader
      */
     public static ExperimentFeatureVectorSummary loadExperimentFeatureVectors(Session session,
             IScreeningBusinessObjectFactory businessObjectFactory, IDAOFactory daoFactory,
-            TechId experimentId, String analysisProcedureOrNull, MaterialSummarySettings settings)
+            TechId experimentId, AnalysisProcedureCriteria analysisProcedureCriteria,
+            MaterialSummarySettings settings)
     {
-        LoaderParameters params = new LoaderParameters(experimentId, analysisProcedureOrNull);
+        LoaderParameters params = new LoaderParameters(experimentId, analysisProcedureCriteria);
         return new ExperimentFeatureVectorSummaryLoader(session, businessObjectFactory, daoFactory,
                 settings).loadExperimentFeatureVectors(params);
     }
@@ -189,7 +191,7 @@ public class ExperimentFeatureVectorSummaryLoader extends AbstractContentLoader
 
         Set<PlateIdentifier> plateIdentifiers = extractIdentifiers(plates);
         WellFeatureCollection<FeatureVectorValues> featureVectorsCollection =
-                tryLoadWellSingleFeatureVectors(plateIdentifiers, params.analysisProcedureOrNull);
+                tryLoadWellSingleFeatureVectors(plateIdentifiers, params.analysisProcedureCriteria);
         if (featureVectorsCollection == null)
         {
             return null; // no feature vector datasets connected to plates in this experiment
@@ -201,11 +203,12 @@ public class ExperimentFeatureVectorSummaryLoader extends AbstractContentLoader
     }
 
     private WellFeatureCollection<FeatureVectorValues> tryLoadWellSingleFeatureVectors(
-            Set<PlateIdentifier> plateIdentifiers, String analysisProcedureOrNull)
+            Set<PlateIdentifier> plateIdentifiers,
+            AnalysisProcedureCriteria analysisProcedureCriteria)
     {
         return new WellFeatureCollectionLoader(session, businessObjectFactory, daoFactory)
                 .tryLoadWellSingleFeatureVectors(plateIdentifiers, settings.getFeatureCodes(),
-                        analysisProcedureOrNull);
+                        analysisProcedureCriteria);
     }
 
     private static ExperimentFeatureVectorSummary createEmptySummary(ExperimentReference experiment)
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoader.java
index 40544e10eae..b9dd88bb4a3 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoader.java
@@ -27,6 +27,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.commons.lang.StringUtils;
+
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
@@ -36,6 +38,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.server.IScreeningBusinessObject
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.FeatureVectorDatasetReference;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.PlateIdentifier;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ScreeningConstants;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 
 /**
  * @author Chandrasekhar Ramakrishnan
@@ -47,7 +50,7 @@ class FeatureVectorDatasetLoader extends HCSImageDatasetLoader
     // Parameter state
     private final String featureVectorDatasetTypeCode;
 
-    private final String analysisProcedureOrNull;
+    private final AnalysisProcedureCriteria analysisProcedureCriteria;
 
     // Running state
     private Collection<ExternalData> featureVectorDatasets;
@@ -56,18 +59,20 @@ class FeatureVectorDatasetLoader extends HCSImageDatasetLoader
             IScreeningBusinessObjectFactory businessObjectFactory, String homeSpaceOrNull,
             Set<? extends PlateIdentifier> plates)
     {
-        this(session, businessObjectFactory, homeSpaceOrNull, plates, null);
+        this(session, businessObjectFactory, homeSpaceOrNull, plates, AnalysisProcedureCriteria
+                .createAllProcedures());
     }
 
     FeatureVectorDatasetLoader(Session session,
             IScreeningBusinessObjectFactory businessObjectFactory, String homeSpaceOrNull,
-            Set<? extends PlateIdentifier> plates, String analysisProcedureOrNull)
+            Set<? extends PlateIdentifier> plates,
+            AnalysisProcedureCriteria analysisProcedureCriteria)
     {
         super(session, businessObjectFactory, homeSpaceOrNull, plates,
                 ScreeningConstants.ANY_HCS_IMAGE_DATASET_TYPE_PATTERN,
                 ScreeningConstants.HCS_IMAGE_ANALYSIS_DATASET_TYPE_PATTERN);
         featureVectorDatasetTypeCode = ScreeningConstants.HCS_IMAGE_ANALYSIS_DATASET_TYPE_PATTERN;
-        this.analysisProcedureOrNull = analysisProcedureOrNull;
+        this.analysisProcedureCriteria = analysisProcedureCriteria;
     }
 
     public static class FeatureVectorExternalData
@@ -141,14 +146,20 @@ class FeatureVectorDatasetLoader extends HCSImageDatasetLoader
 
     private boolean isMatchingAnalysisProcedure(ExternalData dataset)
     {
+        if (analysisProcedureCriteria.isAllProcedures())
+        {
+            return true;
+        }
+
         String dataSetAnalysisProcedure =
                 EntityHelper.tryFindPropertyValue(dataset, ScreeningConstants.ANALYSIS_PROCEDURE);
-        if (analysisProcedureOrNull == null)
+        if (analysisProcedureCriteria.isNoProcedures())
         {
-            return dataSetAnalysisProcedure == null;
+            return StringUtils.isBlank(dataSetAnalysisProcedure);
         } else
         {
-            return analysisProcedureOrNull.equals(dataSetAnalysisProcedure);
+            String analysisProcedureCode = analysisProcedureCriteria.tryGetAnalysisProcedureCode();
+            return analysisProcedureCode.equals(dataSetAnalysisProcedure);
         }
     }
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellFeatureCollectionLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellFeatureCollectionLoader.java
index 66a8e59df6f..84ae45f9c16 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellFeatureCollectionLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellFeatureCollectionLoader.java
@@ -38,6 +38,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.PlateIdentifi
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.DatasetReference;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.FeatureValue;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.FeatureVectorValues;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.FeatureVectorLoader.WellFeatureCollection;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.IHCSFeatureVectorLoader;
 
@@ -56,12 +57,13 @@ public class WellFeatureCollectionLoader extends AbstractContentLoader
 
     /** Loads feature vectors for chosen plates and set of features */
     public WellFeatureCollection<FeatureVectorValues> tryLoadWellSingleFeatureVectors(
-            Set<PlateIdentifier> plates, List<String> featureCodes, String analysisProcedureOrNull)
+            Set<PlateIdentifier> plates, List<String> featureCodes,
+            AnalysisProcedureCriteria analysisProcedureCriteria)
     {
         StopWatch watch = new StopWatch();
         watch.start();
         FeatureVectorDatasetLoader datasetsRetriever =
-                createFeatureVectorDatasetsRetriever(plates, analysisProcedureOrNull);
+                createFeatureVectorDatasetsRetriever(plates, analysisProcedureCriteria);
         Collection<ExternalData> featureVectorDatasets =
                 datasetsRetriever.getFeatureVectorDatasets();
         if (featureVectorDatasets.isEmpty())
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/IScreeningServer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/IScreeningServer.java
index 0795eb6b57b..21059c87462 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/IScreeningServer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/IScreeningServer.java
@@ -61,6 +61,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellContent;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellLocation;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellReplicaImage;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchByProjectCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
 
@@ -223,7 +224,7 @@ public interface IScreeningServer extends IServer
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public ExperimentFeatureVectorSummary getExperimentFeatureVectorSummary(String sessionToken,
             @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class) TechId experimentId,
-            String analysisProcedureOrNull);
+            AnalysisProcedureCriteria analysisProcedureCriteria);
 
     /**
      * Returns a feature vector summary (with details for each replica) for the given experiment and
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/WellSearchCriteria.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/WellSearchCriteria.java
index 3ff4eef19a9..21fda21124a 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/WellSearchCriteria.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/WellSearchCriteria.java
@@ -436,30 +436,69 @@ public class WellSearchCriteria implements ISerializable
     {
         private static final long serialVersionUID = ServiceVersionHolder.VERSION;
 
-        private String analysisProcedureCodeOrNull;
+        public static enum MatchType implements ISerializable
+        {
+            /** match data sets for explicitly specified analysis procedure code. */
+            BY_CODE,
+            /** match any data set */
+            ANY,
+            /** match data sets having no analysis procedure property */
+            NONE
+        }
+
+        public static AnalysisProcedureCriteria createFromCode(String code)
+        {
+            if (StringUtils.isBlank(code))
+            {
+                throw new IllegalArgumentException("Cannot construct analysis procedure search "
+                        + "criteria of this type without a specified code.");
+            }
+            return new AnalysisProcedureCriteria(MatchType.BY_CODE, code);
+        }
 
         public static AnalysisProcedureCriteria createAllProcedures()
         {
-            // TODO KE: could we improve this ?
-            return new AnalysisProcedureCriteria();
+            return new AnalysisProcedureCriteria(MatchType.ANY, null);
         }
 
-        public static AnalysisProcedureCriteria createFromCode(String codeOrNull)
+        public static AnalysisProcedureCriteria createNoProcedures()
         {
-            return new AnalysisProcedureCriteria(codeOrNull);
+            return new AnalysisProcedureCriteria(MatchType.NONE, null);
         }
 
+
+        private MatchType matchType;
+
+        private String analysisProcedureCodeOrNull;
+
         // GWT only
         @SuppressWarnings("unused")
         private AnalysisProcedureCriteria()
         {
         }
 
-        private AnalysisProcedureCriteria(String analysisProcedureCodeOrNull)
+        private AnalysisProcedureCriteria(MatchType matchType, String analysisProcedureCodeOrNull)
         {
+            this.matchType = matchType;
             this.analysisProcedureCodeOrNull = analysisProcedureCodeOrNull;
         }
 
+        /**
+         * Return true if this criteria selects all data sets regardless of their property values.
+         */
+        public boolean isAllProcedures()
+        {
+            return matchType == MatchType.ANY;
+        }
+
+        /**
+         * Return true if this criteria selects only data sets without APs, false otherwise.
+         */
+        public boolean isNoProcedures()
+        {
+            return matchType == MatchType.NONE;
+        }
+
         public String tryGetAnalysisProcedureCode()
         {
             return analysisProcedureCodeOrNull;
-- 
GitLab