From 158c7b176740aa3159547404b6cacb7594a59199 Mon Sep 17 00:00:00 2001
From: kaloyane <kaloyane>
Date: Tue, 15 Feb 2011 09:08:55 +0000
Subject: [PATCH] [LMS-2033] added support for registering a new dataset and a
 new sample in one go + test

SVN: 19947
---
 .../api/v1/impl/AbstractTransactionState.java | 21 ++++-
 .../JythonTopLevelDataSetRegistratorTest.java | 86 ++++++++++++++++++-
 .../transaction-with-new-sample.py            | 16 ++++
 3 files changed, 116 insertions(+), 7 deletions(-)
 create mode 100644 datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/transaction-with-new-sample.py

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 25299c41664..fa7943421a1 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
@@ -262,8 +262,9 @@ abstract class AbstractTransactionState<T extends DataSetInformation>
                 File contents = dataSet.getDataSetContents();
                 DataSetRegistrationDetails<T> details = dataSet.getRegistrationDetails();
 
-                // The experiment does not yet exist
-                if (experimentsToBeRegistered.contains(dataSet.getExperiment()))
+                // The experiment/sample does not yet exist
+                if (experimentsToBeRegistered.contains(dataSet.getExperiment())
+                        || samplesToBeRegistered.contains(dataSet.getSample()))
                 {
                     algorithms.add(registrationService
                             .createStorageAlgorithmWithIdentifiedStrategy(contents, details));
@@ -334,9 +335,14 @@ abstract class AbstractTransactionState<T extends DataSetInformation>
                 NewExperiment newExperiment = new NewExperiment();
                 newExperiment.setIdentifier(experiment.getIdentifier());
                 newExperiment.setPermID(experiment.getPermId());
+                if (experiment.getExperimentType() != null)
+                {
+                    newExperiment.setExperimentTypeCode(experiment.getExperimentType().getCode());
+                }
                 IEntityProperty[] properties =
                         experiment.getProperties().toArray(new IEntityProperty[0]);
                 newExperiment.setProperties(properties);
+
                 result.add(newExperiment);
             }
             return result;
@@ -352,10 +358,17 @@ abstract class AbstractTransactionState<T extends DataSetInformation>
                 NewSample newSample = new NewSample();
                 newSample.setIdentifier(sample.getIdentifier());
                 newSample.setPermID(sample.getPermId());
+                if (sample.getExperiment() != null)
+                {
+                    newSample.setExperimentIdentifier(sample.getExperiment().getIdentifier());
+                }
+                newSample.setSampleType(sample.getSampleType());
+
                 IEntityProperty[] properties =
                         sample.getProperties().toArray(new IEntityProperty[0]);
                 newSample.setProperties(properties);
-                newSample.setExperimentIdentifier(sample.getExperiment().getIdentifier());
+
+                result.add(newSample);
             }
             return result;
         }
