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

SVN: 26242
---
 .../DefaultEntityOperationService.java        |  5 +-
 .../v1/IDataSetRegistrationTransaction.java   |  2 +-
 .../registrator/api/v1/IExperiment.java       |  8 +---
 .../api/v1/IExperimentUpdatable.java          | 34 ++++++++++++++
 .../api/v1/impl/AbstractTransactionState.java | 36 ++++++++++++--
 .../api/v1/impl/ConversionUtils.java          | 22 +++++++++
 .../impl/DataSetRegistrationTransaction.java  |  3 +-
 .../registrator/api/v1/impl/Experiment.java   |  9 +---
 .../api/v1/impl/ExperimentUpdatable.java      | 47 +++++++++++++++++++
 ...aSetRegistrationTransactionV2Delegate.java |  3 +-
 .../v2/IDataSetRegistrationTransactionV2.java |  3 +-
 .../drop-boxes/rich-test/data-set-handler.py  |  7 +++
 .../FeatureRichDataSetImportSystemTest.java   | 14 ++++++
 13 files changed, 168 insertions(+), 25 deletions(-)
 create mode 100644 datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IExperimentUpdatable.java
 create mode 100644 datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ExperimentUpdatable.java

diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DefaultEntityOperationService.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DefaultEntityOperationService.java
index a37c9cd64e0..a029461924c 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DefaultEntityOperationService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DefaultEntityOperationService.java
@@ -32,6 +32,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.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.SampleUpdatesDTO;
@@ -79,6 +80,7 @@ public class DefaultEntityOperationService<T extends DataSetInformation> impleme
         List<NewSpace> spaceRegistrations = details.getSpaceRegistrations();
         List<NewProject> projectRegistrations = details.getProjectRegistrations();
         List<NewExperiment> experimentRegistrations = details.getExperimentRegistrations();
+        List<ExperimentUpdatesDTO> experimentUpdates = details.getExperimentUpdates();
         List<SampleUpdatesDTO> sampleUpdates = details.getSampleUpdates();
         List<NewSample> sampleRegistrations = details.getSampleRegistrations();
         Map<String, List<NewMaterial>> materialRegistrations = details.getMaterialRegistrations();
@@ -94,7 +96,8 @@ public class DefaultEntityOperationService<T extends DataSetInformation> impleme
 
         return new ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails(
                 details.getRegistrationId(), details.tryUserIdOrNull(), spaceRegistrations,
-                projectRegistrations, experimentRegistrations, sampleUpdates, sampleRegistrations,
+                projectRegistrations, experimentRegistrations, experimentUpdates, sampleUpdates,
+                sampleRegistrations,
                 materialRegistrations, materialUpdates, dataSetRegistrations, dataSetUpdates);
     }
 
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IDataSetRegistrationTransaction.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IDataSetRegistrationTransaction.java
index 48dd85ba877..c6bfe9300c0 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IDataSetRegistrationTransaction.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IDataSetRegistrationTransaction.java
@@ -125,7 +125,7 @@ public interface IDataSetRegistrationTransaction
     /**
      * Get an experiment from the openBIS AS for the purpose of modifying it.
      */
-    IExperiment getExperimentForUpdate(String experimentIdentifierString);
+    IExperimentUpdatable getExperimentForUpdate(String experimentIdentifierString);
 
     /**
      * Create a new experiment to register with the openBIS AS. The experiment will have a permId.
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IExperiment.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IExperiment.java
index 94303cd8876..bdee04869f5 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IExperiment.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IExperiment.java
@@ -16,7 +16,6 @@
 
 package ch.systemsx.cisd.etlserver.registrator.api.v1;
 
-import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.IExperimentImmutable;
 
 
 /**
@@ -24,13 +23,8 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.IExperimentIm
  * 
  * @author Chandrasekhar Ramakrishnan
  */
