diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/AbstractArchiverProcessingPlugin.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/AbstractArchiverProcessingPlugin.java index c8e19d40075d6781315893c9c894673f1416ae3b..00706dc3d50814466261ec3bf6418c8f701fbbdb 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/AbstractArchiverProcessingPlugin.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/AbstractArchiverProcessingPlugin.java @@ -361,7 +361,8 @@ public abstract class AbstractArchiverProcessingPlugin extends AbstractDatastore protected static enum Operation { ARCHIVE("Archiving"), UNARCHIVE("Unarchiving"), - DELETE_FROM_ARCHIVE("Deleting from archive"); + DELETE_FROM_ARCHIVE("Deleting from archive"), + MARK_AS_DELETED("Marking as deleted"); private final String description; diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/DataSetFileOperationsManager.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/DataSetFileOperationsManager.java index e7e1af50b51980003596a6b8e3dea707523f4932..61102091f3faf0c1ac441112871deb30bd6d0033 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/DataSetFileOperationsManager.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/DataSetFileOperationsManager.java @@ -80,6 +80,8 @@ public class DataSetFileOperationsManager implements IDataSetFileOperationsManag @Private static final long DEFAULT_TIMEOUT_SECONDS = 15; + private static final String FOLDER_OF_AS_DELETED_MARKED_DATA_SETS = "DELETED"; + private final IDataSetFileOperationsExecutor executor; private final File destination; @@ -211,6 +213,21 @@ public class DataSetFileOperationsManager implements IDataSetFileOperationsManag } } + public Status markAsDeleted(DatasetLocation dataset) + { + try + { + File deletedFolder = new File(destination, FOLDER_OF_AS_DELETED_MARKED_DATA_SETS); + executor.createFolder(deletedFolder); + File markerFile = new File(deletedFolder, dataset.getCode()); + executor.createMarkerFile(markerFile); + return Status.OK; + } catch (ExceptionWithStatus ex) + { + return ex.getStatus(); + } + } + /** * Checks if specified dataset's data are present and synchronized in the destination specified * in constructor. The path at the destination is defined by original location of the data set. diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/IDataSetFileOperationsManager.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/IDataSetFileOperationsManager.java index 7749d1be1c2c759aa1e4248a7e490f21f84377b3..3da3bdfe13575f57eb5b5e7b75cd2b7e6a0604a7 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/IDataSetFileOperationsManager.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/IDataSetFileOperationsManager.java @@ -36,16 +36,21 @@ public interface IDataSetFileOperationsManager public abstract Status copyToDestination(File originalData, DatasetDescription dataset); /** - * Retrieves specified datases's data from the destination specified in constructor. The path at + * Retrieves specified dataset's data from the destination specified in constructor. The path at * the destination is defined by original location of the data set. */ public abstract Status retrieveFromDestination(File originalData, DatasetDescription dataset); /** - * Deletes specified datases's data from the destination specified in constructor. The path at + * Deletes specified dataset's data from the destination specified in constructor. The path at * the destination is defined by original location of the data set. */ public abstract Status deleteFromDestination(DatasetLocation dataset); + + /** + * Marks the specified data set as deleted. Does not delete the dataset's data. + */ + public abstract Status markAsDeleted(DatasetLocation dataset); /** * Checks if specified dataset's data are present and synchronized in the destination specified diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/RsyncArchiver.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/RsyncArchiver.java index 61829d55a678e5c948055108e6f313cdf5d17777..a2c13785bf085742c9052687c06acc2406c9eb40 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/RsyncArchiver.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/RsyncArchiver.java @@ -24,6 +24,7 @@ import ch.rinn.restrictions.Private; import ch.systemsx.cisd.common.exceptions.Status; import ch.systemsx.cisd.common.exceptions.UserFailureException; import ch.systemsx.cisd.common.filesystem.BooleanStatus; +import ch.systemsx.cisd.common.utilities.PropertyUtils; import ch.systemsx.cisd.openbis.dss.generic.shared.ArchiverTaskContext; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatasetLocation; import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription; @@ -42,10 +43,48 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription; */ public class RsyncArchiver extends AbstractArchiverProcessingPlugin { + private static final String ONLY_MARK_AS_DELETED_KEY = "only-mark-as-deleted"; + private static final long serialVersionUID = 1L; + private enum DeleteAction + { + DELETE(Operation.DELETE_FROM_ARCHIVE) + { + @Override + public Status execute(IDataSetFileOperationsManager manager, DatasetLocation dataSet) + { + return manager.deleteFromDestination(dataSet); + } + }, + MARK_AS_DELETED(Operation.MARK_AS_DELETED) + { + @Override + public Status execute(IDataSetFileOperationsManager manager, DatasetLocation dataSet) + { + return manager.markAsDeleted(dataSet); + } + }; + private final Operation operation; + + private DeleteAction(Operation operation) + { + this.operation = operation; + } + + public Operation getOperation() + { + return operation; + } + + public abstract Status execute(IDataSetFileOperationsManager manager, + DatasetLocation dataSet); + } + private transient IDataSetFileOperationsManager fileOperationsManager; + private final DeleteAction deleteAction; + public RsyncArchiver(Properties properties, File storeRoot) { this(properties, storeRoot, new DataSetFileOperationsManager(properties, @@ -58,6 +97,13 @@ public class RsyncArchiver extends AbstractArchiverProcessingPlugin { super(properties, storeRoot, null, null); this.fileOperationsManager = fileOperationsManager; + if (PropertyUtils.getBoolean(properties, ONLY_MARK_AS_DELETED_KEY, true)) + { + deleteAction = DeleteAction.MARK_AS_DELETED; + } else + { + deleteAction = DeleteAction.DELETE; + } } @Override @@ -97,13 +143,12 @@ public class RsyncArchiver extends AbstractArchiverProcessingPlugin DatasetProcessingStatuses statuses = new DatasetProcessingStatuses(); for (DatasetLocation dataset : datasets) { - Status status = doDeleteFromArchive(dataset); - statuses.addResult(dataset.getDataSetCode(), status, Operation.DELETE_FROM_ARCHIVE); + Status status = deleteAction.execute(fileOperationsManager, dataset); + statuses.addResult(dataset.getDataSetCode(), status, deleteAction.getOperation()); } - return statuses; } - + @Override protected BooleanStatus isDataSetSynchronizedWithArchive(DatasetDescription dataset, ArchiverTaskContext context) @@ -128,11 +173,6 @@ public class RsyncArchiver extends AbstractArchiverProcessingPlugin return fileOperationsManager.retrieveFromDestination(originalData, dataset); } - private Status doDeleteFromArchive(DatasetLocation dataset) - { - return fileOperationsManager.deleteFromDestination(dataset); - } - private File getDatasetDirectory(ArchiverTaskContext context, DatasetDescription dataset) { return context.getDirectoryProvider().getDataSetDirectory(dataset);