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