From ccca07de338fea0975724a2b122e7480f26735c4 Mon Sep 17 00:00:00 2001
From: jakubs <jakubs>
Date: Fri, 27 Jul 2012 13:29:36 +0000
Subject: [PATCH] BIS-102 SP-146 implement&test experiment updates from dss

SVN: 26247
---
 .../server/ETLEntityOperationChecker.java     |  7 ++++++
 .../openbis/generic/server/ETLService.java    | 25 +++++++++++++++++++
 .../server/IETLEntityOperationChecker.java    |  9 +++++++
 .../dto/AtomicEntityOperationDetails.java     | 12 +++++----
 .../server/ETLServiceDatabaseTest.java        | 21 ++++++++++------
 .../generic/server/ETLServiceTest.java        |  6 ++++-
 .../dto/AtomicEntityOperationDetailsTest.java |  7 ++++--
 .../systemtest/EntityOperationTest.java       |  8 ++++--
 8 files changed, 77 insertions(+), 18 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLEntityOperationChecker.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLEntityOperationChecker.java
index e3566a1e0eb..1a9e31f55ae 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLEntityOperationChecker.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLEntityOperationChecker.java
@@ -25,6 +25,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewProject;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSpace;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetBatchUpdatesDTO;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.IAuthSession;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialUpdateDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.NewExternalData;
@@ -101,4 +102,10 @@ public class ETLEntityOperationChecker implements IETLEntityOperationChecker
     {
     }
 
+    @Override
+    public void assertExperimentUpdateAllowed(IAuthSession session,
+            ExperimentUpdatesDTO experimentUpdates)
+    {
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java
index 449aa349764..9d05783f58b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java
@@ -149,6 +149,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.EntityOperationsLogEntryPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentTypePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataManagementSystemPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ListSamplesByPropertyCriteria;
@@ -1386,6 +1387,9 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
             long experimentsCreated =
                     createExperiments(sessionForEntityOperation, operationDetails, progressListener);
 
+            long experimentsUpdates =
+                    updateExperiments(sessionForEntityOperation, operationDetails, progressListener);
+
             long samplesCreated =
                     createSamples(sessionForEntityOperation, operationDetails, progressListener);
 
@@ -1824,6 +1828,27 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
         return index;
     }
 
+    private void updateExperiment(Session session, ExperimentUpdatesDTO updates)
+    {
+        final IExperimentBO experimentBO = businessObjectFactory.createExperimentBO(session);
+        experimentBO.update(updates);
+        experimentBO.save();
+    }
+
+    private long updateExperiments(Session session, AtomicEntityOperationDetails operationDetails,
+            IProgressListener progress)
+    {
+        List<ExperimentUpdatesDTO> updates = operationDetails.getExperimentUpdates();
+
+        for (ExperimentUpdatesDTO update : updates)
+        {
+            entityOperationChecker.assertExperimentUpdateAllowed(session, update);
+            updateExperiment(session, update);
+        }
+
+        return updates.size();
+    }
+
     private IDataBO registerDataSetInternal(final Session session,
             SampleIdentifier sampleIdentifier, NewExternalData externalData)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/IETLEntityOperationChecker.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/IETLEntityOperationChecker.java
index 9bdd326b34b..5a7dadfca06 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/IETLEntityOperationChecker.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/IETLEntityOperationChecker.java
@@ -23,6 +23,7 @@ import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.Authoriz
 import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.Capability;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.RolesAllowed;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.DataSetUpdatesCollectionPredicate;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.ExperimentUpdatesPredicate;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.NewExperimentPredicate;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.NewExternalDataPredicate;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.NewProjectPredicate;
@@ -35,6 +36,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSpace;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetBatchUpdatesDTO;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.IAuthSession;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialUpdateDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.NewExternalData;
@@ -73,6 +75,13 @@ public interface IETLEntityOperationChecker
             @AuthorizationGuard(guardClass = NewExperimentPredicate.class)
             List<NewExperiment> newExperiments);
 
