From 59fbdef3b1cfc36c7fe45b5eb92921ed4cf9dba0 Mon Sep 17 00:00:00 2001
From: jakubs <jakubs>
Date: Wed, 3 Oct 2012 11:06:49 +0000
Subject: [PATCH] SP-299 BIS-211 add filter for storage confirmed datasets in
 general information service

SVN: 26947
---
 .../api/v1/GeneralInformationService.java      |  5 +++--
 ...DataSetByExperimentIdentifierValidator.java | 18 ++++++++++--------
 .../StorageConfirmedForAdminValidator.java     | 11 ++++++++---
 .../datasetlister/DataSetLister.java           |  5 +++++
 .../datasetlister/DataSetRecord.java           |  2 ++
 .../datasetlister/IDataSetListingQuery.java    |  2 ++
 .../generic/shared/api/v1/Translator.java      |  2 ++
 .../GeneralInformationServiceJsonApiTest.java  | 17 +++++++++++++++++
 .../sql/postgresql/122/030=external_data.tsv   |  2 +-
 9 files changed, 50 insertions(+), 14 deletions(-)

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 ad3415a3007..77a9be667a8 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
@@ -864,12 +864,13 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
 
         // filter by user
         final PersonPE person = getDAOFactory().getPersonDAO().tryFindPersonByUserId(userId);
-        final DataSetByExperimentIdentifierValidator validator =
+        final DataSetByExperimentIdentifierValidator experimentIdentifierValidator =
                 new DataSetByExperimentIdentifierValidator();
