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