-public interface IExperiment extends IExperimentImmutable
+public interface IExperiment extends IExperimentUpdatable
 {
-    /**
-     * Set the value for a property.
-     */
-    void setPropertyValue(String propertyCode, String propertyValue);
-
     /**
      * Set the experiment type for this experiment.
      */
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IExperimentUpdatable.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IExperimentUpdatable.java
new file mode 100644
index 00000000000..01ac2592afc
--- /dev/null
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IExperimentUpdatable.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2011 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.etlserver.registrator.api.v1;
+
+import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.IExperimentImmutable;
+
+
+/**
+ * Interface to specify an experiment to be modified.
+ * 
+ * @author Jakub Straszewski
+ */
+public interface IExperimentUpdatable extends IExperimentImmutable
+{
+    /**
+     * Set the value for a property.
+     */
+    void setPropertyValue(String propertyCode, String propertyValue);
+
+}
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java
index 6a11c056586..298aa16be4a 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java
@@ -40,6 +40,7 @@ import ch.systemsx.cisd.etlserver.registrator.ITransactionalCommand;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IDataSet;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IDataSetUpdatable;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IExperiment;
+import ch.systemsx.cisd.etlserver.registrator.api.v1.IExperimentUpdatable;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IMaterial;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IProject;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.ISample;
@@ -66,6 +67,7 @@ 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.SampleUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifierFactory;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory;
 
@@ -155,6 +157,9 @@ public abstract class AbstractTransactionState<T extends DataSetInformation>
 
         private final List<Experiment> experimentsToBeRegistered = new ArrayList<Experiment>();
 
+        private final List<ExperimentUpdatable> experimentsToBeUpdated =
+                new ArrayList<ExperimentUpdatable>();
+
         private final List<Space> spacesToBeRegistered = new ArrayList<Space>();
 
         private final List<Project> projectsToBeRegistered = new ArrayList<Project>();
@@ -542,9 +547,22 @@ public abstract class AbstractTransactionState<T extends DataSetInformation>
             return sample;
         }
 