+
         final ArrayList<DataSet> dataSets = new ArrayList<DataSet>(allDataSets.size());
         for (DataSet dataSet : allDataSets)
         {
-            if (validator.doValidation(person, dataSet))
+            if (experimentIdentifierValidator.doValidation(person, dataSet))
             {
                 dataSets.add(dataSet);
             }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/DataSetByExperimentIdentifierValidator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/DataSetByExperimentIdentifierValidator.java
index 4556eff6263..2507f9e9bca 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/DataSetByExperimentIdentifierValidator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/DataSetByExperimentIdentifierValidator.java
@@ -32,14 +32,16 @@ public class DataSetByExperimentIdentifierValidator extends AbstractValidator<Da
     @Override
     public boolean doValidation(PersonPE person, final DataSet value)
     {
-        return validator.isValid(person, new IIdentifierHolder()
-            {
-                @Override
-                public String getIdentifier()
-                {
-                    return value.getExperimentIdentifier();
-                }
-            });
+
+        return StorageConfirmedForAdminValidator.isValid(person, value.isStorageConfirmed())
+                && validator.isValid(person, new IIdentifierHolder()
+                    {
+                        @Override
+                        public String getIdentifier()
+                        {
+                            return value.getExperimentIdentifier();
+                        }
+                    });
     }
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/StorageConfirmedForAdminValidator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/StorageConfirmedForAdminValidator.java
index 52a86b7f003..07cf24091a9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/StorageConfirmedForAdminValidator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/StorageConfirmedForAdminValidator.java
@@ -21,13 +21,13 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.RoleAssignmentPE;
 
 /**
- * @author Franz-Josef Elmer
+ * @author Jakub Straszewski
  */
 public class StorageConfirmedForAdminValidator extends
         AbstractValidator<ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData>
 {
 
-    private boolean isPersonAllowedForNotConfirmed(PersonPE person)
+    private static boolean isPersonAllowedForNotConfirmed(PersonPE person)
     {
         for (RoleAssignmentPE role : person.getAllPersonRoles())
         {
@@ -39,10 +39,15 @@ public class StorageConfirmedForAdminValidator extends
         return false;
     }
 
+    public static boolean isValid(PersonPE person, boolean isStorageConfirmed)
+    {
+        return isStorageConfirmed || isPersonAllowedForNotConfirmed(person);
+    }
+
     @Override
     public boolean doValidation(PersonPE person,
             ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData value)
     {
-        return value.isStorageConfirmation() || isPersonAllowedForNotConfirmed(person);
+        return isValid(person, value.isStorageConfirmation());
     }
 }
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 958f643f9ee..bc1aab89116 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
@@ -173,6 +173,11 @@ public class DataSetLister implements IDataSetLister
         initializer.setDataSetTypeCode(dataSet.dt_code);
         initializer.setContainerDataSet(DataSetKind.CONTAINER.name().equals(
                 dataSet.dt_data_set_kind));
+        initializer.setStorageConfirmed(dataSet.ed_sc == null || dataSet.ed_sc); // if there's no
+                                                                                 // external data
+                                                                                 // than the storage
+                                                                                 // is considered
+                                                                                 // confirmed
         initializer.setLinkDataSet(DataSetKind.LINK.name().equals(dataSet.dt_data_set_kind));
         if (initializer.isLinkDataSet())
         {
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 ed9c22a20cd..515920cd652 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
@@ -36,6 +36,8 @@ public class DataSetRecord
 
     public String dt_data_set_kind;
 
+    public Boolean ed_sc;
+
     public String ex_code;
 
     public String sa_code;
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 67ee0e2aab0..1870ea93c6d 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
@@ -37,6 +37,7 @@ public interface IDataSetListingQuery extends BaseQuery
             + " ds.modification_timestamp as ds_modification_timestamp,"
             + " dt.code as dt_code, dt.data_set_kind as dt_data_set_kind,"
             + " 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,"
             + " pe.first_name as pe_first_name, pe.last_name as pe_last_name, pe.email as pe_email, pe.user_id as pe_user_id,"
             + " mod.first_name as mod_first_name, mod.last_name as mod_last_name, mod.email as mod_email, mod.user_id as mod_user_id,"
@@ -45,6 +46,7 @@ public interface IDataSetListingQuery extends BaseQuery
             + " ld.external_code as ld_external_code, edms.id as edms_id, edms.code as edms_code, edms.label as edms_label, edms.url_template as edms_url_template, edms.is_openbis as edms_is_openbis"
             + " from data ds inner join data_set_types dt on ds.dsty_id = dt.id"
             + " inner join experiments ex on ds.expe_id = ex.id"
+            + " left outer join external_data ed on ds.id = ed.data_id"
             + " left outer join link_data ld on ds.id = ld.data_id"
             + " left outer join external_data_management_systems edms on ld.edms_id = edms.id"
             + " left outer join samples sa on ds.samp_id = sa.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 87a8c6831fa..75bca955dac 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
@@ -342,6 +342,8 @@ public class Translator
         initializer.setExperimentIdentifier(externalDatum.getExperiment().getIdentifier());
         initializer.setSampleIdentifierOrNull(externalDatum.getSampleIdentifier());
         initializer.setDataSetTypeCode(externalDatum.getDataSetType().getCode());
+        initializer.setStorageConfirmed(externalDatum.isStorageConfirmation());
+
         List<IEntityProperty> properties = externalDatum.getProperties();
         for (IEntityProperty prop : properties)
         {
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceJsonApiTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceJsonApiTest.java
index 4cfffcdcceb..743daa4b38b 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceJsonApiTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceJsonApiTest.java
@@ -68,6 +68,8 @@ public class GeneralInformationServiceJsonApiTest extends RemoteApiTestCase
 
     protected String sessionToken;
 
+    protected String userSessionToken;
+
     protected IGeneralInformationService createService()
     {
         return TestJsonServiceFactory.createGeneralInfoService();
@@ -78,6 +80,8 @@ public class GeneralInformationServiceJsonApiTest extends RemoteApiTestCase
     {
         generalInformationService = createService();
         sessionToken = generalInformationService.tryToAuthenticateForAllServices("test", "a");
+        userSessionToken =
+                generalInformationService.tryToAuthenticateForAllServices("test_role", "a");
     }
 
     @AfterMethod
@@ -327,6 +331,19 @@ public class GeneralInformationServiceJsonApiTest extends RemoteApiTestCase
         assertEquals(true, result.size() > 0);
     }
 
+    @Test
+    public void testListDataSetsForSampleForRegularUserDoesntIncludeStorageNonConfirmed()
+    {
+        // Search for Samples first
+        SearchCriteria sc = new SearchCriteria();
+        sc.addMatchClause(MatchClause.createPropertyMatch("ORGANISM", "HUMAN"));
+        List<Sample> samples = generalInformationService.searchForSamples(userSessionToken, sc);
+        List<DataSet> result =
+                generalInformationService.listDataSetsForSample(userSessionToken, samples.get(0),
+                        true);
+        assertEquals(0, result.size());
+    }
+
     @Test
     public void testListDataSetsForEmptySampleList()
     {
diff --git a/openbis/sourceTest/sql/postgresql/122/030=external_data.tsv b/openbis/sourceTest/sql/postgresql/122/030=external_data.tsv
index 62d8e8972a9..3b5f306416e 100644
--- a/openbis/sourceTest/sql/postgresql/122/030=external_data.tsv
+++ b/openbis/sourceTest/sql/postgresql/122/030=external_data.tsv
@@ -1,6 +1,6 @@
 2	xxx/yyy/zzz	1	1	4	U	\N	AVAILABLE	\N	\N	f	-50	t
 4	analysis/result	2	1	4	U	\N	AVAILABLE	\N	\N	f	-50	t
-5	a/1	1	1	4	U	\N	AVAILABLE	42	4711	f	42	t
+5	a/1	1	1	4	U	\N	AVAILABLE	42	4711	f	42	f
 6	a/2	2	1	4	U	\N	AVAILABLE	\N	\N	f	-50	t
 7	a/3	3	1	4	U	\N	AVAILABLE	\N	\N	f	-50	t
 8	xml/result-8	8	1	4	U	\N	AVAILABLE	\N	\N	f	-50	t
-- 
GitLab