diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/IdentifiedDataStrategy.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/IdentifiedDataStrategy.java index e748ef2b729db8ec2355016b41ba49461ad85299..8d6fdb752c416d0e26f0da2c914840204b60abab 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/IdentifiedDataStrategy.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/IdentifiedDataStrategy.java @@ -40,7 +40,7 @@ public final class IdentifiedDataStrategy implements IDataStoreStrategy static final String STORAGE_LAYOUT_ERROR_MSG_PREFIX = "Serious error in data store layout: "; - IdentifiedDataStrategy() + public IdentifiedDataStrategy() { } diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationService.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationService.java index 1a83fdee2e6d642842de30ceca99696cbdf13c21..6d4fbb11261da1b6a3ad4c4905dba4e6e5da8b5d 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationService.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationService.java @@ -26,6 +26,7 @@ import ch.systemsx.cisd.etlserver.DataSetRegistrationAlgorithm; import ch.systemsx.cisd.etlserver.DataSetRegistrationAlgorithm.DataSetRegistrationAlgorithmState; import ch.systemsx.cisd.etlserver.DataSetRegistrationAlgorithmRunner; import ch.systemsx.cisd.etlserver.IDataStoreStrategy; +import ch.systemsx.cisd.etlserver.IdentifiedDataStrategy; import ch.systemsx.cisd.etlserver.TopLevelDataSetRegistratorGlobalState; import ch.systemsx.cisd.etlserver.registrator.AbstractOmniscientTopLevelDataSetRegistrator.OmniscientTopLevelDataSetRegistratorState; import ch.systemsx.cisd.etlserver.registrator.api.v1.IDataSetRegistrationTransaction; @@ -213,6 +214,28 @@ public class DataSetRegistrationService<T extends DataSetInformation> implements return algorithm; } + /** + * Create a storage algorithm for storing an individual data set, bypassing the detection of + * whether the data set's owner is in the db. This is used if the owner will be registered in + * the same transaction. This is internally used by transactions. Other clients may find it + * useful as well. + */ + public DataSetStorageAlgorithm<T> createStorageAlgorithmWithIdentifiedStrategy( + File dataSetFile, DataSetRegistrationDetails<T> dataSetDetails) + { + TopLevelDataSetRegistratorGlobalState globalContext = registratorContext.getGlobalState(); + T dataSetInformation = dataSetDetails.getDataSetInformation(); + dataSetInformation.setShareId(globalContext.getShareId()); + IDataStoreStrategy strategy = new IdentifiedDataStrategy(); + + DataSetStorageAlgorithm<T> algorithm = + new DataSetStorageAlgorithm<T>(dataSetFile, dataSetDetails, strategy, + registratorContext.getStorageProcessor(), + globalContext.getDataSetValidator(), globalContext.getDssCode(), + registratorContext.getFileOperations(), globalContext.getMailClient()); + return algorithm; + } + public IEntityOperationService<T> getEntityRegistrationService() { return new DefaultEntityOperationService<T>(registrator); 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 f4675b3d48c50f6e49032890f09510ab421dfa52..695c75414b5de7c5c6e2618a51c6a61612c98ebb 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 @@ -260,7 +260,16 @@ abstract class AbstractTransactionState<T extends DataSetInformation> { File contents = dataSet.getDataSetContents(); DataSetRegistrationDetails<T> details = dataSet.getRegistrationDetails(); - algorithms.add(registrationService.createStorageAlgorithm(contents, details)); + + // The experiment does not yet exist + if (experimentsToBeRegistered.contains(dataSet.getExperiment())) + { + algorithms.add(registrationService + .createStorageAlgorithmWithIdentifiedStrategy(contents, details)); + } else + { + algorithms.add(registrationService.createStorageAlgorithm(contents, details)); + } } DataSetStorageAlgorithmRunner<T> runner = @@ -306,20 +315,21 @@ abstract class AbstractTransactionState<T extends DataSetInformation> List<NewSample> sampleRegistrations = convertSamplesToBeRegistered(); // experiment updates not yet supported - List<ExperimentUpdatesDTO> experimentUpdates = - new ArrayList<ExperimentUpdatesDTO>(); + List<ExperimentUpdatesDTO> experimentUpdates = new ArrayList<ExperimentUpdatesDTO>(); AtomicEntityOperationDetails<T> registrationDetails = - new AtomicEntityOperationDetails<T>(experimentUpdates, - experimentRegistrations, sampleUpdates, sampleRegistrations, - dataSetRegistrations); + new AtomicEntityOperationDetails<T>(experimentUpdates, experimentRegistrations, + sampleUpdates, sampleRegistrations, dataSetRegistrations); return registrationDetails; } - private List<NewExperiment> convertExperimentsToBeRegistered() { + private List<NewExperiment> convertExperimentsToBeRegistered() + { List<NewExperiment> result = new ArrayList<NewExperiment>(); - for (Experiment apiExperiment : experimentsToBeRegistered) { - ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment experiment = apiExperiment.getExperiment(); + for (Experiment apiExperiment : experimentsToBeRegistered) + { + ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment experiment = + apiExperiment.getExperiment(); NewExperiment newExperiment = new NewExperiment(); newExperiment.setIdentifier(experiment.getIdentifier()); newExperiment.setPermID(experiment.getPermId()); @@ -349,12 +359,14 @@ abstract class AbstractTransactionState<T extends DataSetInformation> return result; } - private List<SampleUpdatesDTO> convertSamplesToBeUpdated() { + private List<SampleUpdatesDTO> convertSamplesToBeUpdated() + { List<SampleUpdatesDTO> result = new ArrayList<SampleUpdatesDTO>(); - for (Sample apiSample : samplesToBeRegistered) { + for (Sample apiSample : samplesToBeRegistered) + { ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample sample = - apiSample.getSample(); - + apiSample.getSample(); + List<NewAttachment> attachments = Collections.emptyList(); SampleUpdatesDTO sampleUpdate = new SampleUpdatesDTO(TechId.create(sample), // db id sample.getProperties(), // List<IEntityProperty> 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 07be4ab08e8b53aa8a994387a74c342615af890e..09f8eee2bed1948cecd2b8de4c230adf94bed6f1 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 @@ -359,11 +359,11 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest assertEquals(DATA_SET_TYPE, dataSet1.getDataSetType()); File datasetLocation1 = DatasetLocationUtil.getDatasetLocationPath(workingDirectory, DATA_SET_CODE + 1, - ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID, DATABASE_INSTANCE_UUID); + 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), - datasetLocation1), dataSet1 - .getLocation()); + datasetLocation1), dataSet1.getLocation()); assertEquals(datasetLocation1, MockStorageProcessor.instance.rootDirs.get(0)); File incomingDir1 = MockStorageProcessor.instance.incomingDirs.get(0); assertEquals(new File(new File(stagingDir, DATA_SET_CODE + 1), "sub_data_set_1"), @@ -376,11 +376,11 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest assertEquals(DATA_SET_TYPE, dataSet2.getDataSetType()); File datasetLocation2 = DatasetLocationUtil.getDatasetLocationPath(workingDirectory, DATA_SET_CODE + 2, - ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID, DATABASE_INSTANCE_UUID); + 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), - datasetLocation2), dataSet2 - .getLocation()); + datasetLocation2), dataSet2.getLocation()); assertEquals(datasetLocation2, MockStorageProcessor.instance.rootDirs.get(1)); File incomingDir2 = MockStorageProcessor.instance.incomingDirs.get(1); assertEquals(new File(new File(stagingDir, DATA_SET_CODE + 2), "sub_data_set_2"), @@ -416,8 +416,7 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest MockStorageProcessor.instance.dataSetInfoString); } - // TODO KE: 2011-02-11 Make this test run - //@Test + @Test public void testTransactionWithNewExperiment() { setUpHomeDataBaseExpectations(); @@ -427,8 +426,6 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest properties.setProperty(DataSetRegistrationService.STAGING_DIR, stagingDir.getPath()); createHandler(properties, false, true); createData(); - final ExperimentIdentifier experimentIdentifier = - ExperimentIdentifierFactory.parse("/SPACE/PROJECT/EXP"); 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() @@ -440,9 +437,6 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest one(openBisService).createDataSetCode(); will(returnValue(EXPERIMENT_PERM_ID)); - one(openBisService).tryToGetExperiment(experimentIdentifier); - will(returnValue(null)); - one(dataSetValidator).assertValidDataSet(DATA_SET_TYPE, new File(new File(stagingDir, DATA_SET_CODE), "sub_data_set_1")); one(openBisService).performEntityOperations(with(atomicatOperationDetails)); @@ -725,7 +719,8 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest new ThreadParameters(threadProperties, "jython-handler-test"); TopLevelDataSetRegistratorGlobalState globalState = - new TopLevelDataSetRegistratorGlobalState("dss", ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID, + new TopLevelDataSetRegistratorGlobalState("dss", + ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID, workingDirectory, openBisService, mailClient, dataSetValidator, true, threadParameters); return globalState;