From 6dece3b9ae057d4a543acc97cd682cfec352d819 Mon Sep 17 00:00:00 2001 From: felmer <felmer> Date: Wed, 13 Feb 2013 11:26:44 +0000 Subject: [PATCH] SP-497, BIS-321: WellContentLoader: Throw an exception if more than 1000 materials found. WellSearchGrid: Improved by invoking ChannelChooserPanel.updateChannelSelection() only once and not for each row which lead to a quadratic increase of time to create the grid. SVN: 28362 --- .../detailviewers/ChannelChooserPanel.java | 4 +- .../detailviewers/WellSearchGrid.java | 40 +++++++++++++++++-- .../ScreeningBusinessObjectFactory.java | 12 +++++- .../server/logic/WellContentLoader.java | 9 +++++ 4 files changed, 59 insertions(+), 6 deletions(-) diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ChannelChooserPanel.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ChannelChooserPanel.java index 7d3549af285..c8b6fe99724 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ChannelChooserPanel.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ChannelChooserPanel.java @@ -366,7 +366,7 @@ public class ChannelChooserPanel extends LayoutContainer return channels; } - private void addChannelsForParameters(ImageDatasetParameters imageParameters) + public void addChannelsForParameters(ImageDatasetParameters imageParameters) { addChannelToComboBox(new LabeledItem<String>(MERGED_CHANNELS, MERGED_CHANNELS)); @@ -439,7 +439,7 @@ public class ChannelChooserPanel extends LayoutContainer return false; } - private void updateChannelSelection(List<String> selectedChannels) + public void updateChannelSelection(List<String> selectedChannels) { List<String> channels = selectedChannels; if (channels == null || channels.size() == 0) 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 961bd58e11d..53b58c9f9fa 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 @@ -31,6 +31,7 @@ import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer; import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat; +import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Widget; import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback; @@ -50,8 +51,10 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ID 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.GridRowModels; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet; +import ch.systemsx.cisd.openbis.generic.shared.basic.GridRowModel; import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithIdentifier; import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId; import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; @@ -653,9 +656,7 @@ public class WellSearchGrid extends TypedTableGrid<WellContent> implements channelChooser.tryGetSelectedTransformationCode(false), channelChooser.tryGetSelectedIntensityRanges()); - ImageDatasetParameters imageParameters = images.getImageParameters(); channelChooser.addSelectionChangedListener(widgetWithListener); - channelChooser.addChannels(imageParameters); return widgetWithListener.asWidget(); } @@ -681,7 +682,40 @@ public class WellSearchGrid extends TypedTableGrid<WellContent> implements WellSearchCriteria searchCriteria = new WellSearchCriteria(experimentCriteriaOrNull, materialCriteria, analysisProcedureCriteria); - getViewContext().getService().listPlateWells(resultSetConfig, searchCriteria, callback); + getViewContext().getService().listPlateWells(resultSetConfig, searchCriteria, + new AsyncCallback<TypedTableResultSet<WellContent>>() + { + @Override + public void onFailure(Throwable caught) + { + callback.onFailure(caught); + } + + @Override + public void onSuccess(TypedTableResultSet<WellContent> result) + { + GridRowModels<TableModelRowWithObject<WellContent>> rows = + result.getResultSet().getList(); + for (GridRowModel<TableModelRowWithObject<WellContent>> row : rows) + { + WellContent wellContent = row.getOriginalObject().getObjectOrNull(); + if (wellContent != null) + { + + DatasetImagesReference dataSet = + wellContent.tryGetImageDataset(); + if (dataSet != null) + { + ImageDatasetParameters imageParameters = + dataSet.getImageParameters(); + channelChooser.addChannelsForParameters(imageParameters); + } + } + } + channelChooser.updateChannelSelection(null); + callback.onSuccess(result); + } + }); } @Override diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningBusinessObjectFactory.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningBusinessObjectFactory.java index 5e02233207a..7ab010e2704 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningBusinessObjectFactory.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningBusinessObjectFactory.java @@ -114,6 +114,7 @@ public final class ScreeningBusinessObjectFactory extends AbstractPluginBusiness { return new IMetadataProvider() { + private IDatasetLister lister; @Override public SampleIdentifier tryGetSampleIdentifier(String samplePermId) @@ -125,9 +126,18 @@ public final class ScreeningBusinessObjectFactory extends AbstractPluginBusiness public List<String> tryGetContainedDatasets(String datasetCode) { List<String> result = - createDatasetLister(session).listContainedCodes(datasetCode); + getLister().listContainedCodes(datasetCode); return result; } + + private IDatasetLister getLister() + { + if (lister == null) + { + lister = createDatasetLister(session); + } + return lister; + } }; } diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellContentLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellContentLoader.java index 527a80ee550..201b18ee4fc 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellContentLoader.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellContentLoader.java @@ -35,6 +35,7 @@ import ch.rinn.restrictions.Friend; import ch.systemsx.cisd.common.collection.IKeyExtractor; import ch.systemsx.cisd.common.collection.TableMap; import ch.systemsx.cisd.common.collection.TableMap.UniqueKeyViolationStrategy; +import ch.systemsx.cisd.common.exceptions.UserFailureException; import ch.systemsx.cisd.openbis.generic.server.business.bo.materiallister.IMaterialLister; import ch.systemsx.cisd.openbis.generic.server.business.bo.samplelister.ISampleLister; import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; @@ -90,6 +91,8 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.IHCSFeatureVecto @Friend(toClasses = IScreeningQuery.class) public class WellContentLoader extends AbstractContentLoader { + private static final int MAX_NUMBERS_OF_MATERIALS = 1000; + /** * Finds wells containing the specified material and belonging to the specified experiment. * Loads wells metadata, but no information about connected datasets. @@ -809,6 +812,12 @@ public class WellContentLoader extends AbstractContentLoader "[%d msec] Finding %d materials for criteria '%s'. Result: %s", (System.currentTimeMillis() - start), materialIds.length, codesCriteria, abbreviate(materialIds, 100))); + if (materialIds.length > MAX_NUMBERS_OF_MATERIALS) + { + throw new UserFailureException("More than " + MAX_NUMBERS_OF_MATERIALS + + " materials for criteria '" + codesCriteria + "' are found. " + + "Please restrict your search criteria."); + } start = System.currentTimeMillis(); if (experimentOrNull != null) -- GitLab