From 51c7a3430ca5ca9edb4498ebb0368dab38aea89b Mon Sep 17 00:00:00 2001
From: alaskowski <alaskowski@ethz.ch>
Date: Fri, 23 Jun 2023 11:57:11 +0200
Subject: [PATCH] SSDM-13637: changed logic for set() method of update metadata
 procedure. Amended tests.

---
 .../UpdateMetaDataForEntityExecutor.java      | 13 ++--
 .../asapi/v3/UpdateDataSetTest.java           | 31 ++++++++
 .../asapi/v3/UpdateDataSetTypeTest.java       | 21 ++++++
 .../asapi/v3/UpdateExperimentTest.java        | 35 +++++++++
 .../asapi/v3/UpdateExperimentTypeTest.java    | 23 ++++++
 .../systemtest/asapi/v3/UpdateSampleTest.java | 72 +++++++++++++++++++
 .../asapi/v3/UpdateSampleTypeTest.java        | 24 +++++++
 7 files changed, 212 insertions(+), 7 deletions(-)

diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/metadata/UpdateMetaDataForEntityExecutor.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/metadata/UpdateMetaDataForEntityExecutor.java
index e0000744937..ff5a7fa3a25 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/metadata/UpdateMetaDataForEntityExecutor.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/metadata/UpdateMetaDataForEntityExecutor.java
@@ -68,7 +68,6 @@ public class UpdateMetaDataForEntityExecutor<ENTITY_UPDATE extends IMetaDataUpda
         {
             metaData.putAll(entity.getMetaData());
         }
-        ListUpdateValue.ListUpdateActionSet<?> lastSetAction = null;
         AtomicBoolean metaDataChanged = new AtomicBoolean(false);
         for (ListUpdateValue.ListUpdateAction<Object> action : update.getMetaData().getActions())
         {
@@ -84,14 +83,14 @@ public class UpdateMetaDataForEntityExecutor<ENTITY_UPDATE extends IMetaDataUpda
                 }
             } else if (action instanceof ListUpdateValue.ListUpdateActionSet<?>)
             {
-                lastSetAction = (ListUpdateValue.ListUpdateActionSet<?>) action;
+                metaDataChanged.set(true);
+                Collection<Map<String, String>> items = (Collection<Map<String, String>>) action.getItems();
+                for (Map<String, String> item : items)
+                {
+                    metaData = item;
+                }
             }
         }
-        if (lastSetAction != null)
-        {
-            metaData.clear();
-            addTo(metaData, lastSetAction, metaDataChanged);
-        }
         if (metaDataChanged.get())
         {
             entity.setMetaData(metaData.isEmpty() ? null : metaData);
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateDataSetTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateDataSetTest.java
index 2d70380580d..9cf63e3679a 100644
--- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateDataSetTest.java
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateDataSetTest.java
@@ -1348,6 +1348,37 @@ public class UpdateDataSetTest extends AbstractDataSetTest
         assertEquals(dataSet.getMetaData(), Map.of("key_modify", "new_value", "key_add", "value_add"));
     }
 
+    @Test
+    public void testUpdateMetaDataSetEmpty()
+    {
+        // Prepare
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        DataSetCreation dataSetCreation = new DataSetCreation();
+        dataSetCreation.setCode("DATA_SET_META_1");
+        dataSetCreation.setTypeId(new EntityTypePermId("DELETION_TEST_CONTAINER", EntityKind.DATA_SET));
+        dataSetCreation.setDataStoreId(new DataStorePermId("STANDARD"));
+        dataSetCreation.setDataSetKind(DataSetKind.CONTAINER);
+        dataSetCreation.setExperimentId(new ExperimentIdentifier("/CISD/NEMO/EXP-TEST-1"));
+        dataSetCreation.setMetaData(Map.of("key_modify", "value_modify", "key_delete", "value_delete"));
+        DataSetPermId id = v3api.createDataSets(sessionToken, Arrays.asList(dataSetCreation)).get(0);
+
+        // Act
+        DataSetUpdate update = new DataSetUpdate();
+        update.setDataSetId(id);
+        update.getMetaData().add(Map.of());
+        v3api.updateDataSets(sessionToken, Arrays.asList(update));
+
+        // Verify
+        DataSetFetchOptions fetchOptions = new DataSetFetchOptions();
+        fetchOptions.withProperties();
+        fetchOptions.withSampleProperties();
+        fetchOptions.withHistory().withAuthor();
+        DataSet dataSet = v3api.getDataSets(sessionToken, Arrays.asList(id), fetchOptions).get(id);
+
+        assertEquals(dataSet.getMetaData(), Map.of());
+    }
+
     @Test(dataProvider = USER_ROLES_PROVIDER)
     public void testUpdateWithDifferentRolesExperimentDataSet(RoleWithHierarchy role)
     {
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateDataSetTypeTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateDataSetTypeTest.java
index 63197e1a381..72cc68609b9 100644
--- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateDataSetTypeTest.java
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateDataSetTypeTest.java
@@ -201,4 +201,25 @@ public class UpdateDataSetTypeTest extends UpdateEntityTypeTest<DataSetTypeCreat
         assertEquals(type.getMetaData(), Map.of("key_modify", "new_value", "key_add", "value_add"));
     }
 
