From 10e2cfc5f393b39e80d598e44b4f2edfa1e802d7 Mon Sep 17 00:00:00 2001
From: felmer <franz-josef.elmer@id.ethz.ch>
Date: Tue, 19 Nov 2019 11:22:57 +0100
Subject: [PATCH] SSDM-8929: ArchivingAggreationService output: Error included
 and jsonized result

---
 .../standard/ArchivingAggregationService.java | 68 ++++++++++++-------
 .../ArchivingAggregationServiceTest.java      | 47 ++++++++++---
 2 files changed, 82 insertions(+), 33 deletions(-)

diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/ArchivingAggregationService.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/ArchivingAggregationService.java
index 0af92334103..8817c392777 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/ArchivingAggregationService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/ArchivingAggregationService.java
@@ -30,10 +30,14 @@ import java.util.TreeMap;
 import java.util.TreeSet;
 import java.util.stream.Collectors;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
+
 import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.DataSet;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.fetchoptions.DataSetFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id.DataSetPermId;
+import ch.ethz.sis.openbis.generic.server.sharedapi.v3.json.GenericObjectMapper;
+import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.dss.generic.shared.DataSetProcessingContext;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IArchiverPlugin;
@@ -49,13 +53,10 @@ import ch.systemsx.cisd.openbis.generic.shared.util.SimpleTableModelBuilder;
 public class ArchivingAggregationService extends AggregationService
 {
     static final String METHOD_KEY = "method";
+
     static final String ARGS_KEY = "args";
-    static final String GET_ARCHIVING_INFO_METHOD = "getArchivingInfo";
-    private static final String DATA_SET_COLUMN = "DataSet";
-    private static final String SIZE_COLUMN = "Size";
-    private static final String CONTAINER_SIZE_COLUMN = "ContainerSize";
-    private static final String CONTAINER_COLUMN = "Container";
 
+    static final String GET_ARCHIVING_INFO_METHOD = "getArchivingInfo";
 
     private static final long serialVersionUID = 1L;
 
@@ -74,17 +75,24 @@ public class ArchivingAggregationService extends AggregationService
         this.v3api = v3api;
         this.archiver = archiver;
     }
-    
+
     @Override
     public TableModel createAggregationReport(Map<String, Object> parameters, DataSetProcessingContext context)
     {
-        Object method = parameters.get(METHOD_KEY);
-        List<String> arguments = getArguments(parameters);
-        if (GET_ARCHIVING_INFO_METHOD.equals(method))
+        try
+        {
+            Object method = parameters.get(METHOD_KEY);
+            List<String> arguments = getArguments(parameters);
+            if (GET_ARCHIVING_INFO_METHOD.equals(method))
+            {
+                return getArchivingInfo(context.trySessionToken(), arguments);
+            }
+            throw new UserFailureException("Unknown method '" + method + "'.");
+        } catch (Throwable e)
         {
-            return getArchivingInfo(context.trySessionToken(), arguments);
+            logInvocationError(parameters, e);
+            return errorTableModel(parameters, e);
         }
-        throw new UserFailureException("Unknown method '" + method + "'.");
     }
 
     private TableModel getArchivingInfo(String sessionToken, List<String> dataSetCodes)
@@ -95,24 +103,34 @@ public class ArchivingAggregationService extends AggregationService
         Map<String, Long> containerSizes = getContainerSizes(containersByDataSetCode, dataSetSizes);
         long totalSize = getTotalSize(allDataSets, dataSetSizes);
 
-        SimpleTableModelBuilder builder = new SimpleTableModelBuilder(true);
-        builder.addHeader(DATA_SET_COLUMN);
-        builder.addHeader(SIZE_COLUMN);
-        builder.addHeader(CONTAINER_COLUMN);
-        builder.addHeader(CONTAINER_SIZE_COLUMN);
-        Set<Entry<String, Set<String>>> entrySet = containersByDataSetCode.entrySet();
-        for (Entry<String, Set<String>> entry : entrySet)
+        Map<String, Object> infos = new TreeMap<>();
+        infos.put("total size", totalSize);
+        for (Entry<String, Set<String>> entry : containersByDataSetCode.entrySet())
         {
-            IRowBuilder row = builder.addRow();
+            Map<String, Object> info = new TreeMap<>();
             String dataSetCode = entry.getKey();
-            row.setCell(DATA_SET_COLUMN, dataSetCode);
-            row.setCell(SIZE_COLUMN, dataSetSizes.get(dataSetCode));
-            row.setCell(CONTAINER_COLUMN, String.join(",", entry.getValue()));
-            row.setCell(CONTAINER_SIZE_COLUMN, containerSizes.get(dataSetCode));
+            info.put("size", dataSetSizes.get(dataSetCode));
+            info.put("container", entry.getValue());
+            info.put("container size", containerSizes.get(dataSetCode));
+            infos.put(dataSetCode, info);
         }
-        IRowBuilder row = builder.addRow();
-        row.setCell(SIZE_COLUMN, totalSize);
 
