From 39fc47174eb5d51c69dd4f0dc3ae9c0c70142064 Mon Sep 17 00:00:00 2001
From: brinn <brinn>
Date: Thu, 15 Nov 2012 21:06:50 +0000
Subject: [PATCH] [BIS-265] Extend OpenBisServiceFacade to provide the dataset
 container for a given dataset.

SVN: 27654
---
 .../openbis/dss/client/api/v1/DataSet.java    | 23 ++++++++++++++
 .../api/v1/ISimpleOpenbisServiceFacade.java   |  5 ++++
 .../api/v1/impl/OpenbisServiceFacade.java     |  9 ++++++
 .../api/v1/GeneralInformationService.java     |  2 +-
 .../datasetlister/DataSetLister.java          |  8 +++++
 .../datasetlister/DataSetRecord.java          |  4 +++
 .../datasetlister/IDataSetListingQuery.java   |  2 ++
 .../generic/shared/api/v1/Translator.java     |  5 ++++
 .../datasetlister/DataSetListerTest.java      | 23 ++++++++++++++
 .../generic/shared/api/v1/dto/DataSet.java    | 30 ++++++++++++++++++-
 10 files changed, 109 insertions(+), 2 deletions(-)

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 0310df4a857..5d488340c6b 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 ad92c157912..9604766e8b9 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 36b32cfc5e8..936f6b8b7b2 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 43da0d55710..7a5681f52c1 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 4cd44087b68..86c1bfd3f90 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 515920cd652..c71062c23fe 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 9c5c51b1eae..e6e398623e1 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 eeb55e97622..1437ac8226d 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 2d371bf7e70..81264ec3fc8 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 72fd5258859..afc637eab6e 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;
-- 
GitLab