+    @RolesAllowed(
+        { RoleWithHierarchy.SPACE_USER, RoleWithHierarchy.SPACE_ETL_SERVER })
+    @Capability("UPDATE_EXPERIMENTS_VIA_DSS")
+    public void assertExperimentUpdateAllowed(IAuthSession session,
+            @AuthorizationGuard(guardClass = ExperimentUpdatesPredicate.class)
+            ExperimentUpdatesDTO experimentUpdates);
+
     @RolesAllowed(RoleWithHierarchy.INSTANCE_ETL_SERVER)
     public void assertInstanceSampleCreationAllowed(IAuthSession session,
             @AuthorizationGuard(guardClass = NewSamplePredicate.class)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/AtomicEntityOperationDetails.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/AtomicEntityOperationDetails.java
index 13fe13e235a..d973e68668a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/AtomicEntityOperationDetails.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/AtomicEntityOperationDetails.java
@@ -74,7 +74,8 @@ public class AtomicEntityOperationDetails implements Serializable
 
     public AtomicEntityOperationDetails(TechId registrationId, String userIdOrNull,
             List<NewSpace> spaceRegistrations, List<NewProject> projectRegistrations,
-            List<NewExperiment> experimentRegistrations, List<SampleUpdatesDTO> sampleUpdates,
+            List<NewExperiment> experimentRegistrations,
+            List<ExperimentUpdatesDTO> experimentUpdates, List<SampleUpdatesDTO> sampleUpdates,
             List<NewSample> sampleRegistrations,
             Map<String, List<NewMaterial>> materialRegistrations,
             List<MaterialUpdateDTO> materialUpdates,
@@ -85,7 +86,7 @@ public class AtomicEntityOperationDetails implements Serializable
         this.userIdOrNull = userIdOrNull;
         this.spaceRegistrations = new ArrayList<NewSpace>(spaceRegistrations);
         this.projectRegistrations = new ArrayList<NewProject>(projectRegistrations);
-        this.experimentUpdates = new ArrayList<ExperimentUpdatesDTO>();
+        this.experimentUpdates = new ArrayList<ExperimentUpdatesDTO>(experimentUpdates);
         this.experimentRegistrations = new ArrayList<NewExperiment>(experimentRegistrations);
         this.sampleUpdates = new ArrayList<SampleUpdatesDTO>(sampleUpdates);
         this.sampleRegistrations = new ArrayList<NewSample>(sampleRegistrations);
@@ -97,7 +98,8 @@ public class AtomicEntityOperationDetails implements Serializable
 
     public AtomicEntityOperationDetails(TechId registrationId, String userIdOrNull,
             List<NewSpace> spaceRegistrations, List<NewProject> projectRegistrations,
-            List<NewExperiment> experimentRegistrations, List<SampleUpdatesDTO> sampleUpdates,
+            List<NewExperiment> experimentRegistrations,
+            List<ExperimentUpdatesDTO> experimentUpdates, List<SampleUpdatesDTO> sampleUpdates,
             List<NewSample> sampleRegistrations,
             Map<String, List<NewMaterial>> materialRegistrations,
             List<MaterialUpdateDTO> materialUpdates,
@@ -105,8 +107,8 @@ public class AtomicEntityOperationDetails implements Serializable
             List<DataSetBatchUpdatesDTO> dataSetUpdates, Integer batchSizeOrNull)
     {
         this(registrationId, userIdOrNull, spaceRegistrations, projectRegistrations,
-                experimentRegistrations, sampleUpdates, sampleRegistrations, materialRegistrations,
-                materialUpdates, dataSetRegistrations, dataSetUpdates);
+                experimentRegistrations, experimentUpdates, sampleUpdates, sampleRegistrations,
+                materialRegistrations, materialUpdates, dataSetRegistrations, dataSetUpdates);
         this.batchSizeOrNull = batchSizeOrNull;
     }
 
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceDatabaseTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceDatabaseTest.java
index 4e7cd2fde5e..f1ca29e81e3 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceDatabaseTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceDatabaseTest.java
@@ -58,6 +58,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSpace;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetBatchUpdatesDTO;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialUpdateDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.NewExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleUpdatesDTO;
@@ -310,7 +311,8 @@ public class ETLServiceDatabaseTest extends AbstractDAOTest
         List<NewSpace> spaceRegistrations = Collections.emptyList();
         List<NewProject> projectRegistrations = Collections.emptyList();
         List<NewExperiment> experimentRegistrations = Collections.emptyList();
-
+        List<ExperimentUpdatesDTO> experimentUpdates =
+                Collections.<ExperimentUpdatesDTO> emptyList();
         List<SampleUpdatesDTO> sampleUpdates = Collections.emptyList();
         List<NewSample> sampleRegistrations = Collections.emptyList();
         Map<String, List<NewMaterial>> materialRegistrations = Collections.emptyMap();
@@ -318,8 +320,8 @@ public class ETLServiceDatabaseTest extends AbstractDAOTest
         List<? extends NewExternalData> dataSetRegistrations = Collections.emptyList();
         AtomicEntityOperationDetails details =
                 new AtomicEntityOperationDetails(registrationid, null, spaceRegistrations,
-                        projectRegistrations, experimentRegistrations, sampleUpdates,
-                        sampleRegistrations, materialRegistrations, materialUpdates,
+                        projectRegistrations, experimentRegistrations, experimentUpdates,
+                        sampleUpdates, sampleRegistrations, materialRegistrations, materialUpdates,
                         dataSetRegistrations, dataSetUpdates, batchSizeOrNull);
         service.performEntityOperations(sessionToken, details);
     }