+    @Test
+    public void testUpdateMetaDataSetEmpty()
+    {
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        // Prepare
+        DataSetTypeCreation creation = new DataSetTypeCreation();
+        creation.setCode("DATA_SET_META_DATA_TEST");
+        creation.setMetaData(Map.of("key_modify", "value_modify", "key_delete", "value_delete"));
+        createTypes(sessionToken, List.of(creation));
+
+        // Act
+        DataSetTypeUpdate update = new DataSetTypeUpdate();
+        update.setTypeId(new EntityTypePermId("DATA_SET_META_DATA_TEST"));
+        update.getMetaData().add(Map.of());
+        v3api.updateDataSetTypes(sessionToken, Arrays.asList(update));
+
+        // Verify
+        DataSetType type = getType(sessionToken, new EntityTypePermId("DATA_SET_META_DATA_TEST"));
+        assertEquals(type.getMetaData(), Map.of());
+    }
+
 }
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateExperimentTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateExperimentTest.java
index 6a820cc6767..c9ae2d6da11 100644
--- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateExperimentTest.java
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateExperimentTest.java
@@ -1317,6 +1317,41 @@ public class UpdateExperimentTest extends AbstractExperimentTest
                 Map.of("key_modify", "new_value", "key_add", "value_add"));
     }
 
+    @Test
+    public void testUpdateMetaDataSetEmpty()
+    {
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        // Prepare
+        ExperimentCreation creation = new ExperimentCreation();
+        creation.setCode("TEST_EXPERIMENT_META_DATA");
+        creation.setTypeId(new EntityTypePermId("SIRNA_HCS"));
+        creation.setProjectId(new ProjectIdentifier("/CISD/NEMO"));
+        creation.setProperty("DESCRIPTION", "a description");
+        creation.setMetaData(Map.of("key_modify", "value_modify", "key_delete", "value_delete"));
+
+        List<ExperimentPermId> ids = v3api.createExperiments(sessionToken, Arrays.asList(creation));
+
+        final ExperimentPermId permId = ids.get(0);
+
+        // Act
+        final ExperimentUpdate update = new ExperimentUpdate();
+        update.setExperimentId(permId);
+        update.getMetaData().add(Map.of());
+
+        v3api.updateExperiments(sessionToken, Arrays.asList(update));
+
+        // Verify
+        ExperimentFetchOptions fetchOptions = new ExperimentFetchOptions();
+        fetchOptions.withProperties();
+        fetchOptions.withSampleProperties();
+        fetchOptions.withHistory().withAuthor();
+        Experiment experiment =
+                v3api.getExperiments(sessionToken, Arrays.asList(permId), fetchOptions).get(permId);
+
+        assertEquals(experiment.getMetaData(), Map.of());
+    }
+
     @Test(dataProvider = USER_ROLES_PROVIDER)
     public void testUpdateWithDifferentRoles(RoleWithHierarchy role)
     {
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateExperimentTypeTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateExperimentTypeTest.java
index a04f34dab06..d54f378cbc3 100644
--- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateExperimentTypeTest.java
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateExperimentTypeTest.java
@@ -181,4 +181,27 @@ public class UpdateExperimentTypeTest extends UpdateEntityTypeTest<ExperimentTyp
         assertEquals(type.getMetaData(), Map.of("key_modify", "new_value", "key_add", "value_add"));
     }
 
+    @Test
+    public void testUpdateMetaDataSetEmpty()
+    {
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        // Prepare
+        ExperimentTypeCreation creation = new ExperimentTypeCreation();
+        creation.setCode("EXPERIMENT_TYPE_META_DATA_TEST");
+        creation.setMetaData(Map.of("key_modify", "value_modify", "key_delete", "value_delete"));
+        createTypes(sessionToken, List.of(creation));
+
+        // Act
+        ExperimentTypeUpdate update = new ExperimentTypeUpdate();
+        update.setTypeId(new EntityTypePermId("EXPERIMENT_TYPE_META_DATA_TEST"));
+        update.getMetaData().add(Map.of());
+        v3api.updateExperimentTypes(sessionToken, Arrays.asList(update));
+
+        // Verify
+        ExperimentType type = getType(sessionToken, new EntityTypePermId("EXPERIMENT_TYPE_META_DATA_TEST"));
+
+        assertEquals(type.getMetaData(), Map.of());
+    }
+
 }
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateSampleTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateSampleTest.java
index f5b1797792a..44a32afc172 100644
--- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateSampleTest.java
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateSampleTest.java
@@ -214,6 +214,78 @@ public class UpdateSampleTest extends AbstractSampleTest
         assertEquals(sample.getMetaData(), Map.of("key_modify", "new_value", "key_add", "value_add"));
     }
 
