Skip to content
Snippets Groups Projects
Commit dd18be44 authored by felmer's avatar felmer
Browse files

LMS-2483 RsyncArchiver extended: As an alternative of real data set deletion...

LMS-2483 RsyncArchiver extended: As an alternative of real data set deletion data sets can be marked as deleted.

SVN: 24151
parent ec4dc6a0
No related branches found
No related tags found
No related merge requests found
......@@ -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;
......
......@@ -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.
......
......@@ -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
......
......@@ -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);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment