diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationService.java index f8661cffc800a5b82fa6bf0b09a4cc7fc26c1519..a39fba11eb71896b203a58d967a844ad7c74ba0b 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationService.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationService.java @@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.generic.server.api.v1; import java.util.ArrayList; import java.util.Collections; +import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; @@ -41,6 +42,7 @@ import ch.systemsx.cisd.openbis.generic.shared.ICommonServer; import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.ControlledVocabularyPropertyType; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet; +import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet.Connections; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Project; @@ -159,7 +161,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio public int getMinorVersion() { - return 5; + return 7; } private Map<String, List<RoleAssignmentPE>> getRoleAssignmentsPerSpace() @@ -271,19 +273,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio public List<DataSet> listDataSets(String sessionToken, List<Sample> samples) { - checkSession(sessionToken); - List<ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType> sampleTypes = - commonServer.listSampleTypes(sessionToken); - SampleToDataSetRelatedEntitiesTranslator translator = - new SampleToDataSetRelatedEntitiesTranslator(sampleTypes, samples); - DataSetRelatedEntities dsre = translator.convertToDataSetRelatedEntities(); - List<ExternalData> externalData = commonServer.listRelatedDataSets(sessionToken, dsre); - ArrayList<DataSet> dataSets = new ArrayList<DataSet>(externalData.size()); - for (ExternalData externalDatum : externalData) - { - dataSets.add(Translator.translate(externalDatum)); - } - return dataSets; + return listDataSets(sessionToken, samples, EnumSet.noneOf(Connections.class)); } public List<Experiment> listExperiments(String sessionToken, List<Project> projects, @@ -334,7 +324,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio ArrayList<DataSet> dataSets = new ArrayList<DataSet>(externalData.size()); for (ExternalData externalDatum : externalData) { - dataSets.add(Translator.translate(externalDatum)); + dataSets.add(Translator.translate(externalDatum, EnumSet.noneOf(Connections.class))); } return dataSets; } @@ -390,4 +380,22 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio } return vocabTerms; } + + public List<DataSet> listDataSets(String sessionToken, List<Sample> samples, + EnumSet<Connections> connectionsToGet) + { + checkSession(sessionToken); + List<ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType> sampleTypes = + commonServer.listSampleTypes(sessionToken); + SampleToDataSetRelatedEntitiesTranslator translator = + new SampleToDataSetRelatedEntitiesTranslator(sampleTypes, samples); + DataSetRelatedEntities dsre = translator.convertToDataSetRelatedEntities(); + List<ExternalData> externalData = commonServer.listRelatedDataSets(sessionToken, dsre); + ArrayList<DataSet> dataSets = new ArrayList<DataSet>(externalData.size()); + for (ExternalData externalDatum : externalData) + { + dataSets.add(Translator.translate(externalDatum, connectionsToGet)); + } + return dataSets; + } } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationServiceLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationServiceLogger.java index 6cdf8fe298811361fe16beeece8ba71a38b6fbe9..a797728095e821265a72e7a7c464e7534d8efd90 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationServiceLogger.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationServiceLogger.java @@ -16,6 +16,7 @@ package ch.systemsx.cisd.openbis.generic.server.api.v1; +import java.util.EnumSet; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -27,6 +28,7 @@ import ch.systemsx.cisd.openbis.generic.shared.AbstractServerLogger; import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.ControlledVocabularyPropertyType.VocabularyTerm; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet; +import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet.Connections; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Project; @@ -133,4 +135,13 @@ class GeneralInformationServiceLogger extends AbstractServerLogger implements return null; } + public List<DataSet> listDataSets(String sessionToken, List<Sample> samples, + EnumSet<Connections> connectionsToGet) + { + logAccess(sessionToken, "list-data-sets", "SAMPLES(%s) CONNECTIONS(%s)", samples, + connectionsToGet); + + return null; + } + } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/Translator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/Translator.java index 7bfd43015f4ede35a6ed7def86f3f8bd8f689069..2d2676e1a23ebea98859be3ce7d36b2f5ef03655 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/Translator.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/Translator.java @@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.server.api.v1; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.EnumSet; import java.util.HashMap; import java.util.List; import java.util.Set; @@ -26,6 +27,7 @@ import java.util.Set; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.ControlledVocabularyPropertyType; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.ControlledVocabularyPropertyType.ControlledVocabularyPropertyTypeInitializer; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet; +import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet.Connections; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet.DataSetInitializer; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType.DataSetTypeInitializer; @@ -205,7 +207,8 @@ public class Translator return terms; } - public static DataSet translate(ExternalData externalDatum) + public static DataSet translate(ExternalData externalDatum, + EnumSet<Connections> connectionsToGet) { DataSetInitializer initializer = new DataSetInitializer(); initializer.setCode(externalDatum.getCode()); @@ -219,6 +222,22 @@ public class Translator initializer.putProperty(prop.getPropertyType().getCode(), prop.getValue()); } + initializer.setRetrievedConnections(connectionsToGet); + for (Connections connection : connectionsToGet) + { + switch (connection) + { + case PARENTS: + ArrayList<String> parentCodes = new ArrayList<String>(); + for (ExternalData parentDatum : externalDatum.getParents()) + { + parentCodes.add(parentDatum.getCode()); + } + initializer.setParentCodes(parentCodes); + break; + } + } + return new DataSet(initializer); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/IGeneralInformationService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/IGeneralInformationService.java index 8dc591fe4d91e96e8b77b99f152a06d292ad4f7c..9be10d74becc9306496b18a98c2696bdc54c50b9 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/IGeneralInformationService.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/IGeneralInformationService.java @@ -16,6 +16,7 @@ package ch.systemsx.cisd.openbis.generic.shared.api.v1; +import java.util.EnumSet; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -26,6 +27,7 @@ import org.springframework.transaction.annotation.Transactional; import ch.systemsx.cisd.common.api.IRpcService; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.ControlledVocabularyPropertyType; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet; +import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet.Connections; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Project; @@ -184,4 +186,16 @@ public interface IGeneralInformationService extends IRpcService public HashMap<ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary, List<ControlledVocabularyPropertyType.VocabularyTerm>> getVocabularyTermsMap( String sessionToken); + /** + * Return all data sets attached to the given samples with connections. Available since minor + * version 7. + * + * @param samples The samples for which we return attached data sets. + * @since 1.7 + */ + @Transactional(readOnly = true) + @RolesAllowed(RoleWithHierarchy.INSTANCE_OBSERVER) + public List<DataSet> listDataSets(String sessionToken, List<Sample> samples, + EnumSet<Connections> connectionsToGet); + } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataSet.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataSet.java index d5ffec2588a89a0da8362ec46a27cbb7f28cf212..3b4deb5d717377ecabca72c85129ccbfb70cbffe 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataSet.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataSet.java @@ -17,7 +17,9 @@ package ch.systemsx.cisd.openbis.generic.shared.api.v1.dto; import java.io.Serializable; +import java.util.ArrayList; import java.util.Date; +import java.util.EnumSet; import java.util.HashMap; import org.apache.commons.lang.builder.EqualsBuilder; @@ -34,6 +36,11 @@ public final class DataSet implements Serializable { private static final long serialVersionUID = 1L; + public static enum Connections + { + PARENTS + } + /** * Class used to initialize a new data set instance. Necessary since all the fields of a DataSet * are final. @@ -52,6 +59,10 @@ public final class DataSet implements Serializable private Date registrationDate; + private EnumSet<Connections> retrievedConnections = EnumSet.noneOf(Connections.class); + + private ArrayList<String> parentCodes = new ArrayList<String>(); + private HashMap<String, String> properties = new HashMap<String, String>(); public String getCode() @@ -113,6 +124,28 @@ public final class DataSet implements Serializable { properties.put(propCode, value); } + + public void setRetrievedConnections(EnumSet<Connections> retrievedConnections) + { + this.retrievedConnections = + (null == retrievedConnections) ? EnumSet.noneOf(Connections.class) + : retrievedConnections; + } + + public EnumSet<Connections> getRetrievedConnections() + { + return retrievedConnections; + } + + public void setParentCodes(ArrayList<String> parentCodes) + { + this.parentCodes = (null == parentCodes) ? new ArrayList<String>() : parentCodes; + } + + public ArrayList<String> getParentCodes() + { + return parentCodes; + } } private final String code; @@ -127,6 +160,11 @@ public final class DataSet implements Serializable private final HashMap<String, String> properties; + // For handling connections to entities + private final EnumSet<Connections> retrievedConnections; + + private final ArrayList<String> parentCodes; + /** * Creates a new instance with the provided initializer * @@ -151,6 +189,9 @@ public final class DataSet implements Serializable this.registrationDate = initializer.getRegistrationDate(); this.properties = initializer.getProperties(); + + this.retrievedConnections = initializer.getRetrievedConnections(); + this.parentCodes = initializer.getParentCodes(); } private void checkValidString(String string, String message) throws IllegalArgumentException @@ -194,6 +235,16 @@ public final class DataSet implements Serializable return properties; } + public EnumSet<Connections> getRetrievedConnections() + { + return retrievedConnections; + } + + public ArrayList<String> getParentCodes() + { + return parentCodes; + } + @Override public boolean equals(Object obj) { @@ -229,6 +280,10 @@ public final class DataSet implements Serializable builder.append(getSampleIdentifierOrNull()); builder.append(getDataSetTypeCode()); builder.append(getProperties()); + if (retrievedConnections.contains(Connections.PARENTS)) + { + builder.append(getParentCodes()); + } return builder.toString(); } } diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java index 3ea3c9b08057822376b4baefea178856036b264a..f9dd3a1e5fa729c72c96ca2a37ff9aa5b93d5ad6 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java @@ -23,6 +23,7 @@ import static org.testng.AssertJUnit.fail; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.EnumSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -43,6 +44,7 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.PropertyTypeGroup; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Role; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria; +import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet.Connections; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseAttribute; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria; @@ -244,6 +246,30 @@ public class GeneralInformationServiceTest extends SystemTestCase assertEquals(true, result.size() > 0); } + @Test + public void testListDataSetsWithParentsForAllSamples() + { + // Search for Samples first + SearchCriteria sc = new SearchCriteria(); + List<Sample> samples = generalInformationService.searchForSamples(sessionToken, sc); + List<DataSet> result = + generalInformationService.listDataSets(sessionToken, samples, + EnumSet.of(Connections.PARENTS)); + assertEquals(true, result.size() > 0); + // See if some sample has parents + boolean parentCodesFound = false; + for (DataSet dataSet : result) + { + if (false == dataSet.getParentCodes().isEmpty()) + { + parentCodesFound = true; + break; + } + } + + assertTrue("No parent codes should have been found", (false == parentCodesFound)); + } + @Test public void testListDataSetsForSample() {