diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/TrackingServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/TrackingServer.java index c6a9146e7bf9b081871891d029900ff7231b220e..a332430325707836d51e77e53d88db5322d12bb8 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/TrackingServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/TrackingServer.java @@ -16,7 +16,10 @@ package ch.systemsx.cisd.openbis.generic.server; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import ch.systemsx.cisd.authentication.ISessionManager; import ch.systemsx.cisd.openbis.generic.server.business.bo.ICommonBusinessObjectFactory; @@ -65,22 +68,65 @@ public final class TrackingServer extends AbstractServer<ITrackingServer> implem // ITrackingServer // - public List<ExternalData> listDataSets(String sessionToken, TrackingDataSetCriteria criteria) + public List<Sample> listSamples(String sessionToken, TrackingSampleCriteria criteria) { final Session session = getSession(sessionToken); - final IDatasetLister datasetLister = - businessObjectFactory.createDatasetLister(session, getDataStoreBaseURL()); - return datasetLister.listByTrackingCriteria(criteria); + final ISampleLister sampleLister = businessObjectFactory.createSampleLister(session); + final ListOrSearchSampleCriteria listerCriteria = new ListOrSearchSampleCriteria(criteria); + listerCriteria.setEnrichDependentSamplesWithProperties(true); + return sampleLister.list(listerCriteria); } - public List<Sample> listSamples(String sessionToken, TrackingSampleCriteria criteria) + public List<ExternalData> listDataSets(String sessionToken, TrackingDataSetCriteria criteria) { final Session session = getSession(sessionToken); + // retrieve data sets connected to samples of type specified in criteria + // (these samples don't have properties loaded but ids are loaded) + final IDatasetLister datasetLister = + businessObjectFactory.createDatasetLister(session, getDataStoreBaseURL()); + final List<ExternalData> dataSets = datasetLister.listByTrackingCriteria(criteria); + // retrieve samples enriched with their dependent samples and properties + // (drawback - samples directly connected to data sets are retrieved twice) final ISampleLister sampleLister = businessObjectFactory.createSampleLister(session); - final ListOrSearchSampleCriteria listerCriteria = new ListOrSearchSampleCriteria(criteria); + final ListOrSearchSampleCriteria listerCriteria = + new ListOrSearchSampleCriteria(extractConnectedSampleIds(dataSets)); listerCriteria.setEnrichDependentSamplesWithProperties(true); - return sampleLister.list(listerCriteria); + final List<Sample> enrichedSamples = sampleLister.list(listerCriteria); + // replace data set samples with enriched ones + replaceConnectedSamples(dataSets, enrichedSamples); + return dataSets; + } + + private List<Long> extractConnectedSampleIds(List<ExternalData> dataSets) + { + final List<Long> sampleIds = new ArrayList<Long>(); + for (ExternalData dataSet : dataSets) + { + assert dataSet.getSample() != null : "data set is not connected to a sample"; + sampleIds.add(dataSet.getSample().getId()); + } + return sampleIds; } + + private void replaceConnectedSamples(List<ExternalData> dataSets, List<Sample> enrichedSamples) + { + // list orders are not the same - map is needed for quick search + // <sample id, sample> + final Map<Long, Sample> enrichedSamplesMap = + new HashMap<Long, Sample>(enrichedSamples.size()); + for (Sample sample : enrichedSamples) + { + enrichedSamplesMap.put(sample.getId(), sample); + } + + for (ExternalData dataSet : dataSets) + { + final Sample enrichedSample = enrichedSamplesMap.get(dataSet.getSample().getId()); + assert enrichedSample != null; + dataSet.setSample(enrichedSample); + } + } + } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ITrackingServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ITrackingServer.java index daa92d1625c927a5109a50b83c3927a893e85761..823fc721c5cabe8ea7b3d9c9032ac3b14ccb6b5a 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ITrackingServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ITrackingServer.java @@ -29,7 +29,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingDataSetCriteria import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingSampleCriteria; /** - * Definition of the client-server interface. + * Definition of the client-server interface for tracking creation of samples and datasets. * * @author Piotr Buczek */ diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/OpenbisClientTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/OpenbisClientTest.java index 42c3b79fae09ec2cb63697b5b70e7ee17d3e89dc..5e3adc14e506befbd7836b782babf7bd054c25de 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/OpenbisClientTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/OpenbisClientTest.java @@ -104,7 +104,7 @@ public class OpenbisClientTest final String sampleTypeCode = "CELL_PLATE"; final int lastSeenSampleId = 1000; // compare with 0 - final int lastSeenDataSetId = 3; // compare with 0 + final int lastSeenDataSetId = 0; // compare with 3 final TrackingSampleCriteria sampleCriteria = new TrackingSampleCriteria(sampleTypeCode, lastSeenSampleId); @@ -202,10 +202,11 @@ public class OpenbisClientTest builder.append(" type", dataSet.getDataSetType()); builder.append(" properties", toString(dataSet.getProperties())); sb.append(builder.toString()); - final String indent = INDENT; if (dataSet.getSample() != null) { - sb.append("\n" + indent + toString(dataSet.getSample())); + final String indent = INDENT; + final String newIndent = indent + INDENT; + sb.append("\n" + indent + toString(dataSet.getSample(), newIndent)); } return sb.toString(); }