diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessor.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessor.java index 9251d252912645cdc9729ad63342116cc1f46fc0..498d563d2ad89b104d7f77fc0d9a564421e99d20 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessor.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessor.java @@ -30,7 +30,6 @@ import ch.systemsx.cisd.common.utilities.ClassUtils; import ch.systemsx.cisd.common.utilities.ExtendedProperties; import ch.systemsx.cisd.common.utilities.PropertyUtils; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; import ch.systemsx.cisd.openbis.generic.shared.dto.StorageFormat; /** @@ -93,12 +92,12 @@ abstract public class AbstractDelegatingStorageProcessor implements IStorageProc // delegation // - public File storeData(final Sample sample, final DataSetInformation dataSetInformation, - final ITypeExtractor typeExtractor, final IMailClient mailClient, - final File incomingDataSetDirectory, final File rootDir) + public File storeData(final DataSetInformation dataSetInformation, final ITypeExtractor typeExtractor, + final IMailClient mailClient, final File incomingDataSetDirectory, + final File rootDir) { - return delegate.storeData(sample, dataSetInformation, typeExtractor, mailClient, - incomingDataSetDirectory, rootDir); + return delegate.storeData(dataSetInformation, typeExtractor, mailClient, incomingDataSetDirectory, + rootDir); } public UnstoreDataAction unstoreData(final File incomingDataSetDirectory, diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessorWithDropbox.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessorWithDropbox.java index 43eb99d2900495985f6e9eb9454a76fe5bc4ecbd..fe985f40af098a27ca395d947d42933ed4ceab20 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessorWithDropbox.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessorWithDropbox.java @@ -25,7 +25,6 @@ import ch.systemsx.cisd.common.filesystem.IFileOperations; import ch.systemsx.cisd.common.mail.IMailClient; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; import ch.systemsx.cisd.openbis.dss.generic.shared.utils.AbstractDatasetDropboxHandler; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; /** * Storage processor which is able to create a copy of incoming data for additional processing. @@ -66,13 +65,13 @@ abstract public class AbstractDelegatingStorageProcessorWithDropbox extends // @Override - public final File storeData(final Sample sample, final DataSetInformation dataSetInformation, - final ITypeExtractor typeExtractor, final IMailClient mailClient, - final File incomingDataSetDirectory, final File rootDir) + public final File storeData(final DataSetInformation dataSetInformation, final ITypeExtractor typeExtractor, + final IMailClient mailClient, final File incomingDataSetDirectory, + final File rootDir) { File storeData = - super.storeData(sample, dataSetInformation, typeExtractor, mailClient, - incomingDataSetDirectory, rootDir); + super.storeData(dataSetInformation, typeExtractor, mailClient, incomingDataSetDirectory, + rootDir); File originalData = super.tryGetProprietaryData(storeData); dropboxHandler.handle(originalData, dataSetInformation); return storeData; diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractStrorageProcessorWithUploader.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractStrorageProcessorWithUploader.java index 3a91aa377edafca40b44e9db708b3510f5fbb456..1a2d01888c6afdbffd2afb0e6ebdbc1da9d1bee1 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractStrorageProcessorWithUploader.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractStrorageProcessorWithUploader.java @@ -21,7 +21,6 @@ import java.util.Properties; import ch.systemsx.cisd.common.mail.IMailClient; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; /** * Storage processor which uses an {@link IDataSetUploader} after data set has been stored by @@ -50,13 +49,13 @@ public abstract class AbstractStrorageProcessorWithUploader extends AbstractDele } @Override - public File storeData(final Sample sample, final DataSetInformation dataSetInformation, - final ITypeExtractor typeExtractor, final IMailClient mailClient, - final File incomingDataSetDirectory, final File rootDir) + public File storeData(final DataSetInformation dataSetInformation, final ITypeExtractor typeExtractor, + final IMailClient mailClient, final File incomingDataSetDirectory, + final File rootDir) { File storeData = - super.storeData(sample, dataSetInformation, typeExtractor, mailClient, - incomingDataSetDirectory, rootDir); + super.storeData(dataSetInformation, typeExtractor, mailClient, incomingDataSetDirectory, + rootDir); File originalData = super.tryGetProprietaryData(storeData); uploader.upload(originalData, dataSetInformation); return storeData; diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/BDSStorageProcessor.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/BDSStorageProcessor.java index 6f9072ecb7c3e201da09b903bf4b5dee58c80362..cd70428da46805d030cf49278707c797dbef8c3e 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/BDSStorageProcessor.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/BDSStorageProcessor.java @@ -401,10 +401,9 @@ public final class BDSStorageProcessor extends AbstractStorageProcessor implemen // public final File storeData( - final ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample sample, - final DataSetInformation dataSetInformation, final ITypeExtractor typeExtractor, - final IMailClient mailClient, final File incomingDataSetDirectory, - final File rootDirectory) + final DataSetInformation dataSetInformation, + final ITypeExtractor typeExtractor, final IMailClient mailClient, + final File incomingDataSetDirectory, final File rootDirectory) { checkDataSetInformation(dataSetInformation); assert rootDirectory != null : "Root directory can not be null."; @@ -414,7 +413,8 @@ public final class BDSStorageProcessor extends AbstractStorageProcessor implemen dataStructureDir = rootDirectory; dataStructureDir.mkdirs(); dataStructure = - createDataStructure(sample.getExperiment(), dataSetInformation, typeExtractor, + createDataStructure(dataSetInformation.tryToGetExperiment(), + dataSetInformation, typeExtractor, incomingDataSetDirectory, dataStructureDir); final IFormattedData formattedData = dataStructure.getFormattedData(); if (formattedData instanceof IHCSImageFormattedData) diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/CifexStorageProcessor.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/CifexStorageProcessor.java index c6ab6ca3180a333db6b5817c8f4dfadf1983f588..ffafcc2df4cea2dbf117a51059c1f0e38f13ee63 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/CifexStorageProcessor.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/CifexStorageProcessor.java @@ -35,7 +35,6 @@ import ch.systemsx.cisd.common.logging.LogFactory; import ch.systemsx.cisd.common.mail.IMailClient; import ch.systemsx.cisd.common.utilities.PropertyUtils; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; import ch.systemsx.cisd.openbis.generic.shared.dto.StorageFormat; /** @@ -85,13 +84,12 @@ public class CifexStorageProcessor extends AbstractStorageProcessor return StorageFormat.PROPRIETARY; } - public File storeData(Sample sample, DataSetInformation dataSetInformation, - ITypeExtractor typeExtractor, IMailClient mailClient, File incomingDataSetDirectory, - File rootDir) + public File storeData(DataSetInformation dataSetInformation, ITypeExtractor typeExtractor, + IMailClient mailClient, File incomingDataSetDirectory, File rootDir) { File result = - delegate.storeData(sample, dataSetInformation, typeExtractor, mailClient, - incomingDataSetDirectory, rootDir); + delegate.storeData(dataSetInformation, typeExtractor, mailClient, incomingDataSetDirectory, + rootDir); if (StringUtils.isBlank(keppFileRegex) == false) { clean(delegate.tryGetProprietaryData(rootDir), keppFileRegex); diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/DataStrategyStore.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/DataStrategyStore.java index 2bd210effbc5851597c0417ead94c5fafe2c8690..601609a3c022ca40ecc613ce1dd10a066d513243 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/DataStrategyStore.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/DataStrategyStore.java @@ -129,54 +129,68 @@ final class DataStrategyStore implements IDataStrategyStore { return dataStoreStrategies.get(DataStoreStrategyKey.UNIDENTIFIED); } + ExperimentIdentifier experimentIdentifier = dataSetInfo.getExperimentIdentifier(); final SampleIdentifier sampleIdentifier = dataSetInfo.getSampleIdentifier(); - final Sample sample = tryGetSample(sampleIdentifier); - final Experiment experiment = (sample == null) ? null : sample.getExperiment(); - if (experiment == null) + if (experimentIdentifier != null) { - notificationLog.error(createNotificationMessage(dataSetInfo, incomingDataSetPath)); - return dataStoreStrategies.get(DataStoreStrategyKey.UNIDENTIFIED); - } else if (experiment.getInvalidation() != null) - { - notificationLog.error("Data set for sample '" + sampleIdentifier - + "' can not be registered because experiment '" + experiment.getCode() - + "' has been invalidated."); - return dataStoreStrategies.get(DataStoreStrategyKey.UNIDENTIFIED); - } - dataSetInfo.setSample(sample); - final ExperimentIdentifier experimentIdentifier = createExperimentIdentifier(experiment); - dataSetInfo.setExperimentIdentifier(experimentIdentifier); - - final IEntityProperty[] properties = - limsService.getPropertiesOfTopSampleRegisteredFor(sampleIdentifier); - if (properties == null) + Experiment experiment = limsService.tryToGetExperiment(experimentIdentifier); + if (experiment == null) + { + notificationLog.error("Unknown experiment identifier '" + experimentIdentifier + "'."); + return dataStoreStrategies.get(DataStoreStrategyKey.UNIDENTIFIED); + } + dataSetInfo.setExperiment(experiment); + } else { - final Person registrator = experiment.getRegistrator(); - assert registrator != null : "Registrator must be known"; - final String message = createInvalidSampleCodeMessage(dataSetInfo); - final String recipientMail = registrator.getEmail(); - if (StringUtils.isNotBlank(recipientMail)) + final Sample sample = tryGetSample(sampleIdentifier); + final Experiment experiment = (sample == null) ? null : sample.getExperiment(); + if (experiment == null) + { + notificationLog.error(createNotificationMessage(dataSetInfo, incomingDataSetPath)); + return dataStoreStrategies.get(DataStoreStrategyKey.UNIDENTIFIED); + } else if (experiment.getInvalidation() != null) { - sendEmail(message, experimentIdentifier, recipientMail); - } else + notificationLog.error("Data set for sample '" + sampleIdentifier + + "' can not be registered because experiment '" + experiment.getCode() + + "' has been invalidated."); + return dataStoreStrategies.get(DataStoreStrategyKey.UNIDENTIFIED); + } + dataSetInfo.setSample(sample); + experimentIdentifier = createExperimentIdentifier(experiment); + dataSetInfo.setExperimentIdentifier(experimentIdentifier); + + final IEntityProperty[] properties = + limsService.getPropertiesOfTopSampleRegisteredFor(sampleIdentifier); + if (properties == null) { - notificationLog.error("The registrator '" + registrator - + "' has a blank email, sending the following email failed:\n" + message); + final Person registrator = experiment.getRegistrator(); + assert registrator != null : "Registrator must be known"; + final String message = createInvalidSampleCodeMessage(dataSetInfo); + final String recipientMail = registrator.getEmail(); + if (StringUtils.isNotBlank(recipientMail)) + { + sendEmail(message, experimentIdentifier, recipientMail); + } else + { + notificationLog.error("The registrator '" + registrator + + "' has a blank email, sending the following email failed:\n" + message); + } + operationLog.error(String.format("Incoming data set '%s' claims to " + + "belong to experiment '%s' and sample" + + " identifier '%s', but according to the openBIS server " + + "there is no such sample for this " + + "experiment (it has maybe been invalidated?). We thus consider it invalid.", + incomingDataSetPath, experimentIdentifier, sampleIdentifier)); + return dataStoreStrategies.get(DataStoreStrategyKey.INVALID); } - operationLog.error(String.format("Incoming data set '%s' claims to " - + "belong to experiment '%s' and sample" - + " identifier '%s', but according to the openBIS server " - + "there is no such sample for this " - + "experiment (it has maybe been invalidated?). We thus consider it invalid.", - incomingDataSetPath, experimentIdentifier, sampleIdentifier)); - return dataStoreStrategies.get(DataStoreStrategyKey.INVALID); + dataSetInfo.setProperties(properties); } - dataSetInfo.setProperties(properties); if (operationLog.isInfoEnabled()) { - operationLog.info("Identified that database knows experiment '" + experimentIdentifier - + "' and sample '" + sampleIdentifier + "'."); + operationLog.info("Identified that database knows experiment '" + + experimentIdentifier + "'" + + (sampleIdentifier == null ? "." : " and sample '" + sampleIdentifier + "'.")); } return dataStoreStrategies.get(DataStoreStrategyKey.IDENTIFIED); } diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/DefaultStorageProcessor.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/DefaultStorageProcessor.java index c0ef00e1b171054cc641fefb189f1767797d9c37..cde68a619e58ca1374c35dd7b5f4e2e9a324db13 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/DefaultStorageProcessor.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/DefaultStorageProcessor.java @@ -24,7 +24,6 @@ import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; import ch.systemsx.cisd.common.filesystem.FileUtilities; import ch.systemsx.cisd.common.mail.IMailClient; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; import ch.systemsx.cisd.openbis.generic.shared.dto.StorageFormat; /** @@ -48,9 +47,9 @@ public class DefaultStorageProcessor extends AbstractStorageProcessor // AbstractStorageProcessor // - public final File storeData(final Sample sample, final DataSetInformation dataSetInformation, - final ITypeExtractor typeExtractor, final IMailClient mailClient, - final File incomingDataSetDirectory, final File rootDir) + public final File storeData(final DataSetInformation dataSetInformation, final ITypeExtractor typeExtractor, + final IMailClient mailClient, final File incomingDataSetDirectory, + final File rootDir) { checkParameters(incomingDataSetDirectory, rootDir); File originalDir = getOriginalDirectory(rootDir); diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/IStorageProcessor.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/IStorageProcessor.java index d92ed351ec5bd33107c5ba496da83f6c490cfb96..9f21908172836de255b63f786e7eb1eed86f1a13 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/IStorageProcessor.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/IStorageProcessor.java @@ -21,7 +21,6 @@ import java.util.Properties; import ch.systemsx.cisd.common.mail.IMailClient; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; import ch.systemsx.cisd.openbis.generic.shared.dto.StorageFormat; /** @@ -45,22 +44,20 @@ public interface IStorageProcessor extends IStoreRootDirectoryHolder * Do not try/catch exceptions that could occur here. Preferably let the upper layer handle * them. * </p> - * - * @param sample Sample connected to a dataset, enriched with properties, connected experiment - * and its properties. * @param dataSetInformation Information about the data set. * @param typeExtractor the {@link ITypeExtractor} implementation. * @param mailClient mail client. * @param incomingDataSetDirectory folder to store. Do not remove it after the implementation * has finished processing. {@link TransferredDataSetHandler} takes care of this. * @param rootDir directory to whom the data will be stored. + * * @return folder which contains the stored data. This folder <i>must</i> be below the * <var>rootDir</var>. Never returns <code>null</code> but prefers to throw an exception * in case of unexpected behavior. */ - public File storeData(final Sample sample, final DataSetInformation dataSetInformation, - final ITypeExtractor typeExtractor, final IMailClient mailClient, - final File incomingDataSetDirectory, final File rootDir); + public File storeData(final DataSetInformation dataSetInformation, final ITypeExtractor typeExtractor, + final IMailClient mailClient, final File incomingDataSetDirectory, + final File rootDir); /** * Instructs the dataset handler what to do with the data in incoming directory if there was an @@ -80,7 +77,7 @@ public interface IStorageProcessor extends IStoreRootDirectoryHolder /** * Performs a rollback of - * {@link #storeData(Sample, DataSetInformation, ITypeExtractor, IMailClient, File, File)} The + * {@link #storeData(DataSetInformation, ITypeExtractor, IMailClient, File, File)} The * data created in <code>directory</code> will also be removed. * <p> * Call to this method is safe as implementations should try/catch exceptions that could occur diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandler.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandler.java index 543016e76b4cfc8c28d74baba61eae5baaefdc6d..2e7f006dcb42efe3de5817e974cca560896c2228 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandler.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandler.java @@ -59,7 +59,6 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; 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.Sample; import ch.systemsx.cisd.openbis.generic.shared.dto.ExtractableData; import ch.systemsx.cisd.openbis.generic.shared.dto.NewExternalData; import ch.systemsx.cisd.openbis.generic.shared.dto.StorageFormat; @@ -415,12 +414,11 @@ public final class TransferredDataSetHandler implements IPathHandler, ISelfTesta */ final List<DataSetInformation> registerDataSet() { - final Sample sample = dataSetInformation.getSample(); String processorID = typeExtractor.getProcessorType(incomingDataSetFile); try { - registerDataSetAndInitiateProcessing(sample, processorID); - logAndNotifySuccessfulRegistration(sample.getExperiment().getRegistrator() + registerDataSetAndInitiateProcessing(processorID); + logAndNotifySuccessfulRegistration(dataSetInformation.tryToGetExperiment().getRegistrator() .getEmail()); if (fileOperations.exists(incomingDataSetFile) && fileOperations.removeRecursivelyQueueing(incomingDataSetFile) == false) @@ -481,8 +479,7 @@ public final class TransferredDataSetHandler implements IPathHandler, ISelfTesta /** * Registers the data set. */ - private void registerDataSetAndInitiateProcessing(final Sample sample, - final String procedureTypeCode) + private void registerDataSetAndInitiateProcessing(final String procedureTypeCode) { final File markerFile = createProcessingMarkerFile(); try @@ -496,8 +493,8 @@ public final class TransferredDataSetHandler implements IPathHandler, ISelfTesta watch.start(); NewExternalData data = createExternalData(); File dataFile = - storageProcessor.storeData(sample, dataSetInformation, typeExtractor, - mailClient, incomingDataSetFile, baseDirectoryHolder + storageProcessor.storeData(dataSetInformation, typeExtractor, mailClient, + incomingDataSetFile, baseDirectoryHolder .getBaseDirectory()); if (operationLog.isInfoEnabled()) { diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISService.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISService.java index d6cc2dc12d4bada41ecf2eed7ba4c4c44d64e10c..dc74a12dc6e344c6d55f767ab88a18f60d53016b 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISService.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISService.java @@ -33,6 +33,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; import ch.systemsx.cisd.openbis.generic.shared.IETLLIMSService; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletedDataSet; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; @@ -42,6 +43,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.ListSamplesByPropertyCriteria import ch.systemsx.cisd.openbis.generic.shared.dto.NewExternalData; import ch.systemsx.cisd.openbis.generic.shared.dto.Session; import ch.systemsx.cisd.openbis.generic.shared.dto.SimpleDataSetInformationDTO; +import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; /** @@ -175,6 +177,11 @@ public final class EncapsulatedOpenBISService implements IEncapsulatedOpenBISSer authenticate(); } } + + private Experiment primTryToGetExperiment(ExperimentIdentifier experimentIdentifier) + { + return service.tryToGetExperiment(sessionToken, experimentIdentifier); + } private final Sample primTryGetSampleWithExperiment(final SampleIdentifier sampleIdentifier) { @@ -184,7 +191,15 @@ public final class EncapsulatedOpenBISService implements IEncapsulatedOpenBISSer private final void primRegisterDataSet(final DataSetInformation dataSetInformation, final NewExternalData data) { - service.registerDataSet(sessionToken, dataSetInformation.getSampleIdentifier(), data); + ExperimentIdentifier experimentIdentifier = dataSetInformation.getExperimentIdentifier(); + if (experimentIdentifier != null) + { + service.registerDataSet(sessionToken, experimentIdentifier, data); + } else + { + SampleIdentifier sampleIdentifier = dataSetInformation.getSampleIdentifier(); + service.registerDataSet(sessionToken, sampleIdentifier, data); + } } private final IEntityProperty[] primGetPropertiesOfSampleRegisteredFor( @@ -208,6 +223,21 @@ public final class EncapsulatedOpenBISService implements IEncapsulatedOpenBISSer // IEncapsulatedOpenBISService // + synchronized public Experiment tryToGetExperiment(ExperimentIdentifier experimentIdentifier) + { + assert experimentIdentifier != null : " Unspecified experiment identifier."; + + checkSessionToken(); + try + { + return primTryToGetExperiment(experimentIdentifier); + } catch (InvalidSessionException ex) + { + authenticate(); + return primTryToGetExperiment(experimentIdentifier); + } + } + synchronized public final Sample tryGetSampleWithExperiment( final SampleIdentifier sampleIdentifier) { diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IEncapsulatedOpenBISService.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IEncapsulatedOpenBISService.java index 521f32a7aad267ffe5343be2bd8f29698b9b6381..ba481bd5e46371bf0fd5fbe8f9a56825205a56ba 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IEncapsulatedOpenBISService.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IEncapsulatedOpenBISService.java @@ -23,12 +23,14 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; import ch.systemsx.cisd.openbis.generic.shared.IETLLIMSService; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletedDataSet; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; import ch.systemsx.cisd.openbis.generic.shared.dto.ListSamplesByPropertyCriteria; import ch.systemsx.cisd.openbis.generic.shared.dto.NewExternalData; import ch.systemsx.cisd.openbis.generic.shared.dto.SimpleDataSetInformationDTO; +import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; /** @@ -46,6 +48,12 @@ public interface IEncapsulatedOpenBISService public ExternalData tryGetDataSet(final String sessionToken, final String dataSetCode) throws UserFailureException; + /** + * Tries to get the experiment of specified identifier or <code>null</code> if not found. + */ + public Experiment tryToGetExperiment(ExperimentIdentifier experimentIdentifier) + throws UserFailureException; + /** * Gets a sample with the specified identifier. Sample is enriched with properties and the * experiment with properties. diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/dto/DataSetInformation.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/dto/DataSetInformation.java index ca6db23c3f2c08ca7a70c686cadc0202f85b110f..d193444f46cb1af7d0a9ae12bedcecf1820513fb 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/dto/DataSetInformation.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/dto/DataSetInformation.java @@ -71,6 +71,8 @@ public class DataSetInformation implements Serializable /** sample with properties, enriched with connected experiment with properties. */ private transient Sample sample; + + private transient Experiment experiment; private BooleanOrUnknown isCompleteFlag = BooleanOrUnknown.U; @@ -119,7 +121,7 @@ public class DataSetInformation implements Serializable */ public final IEntityProperty[] getProperties() { - return properties; + return properties == null ? new IEntityProperty[0] : properties; } public final void setProperties(final IEntityProperty[] properties) @@ -166,18 +168,17 @@ public class DataSetInformation implements Serializable /** * Returns the basic information about the experiment. */ - public Experiment getExperiment() + public Experiment tryToGetExperiment() { - return sample == null ? null : sample.getExperiment(); + return experiment == null ? (sample == null ? null : sample.getExperiment()) : experiment; + } + + public void setExperiment(Experiment experiment) + { + this.experiment = experiment; } - /** - * NOTE: may be NULL - * - * @deprecated remove deprecation when all use cases are rewritten in a NULL safe way - */ - @Deprecated - public Sample getSample() + public Sample tryToGetSample() { return sample; } diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/AbstractStorageProcessorWithDropboxTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/AbstractStorageProcessorWithDropboxTest.java index ab3006e0b64c426c5c3bcb6c053befc366b10413..440a20b8f359aabcb66c08e26bca32238e052131 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/AbstractStorageProcessorWithDropboxTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/AbstractStorageProcessorWithDropboxTest.java @@ -53,8 +53,8 @@ public class AbstractStorageProcessorWithDropboxTest extends AbstractFileSystemT context.checking(new Expectations() { { - one(delegateStorageProcessor).storeData(null, dataSetInfo, null, null, - incomingDirectory, null); + one(delegateStorageProcessor).storeData(dataSetInfo, null, null, incomingDirectory, + null); will(returnValue(incomingDirectory)); File dropboxIncomingDir = new File(dropboxIncomingDirName); @@ -77,7 +77,7 @@ public class AbstractStorageProcessorWithDropboxTest extends AbstractFileSystemT AbstractDelegatingStorageProcessorWithDropbox storageProcessor = new StorageProcessorWithDropboxTest(props, delegateStorageProcessor, fileOperations); - storageProcessor.storeData(null, dataSetInfo, null, null, incomingDirectory, null); + storageProcessor.storeData(dataSetInfo, null, null, incomingDirectory, null); context.assertIsSatisfied(); } @@ -195,7 +195,7 @@ public class AbstractStorageProcessorWithDropboxTest extends AbstractFileSystemT File store = new File(workingDirectory, "store"); store.mkdirs(); - processor.storeData(null, dataSetInfo, null, null, dataSetFile, store); + processor.storeData(dataSetInfo, null, null, dataSetFile, store); File storeData = new File(store, "original/data.txt"); assertEquals(true, storeData.exists()); diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/BDSStorageProcessorTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/BDSStorageProcessorTest.java index 04b417dd60c4bae731642e60c3d873460c4ca5b0..1b272f635f00853f3d4ce585a9f3338693c2838f 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/BDSStorageProcessorTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/BDSStorageProcessorTest.java @@ -354,8 +354,8 @@ public final class BDSStorageProcessorTest extends AbstractFileSystemTestCase final DataSetInformation dataSetInformation = createDataSetInformation(); prepareMailClient(format); final File dataFile = - storageProcessor.storeData(baseSample, dataSetInformation, TYPE_EXTRACTOR, - mailClient, incomingDataSetDirectory, new File(workingDirectory, + storageProcessor.storeData(dataSetInformation, TYPE_EXTRACTOR, mailClient, + incomingDataSetDirectory, new File(workingDirectory, STORE_ROOT_DIR)); assertEquals(new File(workingDirectory, STORE_ROOT_DIR).getAbsolutePath(), dataFile .getAbsolutePath()); @@ -412,8 +412,8 @@ public final class BDSStorageProcessorTest extends AbstractFileSystemTestCase prepareMailClient(format); final File storeRootDir = new File(workingDirectory, STORE_ROOT_DIR); final File dataStore = - storageAdapter.storeData(baseSample, dataSetInformation, TYPE_EXTRACTOR, - mailClient, incomingDirectoryData, storeRootDir); + storageAdapter.storeData(dataSetInformation, TYPE_EXTRACTOR, mailClient, + incomingDirectoryData, storeRootDir); assertEquals(true, dataStore.isDirectory()); assertEquals(false, incomingDirectoryData.exists()); storageAdapter.unstoreData(incomingDirectoryData, storeRootDir, null); @@ -433,8 +433,8 @@ public final class BDSStorageProcessorTest extends AbstractFileSystemTestCase final DataSetInformation dataSetInformation = createDataSetInformation(); prepareMailClient(format); final File storeData = - storageProcessor.storeData(baseSample, dataSetInformation, TYPE_EXTRACTOR, - mailClient, incomingDirectoryData, workingDirectory); + storageProcessor.storeData(dataSetInformation, TYPE_EXTRACTOR, mailClient, + incomingDirectoryData, workingDirectory); final File originalDataSet = storageProcessor.tryGetProprietaryData(storeData); assertNotNull(originalDataSet); assertEquals(INCOMING_DATA_SET_DIR, originalDataSet.getName()); @@ -462,8 +462,8 @@ public final class BDSStorageProcessorTest extends AbstractFileSystemTestCase final DataSetInformation dataSetInformation = createDataSetInformation(); prepareMailClient(HCSImageFormatV1_0.HCS_IMAGE_1_0); final File storeData = - storageProcessor.storeData(baseSample, dataSetInformation, TYPE_EXTRACTOR, - mailClient, incomingDirectoryData, workingDirectory); + storageProcessor.storeData(dataSetInformation, TYPE_EXTRACTOR, mailClient, + incomingDirectoryData, workingDirectory); logRecorder.resetLogContent(); final File originalDataSet = storageProcessor.tryGetProprietaryData(storeData); assertEquals(null, originalDataSet); diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/CifexStorageProcessorTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/CifexStorageProcessorTest.java index 0b57f1aac6083224ce1fff368a553d6e38e9cf2b..700569e9887ba5c40f82715fad3d1787732ef81c 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/CifexStorageProcessorTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/CifexStorageProcessorTest.java @@ -68,8 +68,8 @@ public class CifexStorageProcessorTest extends AbstractFileSystemTestCase FileUtilities.writeToFile(new File(incomingDataSetDirectory, "read.me"), "hello world"); final File rootDir = createDirectory("root"); final File storeData = - storageProcessor.storeData(null, null, TYPE_EXTRACTOR, null, - incomingDataSetDirectory, rootDir); + storageProcessor.storeData(null, TYPE_EXTRACTOR, null, incomingDataSetDirectory, + rootDir); assertEquals(false, incomingDataSetDirectory.exists()); assertEquals(true, storeData.isDirectory()); assertEquals(rootDir.getAbsolutePath(), storeData.getAbsolutePath()); @@ -87,7 +87,7 @@ public class CifexStorageProcessorTest extends AbstractFileSystemTestCase FileUtilities.writeToFile(incoming, "hello world"); final File rootDir = createDirectory("root"); final File storeData = - storageProcessor.storeData(null, null, TYPE_EXTRACTOR, null, incoming, rootDir); + storageProcessor.storeData(null, TYPE_EXTRACTOR, null, incoming, rootDir); assertEquals(false, incoming.exists()); assertEquals(true, storeData.isDirectory()); File fileName = new File(rootDir, DefaultStorageProcessor.ORIGINAL_DIR + "/read.me"); diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/DefaultStorageProcessorTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/DefaultStorageProcessorTest.java index 796dd33234f661a72504c1a1cdb181934794e084..324630df94ae51b0a6325542bf0d5d7267e2e854 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/DefaultStorageProcessorTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/DefaultStorageProcessorTest.java @@ -63,7 +63,7 @@ public final class DefaultStorageProcessorTest extends AbstractFileSystemTestCas final DefaultStorageProcessor storageProcessor = createStorageProcessor(); try { - storageProcessor.storeData(null, null, null, null, null, null); + storageProcessor.storeData(null, null, null, null, null); fail("Null values not accepted"); } catch (final AssertionError e) { @@ -73,8 +73,8 @@ public final class DefaultStorageProcessorTest extends AbstractFileSystemTestCas FileUtilities.writeToFile(new File(incomingDataSetDirectory, "read.me"), "hello world"); final File rootDir = createDirectory("root"); final File storeData = - storageProcessor.storeData(null, null, TYPE_EXTRACTOR, null, - incomingDataSetDirectory, rootDir); + storageProcessor.storeData(null, TYPE_EXTRACTOR, null, incomingDataSetDirectory, + rootDir); assertEquals(false, incomingDataSetDirectory.exists()); assertEquals(true, storeData.isDirectory()); assertEquals(rootDir.getAbsolutePath(), storeData.getAbsolutePath()); @@ -108,8 +108,8 @@ public final class DefaultStorageProcessorTest extends AbstractFileSystemTestCas File readMeFile = new File(incomingDataSetDirectory, "read.me"); FileUtilities.writeToFile(readMeFile, "hi"); final File storeData = - storageProcessor.storeData(null, null, TYPE_EXTRACTOR, null, - incomingDataSetDirectory, root); + storageProcessor.storeData(null, TYPE_EXTRACTOR, null, incomingDataSetDirectory, + root); assertEquals(true, storeData.exists()); assertEquals(false, incomingDataSetDirectory.exists()); storageProcessor.unstoreData(incomingDataSetDirectory, root, null); diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java index 51ec503c86e44efab0f8bcb203b9029b0b93c61f..c7677e1f263853a722b7418f3220a64c9d56cd6a 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java @@ -560,8 +560,8 @@ public final class TransferredDataSetHandlerTest extends AbstractFileSystemTestC allowing(storageProcessor).getStorageFormat(); will(returnValue(StorageFormat.BDS_DIRECTORY)); - one(storageProcessor).storeData(baseSample, dataSetInformation, typeExtractor, - mailClient, data1, baseDir); + one(storageProcessor).storeData(dataSetInformation, typeExtractor, mailClient, + data1, baseDir); final File finalDataSetPath = new File(baseDir, DATA1_NAME); will(returnValue(finalDataSetPath)); } @@ -602,8 +602,8 @@ public final class TransferredDataSetHandlerTest extends AbstractFileSystemTestC allowing(storageProcessor).getStorageFormat(); will(returnValue(StorageFormat.BDS_DIRECTORY)); - one(storageProcessor).storeData(baseSample, dataSetInformation, typeExtractor, - mailClient, data1, baseDir); + one(storageProcessor).storeData(dataSetInformation, typeExtractor, mailClient, + data1, baseDir); final File finalDataSetPath = new File(baseDir, DATA1_NAME); will(returnValue(finalDataSetPath)); } @@ -696,8 +696,8 @@ public final class TransferredDataSetHandlerTest extends AbstractFileSystemTestC one(typeExtractor).getProcessorType(folder); will(returnValue(EXAMPLE_PROCESSOR_ID)); - one(storageProcessor).storeData(baseSample, dataSetInformation, typeExtractor, - mailClient, folder, baseDir); + one(storageProcessor).storeData(dataSetInformation, typeExtractor, mailClient, + folder, baseDir); UserFailureException exception = new UserFailureException("Could store data by storage processor"); will(throwException(exception)); @@ -755,8 +755,8 @@ public final class TransferredDataSetHandlerTest extends AbstractFileSystemTestC context.checking(new Expectations() { { - one(storageProcessor).storeData(baseSample, dataSetInformation, typeExtractor, - mailClient, folder, baseDir); + one(storageProcessor).storeData(dataSetInformation, typeExtractor, mailClient, + folder, baseDir); will(returnValue(new File(baseDir, DATA1_NAME))); one(limsService).registerDataSet(with(equal(SESSION_TOKEN)),