+    @Test
+    public void testUpdateSampleMetaDataSetEmpty()
+    {
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        SampleCreation creation = new SampleCreation();
+        creation.setCode("SAMPLE");
+        creation.setTypeId(new EntityTypePermId("CELL_PLATE"));
+        creation.setSpaceId(new SpacePermId("CISD"));
+        creation.setMetaData(Map.of("key_modify", "value_modify", "key_delete", "value_delete"));
+
+        List<SamplePermId> ids = v3api.createSamples(sessionToken, Arrays.asList(creation));
+
+        SampleUpdate update = new SampleUpdate();
+        update.setSampleId(ids.get(0));
+        update.setSpaceId(new SpacePermId("TEST-SPACE"));
+        update.setExperimentId(new ExperimentPermId("201206190940555-1032"));
+        update.getMetaData().set(Map.of());
+
+        v3api.updateSamples(sessionToken, Arrays.asList(update));
+
+        SampleFetchOptions fetchOptions = new SampleFetchOptions();
+        fetchOptions.withSpace();
+        fetchOptions.withExperiment();
+
+        Map<ISampleId, Sample> map = v3api.getSamples(sessionToken, ids, fetchOptions);
+        List<Sample> samples = new ArrayList<Sample>(map.values());
+
+        AssertionUtil.assertCollectionSize(samples, 1);
+
+        Sample sample = samples.get(0);
+        assertEquals(sample.getSpace().getCode(), "TEST-SPACE");
+        assertEquals(sample.getExperiment().getIdentifier().getIdentifier(), "/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST");
+        assertEquals(sample.getMetaData(), Map.of());
+    }
+
+    @Test
+    public void testUpdateSampleMetaDataLastSetMatters()
+    {
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        SampleCreation creation = new SampleCreation();
+        creation.setCode("SAMPLE");
+        creation.setTypeId(new EntityTypePermId("CELL_PLATE"));
+        creation.setSpaceId(new SpacePermId("CISD"));
+        creation.setMetaData(Map.of("key_modify", "value_modify", "key_delete", "value_delete"));
+
+        List<SamplePermId> ids = v3api.createSamples(sessionToken, Arrays.asList(creation));
+
+        SampleUpdate update = new SampleUpdate();
+        update.setSampleId(ids.get(0));
+        update.setSpaceId(new SpacePermId("TEST-SPACE"));
+        update.setExperimentId(new ExperimentPermId("201206190940555-1032"));
+        update.getMetaData().set(Map.of("a", "b"), Map.of());
+
+        v3api.updateSamples(sessionToken, Arrays.asList(update));
+
+        SampleFetchOptions fetchOptions = new SampleFetchOptions();
+        fetchOptions.withSpace();
+        fetchOptions.withExperiment();
+
+        Map<ISampleId, Sample> map = v3api.getSamples(sessionToken, ids, fetchOptions);
+        List<Sample> samples = new ArrayList<Sample>(map.values());
+
+        AssertionUtil.assertCollectionSize(samples, 1);
+
+        Sample sample = samples.get(0);
+        assertEquals(sample.getSpace().getCode(), "TEST-SPACE");
+        assertEquals(sample.getExperiment().getIdentifier().getIdentifier(), "/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST");
+        assertEquals(sample.getMetaData(), Map.of());
+    }
+
     @Test
     public void testUpdateWithSampleNonexistent()
     {
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateSampleTypeTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateSampleTypeTest.java
index 6472c18e166..b05901248df 100644
--- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateSampleTypeTest.java
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateSampleTypeTest.java
@@ -202,4 +202,28 @@ public class UpdateSampleTypeTest extends UpdateEntityTypeTest<SampleTypeCreatio
 
     }
 
+    @Test
+    public void testUpdateMetaDataSetEmpty()
+    {
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        // Prepare
+        SampleTypeCreation creation = new SampleTypeCreation();
+        creation.setCode("META_DATA_UPDATE_TEST_1");
+        creation.setMetaData(Map.of("key_modify", "value_modify", "key_delete", "value_delete"));
+        createTypes(sessionToken, List.of(creation));
+
+        // Act
+        SampleTypeUpdate update = new SampleTypeUpdate();
+        update.setTypeId(new EntityTypePermId("META_DATA_UPDATE_TEST_1"));
+        update.getMetaData().set(Map.of());
+
+        v3api.updateSampleTypes(sessionToken, Arrays.asList(update));
+
+        // Verify
+        SampleType type = getType(sessionToken, new EntityTypePermId("META_DATA_UPDATE_TEST_1"));
+
+        assertEquals(type.getMetaData(), Map.of());
+    }
+
 }
-- 
GitLab