@@ -363,7 +376,7 @@ abstract class AbstractTransactionState<T extends DataSetInformation>
         private List<SampleUpdatesDTO> convertSamplesToBeUpdated()
         {
             List<SampleUpdatesDTO> result = new ArrayList<SampleUpdatesDTO>();
-            for (Sample apiSample : samplesToBeRegistered)
+            for (Sample apiSample : samplesToBeUpdated)
             {
                 ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample sample =
                         apiSample.getSample();
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorTest.java
index b06b1a73686..e1b225d4f46 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorTest.java
@@ -64,6 +64,8 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.utils.DatasetLocationUtil;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Person;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.ExperimentBuilder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationResult;
@@ -89,6 +91,10 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest
 
     private static final String EXPERIMENT_PERM_ID = "experiment-perm-id";
 
+    private static final String EXPERIMENT_IDENTIFIER = "/SPACE/PROJECT/EXP";
+
+    private static final String SAMPLE_PERM_ID = "sample-perm-id";
+
     private JythonTopLevelDataSetHandler<DataSetInformation> handler;
 
     private Mockery context;
@@ -151,7 +157,8 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest
         properties.setProperty(DataSetRegistrationService.STAGING_DIR, stagingDir.getPath());
         createHandler(properties, false, true);
         createData();
-        ExperimentBuilder builder = new ExperimentBuilder().identifier("/SPACE/PROJECT/EXP");
+
+        ExperimentBuilder builder = new ExperimentBuilder().identifier(EXPERIMENT_IDENTIFIER);
         final Experiment experiment = builder.getExperiment();
         final RecordingMatcher<ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails> atomicatOperationDetails =
                 new RecordingMatcher<ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails>();
@@ -208,7 +215,7 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest
         properties.setProperty(DataSetRegistrationService.STAGING_DIR, stagingDir.getPath());
         createHandler(properties, true, false);
         createData();
-        ExperimentBuilder builder = new ExperimentBuilder().identifier("/SPACE/PROJECT/EXP");
+        ExperimentBuilder builder = new ExperimentBuilder().identifier(EXPERIMENT_IDENTIFIER);
         final Experiment experiment = builder.getExperiment();
         context.checking(new Expectations()
             {
@@ -255,7 +262,7 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest
         properties.setProperty(DataSetRegistrationService.STAGING_DIR, stagingDir.getPath());
         createHandler(properties, false, false);
         createData();
-        ExperimentBuilder builder = new ExperimentBuilder().identifier("/SPACE/PROJECT/EXP");
+        ExperimentBuilder builder = new ExperimentBuilder().identifier(EXPERIMENT_IDENTIFIER);
         final Experiment experiment = builder.getExperiment();
         context.checking(new Expectations()
             {
@@ -469,6 +476,79 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest
         context.assertIsSatisfied();
     }
 
+    @Test
+    public void testTransactionWithNewSample()
+    {
+        setUpHomeDataBaseExpectations();
+        Properties properties =
+                createThreadProperties(SCRIPTS_FOLDER + "transaction-with-new-sample.py");
+        final File stagingDir = new File(workingDirectory, "staging");
+        properties.setProperty(DataSetRegistrationService.STAGING_DIR, stagingDir.getPath());
+        createHandler(properties, false, true);
+        createData();
+        final RecordingMatcher<ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails> atomicatOperationDetails =
+                new RecordingMatcher<ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails>();
+        context.checking(new Expectations()
+            {
+                {
+                    one(openBisService).createDataSetCode();
+                    will(returnValue(DATA_SET_CODE));
+
+                    one(openBisService).createDataSetCode();
+                    will(returnValue(EXPERIMENT_PERM_ID));
+
+                    one(openBisService).createDataSetCode();
+                    will(returnValue(SAMPLE_PERM_ID));
+
+                    one(dataSetValidator).assertValidDataSet(DATA_SET_TYPE,
+                            new File(new File(stagingDir, DATA_SET_CODE), "sub_data_set_1"));
+                    one(openBisService).performEntityOperations(with(atomicatOperationDetails));
+                    will(returnValue(new AtomicEntityOperationResult()));
+                }
+            });
+
+        handler.handle(markerFile);
+
+        assertEquals(1, MockStorageProcessor.instance.incomingDirs.size());
+        ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails operations =
+                atomicatOperationDetails.recordedObject();
+
+        assertEquals(1, operations.getDataSetRegistrations().size());
+        assertEquals(0, operations.getExperimentUpdates().size());
+        assertEquals(0, operations.getSampleUpdates().size());
+        assertEquals(1, operations.getSampleRegistrations().size());
+        assertEquals(1, operations.getExperimentRegistrations().size());
+
+        NewSample newSample = operations.getSampleRegistrations().get(0);
+        assertEquals(SAMPLE_PERM_ID, newSample.getPermID());
+        assertEquals(EXPERIMENT_IDENTIFIER, newSample.getExperimentIdentifier());
+        assertEquals("sample_type", newSample.getSampleType().getCode());
+
+        NewExperiment newExperiment = operations.getExperimentRegistrations().get(0);
+        assertEquals(EXPERIMENT_PERM_ID, newExperiment.getPermID());
+        assertEquals(EXPERIMENT_IDENTIFIER, newExperiment.getIdentifier());
+        assertEquals("experiment_type", newExperiment.getExperimentTypeCode());
+
+        NewExternalData dataSet = operations.getDataSetRegistrations().get(0);
+        assertEquals(DATA_SET_CODE, dataSet.getCode());
+        assertEquals(DATA_SET_TYPE, dataSet.getDataSetType());
+
+        File datasetLocation =
+                DatasetLocationUtil.getDatasetLocationPath(workingDirectory, DATA_SET_CODE,
+                        ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID,
+                        DATABASE_INSTANCE_UUID);
+        assertEquals(FileUtilities.getRelativeFile(new File(workingDirectory,
+                ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID),
+                datasetLocation),
+
+        dataSet.getLocation());
+        assertEquals(1, MockStorageProcessor.instance.calledCommitCount);
+        assertEquals(datasetLocation, MockStorageProcessor.instance.rootDirs.get(0));
+        File incomingDir = MockStorageProcessor.instance.incomingDirs.get(0);
+        assertEquals(new File(new File(stagingDir, DATA_SET_CODE), "sub_data_set_1"), incomingDir);
+        context.assertIsSatisfied();
+    }
+
     @Test
     public void testScriptDies()
     {
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/transaction-with-new-sample.py b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/transaction-with-new-sample.py
new file mode 100644
index 00000000000..10cea6c68b0
--- /dev/null
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/transaction-with-new-sample.py
@@ -0,0 +1,16 @@
+transaction = service.transaction(incoming, factory)
+dataSet = transaction.createNewDataSet()
+transaction.moveFile(incoming.getPath() + '/sub_data_set_1', dataSet)
+dataSet.setDataSetType('O1')
+
+experiment = transaction.createNewExperiment('/SPACE/PROJECT/EXP')
+experiment.setPropertyValue('propCode', 'propValue')
+experiment.setType('experiment_type')
+
+sample = transaction.createNewSample('db:/PROJECT/SAMPLE')
+sample.setType('sample_type')
+sample.setPropertyValue('samplePropCode', 'samplePropValue')
+sample.setExperiment(experiment)
+
+dataSet.setSample(sample)
+
-- 
GitLab