@@ -330,6 +332,8 @@ public class ETLServiceDatabaseTest extends AbstractDAOTest
         List<NewSpace> spaceRegistrations = Collections.emptyList();
         List<NewProject> projectRegistrations = Collections.emptyList();
         List<NewExperiment> experimentRegistrations = Collections.emptyList();
+        List<ExperimentUpdatesDTO> experimentUpdates =
+                Collections.<ExperimentUpdatesDTO> emptyList();
 
         List<NewSample> sampleRegistrations = Collections.emptyList();
         Map<String, List<NewMaterial>> materialRegistrations = Collections.emptyMap();
@@ -338,8 +342,8 @@ public class ETLServiceDatabaseTest extends AbstractDAOTest
         List<DataSetBatchUpdatesDTO> dataSetUpdates = Collections.emptyList();
         AtomicEntityOperationDetails details =
                 new AtomicEntityOperationDetails(registrationid, null, spaceRegistrations,
-                        projectRegistrations, experimentRegistrations, sampleUpdates,
-                        sampleRegistrations, materialRegistrations, materialUpdates,
+                        projectRegistrations, experimentRegistrations, experimentUpdates,
+                        sampleUpdates, sampleRegistrations, materialRegistrations, materialUpdates,
                         dataSetRegistrations, dataSetUpdates, batchSizeOrNull);
         service.performEntityOperations(sessionToken, details);
     }
@@ -402,7 +406,8 @@ public class ETLServiceDatabaseTest extends AbstractDAOTest
         List<NewSpace> spaceRegistrations = Collections.emptyList();
         List<NewProject> projectRegistrations = Collections.emptyList();
         List<NewExperiment> experimentRegistrations = Collections.emptyList();
-
+        List<ExperimentUpdatesDTO> experimentUpdates =
+                Collections.<ExperimentUpdatesDTO> emptyList();
         List<SampleUpdatesDTO> sampleUpdates = Collections.emptyList();
         List<NewSample> sampleRegistrations = Arrays.asList(sampleToCreate);
         Map<String, List<NewMaterial>> materialRegistrations = Collections.emptyMap();
@@ -411,8 +416,8 @@ public class ETLServiceDatabaseTest extends AbstractDAOTest
         List<DataSetBatchUpdatesDTO> dataSetUpdates = Collections.emptyList();
         AtomicEntityOperationDetails details =
                 new AtomicEntityOperationDetails(registrationid, null, spaceRegistrations,
-                        projectRegistrations, experimentRegistrations, sampleUpdates,
-                        sampleRegistrations, materialRegistrations, materialUpdates,
+                        projectRegistrations, experimentRegistrations, experimentUpdates,
+                        sampleUpdates, sampleRegistrations, materialRegistrations, materialUpdates,
                         dataSetRegistrations, dataSetUpdates);
         service.performEntityOperations(sessionToken, details);
     }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceTest.java
index 44ae0acb74c..69e03816c38 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceTest.java
@@ -84,6 +84,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.DataTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatastoreServiceDescriptions;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialTypePE;
@@ -969,6 +970,8 @@ public class ETLServiceTest extends AbstractServerTestCase
         final Date version = new Date();
         final Collection<NewAttachment> attachments = Collections.<NewAttachment> emptyList();
 
+        List<ExperimentUpdatesDTO> experimentUpdates = new ArrayList<ExperimentUpdatesDTO>();
+
         final SampleUpdatesDTO sampleUpdate =
                 new SampleUpdatesDTO(CommonTestUtils.TECH_ID, null, null, attachments, version,
                         sampleIdentifier, null, null);
