From 5bef88876aa7841fc42f7a91246634e773302335 Mon Sep 17 00:00:00 2001
From: vkovtun <viktor.kovtun@id.ethz.ch>
Date: Fri, 24 Nov 2023 15:08:48 +0100
Subject: [PATCH] BIS-772: Working on data export. Added a folder name
 generator.

---
 .../v3/executor/exporter/ExportExecutor.java  | 112 ++++++++++++++++--
 .../executor/exporter/ExportExecutorTest.java |  99 +++++++++++++++-
 2 files changed, 192 insertions(+), 19 deletions(-)

diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/exporter/ExportExecutor.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/exporter/ExportExecutor.java
index 3d820f3b51c..74980e16d6c 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/exporter/ExportExecutor.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/exporter/ExportExecutor.java
@@ -341,7 +341,15 @@ public class ExportExecutor implements IExportExecutor
             final EntitiesVo entitiesVo, final Set<String> existingZipEntries,
             final Map<String, Map<String, List<Map<String, String>>>> exportFields)
     {
-        final Collection<DataSet> dataSets = entitiesVo.getDataSets();
+//        final Collection<DataSet> dataSets = entitiesVo.getDataSets();
+        final Collection<Sample> samples = entitiesVo.getSamples();
+
+        for (final Sample sample : samples)
+        {
+            final List<DataSet> dataSets = sample.getDataSets();
+
+
+        }
     }
 
     private void exportSpacesDoc(final ZipOutputStream zos, final BufferedOutputStream bos, final String sessionToken,
@@ -826,6 +834,64 @@ public class ExportExecutor implements IExportExecutor
         return entryBuilder.toString();
     }
 