+        SimpleTableModelBuilder builder = new SimpleTableModelBuilder(true);
+        builder.addHeader("STATUS");
+        builder.addHeader("MESSAGE");
+        builder.addHeader("RESULT");
+        IRowBuilder row = builder.addRow();
+        row.setCell("STATUS","OK");
+        row.setCell("MESSAGE", "Operation Successful");
+        GenericObjectMapper objectMapper = new GenericObjectMapper();
+        try
+        {
+            String jsonValue = objectMapper.writeValueAsString(infos);
+            row.setCell("RESULT", jsonValue);
+        } catch (JsonProcessingException e)
+        {
+            throw CheckedExceptionTunnel.wrapIfNecessary(e);
+        }
         return builder.getTableModel();
     }
 
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/ArchivingAggregationServiceTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/ArchivingAggregationServiceTest.java
index 4504917eb64..5ebed489192 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/ArchivingAggregationServiceTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/ArchivingAggregationServiceTest.java
@@ -42,6 +42,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.fetchoptions.DataSetFetc
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id.DataSetPermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id.IDataSetId;
 import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.mail.IMailClient;
 import ch.systemsx.cisd.common.test.RecordingMatcher;
 import ch.systemsx.cisd.openbis.dss.generic.shared.DataSetProcessingContext;
@@ -101,10 +102,11 @@ public class ArchivingAggregationServiceTest extends AbstractFileSystemTestCase
         List<TableModelRow> rows = service.createAggregationReport(parameters, processingContext).getRows();
 
         // Then
-        assertEquals("[[ds1, 10000, ds1, 10000]]\n"
-                + "[[ds2, 10010, ds2, 10010]]\n"
-                + "[[ds3, 10020, ds3, 10020]]\n"
-                + "[[, 30030, , ]]\n", renderRows(rows));
+        assertEquals("[[OK, Operation Successful, "
+                + "{\"ds1\":{\"container\":[\"ds1\"],\"container size\":10000,\"size\":10000},"
+                + "\"ds2\":{\"container\":[\"ds2\"],\"container size\":10010,\"size\":10010},"
+                + "\"ds3\":{\"container\":[\"ds3\"],\"container size\":10020,\"size\":10020},"
+                + "\"total size\":30030}]]\n", renderRows(rows));
         assertEquals("[DS1, DS2, DS3]", actualDataSetsMatcher.recordedObject().toString());
         context.assertIsSatisfied();
     }
@@ -125,14 +127,32 @@ public class ArchivingAggregationServiceTest extends AbstractFileSystemTestCase
         List<TableModelRow> rows = service.createAggregationReport(parameters, processingContext).getRows();
 
         // Then
-        assertEquals("[[ds1, 10000, ds1,ds10,ds9, 30060]]\n"
-                + "[[ds2, 10020, ds2,ds3,ds4, 30090]]\n"
-                + "[[ds3, 10040, ds2,ds3,ds4, 30090]]\n"
-                + "[[, 60150, , ]]\n", renderRows(rows));
+        assertEquals("[[OK, Operation Successful, "
+                + "{\"ds1\":{\"container\":[\"ds1\",\"ds10\",\"ds9\"],\"container size\":30060,\"size\":10000},"
+                + "\"ds2\":{\"container\":[\"ds2\",\"ds3\",\"ds4\"],\"container size\":30090,\"size\":10020},"
+                + "\"ds3\":{\"container\":[\"ds2\",\"ds3\",\"ds4\"],\"container size\":30090,\"size\":10040},"
+                + "\"total size\":60150}]]\n", renderRows(rows));
         assertEquals("[DS1, DS10, DS2, DS3, DS4, DS9]", actualDataSetsMatcher.recordedObject().toString());
         context.assertIsSatisfied();
     }
 
+    @Test
+    public void testTooLargeToUnarchive()
+    {
+        // Given
+        prepareGetContainer("ds1", new UserFailureException("Too large"));
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put(METHOD_KEY, GET_ARCHIVING_INFO_METHOD);
+        parameters.put(ArchivingAggregationService.ARGS_KEY, String.join(", ", "ds1"));
+
+        // When
+        List<TableModelRow> rows = service.createAggregationReport(parameters, processingContext).getRows();
+
+        // Then
+        assertEquals("[[{args=ds1, method=getArchivingInfo}, Too large]]\n", renderRows(rows));
+        context.assertIsSatisfied();
+    }
+
     private RecordingMatcher<List<DataSetPermId>> prepareGetDataSets(String... dataSetCodes)
     {
         DataSetFetchOptions fetchOptions = new DataSetFetchOptions();
@@ -196,6 +216,17 @@ public class ArchivingAggregationServiceTest extends AbstractFileSystemTestCase
             });
     }
 
+    private void prepareGetContainer(String dataSetCode, UserFailureException exception)
+    {
+        context.checking(new Expectations()
+            {
+                {
+                    allowing(archiver).getDataSetCodesForUnarchiving(Arrays.asList(dataSetCode));
+                    will(throwException(exception));
+                }
+            });
+    }
+
     private String renderRows(List<TableModelRow> rows)
     {
         StringBuilder builder = new StringBuilder();
-- 
GitLab