diff --git a/screening/.classpath b/screening/.classpath index 2fa42baa063251bf399987b76769420827521cf4..b64b10e9876dfea4a6b87782256a4fee07766ad4 100644 --- a/screening/.classpath +++ b/screening/.classpath @@ -42,5 +42,6 @@ <classpathentry kind="lib" path="/libraries/jhdf5/cisd-jhdf5-batteries_included_lin_win_mac.jar"/> <classpathentry kind="lib" path="/libraries/hdf5"/> <classpathentry kind="lib" path="/libraries/nativedata"/> + <classpathentry kind="lib" path="/libraries/fastutil/fastutil.jar" sourcepath="/libraries/fastutil/fastutil-src.zip"/> <classpathentry kind="output" path="targets/www/WEB-INF/classes"/> </classpath> 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 63b64f1093a158586aaaff1c320c8e421c15218a..0ed55be5b6d4e0742e74b25461976a19c74387c2 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 @@ -16,7 +16,12 @@ package ch.systemsx.cisd.openbis.plugin.screening.server.logic; +import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectSortedMap; + import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; import java.util.List; import ch.systemsx.cisd.openbis.generic.server.business.bo.datasetlister.IDatasetLister; @@ -44,7 +49,7 @@ class FeatureVectorDatasetLoader extends ImageDatasetLoader FeatureVectorDatasetLoader(Session session, IScreeningBusinessObjectFactory businessObjectFactory, String dataStoreBaseURL, - List<? extends PlateIdentifier> plates) + Collection<? extends PlateIdentifier> plates) { super(session, businessObjectFactory, dataStoreBaseURL, plates, ScreeningConstants.IMAGE_DATASET_TYPE, @@ -62,10 +67,8 @@ class FeatureVectorDatasetLoader extends ImageDatasetLoader private void loadFeatureVectorDatasets() { - // TODO 2010-05-26, CR, : This is slow if there are a large number of image data sets - // Need to add a query to the dataset lister that returns, for a collection of tech ids, a - // child datasets and their parents. - featureVectorDatasets = new ArrayList<ExternalData>(); + final Long2ObjectSortedMap<ExternalData> featureVectorDatasetSet = + new Long2ObjectLinkedOpenHashMap<ExternalData>(); IDatasetLister datasetLister = businessObjectFactory.createDatasetLister(session, dataStoreBaseURL); @@ -73,23 +76,33 @@ class FeatureVectorDatasetLoader extends ImageDatasetLoader { if (ScreeningUtils.isTypeEqual(data, ScreeningConstants.IMAGE_ANALYSIS_DATASET_TYPE)) { - featureVectorDatasets.add(data); - } else + featureVectorDatasetSet.put(data.getId(), data); + } + } + + // Implementation note: some data sets in this loop may overwrite data from the first loop. + // This is intended as we want to keep the parent relationship of the feature vector data + // sets, if they exist. + for (ExternalData data : getDatasets()) + { + if (ScreeningUtils.isTypeEqual(data, ScreeningConstants.IMAGE_DATASET_TYPE)) { - List<ExternalData> children = + // TODO 2010-05-26, CR, : This way to access the database one by one is slow if + // there are a large number of image data sets + // Need to add a query to the dataset lister that returns, for a collection of tech + // ids, a child datasets and their parents. + final List<ExternalData> children = datasetLister.listByParentTechId(new TechId(data.getId())); - ArrayList<ExternalData> parentList = new ArrayList<ExternalData>(); - parentList.add(data); for (ExternalData child : children) { - child.setParents(parentList); + child.setParents(Collections.singleton(data)); + featureVectorDatasetSet.put(child.getId(), child); } - featureVectorDatasets.addAll(children); } } featureVectorDatasets = - ScreeningUtils.filterExternalDataByType(featureVectorDatasets, + ScreeningUtils.filterExternalDataByType(featureVectorDatasetSet.values(), featureVectorDatasetTypeCode); } @@ -106,22 +119,21 @@ class FeatureVectorDatasetLoader extends ImageDatasetLoader protected FeatureVectorDatasetReference asFeatureVectorDataset(ExternalData externalData) { DataStore dataStore = externalData.getDataStore(); - if (externalData.getParents() == null || externalData.getParents().size() == 0) + if (externalData.getParents() == null || externalData.getParents().isEmpty()) { return new FeatureVectorDatasetReference(externalData.getCode(), getDataStoreUrlFromDataStore(dataStore), createPlateIdentifier(externalData), - extractPlateGeometry(externalData), externalData.getRegistrationDate(), - null); + extractPlateGeometry(externalData), externalData.getRegistrationDate(), null); } else { - // Note: this only works reliably because this class sets the parents of the feature + // Note: this only works reliably because this class sets the parents of the feature // vector data sets itself and sets it to a list with exactly one entry! // (see loadFeatureVectorDatasets() above) final ExternalData parentDataset = externalData.getParents().iterator().next(); return new FeatureVectorDatasetReference(externalData.getCode(), getDataStoreUrlFromDataStore(dataStore), createPlateIdentifier(parentDataset), - extractPlateGeometry(parentDataset), externalData.getRegistrationDate(), - asImageDataset(parentDataset)); + extractPlateGeometry(parentDataset), externalData.getRegistrationDate(), + asImageDataset(parentDataset)); } } } diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ImageDatasetLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ImageDatasetLoader.java index b6e1f5684224f4079b23e751d898fbd68832241e..fedb87144b078c9e511744a8ef907c6894858276 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ImageDatasetLoader.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ImageDatasetLoader.java @@ -17,6 +17,7 @@ package ch.systemsx.cisd.openbis.plugin.screening.server.logic; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore; @@ -37,7 +38,7 @@ class ImageDatasetLoader extends PlateDatasetLoader // TODO 2010-05-27, CR : See PlateDatasetLoader todo comment ImageDatasetLoader(Session session, IScreeningBusinessObjectFactory businessObjectFactory, - String dataStoreBaseURL, List<? extends PlateIdentifier> plates, + String dataStoreBaseURL, Collection<? extends PlateIdentifier> plates, String... datasetTypeCodes) { super(session, businessObjectFactory, dataStoreBaseURL, plates, @@ -51,15 +52,18 @@ class ImageDatasetLoader extends PlateDatasetLoader public List<ImageDatasetReference> getImageDatasets() { load(); - return asImageDatasets(); + return filterImageDatasets(); } - private List<ImageDatasetReference> asImageDatasets() + private List<ImageDatasetReference> filterImageDatasets() { List<ImageDatasetReference> result = new ArrayList<ImageDatasetReference>(); for (ExternalData externalData : getDatasets()) { - result.add(asImageDataset(externalData)); + if (ScreeningUtils.isTypeEqual(externalData, ScreeningConstants.IMAGE_DATASET_TYPE)) + { + result.add(asImageDataset(externalData)); + } } return result; } diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/PlateDatasetLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/PlateDatasetLoader.java index 6e604cc9dcc4ac5c0ff0274f40dd67d42061aa85..7b10358d884a39779307d9a44e644704bf4bfa7e 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/PlateDatasetLoader.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/PlateDatasetLoader.java @@ -3,9 +3,12 @@ package ch.systemsx.cisd.openbis.plugin.screening.server.logic; import static ch.systemsx.cisd.openbis.generic.shared.GenericSharedConstants.DATA_STORE_SERVER_WEB_APPLICATION_NAME; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; +import org.apache.commons.lang.StringUtils; + import ch.systemsx.cisd.common.exceptions.UserFailureException; import ch.systemsx.cisd.openbis.generic.server.business.bo.datasetlister.IDatasetLister; import ch.systemsx.cisd.openbis.generic.server.business.bo.samplelister.ISampleLister; @@ -44,7 +47,7 @@ class PlateDatasetLoader protected final String dataStoreBaseURL; // Parameter state - private final List<? extends PlateIdentifier> plates; + private final Collection<? extends PlateIdentifier> plates; private final String[] datasetTypeCodes; @@ -58,7 +61,7 @@ class PlateDatasetLoader private HashMap<Long, Sample> samplesById; PlateDatasetLoader(Session session, IScreeningBusinessObjectFactory businessObjectFactory, - String dataStoreBaseURL, List<? extends PlateIdentifier> plates, + String dataStoreBaseURL, Collection<? extends PlateIdentifier> plates, String... datasetTypeCodes) { this.session = session; @@ -122,7 +125,9 @@ class PlateDatasetLoader { for (PlateIdentifier plate : plates) { - Sample sample = samplesByIdentifier.get(createSampleIdentifier(plate)); + Sample sample = + samplesByIdentifier.get(createSampleIdentifier(plate, session + .tryGetHomeGroupCode())); // Make sure the sample and plate have the same *identifier* not just code String plateSpaceCodeOrNull = plate.tryGetSpaceCode(); Space sampleSpaceOrNull = sample.getSpace(); @@ -180,7 +185,7 @@ class PlateDatasetLoader } } - throw new UserFailureException("Sample " + sample.getIdentifier() + " has no property " + throw new UserFailureException("Sample '" + sample.getIdentifier() + "' has no property " + ScreeningConstants.PLATE_GEOMETRY); } @@ -210,7 +215,7 @@ class PlateDatasetLoader private List<Long> extractSampleIds() { - ArrayList<Long> sampleIds = new ArrayList<Long>(); + ArrayList<Long> sampleIds = new ArrayList<Long>(samples.size()); for (Sample sample : samples) { sampleIds.add(sample.getId()); @@ -237,17 +242,31 @@ class PlateDatasetLoader return datastoreUrl; } - protected static SampleIdentifier createSampleIdentifier(PlateIdentifier plate) + protected static SampleIdentifier createSampleIdentifier(PlateIdentifier plate, + String homeSpaceCodeOrNull) { SampleOwnerIdentifier owner; String spaceCode = plate.tryGetSpaceCode(); - if (spaceCode != null) + if (StringUtils.isNotBlank(spaceCode)) { - SpaceIdentifier space = new SpaceIdentifier(DatabaseInstanceIdentifier.HOME, spaceCode); + final SpaceIdentifier space = + new SpaceIdentifier(DatabaseInstanceIdentifier.HOME, spaceCode); owner = new SampleOwnerIdentifier(space); } else { - owner = new SampleOwnerIdentifier(DatabaseInstanceIdentifier.createHome()); + if (spaceCode == null) + { + owner = new SampleOwnerIdentifier(DatabaseInstanceIdentifier.createHome()); + } else + { + if (homeSpaceCodeOrNull == null) + { + throw new UserFailureException("No space given and user has no home space."); + } + final SpaceIdentifier space = + new SpaceIdentifier(DatabaseInstanceIdentifier.HOME, homeSpaceCodeOrNull); + owner = new SampleOwnerIdentifier(space); + } } return SampleIdentifier.createOwnedBy(owner, plate.getPlateCode()); }