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 406417c21d8dc485a7cff3dfea45d16e84b1c52c..6993ee1df2c424d68714bd44117a0e5cfaac8f7b 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessor.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessor.java @@ -101,9 +101,10 @@ abstract public class AbstractDelegatingStorageProcessor implements IStorageProc incomingDataSetDirectory, rootDir); } - public void unstoreData(final File incomingDataSetDirectory, final File storedDataDirectory) + public UnstoreDataAction unstoreData(final File incomingDataSetDirectory, + final File storedDataDirectory, Throwable exception) { - delegate.unstoreData(incomingDataSetDirectory, storedDataDirectory); + return delegate.unstoreData(incomingDataSetDirectory, storedDataDirectory, exception); } public StorageFormat getStorageFormat() 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 6ca7187bffba8cd893fb3e73ac5334ed28f1bd20..0f82df7c0a8a7b675ba5b58e725ed48164837751 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessorWithDropbox.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessorWithDropbox.java @@ -147,14 +147,14 @@ abstract public class AbstractDelegatingStorageProcessorWithDropbox extends } @Override - public final void unstoreData(final File incomingDataSetDirectory, - final File storedDataDirectory) + public UnstoreDataAction unstoreData(final File incomingDataSetDirectory, + final File storedDataDirectory, Throwable exception) { if (recentlyStoredDropboxDataset != null && recentlyStoredDropboxDataset.exists()) { fileOperations.deleteRecursively(recentlyStoredDropboxDataset); } recentlyStoredDropboxDataset = null; - super.unstoreData(incomingDataSetDirectory, storedDataDirectory); + return super.unstoreData(incomingDataSetDirectory, storedDataDirectory, exception); } } 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 e5cc4408327c67190ea87985083b66587ad8bcc9..9336bbac572f3ddce2208a76c92ee9887777f5ba 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/BDSStorageProcessor.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/BDSStorageProcessor.java @@ -478,7 +478,14 @@ public final class BDSStorageProcessor extends AbstractStorageProcessor implemen return dataStructureDir; } - public final void unstoreData(final File incomingDataSetDirectory, + public UnstoreDataAction unstoreData(File incomingDataSetDirectory, File storedDataDirectory, + Throwable exception) + { + unstoreData(incomingDataSetDirectory, storedDataDirectory); + return UnstoreDataAction.MOVE_TO_ERROR; + } + + private final void unstoreData(final File incomingDataSetDirectory, final File storedDataDirectory) { checkParameters(incomingDataSetDirectory, storedDataDirectory); 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 35fa2700b6dda857d7a24d748f1a647befd15b4a..f756a57ab94fd8faeb72f68bd3358d6fbe8ccee1 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/DefaultStorageProcessor.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/DefaultStorageProcessor.java @@ -68,8 +68,8 @@ public class DefaultStorageProcessor extends AbstractStorageProcessor return rootDir; } - public final void unstoreData(final File incomingDataSetDirectory, - final File storedDataDirectory) + public UnstoreDataAction unstoreData(final File incomingDataSetDirectory, + final File storedDataDirectory, Throwable exception) { checkParameters(incomingDataSetDirectory, storedDataDirectory); File targetFile = @@ -79,6 +79,7 @@ public class DefaultStorageProcessor extends AbstractStorageProcessor // directory structure will persist. Right now, we consider this is fine as these empty // directories will not disturb the running application. FileRenamer.renameAndLog(targetFile, incomingDataSetDirectory); + return UnstoreDataAction.MOVE_TO_ERROR; } private static File getOriginalDirectory(final File storedDataDirectory) 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 4e87d141299efd4c340b7b91dded3105949b7ce5..dce604405eeb5777791f0dd4bd318f897325ac33 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/IStorageProcessor.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/IStorageProcessor.java @@ -62,6 +62,22 @@ public interface IStorageProcessor extends IStoreRootDirectoryHolder 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 + * error during registration in openbis. + */ + public enum UnstoreDataAction + { + /** + * moved the data to the error directory + */ + MOVE_TO_ERROR, + /** + * leave the data in the incoming directory + */ + LEAVE_UNTOUCH + } + /** * Performs a rollback of * {@link #storeData(SamplePE, DataSetInformation, ITypeExtractor, IMailClient, File, File)} The @@ -73,8 +89,11 @@ public interface IStorageProcessor extends IStoreRootDirectoryHolder * * @param incomingDataSetDirectory original folder to be restored. * @param storedDataDirectory directory which contains the data to be restored. + * @param exception an exception which has caused that the unstore operation has to be performed + * @return an instruction what to do with the data in incoming directory */ - public void unstoreData(final File incomingDataSetDirectory, final File storedDataDirectory); + public UnstoreDataAction unstoreData(final File incomingDataSetDirectory, + final File storedDataDirectory, Throwable exception); /** * Returns the format that this storage processor is storing data sets in. 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 d5ef3778cd6bbc9c109e9f88d7a653c997348d14..56471ee83f4a60ee7382e35a571b97f016c19aa0 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandler.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandler.java @@ -55,6 +55,7 @@ import ch.systemsx.cisd.common.types.BooleanOrUnknown; import ch.systemsx.cisd.common.utilities.BeanUtils; import ch.systemsx.cisd.common.utilities.IDelegatedActionWithResult; import ch.systemsx.cisd.common.utilities.ISelfTestable; +import ch.systemsx.cisd.etlserver.IStorageProcessor.UnstoreDataAction; 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.dto.DataSetType; @@ -466,9 +467,10 @@ public final class TransferredDataSetHandler implements IPathHandler, ISelfTesta { throw (Error) throwable; } - storageProcessor.unstoreData(incomingDataSetFile, baseDirectoryHolder - .getBaseDirectory()); - if (stopped == false) + UnstoreDataAction action = + storageProcessor.unstoreData(incomingDataSetFile, baseDirectoryHolder + .getBaseDirectory(), throwable); + if (stopped == false && action == UnstoreDataAction.MOVE_TO_ERROR) { final File baseDirectory = createBaseDirectory(ERROR_DATA_STRATEGY, storeRoot, dataSetInformation);