diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/v1/DataSet.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/v1/DataSet.java index 0310df4a857ac242106c8d7cca2e84e4dfc3a765..5d488340c6bcd737d3f8608740cc996a9ce025ff 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/v1/DataSet.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/v1/DataSet.java @@ -42,6 +42,8 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalDataManagementS */ public class DataSet { + private static final int MINIMAL_MINOR_VERSION_DELIVERING_CONTAINER = 20; + private final IOpenbisServiceFacade facade; private final IDssComponent dssComponent; @@ -205,6 +207,27 @@ public class DataSet return getMetadata().getExternalDataManagementSystem(); } + /** + * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet#getContainerOrNull() + */ + @Retry + public DataSet getContainerOrNull() + { + final DataSet containerOrNull = (getMetadata().getContainerOrNull() != null) ? + new DataSet(facade, dssComponent, getMetadata().getContainerOrNull(), null) : null; + return containerOrNull; + } + + /** + * Returns <code>true</code>, if result of {@link #getContainerOrNull()} can be trusted and + * <code>false</code>, if it cannot be trusted because the server is too old to deliver this + * information. + */ + public boolean knowsContainer() + { + return facade.getMinorVersionInformationService() >= MINIMAL_MINOR_VERSION_DELIVERING_CONTAINER; + } + /** * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet#getContainedDataSets() */ diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/v1/ISimpleOpenbisServiceFacade.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/v1/ISimpleOpenbisServiceFacade.java index ad92c15791224b289972e344c57c8f361d130844..9604766e8b960abb6db63d35f5f0b051936b370c 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/v1/ISimpleOpenbisServiceFacade.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/v1/ISimpleOpenbisServiceFacade.java @@ -48,6 +48,11 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Vocabulary; public interface ISimpleOpenbisServiceFacade { + /** + * Returns the minor version of the general information service. + */ + public int getMinorVersionInformationService(); + /** * Returns all available projects. */ diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/v1/impl/OpenbisServiceFacade.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/v1/impl/OpenbisServiceFacade.java index 36b32cfc5e8673d2dc37285febca2336b11a4051..936f6b8b7b28ee19dbfef1d75a13675483e0e96c 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/v1/impl/OpenbisServiceFacade.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/v1/impl/OpenbisServiceFacade.java @@ -174,6 +174,8 @@ public class OpenbisServiceFacade implements IOpenbisServiceFacade private final IDssComponent dssComponent; + private final int minorVersionInformationService; + private final int minorVersionChangingService; public OpenbisServiceFacade(String sessionToken, IGeneralInformationService service, @@ -181,6 +183,7 @@ public class OpenbisServiceFacade implements IOpenbisServiceFacade { this.sessionToken = sessionToken; this.service = service; + this.minorVersionInformationService = service.getMinorVersion(); this.changingService = changingService; this.minorVersionChangingService = changingService.getMinorVersion(); this.dssComponent = dssComponent; @@ -519,6 +522,12 @@ public class OpenbisServiceFacade implements IOpenbisServiceFacade } } + @Override + public int getMinorVersionInformationService() + { + return minorVersionInformationService; + } + // // IOpenbisServiceFacade // 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 43da0d55710b8dbc75753491f6ea3cb5cfb0cbb0..7a5681f52c17abdf781f930d2b64dee1f55ac939 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 @@ -223,7 +223,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio @Override public int getMinorVersion() { - return 19; + return 20; } private Map<String, List<RoleAssignmentPE>> getRoleAssignmentsPerSpace() diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/DataSetLister.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/DataSetLister.java index 4cd44087b6855f569341d8560d6b62e4eb3b7e46..86c1bfd3f900306d4890d6413abb328f14dbf805 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/DataSetLister.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/DataSetLister.java @@ -210,6 +210,14 @@ public class DataSetLister implements IDataSetLister edms.setOpenBIS(dataSet.edms_is_openbis); initializer.setExternalDataManagementSystem(edms); } + if (dataSet.ctnr_id != null) + { + final DataSetInitializer containerInitializer = new DataSetInitializer(); + containerInitializer.setStub(true); + containerInitializer.setId(dataSet.ctnr_id); + containerInitializer.setCode(dataSet.ctnr_code); + initializer.setContainerOrNull(new DataSet(containerInitializer)); + } initializer.setRegistrationDetails(createDataSetRegistrationDetails(dataSet)); initializer.setExperimentIdentifier(experimentIdentifier.toString()); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/DataSetRecord.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/DataSetRecord.java index 515920cd652fdf8c24727df89714d51e7225aa29..c71062c23fead5512c11f9c7c71be4353bdde3b7 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/DataSetRecord.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/DataSetRecord.java @@ -32,6 +32,10 @@ public class DataSetRecord public Date ds_modification_timestamp; + public Long ctnr_id; + + public String ctnr_code; + public String dt_code; public String dt_data_set_kind; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/IDataSetListingQuery.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/IDataSetListingQuery.java index 9c5c51b1eaede3a39e00a1312dc2982cbdb241e9..e6e398623e147295f3d2e4538b5935262034d918 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/IDataSetListingQuery.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/IDataSetListingQuery.java @@ -36,6 +36,7 @@ public interface IDataSetListingQuery extends BaseQuery + " ds.id as ds_id, ds.code as ds_code, ds.registration_timestamp as ds_registration_timestamp," + " ds.modification_timestamp as ds_modification_timestamp," + " dt.code as dt_code, dt.data_set_kind as dt_data_set_kind," + + " ctnr.id as ctnr_id, ctnr.code as ctnr_code," + " ex.code as ex_code, " + " ed.storage_confirmation as ed_sc," + " sa.code as sa_code, sa.dbin_id as sa_dbin_id, sac.code as sac_code," @@ -52,6 +53,7 @@ public interface IDataSetListingQuery extends BaseQuery + " left outer join samples sa on ds.samp_id = sa.id" + " left outer join persons pe on ds.pers_id_registerer = pe.id" + " left outer join persons mod on ds.pers_id_modifier = mod.id" + + " left outer join data ctnr on ds.ctnr_id = ctnr.id" + " inner join projects pre on ex.proj_id = pre.id" + " inner join spaces spe on pre.space_id = spe.id" + " inner join database_instances die on spe.dbin_id = die.id" diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/Translator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/Translator.java index eeb55e97622008ae722ae8c96a44bcbc4e7cdf54..1437ac8226dbf6673c634abaa604b0644be3dd3d 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/Translator.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/Translator.java @@ -380,6 +380,11 @@ public class Translator { initializer.putProperty(prop.getPropertyType().getCode(), prop.tryGetAsString()); } + if (externalDatum.tryGetContainer() != null) + { + initializer.setContainerOrNull(translate(externalDatum.tryGetContainer(), + connectionsToGet)); + } initializer.setContainerDataSet(externalDatum.isContainer()); if (externalDatum.isContainer()) diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/DataSetListerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/DataSetListerTest.java index 2d371bf7e70431c7b77f211b933863c6c0678b5c..81264ec3fc80e81bca566cc1361c2d9c0d39ae0c 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/DataSetListerTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/DataSetListerTest.java @@ -120,6 +120,29 @@ public class DataSetListerTest extends AbstractDAOTest assertEqualToDataSetMetaDataWithCodes(codes, fetchOptions, result); } + @Test + public void testGetDataSetMetaDataForContainedDataSets() + { + List<String> codes = new ArrayList<String>(); + codes.add("20110509092359990-11"); + codes.add("20110509092359990-12"); + codes.add("VALIDATIONS_IMPOS-27"); + DataSetFetchOptions fetchOptions = new DataSetFetchOptions(); + + List<DataSet> result = lister.getDataSetMetaData(codes, fetchOptions); + + assertNotNull(result.get(0).getContainerOrNull()); + assertNotNull(result.get(1).getContainerOrNull()); + assertNotNull(result.get(2).getContainerOrNull()); + + assertEquals(13, result.get(0).getContainerOrNull().getId().longValue()); + assertEquals("20110509092359990-10", result.get(0).getContainerOrNull().getCode()); + assertEquals(13, result.get(1).getContainerOrNull().getId().longValue()); + assertEquals("20110509092359990-10", result.get(1).getContainerOrNull().getCode()); + assertEquals(26, result.get(2).getContainerOrNull().getId().longValue()); + assertEquals("VALIDATIONS_CNTNR-26", result.get(2).getContainerOrNull().getCode()); + } + @Test public void testGetDataStoreURLs() { diff --git a/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataSet.java b/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataSet.java index 72fd52588593a6ae64e9486e680107f37b072e8d..afc637eab6e1b0cad5eeaa966ee5969c7c8e3839 100644 --- a/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataSet.java +++ b/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataSet.java @@ -74,7 +74,7 @@ public final class DataSet implements Serializable, IIdHolder private String dataSetTypeCode; private boolean containerDataSet; - + private boolean linkDataSet; private String externalDataSetCode; @@ -91,6 +91,8 @@ public final class DataSet implements Serializable, IIdHolder private List<DataSet> containedDataSets = Collections.emptyList(); + private DataSet containerOrNull; + private HashMap<String, String> properties = new HashMap<String, String>(); private List<Metaproject> metaprojects = new ArrayList<Metaproject>(); @@ -234,6 +236,16 @@ public final class DataSet implements Serializable, IIdHolder (null == containedDataSets) ? new ArrayList<DataSet>() : containedDataSets; } + public DataSet getContainerOrNull() + { + return containerOrNull; + } + + public void setContainerOrNull(DataSet containerOrNull) + { + this.containerOrNull = containerOrNull; + } + public boolean isLinkDataSet() { return linkDataSet; @@ -325,6 +337,8 @@ public final class DataSet implements Serializable, IIdHolder private List<String> childrenCodes = Collections.emptyList(); private List<DataSet> containedDataSets = Collections.emptyList(); + + private DataSet containerOrNull; private EntityRegistrationDetails registrationDetails; @@ -369,6 +383,7 @@ public final class DataSet implements Serializable, IIdHolder "Unspecified entity registration details."); this.registrationDetails = initializer.getRegistrationDetails(); this.containerDataSet = initializer.isContainerDataSet(); + this.containerOrNull = initializer.getContainerOrNull(); this.containedDataSets = initializer.getContainedDataSets(); this.linkDataSet = initializer.isLinkDataSet(); this.externalDataSetCode = initializer.getExternalDataSetCode(); @@ -501,6 +516,14 @@ public final class DataSet implements Serializable, IIdHolder return containerDataSet; } + /** + * @since 1.20 + */ + public DataSet getContainerOrNull() + { + return containerOrNull; + } + public boolean isLinkDataSet() { return linkDataSet; @@ -637,6 +660,11 @@ public final class DataSet implements Serializable, IIdHolder this.containerDataSet = containerDataSet; } + private void setContainerOrNull(DataSet containerOrNull) + { + this.containerOrNull = containerOrNull; + } + private void setLinkDataSet(boolean linkDataSet) { this.linkDataSet = linkDataSet;