+    static String getFolderName(final char prefix, final String spaceCode, final String projectCode,
+            final String containerCode, final String entityCode, final String entityName)
+    {
+        if (prefix != 'O' && prefix != 'E')
+        {
+            throw new IllegalArgumentException("Only 'O' and 'E' can be used as prefix.");
+        }
+
+        final StringBuilder entryBuilder = new StringBuilder(String.valueOf(prefix));
+
+        if (spaceCode != null)
+        {
+            entryBuilder.append('+').append(spaceCode);
+        } else if (prefix == 'E')
+        {
+            throw new IllegalArgumentException("Space code cannot be null for experiments.");
+        } else if (projectCode != null)
+        {
+            throw new IllegalArgumentException("If space code is null project code should be also null.");
+        }
+
+        if (projectCode != null)
+        {
+            entryBuilder.append('+').append(projectCode);
+        } else if (prefix == 'E')
+        {
+            throw new IllegalArgumentException("Project code cannot be null for experiments.");
+        }
+
+        entryBuilder.append('+');
+
+        if (containerCode != null)
+        {
+            if (prefix == 'O')
+            {
+                entryBuilder.append(containerCode).append('*');
+            } else
+            {
+                throw new IllegalArgumentException("Only objects can have containers.");
+            }
+        }
+
+        if (entityCode != null)
+        {
+            entryBuilder.append(entityCode);
+        } else
+        {
+            throw new IllegalArgumentException();
+        }
+
+        if (entityName != null)
+        {
+            entryBuilder.append('+').append(entityName);
+        }
+
+        return entryBuilder.toString();
+    }
+
     private static void addFullEntityName(final StringBuilder entryBuilder, final String entityCode, final String entityName)
     {
         if (entityName == null || entityName.isEmpty())
@@ -1230,25 +1296,24 @@ public class ExportExecutor implements IExportExecutor
     private static class EntitiesVo
     {
 
-        final Collection<Space> spaces;
+        private final String sessionToken;
+
+        private final Map<ExportableKind, List<String>> groupedExportablePermIds;
 
-        final Collection<Project> projects;
+        private Collection<Space> spaces;
 
-        final Collection<Experiment> experiments;
+        private Collection<Project> projects;
 
-        final Collection<Sample> samples;
+        private Collection<Experiment> experiments;
 
-        final Collection<DataSet> dataSets;
+        private Collection<Sample> samples;
+
+        private Collection<DataSet> dataSets;
 
         private EntitiesVo(final String sessionToken, final List<ExportablePermId> exportablePermIds)
         {
-            final Map<ExportableKind, List<String>> groupedExportablePermIds = getGroupedExportablePermIds(exportablePermIds);
-
-            spaces = EntitiesFinder.getSpaces(sessionToken, groupedExportablePermIds.getOrDefault(ExportableKind.SPACE, List.of()));
-            projects = EntitiesFinder.getProjects(sessionToken, groupedExportablePermIds.getOrDefault(ExportableKind.PROJECT, List.of()));
-            experiments = EntitiesFinder.getExperiments(sessionToken, groupedExportablePermIds.getOrDefault(ExportableKind.EXPERIMENT, List.of()));
-            samples = EntitiesFinder.getSamples(sessionToken, groupedExportablePermIds.getOrDefault(ExportableKind.SAMPLE, List.of()));
-            dataSets = EntitiesFinder.getDataSets(sessionToken, groupedExportablePermIds.getOrDefault(DATASET, List.of()));
+            this.sessionToken = sessionToken;
+            groupedExportablePermIds = getGroupedExportablePermIds(exportablePermIds);
         }
 
         private static Map<ExportableKind, List<String>> getGroupedExportablePermIds(final List<ExportablePermId> exportablePermIds)
@@ -1266,26 +1331,47 @@ public class ExportExecutor implements IExportExecutor
 
         public Collection<Space> getSpaces()
         {
+            if (spaces == null)
+            {
+                spaces = EntitiesFinder.getSpaces(sessionToken, groupedExportablePermIds.getOrDefault(ExportableKind.SPACE, List.of()));
+            }
             return spaces;
         }
 
         public Collection<Project> getProjects()
         {
+            if (projects == null)
+            {
+                projects = EntitiesFinder.getProjects(sessionToken, groupedExportablePermIds.getOrDefault(ExportableKind.PROJECT, List.of()));
+            }
+
             return projects;
         }
 
         public Collection<Experiment> getExperiments()
         {
+            if (experiments == null)
+            {
+                experiments = EntitiesFinder.getExperiments(sessionToken, groupedExportablePermIds.getOrDefault(ExportableKind.EXPERIMENT, List.of()));
+            }
             return experiments;
         }
 
         public Collection<Sample> getSamples()
         {
+            if (samples == null)
+            {
+                samples = EntitiesFinder.getSamples(sessionToken, groupedExportablePermIds.getOrDefault(ExportableKind.SAMPLE, List.of()));
+            }
             return samples;
         }
 
         public Collection<DataSet> getDataSets()
         {
+            if (dataSets == null)
+            {
+                dataSets = EntitiesFinder.getDataSets(sessionToken, groupedExportablePermIds.getOrDefault(DATASET, List.of()));
+            }
             return dataSets;
         }
 
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/exporter/ExportExecutorTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/exporter/ExportExecutorTest.java
index 50daeacfd05..91c7eff9a0c 100644
--- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/exporter/ExportExecutorTest.java
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/exporter/ExportExecutorTest.java
@@ -30,6 +30,10 @@ public class ExportExecutorTest
 
     private static final String ERRONEOUS_NEXT_ZIP_ENTRY_DATA_PROVIDER = "erroneousNextZipEntryData";
 
+    private static final String FOLDER_NAME_DATA_PROVIDER = "folderNameData";
+
+    private static final String ERRONEOUS_FOLDER_NAME_DATA_PROVIDER = "erroneousFolderNameData";
+
     private static final String SPACE_CODE = "TEST_SPACE";
 
     private static final String PROJECT_CODE = "TEST_PROJECT";
@@ -46,7 +50,7 @@ public class ExportExecutorTest
 
     private static final String DATA_SET_CODE = "TEST_DATA_SET";
 
-    private static final Object[][] DATA = {
+    private static final Object[][] NEXT_ZIP_ENTRY_DATA = {
             {
                     null, null, null, null, null, null, null, null,
                     String.format("%s/", PDF_DIRECTORY)
@@ -179,7 +183,7 @@ public class ExportExecutorTest
             },
     };
 
-    private static final Object[][] ERRONEOUS_DATA = {
+    private static final Object[][] ERRONEOUS_NEXT_ZIP_ENTRY_DATA = {
             {
                     null, PROJECT_CODE, null, null, null, null, null, null
             },
@@ -209,16 +213,84 @@ public class ExportExecutorTest
             },
     };
 
+    private static final Object[][] FOLDER_NAME_DATA = {
+            {
+                    'O', "SPACE", "PROJECT", null, "CODE_A", "NAME_A", "O+SPACE+PROJECT+CODE_A+NAME_A"
+            },
+            {
+                    'O', "SPACE", null, null, "CODE_A", "NAME_A", "O+SPACE+CODE_A+NAME_A"
+            },
+            {
+                    'O', null, null, null, "CODE_A", "NAME_A", "O+CODE_A+NAME_A"
+            },
+            {
+                    'E', "SPACE", "PROJECT", null, "CODE_A", null, "E+SPACE+PROJECT+CODE_A"
+            },
+            {
+                    'O', "SPACE", "PROJECT", "CODE_B", "CODE_A", "NAME_A", "O+SPACE+PROJECT+CODE_B*CODE_A+NAME_A"
+            },
+    };
+
+    private static final Object[][] ERRONEOUS_FOLDER_NAME_DATA = {
+            {
+                    'P', "SPACE", "PROJECT", null, "CODE_A", "NAME_A"
+            },
+            {
+                    'O', null, "PROJECT", null, "CODE_A", "NAME_A"
+            },
+            {
+                    'O', "SPACE", "PROJECT", null, null, "NAME_A"
+            },
+            {
+                    'O', "SPACE", "PROJECT", null, null, null
+            },
+            {
+                    'O', "SPACE", "PROJECT", "CODE_B", null, "NAME_A"
+            },
+            {
+                    'O', "SPACE", "PROJECT", "CODE_B", null, null
+            },
+
+            {
+                    // Experiments cannot have containers
+                    'E', "SPACE", "PROJECT", "CODE_B", "CODE_A", null
+            },
+            {
+                    // Experiments cannot have containers
+                    'E', "SPACE", "PROJECT", "CODE_B", "CODE_A", "NAME_A"
+            },
+            {
+                    // Experiments cannot be on the space level
+                    'E', "SPACE", null, null, "CODE_A", "NAME_A"
+            },
+            {
+                    // Experiments cannot be standalone
+                    'E', null, null, null, "CODE_A", "NAME_A"
+            },
+    };
+
     @DataProvider
-    protected Object[][] nextZipEntryData()
+    private Object[][] nextZipEntryData()
     {
-        return DATA;
+        return NEXT_ZIP_ENTRY_DATA;
     }
 
     @DataProvider
-    protected Object[][] erroneousNextZipEntryData()
+    private Object[][] erroneousNextZipEntryData()
     {
-        return ERRONEOUS_DATA;
+        return ERRONEOUS_NEXT_ZIP_ENTRY_DATA;
+    }
+
+    @DataProvider
+    private Object[][] folderNameData()
+    {
+        return FOLDER_NAME_DATA;
+    }
+
+    @DataProvider
+    private Object[][] erroneousFolderNameData()
+    {
+        return ERRONEOUS_FOLDER_NAME_DATA;
     }
 
     @Test(dataProvider = NEXT_ZIP_ENTRY_DATA_PROVIDER)
@@ -236,4 +308,19 @@ public class ExportExecutorTest
         ExportExecutor.getNextDocZipEntry(spaceCode, projectCode, experimentCode, experimentName, sampleCode, sampleName, dataSetCode, extension);
     }
 
+    @Test(dataProvider = FOLDER_NAME_DATA_PROVIDER)
+    public void testGetFolderName(final char prefix, final String spaceCode, final String projectCode,
+            final String containerCode, final String entityCode, final String entityName, final String expectedResult)
+    {
+        assertEquals(ExportExecutor.getFolderName(prefix, spaceCode, projectCode, containerCode, entityCode, entityName),
+                expectedResult);
+    }
+
+    @Test(dataProvider = ERRONEOUS_FOLDER_NAME_DATA_PROVIDER, expectedExceptions = IllegalArgumentException.class)
+    public void testGetFolderNameError(final char prefix, final String spaceCode, final String projectCode,
+            final String containerCode, final String entityCode, final String entityName)
+    {
+        ExportExecutor.getFolderName(prefix, spaceCode, projectCode, containerCode, entityCode, entityName);
+    }
+
 }
\ No newline at end of file
-- 
GitLab