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 f2760142ef2c3bbb24ed2629c2802155ed63c1c6..65825c2954c23912e31feb4bf48d946818654cff 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 @@ -52,6 +52,7 @@ 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.ExperimentSearchByProjectCriteria; +import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria; /** * Service interface for the <i>screening</i> <i>GWT</i> client. @@ -228,8 +229,9 @@ public interface IScreeningClientService extends IClientService throws UserFailureException; /** - * Return all analysis procedures for an experiment. + * Return all analysis procedures for an experiment criteria. */ - public AnalysisProcedures listAnalysisProcedures(TechId experimentId); + public AnalysisProcedures listAnalysisProcedures( + ExperimentSearchCriteria experimentSearchCriteria); } 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 5600a738368aa01cc6ecf634f7bbc913cd2ddad8..2881438211166c585f9df9dd3bf962fb53b17191 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 @@ -53,6 +53,7 @@ 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.ExperimentSearchByProjectCriteria; +import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria; /** * Service interface for the <i>screening</i> <i>GWT</i> client. @@ -222,9 +223,9 @@ public interface IScreeningClientServiceAsync extends IClientServiceAsync AsyncCallback<String> callback); /** - * @see IScreeningClientService#listAnalysisProcedures(TechId) + * @see IScreeningClientService#listAnalysisProcedures(ExperimentSearchCriteria) */ - public void listAnalysisProcedures(TechId experimentId, + public void listAnalysisProcedures(ExperimentSearchCriteria experimentSearchCriteria, AsyncCallback<AnalysisProcedures> 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 7f038694017f19f55e9128a38d7948d006bf5b4a..44ca3b404d6b12eaffe9e47cf7c75dce9e31c748 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 @@ -25,23 +25,28 @@ import com.extjs.gxt.ui.client.event.Events; import com.extjs.gxt.ui.client.event.Listener; import com.extjs.gxt.ui.client.widget.Component; import com.extjs.gxt.ui.client.widget.HorizontalPanel; +import com.extjs.gxt.ui.client.widget.LayoutContainer; +import com.extjs.gxt.ui.client.widget.VerticalPanel; import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction; import com.extjs.gxt.ui.client.widget.form.SimpleComboBox; import com.extjs.gxt.ui.client.widget.toolbar.LabelToolItem; import ch.systemsx.cisd.common.shared.basic.utils.StringUtils; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback; 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.plugin.screening.client.web.client.IScreeningClientServiceAsync; 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.ExperimentSearchCriteriaHolder; /** * An UI panel for selecting analysis procedures. * * @author Kaloyan Enimanev */ -class AnalysisProcedureChooser extends HorizontalPanel +class AnalysisProcedureChooser extends LayoutContainer { /** @@ -53,11 +58,36 @@ class AnalysisProcedureChooser extends HorizontalPanel void analysisProcedureSelected(String analysisProcedureOrNull); } - private final static String UNSPECIFIED_ANALYSIS_PROCEDURE = "unspecified"; + public static final AnalysisProcedureChooser createHorizontal( + IViewContext<IScreeningClientServiceAsync> viewContext, + ExperimentSearchCriteriaHolder experimentCriteriaHolder, + String selectedAnalysisProcedureOrNull, + IAnalysisProcedureSelectionListener selectionListener) + { + return new AnalysisProcedureChooser(viewContext, experimentCriteriaHolder, + selectedAnalysisProcedureOrNull, selectionListener, new HorizontalPanel()); + } + + public static final AnalysisProcedureChooser createVertical( + IViewContext<IScreeningClientServiceAsync> viewContext, + ExperimentSearchCriteriaHolder experimentCriteriaHolder, + String selectedAnalysisProcedureOrNull, + IAnalysisProcedureSelectionListener selectionListener) + { + + final VerticalPanel layoutPanel = new VerticalPanel(); + layoutPanel.setWidth(200); + return new AnalysisProcedureChooser(viewContext, experimentCriteriaHolder, + selectedAnalysisProcedureOrNull, selectionListener, layoutPanel); + } + + private final static String ANY_ANALYSIS_PROCEDURE = "Any"; private final IViewContext<IScreeningClientServiceAsync> viewContext; private final IAnalysisProcedureSelectionListener selectionListener; + private final ExperimentSearchCriteriaHolder experimentCriteriaHolder; + private SimpleComboBox<String> analysisProceduresComboBox; private final Listener<BaseEvent> selectionChangeListener = new Listener<BaseEvent>() @@ -70,24 +100,48 @@ class AnalysisProcedureChooser extends HorizontalPanel }; - public AnalysisProcedureChooser(IViewContext<IScreeningClientServiceAsync> viewContext, - List<String> analysisProcedures, + private AnalysisProcedureChooser(IViewContext<IScreeningClientServiceAsync> viewContext, + ExperimentSearchCriteriaHolder experimentCriteriaHolder, String selectedAnalysisProcedureOrNull, - IAnalysisProcedureSelectionListener selectionListener) + IAnalysisProcedureSelectionListener selectionListener, LayoutContainer layoutPanel) { this.viewContext = viewContext; this.selectionListener = selectionListener; + this.experimentCriteriaHolder = experimentCriteriaHolder; + analysisProceduresComboBox = createProceduresComboBox(); - setAutoHeight(true); - setAutoWidth(true); + add(layoutPanel); + layoutPanel.setAutoHeight(true); + layoutPanel.add(createComboLabel()); + layoutPanel.add(analysisProceduresComboBox); + + refresh(selectedAnalysisProcedureOrNull); + } + + public void updateAnalysisProcedures() + { + String selection = analysisProceduresComboBox.getSimpleValue(); + String selectedProcedureOrNull = comboBoxValueToAnalysisProcedure(selection); + refresh(selectedProcedureOrNull); + } + + private void refresh(final String selectedAnalysisProcedureOrNull) + { - add(createComboLabel()); - add(analysisProceduresComboBox); - addAnalysisProcedures(analysisProcedures); + analysisProceduresComboBox.removeAll(); + viewContext.getService().listAnalysisProcedures(experimentCriteriaHolder.tryGetCriteria(), + new AbstractAsyncCallback<AnalysisProcedures>(viewContext) + { + @Override + protected void process(AnalysisProcedures analysisProcedures) + { + addAnalysisProcedures(analysisProcedures.getProcedureCodes()); + setInitialSelection(selectedAnalysisProcedureOrNull); + } + }); - setInitialSelection(selectedAnalysisProcedureOrNull); } private Component createComboLabel() @@ -103,6 +157,7 @@ class AnalysisProcedureChooser extends HorizontalPanel { SimpleComboBox<String> comboBox = new SimpleComboBox<String>(); + comboBox.setWidth(160); comboBox.setTriggerAction(TriggerAction.ALL); comboBox.setAllowBlank(false); comboBox.setEditable(false); @@ -130,8 +185,8 @@ class AnalysisProcedureChooser extends HorizontalPanel Collections.sort(sortedCodes); // unspecified is always an option and is always displayed at the end - sortedCodes.remove(UNSPECIFIED_ANALYSIS_PROCEDURE); - sortedCodes.add(UNSPECIFIED_ANALYSIS_PROCEDURE); + sortedCodes.remove(ANY_ANALYSIS_PROCEDURE); + sortedCodes.add(ANY_ANALYSIS_PROCEDURE); return sortedCodes; } @@ -146,6 +201,7 @@ class AnalysisProcedureChooser extends HorizontalPanel private void setInitialSelection(String value) { + // TODO KE: this is a logic we might want to review String analysisProcedureOrNull = value; if (StringUtils.isBlank(analysisProcedureOrNull)) { @@ -154,7 +210,7 @@ class AnalysisProcedureChooser extends HorizontalPanel String comboBoxValue = analysisCodeToComboBoxValue(analysisProcedureOrNull); - if (UNSPECIFIED_ANALYSIS_PROCEDURE.equals(comboBoxValue) + if (ANY_ANALYSIS_PROCEDURE.equals(comboBoxValue) || analysisProceduresComboBox.findModel(comboBoxValue) == null) { comboBoxValue = getFirstValueFromCombo(); @@ -201,12 +257,12 @@ class AnalysisProcedureChooser extends HorizontalPanel private String analysisCodeToComboBoxValue(String analysisProcedureOrNull) { - return StringUtils.isBlank(analysisProcedureOrNull) ? UNSPECIFIED_ANALYSIS_PROCEDURE + return StringUtils.isBlank(analysisProcedureOrNull) ? ANY_ANALYSIS_PROCEDURE : analysisProcedureOrNull; } private String comboBoxValueToAnalysisProcedure(String comboBoxValue) { - return UNSPECIFIED_ANALYSIS_PROCEDURE.equals(comboBoxValue) ? null : comboBoxValue; + return ANY_ANALYSIS_PROCEDURE.equals(comboBoxValue) ? null : comboBoxValue; } } \ No newline at end of file diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentAnalysisSummarySection.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentAnalysisSummarySection.java index 720b3be88ac4105518ca2991d77ad6d48831f361..49a407df67dd7ea1a2af32366c3a0dfcca0cd009 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentAnalysisSummarySection.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentAnalysisSummarySection.java @@ -1,16 +1,15 @@ package ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.detailviewers; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback; import ch.systemsx.cisd.openbis.generic.client.web.client.application.DisposableTabContent; import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; 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.TechId; import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningClientServiceAsync; import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.Dict; import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.DisplayTypeIDGenerator; import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.detailviewers.AnalysisProcedureChooser.IAnalysisProcedureSelectionListener; -import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.AnalysisProcedures; +import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria; +import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteriaHolder; /** * Experiment section panel which shows all feature vector summary for a given experiment. @@ -62,33 +61,27 @@ public class ExperimentAnalysisSummarySection extends DisposableTabContent private void showAnalysisProcedureChooser() { - TechId experimentId = new TechId(experiment.getId()); - screeningViewContext.getService().listAnalysisProcedures(experimentId, - new AbstractAsyncCallback<AnalysisProcedures>(screeningViewContext) - { - @Override - protected void process(AnalysisProcedures analysisProcedures) - { - setHeading(""); - getHeader().setVisible(true); - final AnalysisProcedureChooser analysisProcedureChooser = - createAnalysisProcedureChooser(analysisProcedures); - getHeader().addTool(analysisProcedureChooser); - // WORKAROUND to GXT private widgetPanel in Header with fixed - // "float: right" set onRender - analysisProcedureChooser.getParent().addStyleName("force-float-left"); - - replaceContent(analysisGridDisposableComponent); - } - }); + final AnalysisProcedureChooser analysisProcedureChooser = createAnalysisProcedureChooser(); + + setHeading(""); + getHeader().setVisible(true); + getHeader().addTool(analysisProcedureChooser); + // WORKAROUND to GXT private widgetPanel in Header with fixed + // "float: right" set onRender + analysisProcedureChooser.getParent().addStyleName("force-float-left"); + + replaceContent(analysisGridDisposableComponent); } - private AnalysisProcedureChooser createAnalysisProcedureChooser( - AnalysisProcedures analysisProcedures) + private AnalysisProcedureChooser createAnalysisProcedureChooser() { - return new AnalysisProcedureChooser(screeningViewContext, - analysisProcedures.getProcedureCodes(), null, - getGridAsListener()); + ExperimentSearchCriteria experimentCriteria = + ExperimentSearchCriteria.createExperiment(experiment); + + ExperimentSearchCriteriaHolder criteriaHolder = new ExperimentSearchCriteriaHolder(experimentCriteria); + + return AnalysisProcedureChooser.createHorizontal(screeningViewContext, criteriaHolder, + null, getGridAsListener()); } } \ No newline at end of file diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ImagingMaterialViewer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ImagingMaterialViewer.java index f324820193abc961e15ac87af5f4556e7f16534c..c780aa034435f1f853c5bb88ceb3a850defee4eb 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ImagingMaterialViewer.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ImagingMaterialViewer.java @@ -28,6 +28,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material; import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.material.GenericMaterialViewer; import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningClientServiceAsync; +import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria; import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria; /** @@ -79,9 +80,13 @@ public class ImagingMaterialViewer extends GenericMaterialViewer boolean restrictGlobalScopeLinkToProject = isRestrictGlobalScopeLinkToProject(initialExperimentCriteriaOrNull); + AnalysisProcedureCriteria analysisProcedureCriteria = + AnalysisProcedureCriteria.createAllProcedures(); + WellSearchMaterialSection wellSearchSection = new WellSearchMaterialSection(screeningViewContext, materialId, - initialExperimentCriteriaOrNull, restrictGlobalScopeLinkToProject); + initialExperimentCriteriaOrNull, analysisProcedureCriteria, + restrictGlobalScopeLinkToProject); sections.add(wellSearchSection); MaterialMergedSummarySection summarySection = diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/SingleOrAllExperimentsChooser.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/SingleOrAllExperimentsChooser.java index 19664b5b3eb722ee95cf871c2430e73ca7f45383..68cbe32ba683f6996b47965195da7d65eaa7fc8d 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/SingleOrAllExperimentsChooser.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/SingleOrAllExperimentsChooser.java @@ -71,7 +71,7 @@ class SingleOrAllExperimentsChooser extends LayoutContainer ExperimentChooserFieldAdaptor singleExperimentChooser = createSingleExperimentChooser(); RadioGroup experimentRadioChooser = createExperimentRadio(singleExperimentChooser); - setWidth(400); + setWidth(380); add(experimentRadioChooser); add(singleExperimentChooser.getField()); } diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchComponent.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchComponent.java index 6f3ddba03f18949c07ca61c650eccd0737c2c8c6..b3ec6264790471a42bf418e12a2a4576bf70e325 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchComponent.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchComponent.java @@ -28,6 +28,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.DisplayTypeIDGenerator; 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.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.MaterialSearchCodesCriteria; import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.MaterialSearchCriteria; @@ -207,7 +208,8 @@ public class WellSearchComponent extends TabContent return; } WellSearchGrid.openTab(screeningViewContext, experimentSearchCriteria, - MaterialSearchCriteria.create(materialCriteria), showCombinedResults.getValue()); + MaterialSearchCriteria.create(materialCriteria), + AnalysisProcedureCriteria.createAllProcedures(), showCombinedResults.getValue()); } private MaterialSearchCodesCriteria tryGetMaterialSearchCriteria() 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 5318d3026ed92c6abee8a233844defd6e52888e4..f0b23d0b59481d8fd9e1da9f270d7674b959b372 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 @@ -47,6 +47,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.Co import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ICellListenerAndLinkGenerator; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.listener.OpenEntityDetailsTabAction; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet; @@ -65,6 +66,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.C import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.Dict; import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.DisplayTypeIDGenerator; import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ScreeningDisplayTypeIDGenerator; +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.detailviewers.ChannelWidgetWithListener.ISimpleChanneledViewerFactory; 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.DatasetImagesReference; @@ -72,6 +74,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.DatasetReferen import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ImageDatasetParameters; import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellContent; 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.ExperimentSearchCriteriaHolder; import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.MaterialSearchCriteria; @@ -80,7 +83,8 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.grids.WellSear /** * @author Franz-Josef Elmer */ -public class WellSearchGrid extends TypedTableGrid<WellContent> +public class WellSearchGrid extends TypedTableGrid<WellContent> implements + IAnalysisProcedureSelectionListener { public static final String BROWSER_ID = GenericConstants.ID_PREFIX + "PlateMaterialReviewer2Grid"; @@ -93,6 +97,7 @@ public class WellSearchGrid extends TypedTableGrid<WellContent> public static void openTab( final IViewContext<IScreeningClientServiceAsync> screeningViewContext, final String experimentPermId, final MaterialSearchCriteria materialSearchCriteria, + final AnalysisProcedureCriteria analysisProcedureCriteria, final boolean showCombinedResults) { screeningViewContext.getCommonService().getEntityInformationHolder(EntityKind.EXPERIMENT, @@ -105,7 +110,8 @@ public class WellSearchGrid extends TypedTableGrid<WellContent> { TechId experimentId = new TechId(experimentIdentifier.getId()); WellSearchGrid.openTab(screeningViewContext, experimentId, - materialSearchCriteria, showCombinedResults); + materialSearchCriteria, analysisProcedureCriteria, + showCombinedResults); } }); } @@ -114,6 +120,7 @@ public class WellSearchGrid extends TypedTableGrid<WellContent> private static void openTab( final IViewContext<IScreeningClientServiceAsync> screeningViewContext, TechId experimentId, final MaterialSearchCriteria materialSearchCriteria, + final AnalysisProcedureCriteria analysisProcedureCriteria, final boolean showCombinedResults) { screeningViewContext.getCommonService().getExperimentInfo(experimentId, @@ -125,17 +132,21 @@ public class WellSearchGrid extends TypedTableGrid<WellContent> ExperimentSearchCriteria experimentCriteria = ExperimentSearchCriteria.createExperiment(experiment); WellSearchGrid.openTab(screeningViewContext, experimentCriteria, - materialSearchCriteria, showCombinedResults); + materialSearchCriteria, analysisProcedureCriteria, + showCombinedResults); } }); } public static void openTab(final IViewContext<IScreeningClientServiceAsync> viewContext, final ExperimentSearchCriteria experimentCriteria, - final MaterialSearchCriteria materialCriteria, final boolean showCombinedResults) + final MaterialSearchCriteria materialCriteria, + final AnalysisProcedureCriteria analysisProcedureCriteria, + final boolean showCombinedResults) { WellSearchCriteria searchCriteria = - new WellSearchCriteria(experimentCriteria, materialCriteria); + new WellSearchCriteria(experimentCriteria, materialCriteria, + analysisProcedureCriteria); if (showCombinedResults) { openWellSearchTab(viewContext, searchCriteria); @@ -157,7 +168,8 @@ public class WellSearchGrid extends TypedTableGrid<WellContent> IDisposableComponent grid = WellSearchGrid.create(viewContext, searchCriteria.getExperimentCriteria(), - searchCriteria.getMaterialSearchCriteria()); + searchCriteria.getMaterialSearchCriteria(), + searchCriteria.getAnalysisProcedureCriteria()); return DefaultTabItem.create(getTabTitle(), grid, viewContext); } @@ -192,10 +204,11 @@ public class WellSearchGrid extends TypedTableGrid<WellContent> public static IDisposableComponent create( IViewContext<IScreeningClientServiceAsync> viewContext, ExperimentSearchCriteria experimentCriteriaOrNull, TechId materialId, + AnalysisProcedureCriteria analysisProcedureCriteria, boolean restrictGlobalScopeLinkToProject) { return create(viewContext, experimentCriteriaOrNull, - MaterialSearchCriteria.createIdCriteria(materialId), + MaterialSearchCriteria.createIdCriteria(materialId), analysisProcedureCriteria, restrictGlobalScopeLinkToProject); } @@ -204,18 +217,23 @@ public class WellSearchGrid extends TypedTableGrid<WellContent> private static IDisposableComponent create( IViewContext<IScreeningClientServiceAsync> viewContext, ExperimentSearchCriteria experimentCriteriaOrNull, - MaterialSearchCriteria materialCriteria) + MaterialSearchCriteria materialCriteria, + AnalysisProcedureCriteria analysisProcedureCriteria) { - return create(viewContext, experimentCriteriaOrNull, materialCriteria, false); + return create(viewContext, experimentCriteriaOrNull, materialCriteria, + analysisProcedureCriteria, false); } private static IDisposableComponent create( IViewContext<IScreeningClientServiceAsync> viewContext, ExperimentSearchCriteria experimentCriteriaOrNull, - MaterialSearchCriteria materialCriteria, boolean restrictGlobalScopeLinkToProject) + MaterialSearchCriteria materialCriteria, + AnalysisProcedureCriteria analysisProcedureCriteria, + boolean restrictGlobalScopeLinkToProject) { WellSearchGrid reviewer = new WellSearchGrid(viewContext, experimentCriteriaOrNull, materialCriteria, + analysisProcedureCriteria, restrictGlobalScopeLinkToProject); final ToolBar toolbar = reviewer.createToolbar(); return reviewer.asDisposableWithToolbar(new IDisposableComponent() @@ -250,9 +268,14 @@ public class WellSearchGrid extends TypedTableGrid<WellContent> private ChannelChooserPanel channelChooser; + // field value can change + private AnalysisProcedureCriteria analysisProcedureCriteria; + private WellSearchGrid(IViewContext<IScreeningClientServiceAsync> viewContext, ExperimentSearchCriteria experimentCriteriaOrNull, - MaterialSearchCriteria materialCriteria, boolean restrictGlobalScopeLinkToProject) + MaterialSearchCriteria materialCriteria, + AnalysisProcedureCriteria analysisProcedureCriteria, + boolean restrictGlobalScopeLinkToProject) { super(viewContext.getCommonViewContext(), BROWSER_ID, experimentCriteriaOrNull != null, DisplayTypeIDGenerator.PLATE_MATERIAL_REVIEWER); @@ -262,6 +285,7 @@ public class WellSearchGrid extends TypedTableGrid<WellContent> this.experimentCriteriaHolder = new ExperimentSearchCriteriaHolder(experimentCriteriaOrNull); this.materialCriteria = materialCriteria; + this.analysisProcedureCriteria = analysisProcedureCriteria; final IDefaultChannelState defaultChannelState = createDefaultChannelState(viewContext, experimentCriteriaOrNull); @@ -512,16 +536,41 @@ public class WellSearchGrid extends TypedTableGrid<WellContent> private ToolBar createToolbar() { ToolBar toolbar = new ToolBar(); - toolbar.add(createExperimentChooser()); + AnalysisProcedureChooser analysisProcedureChooser = createAnalysisProcedureChooser(); + toolbar.add(createExperimentChooser(analysisProcedureChooser)); + toolbar.add(analysisProcedureChooser); toolbar.add(new Label(CHANNEL_CHOOSER_LABEL)); toolbar.add(channelChooser); return toolbar; } - private Component createExperimentChooser() + private Component createExperimentChooser(AnalysisProcedureChooser analysisProcedureChooser) { + IDelegatedAction experimentSelectionChangedAction = + createExperimentSelectionChangedAction(analysisProcedureChooser); return new SingleOrAllExperimentsChooser(viewContext, experimentCriteriaHolder, - restrictGlobalScopeLinkToProject, createRefreshGridAction()); + restrictGlobalScopeLinkToProject, experimentSelectionChangedAction); + } + + protected final IDelegatedAction createExperimentSelectionChangedAction( + final AnalysisProcedureChooser analysisProcedureChooser) + { + return new IDelegatedAction() + { + public void execute() + { + analysisProcedureChooser.updateAnalysisProcedures(); + } + }; + } + + + private AnalysisProcedureChooser createAnalysisProcedureChooser() + { + AnalysisProcedureChooser analysisProcedureChooser = + AnalysisProcedureChooser.createVertical(viewContext, experimentCriteriaHolder, + null, this); + return analysisProcedureChooser; } @Override @@ -597,7 +646,8 @@ public class WellSearchGrid extends TypedTableGrid<WellContent> assert experimentCriteriaOrNull != null : "experiment not specified"; WellSearchCriteria searchCriteria = - new WellSearchCriteria(experimentCriteriaOrNull, materialCriteria); + new WellSearchCriteria(experimentCriteriaOrNull, materialCriteria, + analysisProcedureCriteria); viewContext.getService().listPlateWells(resultSetConfig, searchCriteria, callback); } @@ -615,4 +665,14 @@ public class WellSearchGrid extends TypedTableGrid<WellContent> return Arrays.asList(WellSearchGridColumnIds.PLATE, WellSearchGridColumnIds.WELL); } + public void analysisProcedureSelected(String analysisProcedureOrNull) + { + if (experimentCriteriaHolder.tryGetCriteria() != null) + { + this.analysisProcedureCriteria = + AnalysisProcedureCriteria.createFromCode(analysisProcedureOrNull); + refresh(true); + } + } + } diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchMaterialSection.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchMaterialSection.java index 1c5a9a2265db5617b33e89c3b8e4e1524f812ae9..213ae3c1f461f0cae8a5b527572fc24ed2d3a4fd 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchMaterialSection.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchMaterialSection.java @@ -6,6 +6,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ID import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningClientServiceAsync; import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.DisplayTypeIDGenerator; +import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria; import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria; /** @@ -23,6 +24,7 @@ class WellSearchMaterialSection extends TabContent public WellSearchMaterialSection( IViewContext<IScreeningClientServiceAsync> screeningViewContext, final TechId materialId, ExperimentSearchCriteria experimentCriteriaOrNull, + AnalysisProcedureCriteria analysisProcedureCriteria, boolean restrictGlobalScopeLinkToProject) { super( @@ -32,6 +34,7 @@ class WellSearchMaterialSection extends TabContent setHeaderVisible(false); this.reviewer = WellSearchGrid.create(screeningViewContext, experimentCriteriaOrNull, materialId, + analysisProcedureCriteria, restrictGlobalScopeLinkToProject); setIds(DisplayTypeIDGenerator.PLATE_LOCATIONS_MATERIAL_SECTION); } 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 3a4a7226536acd199671914c3734458fb35b994f..0b61aa277e8fc73110d147486f30c567bd782fc8 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 @@ -10,6 +10,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicProjectIdentifier; import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningClientServiceAsync; import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.detailviewers.WellSearchGrid; 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.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.MaterialSearchCodesCriteria; import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.MaterialSearchCriteria; @@ -47,6 +48,10 @@ public class WellSearchLocatorResolver extends AbstractViewLocatorResolver boolean exactMatchOnly = getMandatoryBooleanParameter(locator, ScreeningLinkExtractor.WELL_SEARCH_IS_EXACT_PARAMETER_KEY); + + String analysisProcedureOrNull = + getOptionalParameter(locator, ScreeningLinkExtractor.ANALYSIS_PROCEDURE_KEY); + boolean showCombinedResults = getOptionalBooleanParameter(locator, ScreeningLinkExtractor.WELL_SEARCH_SHOW_COMBINED_RESULTS_PARAMETER_KEY, @@ -58,6 +63,11 @@ public class WellSearchLocatorResolver extends AbstractViewLocatorResolver MaterialSearchCriteria materialSearchCriteria = MaterialSearchCriteria.create(materialCodesCriteria); + + AnalysisProcedureCriteria analysisProcedureCriteria = + (analysisProcedureOrNull == null) ? AnalysisProcedureCriteria.createAllProcedures() + : AnalysisProcedureCriteria.createFromCode(analysisProcedureOrNull); + if (StringUtils.isBlank(experimentPermId)) { ExperimentSearchCriteria criteria; @@ -72,10 +82,12 @@ public class WellSearchLocatorResolver extends AbstractViewLocatorResolver spaceCode, projectCode)); } WellSearchGrid.openTab(viewContext, criteria, materialSearchCriteria, + analysisProcedureCriteria, showCombinedResults); } else { WellSearchGrid.openTab(viewContext, experimentPermId, materialSearchCriteria, + analysisProcedureCriteria, showCombinedResults); } 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 e8ba0078cefbb803d8281eb9a97d64d776646eec..4ca6c89d46550c263c1e1ced9b0ba325ae0073d2 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 @@ -76,6 +76,7 @@ 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.ExperimentSearchByProjectCriteria; +import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria; /** * The {@link IScreeningClientService} implementation. @@ -347,9 +348,10 @@ public final class ScreeningClientService extends AbstractClientService implemen return prepareExportEntities(criteria); } - public AnalysisProcedures listAnalysisProcedures(TechId experimentId) + public AnalysisProcedures listAnalysisProcedures( + ExperimentSearchCriteria experimentSearchCriteria) { - return server.listAnalysisProcedures(getSessionToken(), experimentId); + return server.listAnalysisProcedures(getSessionToken(), experimentSearchCriteria); } } 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 d7f3ee5ebde2cb46ce54d7dcaba85a2bb2f0ddf5..d178fee26ff1b1aeafb224a7992498446a491104 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 @@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.plugin.screening.server; import java.sql.Connection; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; @@ -110,6 +111,8 @@ 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.ExperimentSearchCriteria; +import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.SingleExperimentSearchCriteria; /** * The concrete {@link IScreeningServer} implementation. @@ -453,11 +456,24 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl return createScreeningApiImpl(sessionToken).getDatasetIdentifiers(datasetCodes); } - public AnalysisProcedures listAnalysisProcedures(String sessionToken, TechId experimentId) + public AnalysisProcedures listAnalysisProcedures(String sessionToken, + ExperimentSearchCriteria experimentSearchCriteria) { checkSession(sessionToken); IScreeningQuery dao = createDAO(getDAOFactory()); - List<String> procedureCodes = dao.listAnalysisProcedures(experimentId.getId()); + + SingleExperimentSearchCriteria singleExpCriteria = + (experimentSearchCriteria != null) ? experimentSearchCriteria.tryGetExperiment() + : null; + List<String> procedureCodes = Collections.emptyList(); + if (singleExpCriteria == null) + { + procedureCodes = dao.listAllAnalysisProcedures(); + } else + { + procedureCodes = + dao.listAnalysisProcedures(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 24ab08ab04ceac91fc85ba50f9f5737fd0d27871..525786d4d85809d36d061d2ef4c3b3b005dc9703 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 @@ -67,6 +67,7 @@ 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.ExperimentSearchByProjectCriteria; +import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria; /** * The <i>screening</i> specific {@link AbstractServerLogger} extension. @@ -376,10 +377,12 @@ final class ScreeningServerLogger extends AbstractServerLogger implements IScree return null; } - public AnalysisProcedures listAnalysisProcedures(String sessionToken, TechId experimentId) + public AnalysisProcedures listAnalysisProcedures(String sessionToken, + ExperimentSearchCriteria experimentSearchCriteria) { - logAccess(sessionToken, "listAnalysisProcedures", "sessionToken(%s), experimentId(%s)", - sessionToken, experimentId); + logAccess(sessionToken, "listAnalysisProcedures", + "sessionToken(%s), experimentSearchCriteria(%s)", sessionToken, + experimentSearchCriteria); return null; } } diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/dataaccess/IScreeningQuery.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/dataaccess/IScreeningQuery.java index 47c51623cc4b53655d195f6981aa2c32815fd9c2..feb94dce856bb28b6beb0223e709e71c7836c4a5 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/dataaccess/IScreeningQuery.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/dataaccess/IScreeningQuery.java @@ -305,17 +305,20 @@ public interface IScreeningQuery extends BaseQuery public List<ExperimentReferenceQueryResult> getExperimentsWithMaterial(long materialId, long projectId); - @Select(sql = "select distinct " - + " ds_props.value as value" - + " from experiments exp " - + " join data ds on ds.expe_id = exp.id " - + " join data_set_types ds_type on ds.dsty_id = ds_type.id " - + " join data_set_type_property_types dst_pt on dst_pt.dsty_id = ds_type.id " - + " left outer join data_set_properties ds_props on ds_props.ds_id = ds.id " - + " where " - + " exp.id = ?{1} " - + " and " - + " dst_pt.prty_id = (select id from property_types where code='ANALYSIS_PROCEDURE' and is_internal_namespace=true)") + + final static String ANALYSIS_PROCEDURE_SELECT = "select distinct " + + " ds_props.value as value" + + " from experiments exp " + + " join data ds on ds.expe_id = exp.id " + + " join data_set_types ds_type on ds.dsty_id = ds_type.id " + + " join data_set_type_property_types dst_pt on dst_pt.dsty_id = ds_type.id " + + " left outer join data_set_properties ds_props on ds_props.ds_id = ds.id " + + " where " + + " dst_pt.prty_id = (select id from property_types where code='ANALYSIS_PROCEDURE' and is_internal_namespace=true)"; + + @Select(sql = ANALYSIS_PROCEDURE_SELECT + " and exp.id = ?{1} ") public List<String> listAnalysisProcedures(long experimentId); + @Select(sql = ANALYSIS_PROCEDURE_SELECT) + public List<String> listAllAnalysisProcedures(); } 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 14092853b9541e3c0941c0e36aab9186688ac47e..0795eb6b57b2d060133c74ff4801511654d59bcb 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 @@ -41,6 +41,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleParentWithDerived; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary; import ch.systemsx.cisd.openbis.plugin.screening.shared.authorization.DatasetReferencePredicate; +import ch.systemsx.cisd.openbis.plugin.screening.shared.authorization.ExperimentSearchCriteriaPredicate; import ch.systemsx.cisd.openbis.plugin.screening.shared.authorization.MaterialExperimentFeatureVectorSummaryValidator; import ch.systemsx.cisd.openbis.plugin.screening.shared.authorization.WellContentValidator; import ch.systemsx.cisd.openbis.plugin.screening.shared.authorization.WellSearchCriteriaPredicate; @@ -61,6 +62,7 @@ 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.ExperimentSearchByProjectCriteria; +import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria; /** * The <i>screening</i> server. Used internally. @@ -251,6 +253,6 @@ public interface IScreeningServer extends IServer @Transactional(readOnly = true) @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER) public AnalysisProcedures listAnalysisProcedures(String sessionToken, - @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class) TechId experimentId); + @AuthorizationGuard(guardClass = ExperimentSearchCriteriaPredicate.class) ExperimentSearchCriteria experimentSearchCriteria); } diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/authorization/ExperimentSearchCriteriaPredicate.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/authorization/ExperimentSearchCriteriaPredicate.java new file mode 100644 index 0000000000000000000000000000000000000000..3f9cd024e3cf45cbaeb86f3b48339b4d14b8078b --- /dev/null +++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/authorization/ExperimentSearchCriteriaPredicate.java @@ -0,0 +1,91 @@ +/* + * Copyright 2008 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.screening.shared.authorization; + +import java.util.List; + +import org.springframework.dao.DataAccessException; + +import ch.systemsx.cisd.common.exceptions.Status; +import ch.systemsx.cisd.common.exceptions.UserFailureException; +import ch.systemsx.cisd.openbis.generic.shared.authorization.IAuthorizationDataProvider; +import ch.systemsx.cisd.openbis.generic.shared.authorization.RoleWithIdentifier; +import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.AbstractTechIdPredicate.ExperimentTechIdPredicate; +import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.IPredicate; +import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.SpaceIdentifierPredicate; +import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicProjectIdentifier; +import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE; +import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier; +import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria; +import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.SingleExperimentSearchCriteria; + +/** + * @author Tomasz Pylak + * @author Kaloyan Enimanev + */ +public final class ExperimentSearchCriteriaPredicate implements + IPredicate<ExperimentSearchCriteria> +{ + private final IPredicate<TechId> experimentPredicate; + + private final SpaceIdentifierPredicate spacePredicate; + + public ExperimentSearchCriteriaPredicate() + { + this.experimentPredicate = new ExperimentTechIdPredicate(); + this.spacePredicate = new SpaceIdentifierPredicate(); + } + + public final void init(IAuthorizationDataProvider provider) + { + experimentPredicate.init(provider); + spacePredicate.init(provider); + } + + public final Status evaluate(final PersonPE person, + final List<RoleWithIdentifier> allowedRoles, final ExperimentSearchCriteria value) + { + assert person != null : "Unspecified person"; + assert allowedRoles != null : "Unspecified allowed roles"; + + if (value != null) + { + try + { + SingleExperimentSearchCriteria experiment = value.tryGetExperiment(); + BasicProjectIdentifier project = value.tryGetProjectIdentifier(); + if (experiment != null) + { + return experimentPredicate.evaluate(person, allowedRoles, + experiment.getExperimentId()); + } else if (project != null) + { + SpaceIdentifier space = + new SpaceIdentifier(project.getInstanceCode(), project.getSpaceCode()); + return spacePredicate.evaluate(person, allowedRoles, space); + } + } catch (DataAccessException ex) + { + throw new UserFailureException(ex.getMessage(), ex); + } + } + + return Status.OK; + + } +} diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/authorization/WellSearchCriteriaPredicate.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/authorization/WellSearchCriteriaPredicate.java index 3d9a6d6d4980faf2db94ae31f652a1f66d7f2157..aac3f4869941cf7d084a6e21e534fc6edcb21c3a 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/authorization/WellSearchCriteriaPredicate.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/authorization/WellSearchCriteriaPredicate.java @@ -16,76 +16,39 @@ package ch.systemsx.cisd.openbis.plugin.screening.shared.authorization; -import java.util.List; - -import org.springframework.dao.DataAccessException; - -import ch.systemsx.cisd.common.exceptions.Status; import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.openbis.generic.shared.authorization.IAuthorizationDataProvider; -import ch.systemsx.cisd.openbis.generic.shared.authorization.RoleWithIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.AbstractTechIdPredicate.ExperimentTechIdPredicate; -import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.IPredicate; -import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.SpaceIdentifierPredicate; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicProjectIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier; +import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.DelegatedPredicate; import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria; import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria; -import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.SingleExperimentSearchCriteria; /** * @author Tomasz Pylak + * @author Kaloyan Enimanev */ -public final class WellSearchCriteriaPredicate implements IPredicate<WellSearchCriteria> +public final class WellSearchCriteriaPredicate extends + DelegatedPredicate<ExperimentSearchCriteria, WellSearchCriteria> { - private final IPredicate<TechId> experimentPredicate; - - private final SpaceIdentifierPredicate spacePredicate; public WellSearchCriteriaPredicate() { - this.experimentPredicate = new ExperimentTechIdPredicate(); - this.spacePredicate = new SpaceIdentifierPredicate(); + super(new ExperimentSearchCriteriaPredicate()); } - public final void init(IAuthorizationDataProvider provider) + @Override + public ExperimentSearchCriteria tryConvert(WellSearchCriteria value) { - experimentPredicate.init(provider); - spacePredicate.init(provider); - } - - public final Status evaluate(final PersonPE person, - final List<RoleWithIdentifier> allowedRoles, final WellSearchCriteria value) - { - assert person != null : "Unspecified person"; - assert allowedRoles != null : "Unspecified allowed roles"; if (value == null) { throw UserFailureException.fromTemplate("No well search criteria specified."); } - try - { - ExperimentSearchCriteria experimentCriteria = value.getExperimentCriteria(); - SingleExperimentSearchCriteria experiment = experimentCriteria.tryGetExperiment(); - BasicProjectIdentifier project = experimentCriteria.tryGetProjectIdentifier(); - if (experiment != null) - { - return experimentPredicate.evaluate(person, allowedRoles, - experiment.getExperimentId()); - } else if (project != null) - { - SpaceIdentifier space = - new SpaceIdentifier(project.getInstanceCode(), project.getSpaceCode()); - return spacePredicate.evaluate(person, allowedRoles, space); - } else - { - return Status.OK; - } - } catch (DataAccessException ex) - { - throw new UserFailureException(ex.getMessage(), ex); - } + + return value.getExperimentCriteria(); } + + @Override + public String getCandidateDescription() + { + return "Well search criteria"; + } + } 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 f443fba9bc7e5d57c14ac72758f5ab4a5281b5d0..3ff4eef19a9569788f11bc8a2a3a5456ffdb78ef 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 @@ -305,7 +305,7 @@ public class WellSearchCriteria implements ISerializable } } - public static final class MaterialSearchCodesCriteria implements IsSerializable, Serializable + public static final class MaterialSearchCodesCriteria implements ISerializable { private static final long serialVersionUID = ServiceVersionHolder.VERSION; @@ -358,7 +358,7 @@ public class WellSearchCriteria implements ISerializable } } - public static final class MaterialSearchCriteria implements IsSerializable, Serializable + public static final class MaterialSearchCriteria implements ISerializable { private static final long serialVersionUID = ServiceVersionHolder.VERSION; @@ -432,10 +432,52 @@ public class WellSearchCriteria implements ISerializable } } + public static final class AnalysisProcedureCriteria implements ISerializable + { + private static final long serialVersionUID = ServiceVersionHolder.VERSION; + + private String analysisProcedureCodeOrNull; + + public static AnalysisProcedureCriteria createAllProcedures() + { + // TODO KE: could we improve this ? + return new AnalysisProcedureCriteria(); + } + + public static AnalysisProcedureCriteria createFromCode(String codeOrNull) + { + return new AnalysisProcedureCriteria(codeOrNull); + } + + // GWT only + @SuppressWarnings("unused") + private AnalysisProcedureCriteria() + { + } + + private AnalysisProcedureCriteria(String analysisProcedureCodeOrNull) + { + this.analysisProcedureCodeOrNull = analysisProcedureCodeOrNull; + } + + public String tryGetAnalysisProcedureCode() + { + return analysisProcedureCodeOrNull; + } + + @Override + public String toString() + { + return "[Analysis procedure code '" + analysisProcedureCodeOrNull + "']"; + } + } + private MaterialSearchCriteria materialCriteria; private ExperimentSearchCriteria experimentCriteria; + private AnalysisProcedureCriteria analysisProcedureCriteria; + // GWT @SuppressWarnings("unused") private WellSearchCriteria() @@ -443,19 +485,23 @@ public class WellSearchCriteria implements ISerializable } public WellSearchCriteria(ExperimentSearchCriteria experimentCriteria, - MaterialSearchCriteria materialCriteria) + MaterialSearchCriteria materialCriteria, + AnalysisProcedureCriteria analysisProcedureCriteria) { assert experimentCriteria != null; assert materialCriteria != null; + assert analysisProcedureCriteria != null; this.materialCriteria = materialCriteria; this.experimentCriteria = experimentCriteria; + this.analysisProcedureCriteria = analysisProcedureCriteria; } @Override public String toString() { - return "Search criteria: " + experimentCriteria + ", " + materialCriteria; + return "Search criteria: " + experimentCriteria + ", " + materialCriteria + ", " + + analysisProcedureCriteria; } /** null means all experiments */ @@ -469,6 +515,11 @@ public class WellSearchCriteria implements ISerializable return materialCriteria; } + public AnalysisProcedureCriteria getAnalysisProcedureCriteria() + { + return analysisProcedureCriteria; + } + public static boolean shouldRestrictScopeToProject( ExperimentSearchCriteria searchCriteria) { @@ -480,4 +531,5 @@ public class WellSearchCriteria implements ISerializable { return searchCriteria != null && searchCriteria.tryGetProjectIdentifier() != null; } + } diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellContentLoaderTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellContentLoaderTest.java index 2a2eff1b06582bf09832a36941c48619bffae914..9ac5ac883f0195d6bf7d924740b0693f8da89a0c 100644 --- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellContentLoaderTest.java +++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellContentLoaderTest.java @@ -35,6 +35,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.server.IScreeningBusinessObject import ch.systemsx.cisd.openbis.plugin.screening.server.dataaccess.AbstractScreeningDAOTest; import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellContent; 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.MaterialSearchCriteria; @@ -64,7 +65,8 @@ public class WellContentLoaderTest extends AbstractScreeningDAOTest WellSearchCriteria searchCriteria = new WellSearchCriteria(ExperimentSearchCriteria.createAllExperiments(), MaterialSearchCriteria.createCodesCriteria(materialCodes, - materialTypeCodes, false)); + materialTypeCodes, false), + AnalysisProcedureCriteria.createFromCode(null)); Session session = createSession(getSystemPerson()); List<WellContent> wellContents = @@ -89,7 +91,8 @@ public class WellContentLoaderTest extends AbstractScreeningDAOTest WellSearchCriteria searchCriteria = new WellSearchCriteria(ExperimentSearchCriteria.createAllExperiments(), MaterialSearchCriteria.createCodesCriteria(materialCodes, - materialTypeCodes, false)); + materialTypeCodes, false), + AnalysisProcedureCriteria.createFromCode(null)); Session session = createSession(getSystemPerson()); List<WellContent> wellContents =