From 160c14ae7fcd2c5f03908785b1405dbfeea4975e Mon Sep 17 00:00:00 2001
From: pkupczyk <pkupczyk>
Date: Mon, 9 Nov 2015 12:49:55 +0000
Subject: [PATCH] SSDM-2706 : V3 AS API - create data sets (only metadata) -
 throw an exception when PhysicalData/LinkedData is set for a data set which
 is not physical/linked + tests

SVN: 35012
---
 .../dataset/SetDataSetLinkedDataExecutor.java | 22 +++---
 .../SetDataSetPhysicalDataExecutor.java       | 22 +++---
 .../systemtest/api/v3/CreateDataSetTest.java  | 72 +++++++++++++++++++
 3 files changed, 98 insertions(+), 18 deletions(-)

diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetLinkedDataExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetLinkedDataExecutor.java
index 729242e4ec3..7edb5fd7431 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetLinkedDataExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetLinkedDataExecutor.java
@@ -44,26 +44,30 @@ public class SetDataSetLinkedDataExecutor implements ISetDataSetLinkedDataExecut
         for (Map.Entry<DataSetCreation, DataPE> entry : entitiesMap.entrySet())
         {
             DataSetCreation creation = entry.getKey();
+            LinkedDataCreation linkedCreation = creation.getLinkedData();
             DataPE entity = entry.getValue();
 
             if (entity instanceof LinkDataPE)
             {
-                set(context, creation, (LinkDataPE) entity);
+                if (linkedCreation == null)
+                {
+                    throw new UserFailureException("Linked data cannot be null for a link data set.");
+                }
+                set(context, linkedCreation, (LinkDataPE) entity);
+            } else
+            {
+                if (linkedCreation != null)
+                {
+                    throw new UserFailureException("Linked data cannot be set for a non-link data set.");
+                }
             }
         }
 
         setDataSetExternalDmsExecutor.set(context, entitiesMap);
     }
 
-    private void set(IOperationContext context, DataSetCreation creation, LinkDataPE dataSet)
+    private void set(IOperationContext context, LinkedDataCreation linkedCreation, LinkDataPE dataSet)
     {
-        LinkedDataCreation linkedCreation = creation.getLinkedData();
-
-        if (linkedCreation == null)
-        {
-            throw new UserFailureException("Linked data cannot be null for a link data set.");
-        }
-
         dataSet.setExternalCode(linkedCreation.getExternalCode());
     }
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetPhysicalDataExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetPhysicalDataExecutor.java
index 9d9abb1e0e0..19e6b0d0707 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetPhysicalDataExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetPhysicalDataExecutor.java
@@ -52,11 +52,22 @@ public class SetDataSetPhysicalDataExecutor implements ISetDataSetPhysicalDataEx
         for (Map.Entry<DataSetCreation, DataPE> entry : entitiesMap.entrySet())
         {
             DataSetCreation creation = entry.getKey();
+            PhysicalDataCreation physicalCreation = creation.getPhysicalData();
             DataPE entity = entry.getValue();
 
             if (entity instanceof ExternalDataPE)
             {
-                set(context, creation, (ExternalDataPE) entity);
+                if (physicalCreation == null)
+                {
+                    throw new UserFailureException("Physical data cannot be null for a physical data set.");
+                }
+                set(context, physicalCreation, (ExternalDataPE) entity);
+            } else
+            {
+                if (physicalCreation != null)
+                {
+                    throw new UserFailureException("Physical data cannot be set for a non-physical data set.");
+                }
             }
         }
 
@@ -65,15 +76,8 @@ public class SetDataSetPhysicalDataExecutor implements ISetDataSetPhysicalDataEx
         setDataSetLocatorTypeExecutor.set(context, entitiesMap);
     }
 
-    private void set(IOperationContext context, DataSetCreation creation, ExternalDataPE dataSet)
+    private void set(IOperationContext context, PhysicalDataCreation physicalCreation, ExternalDataPE dataSet)
     {
-        PhysicalDataCreation physicalCreation = creation.getPhysicalData();
-
-        if (physicalCreation == null)
-        {
-            throw new UserFailureException("Physical data cannot be null for a physical data set.");
-        }
-
         dataSet.setShareId(physicalCreation.getShareId());
         dataSet.setLocation(physicalCreation.getLocation());
 
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/CreateDataSetTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/CreateDataSetTest.java
index 26f6f07fb34..d80a3c1fa3a 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/CreateDataSetTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/CreateDataSetTest.java
@@ -952,6 +952,24 @@ public class CreateDataSetTest extends AbstractDataSetTest
         assertNull(dataSet.getLinkedData());
     }
 
+    @Test
+    public void testCreatePhysicalDataSetWithPhysicalDataNotNullAndLinkedDataNotNull()
+    {
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        final DataSetCreation creation = physicalDataSetCreation();
+        creation.setLinkedData(new LinkedDataCreation());
+
+        assertUserFailureException(new IDelegatedAction()
+            {
+                @Override
+                public void execute()
+                {
+                    createDataSet(sessionToken, creation, new DataSetFetchOptions());
+                }
+            }, "Linked data cannot be set for a non-link data set.");
+    }
+
     @Test
     public void testCreatePhysicalDataSetWithPhysicalDataNull()
     {
@@ -1388,6 +1406,42 @@ public class CreateDataSetTest extends AbstractDataSetTest
         assertEquals(dataSet.getContained().iterator().next().getCode(), "20081105092159188-3");
     }
 
+    @Test
+    public void testCreateContainerDataSetWithPhysicalDataNotNull()
+    {
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        final DataSetCreation creation = containerDataSetCreation();
+        creation.setPhysicalData(new PhysicalDataCreation());
+
+        assertUserFailureException(new IDelegatedAction()
+            {
+                @Override
+                public void execute()
+                {
+                    createDataSet(sessionToken, creation, new DataSetFetchOptions());
+                }
+            }, "Physical data cannot be set for a non-physical data set.");
+    }
+
+    @Test
+    public void testCreateContainerDataSetWithLinkedDataNotNull()
+    {
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        final DataSetCreation creation = containerDataSetCreation();
+        creation.setLinkedData(new LinkedDataCreation());
+
+        assertUserFailureException(new IDelegatedAction()
+            {
+                @Override
+                public void execute()
+                {
+                    createDataSet(sessionToken, creation, new DataSetFetchOptions());
+                }
+            }, "Linked data cannot be set for a non-link data set.");
+    }
+
     @Test
     public void testCreateLinkDataSetWithLinkedDataNotNull()
     {
@@ -1421,6 +1475,24 @@ public class CreateDataSetTest extends AbstractDataSetTest
         assertNull(dataSet.getPhysicalData());
     }
 
+    @Test
+    public void testCreateLinkDataSetWithLinkedDataNotNullAndPhyscialDataNotNull()
+    {
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        final DataSetCreation creation = linkDataSetCreation();
+        creation.setPhysicalData(new PhysicalDataCreation());
+
+        assertUserFailureException(new IDelegatedAction()
+            {
+                @Override
+                public void execute()
+                {
+                    createDataSet(sessionToken, creation, new DataSetFetchOptions());
+                }
+            }, "Physical data cannot be set for a non-physical data set.");
+    }
+
     @Test
     public void testCreateLinkDataSetWithLinkedDataNull()
     {
-- 
GitLab