-        public IExperiment getExperimentForUpdate(String experimentIdentifierString)
+        public IExperimentUpdatable getExperimentForUpdate(String experimentIdentifierString)
         {
-            throw new NotImplementedException();
+            ExperimentIdentifier identifier =
+                    ExperimentIdentifierFactory.parse(experimentIdentifierString);
+
+            ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment experimentOrNull =
+                    openBisService.tryToGetExperiment(identifier);
+
+            ExperimentUpdatable result = null;
+            if (experimentOrNull != null)
+            {
+                result = new ExperimentUpdatable(experimentOrNull);
+                experimentsToBeUpdated.add(result);
+            }
+
+            return result;
         }
 
         public IExperiment createNewExperiment(String experimentIdentifierString,
@@ -842,15 +860,13 @@ public abstract class AbstractTransactionState<T extends DataSetInformation>
             List<NewSpace> spaceRegistrations = convertSpacesToBeRegistered();
             List<NewProject> projectRegistrations = convertProjectsToBeRegistered();
             List<NewExperiment> experimentRegistrations = convertExperimentsToBeRegistered();
+            List<ExperimentUpdatesDTO> experimentUpdates = convertExperimentsToBeUpdated();
             List<SampleUpdatesDTO> sampleUpdates = convertSamplesToBeUpdated();
             List<NewSample> sampleRegistrations = convertSamplesToBeRegistered();
             Map<String, List<NewMaterial>> materialRegistrations = convertMaterialsToBeRegistered();
             List<MaterialUpdateDTO> materialUpdates = convertMaterialsToBeUpdated();
             List<DataSetBatchUpdatesDTO> dataSetUpdates = convertDataSetsToBeUpdated();
 
-            // experiment updates not yet supported
-            List<ExperimentUpdatesDTO> experimentUpdates = new ArrayList<ExperimentUpdatesDTO>();
-
             AtomicEntityOperationDetails<T> registrationDetails =
                     new AtomicEntityOperationDetails<T>(registrationId, getUserId(),
                             spaceRegistrations, projectRegistrations, experimentUpdates,
@@ -890,6 +906,16 @@ public abstract class AbstractTransactionState<T extends DataSetInformation>
             return result;
         }
 
+        private List<ExperimentUpdatesDTO> convertExperimentsToBeUpdated()
+        {
+            List<ExperimentUpdatesDTO> result = new ArrayList<ExperimentUpdatesDTO>();
+            for (ExperimentUpdatable experiment : experimentsToBeUpdated)
+            {
+                result.add(ConversionUtils.convertToExperimentUpdateDTO(experiment));
+            }
+            return result;
+        }
+
         private List<NewSample> convertSamplesToBeRegistered()
         {
             List<NewSample> result = new ArrayList<NewSample>();
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ConversionUtils.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ConversionUtils.java
index a105f0a9b7e..26ddfa67f5b 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ConversionUtils.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ConversionUtils.java
@@ -38,6 +38,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.dto.DataSetBatchUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUpdatesDTO;
+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.NewContainerDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.dto.NewDataSet;
@@ -48,6 +49,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SampleUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.StorageFormat;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifierFactory;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifierFactory;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory;
 
@@ -76,6 +78,26 @@ public class ConversionUtils
         return newExperiment;
     }
 
+    public static ExperimentUpdatesDTO convertToExperimentUpdateDTO(
+            ExperimentUpdatable apiExperiment)
+    {
+        ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment experiment =
+                apiExperiment.getExperiment();
+        
+        ExperimentUpdatesDTO updates = new ExperimentUpdatesDTO();
+
+        updates.setVersion(experiment.getModificationDate());
+        updates.setExperimentId(new TechId(experiment.getId()));
+        updates.setAttachments(Collections.<NewAttachment> emptySet());
+        updates.setProjectIdentifier(new ProjectIdentifierFactory(experiment.getProject()
+                .getIdentifier()).createIdentifier());
+
+        updates.setProperties(experiment.getProperties());
+        updates.setVersion(experiment.getModificationDate());
+
+        return updates;
+    }
+
     public static NewSample convertToNewSample(Sample apiSample)
     {
         ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample sample = apiSample.getSample();
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java
index c3cd6e828c8..790be226001 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java
@@ -47,6 +47,7 @@ import ch.systemsx.cisd.etlserver.registrator.api.v1.IDataSet;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IDataSetRegistrationTransaction;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IDataSetUpdatable;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IExperiment;
+import ch.systemsx.cisd.etlserver.registrator.api.v1.IExperimentUpdatable;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IMaterial;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IProject;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.ISample;
@@ -312,7 +313,7 @@ public class DataSetRegistrationTransaction<T extends DataSetInformation> implem
     }
 
     @Override
-    public IExperiment getExperimentForUpdate(String experimentIdentifierString)
+    public IExperimentUpdatable getExperimentForUpdate(String experimentIdentifierString)
     {
         return getStateAsLiveState().getExperimentForUpdate(experimentIdentifierString);
     }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/Experiment.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/Experiment.java
index 24e4c50e33a..0bb593347da 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/Experiment.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/Experiment.java
@@ -22,14 +22,13 @@ import java.util.List;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
-import ch.systemsx.cisd.openbis.generic.shared.util.EntityHelper;
 
 /**
  * Implementation of {@link IExperiment}.
  * 
  * @author Franz-Josef Elmer
  */
-class Experiment extends ExperimentImmutable implements IExperiment
+class Experiment extends ExperimentUpdatable implements IExperiment
 {
     public Experiment(String identifier, String permID)
     {
@@ -48,12 +47,6 @@ class Experiment extends ExperimentImmutable implements IExperiment
         return false;
     }
 
-    @Override
-    public void setPropertyValue(String propertyCode, String propertyValue)
-    {
-        EntityHelper.createOrUpdateProperty(getExperiment(), propertyCode, propertyValue);
-    }
-
     @Override
     public void setExperimentType(String experimentType)
     {
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ExperimentUpdatable.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ExperimentUpdatable.java
new file mode 100644
index 00000000000..4ec9f34b360
--- /dev/null
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ExperimentUpdatable.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2011 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.etlserver.registrator.api.v1.impl;
+
+import ch.systemsx.cisd.etlserver.registrator.api.v1.IExperimentUpdatable;
+import ch.systemsx.cisd.openbis.generic.shared.util.EntityHelper;
+
+/**
+ * Implementation of {@link IExperimentUpdatable}.
+ * 
+ * @author Jakub Straszewski
+ */
+class ExperimentUpdatable extends ExperimentImmutable implements IExperimentUpdatable
+{
+    public ExperimentUpdatable(
+            ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment experiment)
+    {
+        super(experiment);
+    }
+
+    @Override
+    public boolean isExistingExperiment()
+    {
+        return true;
+    }
+
+    @Override
+    public void setPropertyValue(String propertyCode, String propertyValue)
+    {
+        EntityHelper.createOrUpdateProperty(getExperiment(), propertyCode, propertyValue);
+    }
+
+}
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/DataSetRegistrationTransactionV2Delegate.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/DataSetRegistrationTransactionV2Delegate.java
index b90833524e5..0513d8e6d5a 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/DataSetRegistrationTransactionV2Delegate.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/DataSetRegistrationTransactionV2Delegate.java
@@ -26,6 +26,7 @@ import ch.systemsx.cisd.etlserver.registrator.api.v1.IDataSet;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IDataSetRegistrationTransaction;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IDataSetUpdatable;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IExperiment;
+import ch.systemsx.cisd.etlserver.registrator.api.v1.IExperimentUpdatable;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IMaterial;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IProject;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.ISample;
@@ -119,7 +120,7 @@ public class DataSetRegistrationTransactionV2Delegate implements IDataSetRegistr
     }
 
     @Override
-    public IExperiment getExperimentForUpdate(String experimentIdentifierString)
+    public IExperimentUpdatable getExperimentForUpdate(String experimentIdentifierString)
     {
         return transaction.getExperimentForUpdate(experimentIdentifierString);
     }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IDataSetRegistrationTransactionV2.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IDataSetRegistrationTransactionV2.java
index 2f104a258cb..129d065abff 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IDataSetRegistrationTransactionV2.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IDataSetRegistrationTransactionV2.java
@@ -25,6 +25,7 @@ import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationContext;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IDataSet;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IDataSetUpdatable;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IExperiment;
+import ch.systemsx.cisd.etlserver.registrator.api.v1.IExperimentUpdatable;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IMaterial;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IProject;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.ISample;
@@ -121,7 +122,7 @@ public interface IDataSetRegistrationTransactionV2
     /**
      * Get an experiment from the openBIS AS for the purpose of modifying it.
      */
-    IExperiment getExperimentForUpdate(String experimentIdentifierString);
+    IExperimentUpdatable getExperimentForUpdate(String experimentIdentifierString);
 
     /**
      * Create a new experiment to register with the openBIS AS. The experiment will have a permId.
diff --git a/datastore_server/sourceTest/core-plugins/generic-test/1/dss/drop-boxes/rich-test/data-set-handler.py b/datastore_server/sourceTest/core-plugins/generic-test/1/dss/drop-boxes/rich-test/data-set-handler.py
index 21688571492..45742fe10a3 100644
--- a/datastore_server/sourceTest/core-plugins/generic-test/1/dss/drop-boxes/rich-test/data-set-handler.py
+++ b/datastore_server/sourceTest/core-plugins/generic-test/1/dss/drop-boxes/rich-test/data-set-handler.py
@@ -51,6 +51,10 @@ def updateMaterial(transaction):
     ma = transaction.getMaterialForUpdate("AD3", "VIRUS");
     ma.setPropertyValue("DESCRIPTION", "modified description");
 
+def updateExperiment(transaction):
+    ex = transaction.getExperimentForUpdate("/CISD/NEMO/EXP1")
+    ex.setPropertyValue("DESCRIPTION", "modified experiment description")
+
 def process(transaction):
     # create experiment
     experiment = create_experiment_if_needed(transaction)
@@ -67,6 +71,9 @@ def process(transaction):
     # update material
     updateMaterial(transaction) 
 
+    # update existing experiment
+    updateExperiment(transaction)
+
     # register samples
     createSamples(transaction)
 
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/FeatureRichDataSetImportSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/FeatureRichDataSetImportSystemTest.java
index 34299c28c26..9f477b42763 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/FeatureRichDataSetImportSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/FeatureRichDataSetImportSystemTest.java
@@ -33,6 +33,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListMaterialCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
 
 /**
@@ -70,6 +71,19 @@ public class FeatureRichDataSetImportSystemTest extends SystemTestCase
         assertEmailHasBeenSentFromHook();
 
         assertMaterialUpdated(openBISService);
+
+        assertExperimentUpdated(openBISService);
+    }
+
+    private void assertExperimentUpdated(IEncapsulatedOpenBISService openBISService)
+    {
+        Experiment experiment =
+                openBISService.tryToGetExperiment(new ExperimentIdentifier(null, "CISD", "NEMO",
+                        "EXP1"));
+
+        IEntityProperty property = experiment.getProperties().get(0);
+        assertEquals("DESCRIPTION", property.getPropertyType().getCode());
+        assertEquals("modified experiment description", property.getValue());
     }
 
     private void assertEmailHasBeenSentFromHook()
-- 
GitLab