@@ -1011,7 +1014,7 @@ public class ETLServiceTest extends AbstractServerTestCase
         AtomicEntityOperationDetails details =
                 new AtomicEntityOperationDetails(null, null, new ArrayList<NewSpace>(),
                         new ArrayList<NewProject>(), new ArrayList<NewExperiment>(),
-                        Collections.singletonList(sampleUpdate),
+                        experimentUpdates, Collections.singletonList(sampleUpdate),
                         Collections.singletonList(newSample), materialRegistrations,
                         materialUpdates, Collections.singletonList(externalData),
                         Collections.singletonList(dataSetUpdate));
@@ -1194,6 +1197,7 @@ public class ETLServiceTest extends AbstractServerTestCase
         AtomicEntityOperationDetails details =
                 new AtomicEntityOperationDetails(new TechId(1), null, new ArrayList<NewSpace>(),
                         new ArrayList<NewProject>(), new ArrayList<NewExperiment>(),
+                        new ArrayList<ExperimentUpdatesDTO>(),
                         Collections.singletonList(sampleUpdate),
                         Collections.singletonList(newSample), materialRegistrations,
                         materialUpdates, Collections.singletonList(externalData),
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AtomicEntityOperationDetailsTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AtomicEntityOperationDetailsTest.java
index 8cd7c35e4b5..8f0c7de0243 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AtomicEntityOperationDetailsTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AtomicEntityOperationDetailsTest.java
@@ -27,6 +27,7 @@ import org.testng.annotations.Test;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetBatchUpdatesDTO;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialUpdateDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.NewExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleUpdatesDTO;
@@ -65,6 +66,8 @@ public class AtomicEntityOperationDetailsTest extends AssertJUnit
         experimentRegistrations.add(new NewExperiment("/SPACE/PROJECT/EXP-ID1", "EXP-TYPE"));
         experimentRegistrations.add(new NewExperiment("/SPACE/PROJECT/EXP-ID2", "EXP-TYPE"));
 
+        List<ExperimentUpdatesDTO> experimentUpdates = new ArrayList<ExperimentUpdatesDTO>();
+
         ArrayList<SampleUpdatesDTO> sampleUpdates = new ArrayList<SampleUpdatesDTO>();
 
         ArrayList<NewSample> sampleRegistrations = new ArrayList<NewSample>();
@@ -89,8 +92,8 @@ public class AtomicEntityOperationDetailsTest extends AssertJUnit
 
         AtomicEntityOperationDetails details =
                 new AtomicEntityOperationDetails(null, null, spaceRegistrations,
-                        projectRegistrations, experimentRegistrations, sampleUpdates,
-                        sampleRegistrations, materialRegistrations, materialUpdates,
+                        projectRegistrations, experimentRegistrations, experimentUpdates,
+                        sampleUpdates, sampleRegistrations, materialRegistrations, materialUpdates,
                         dataSetRegistrations, dataSetUpdates);
 
         assertEquals(
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityOperationTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityOperationTest.java
index 1e566a706fb..bdfefadab95 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityOperationTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityOperationTest.java
@@ -55,6 +55,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.SampleBuilder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationResult;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetBatchUpdatesDTO;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialUpdateDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.NewExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.NewProperty;
@@ -99,6 +100,9 @@ public class EntityOperationTest extends SystemTestCase
 
         private final List<NewExperiment> experiments = new ArrayList<NewExperiment>();
 
+        private final List<ExperimentUpdatesDTO> experimentUpdates =
+                new ArrayList<ExperimentUpdatesDTO>();
+
         private final List<NewSample> samples = new ArrayList<NewSample>();
 
         private final List<SampleUpdatesDTO> sampleUpdates = new ArrayList<SampleUpdatesDTO>();
@@ -272,8 +276,8 @@ public class EntityOperationTest extends SystemTestCase
         AtomicEntityOperationDetails create()
         {
             return new AtomicEntityOperationDetails(registrationID, userID, spaces, projects,
-                    experiments, sampleUpdates, samples, materials, materialUpdates, dataSets,
-                    dataSetUpdates);
+                    experiments, experimentUpdates, sampleUpdates, samples, materials,
+                    materialUpdates, dataSets, dataSetUpdates);
         }
 
     }
-- 
GitLab