Skip to content
This repository has been archived by the owner on Jul 26, 2022. It is now read-only.

Commit

Permalink
Refactoring and enabling cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
pimotte committed Aug 13, 2014
1 parent 206698a commit 46a2a68
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 24 deletions.
Expand Up @@ -19,6 +19,7 @@

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
Expand All @@ -33,7 +34,7 @@
import org.syncany.plugins.StorageTestResult;
import org.syncany.plugins.transfer.files.RemoteFile;
import org.syncany.plugins.transfer.files.TransactionRemoteFile;
import org.syncany.plugins.transfer.to.TransactionActionTO;
import org.syncany.plugins.transfer.to.ActionTO;
import org.syncany.plugins.transfer.to.TransactionTO;

/**
Expand Down Expand Up @@ -104,17 +105,44 @@ public StorageTestResult test(boolean testCreateTarget) {
return result;
}

public void cleanTransactions(String machineName) throws StorageException {
Map<TransactionTO, TransactionRemoteFile> transactions = getTransactionTOs();
for (TransactionTO transaction : transactions.keySet()) {
if (transaction.getMachineName().equals(machineName)) {
// Delete all permanent or temporary files in this transaction.
for (ActionTO action : transaction.getActions()) {
delete(action.getRemoteFile());
delete(action.getTempRemoteFile());
}

// Get corresponding remote file of transaction and delete it.
delete(transactions.get(transaction));
}
}
}

/**
* Returns a Set of all files that are not temporary, but are listed in a
* transaction file. These belong to an unfinished transaction and should be
* ignored.
*/
protected Set<RemoteFile> getFilesInTransactions() throws StorageException {
Set<RemoteFile> filesInTransaction = new HashSet<RemoteFile>();
Map<String, TransactionRemoteFile> transactionFiles = list(TransactionRemoteFile.class);
Set<TransactionTO> transactions = getTransactionTOs().keySet();

for (TransactionTO transaction : transactions) {
for (ActionTO action : transaction.getActions()) {
filesInTransaction.add(action.getRemoteFile());
}
}

return filesInTransaction;
}

private Map<TransactionTO, TransactionRemoteFile> getTransactionTOs() throws StorageException{
Map<String, TransactionRemoteFile> transactionFiles = list(TransactionRemoteFile.class);
Map<TransactionTO, TransactionRemoteFile> transactions = new HashMap<TransactionTO, TransactionRemoteFile>();
for (TransactionRemoteFile transaction : transactionFiles.values()) {
List<TransactionActionTO> transactionActions = null;

try {
File transactionFile = createTempFile("transaction");
Expand All @@ -128,18 +156,13 @@ protected Set<RemoteFile> getFilesInTransactions() throws StorageException {
TransactionTO transactionTO = serializer.read(TransactionTO.class, transactionFileStr);

// Extract final locations
transactionActions = transactionTO.getTransactionActions();
transactions.put(transactionTO, transaction);
transactionFile.delete();
}
catch (Exception e) {
throw new StorageException("Failed to read transactionFile", e);
}

for (TransactionActionTO transactionAction : transactionActions) {
filesInTransaction.add(transactionAction.getRemoteFile());
}
}

return filesInTransaction;
return transactions;
}
}
Expand Up @@ -31,7 +31,7 @@
import org.syncany.plugins.transfer.files.RemoteFile;
import org.syncany.plugins.transfer.files.TempRemoteFile;
import org.syncany.plugins.transfer.files.TransactionRemoteFile;
import org.syncany.plugins.transfer.to.TransactionActionTO;
import org.syncany.plugins.transfer.to.ActionTO;
import org.syncany.plugins.transfer.to.TransactionTO;

/**
Expand Down Expand Up @@ -63,12 +63,12 @@ public void add(File localFile, RemoteFile remoteFile) throws StorageException {
logger.log(Level.INFO, "Adding file to transaction: " + localFile);
logger.log(Level.INFO, " -> Temp. remote file: " + temporaryRemoteFile + ", final location: " + remoteFile);

TransactionActionTO action = new TransactionActionTO();
action.setType(TransactionActionTO.TYPE_UPLOAD);
ActionTO action = new ActionTO();
action.setType(ActionTO.TYPE_UPLOAD);
action.setLocalTempLocation(localFile);
action.setRemoteLocation(remoteFile);
action.setRemoteTempLocation(temporaryRemoteFile);
transactionTO.addTransactionAction(action);
transactionTO.addAction(action);
}

/**
Expand All @@ -83,14 +83,14 @@ public void commit() throws StorageException {

transferManager.upload(localTransactionFile, remoteTransactionFile);

for (TransactionActionTO action : transactionTO.getTransactionActions()) {
for (ActionTO action : transactionTO.getActions()) {
File localFile = action.getLocalTempLocation();
RemoteFile tempRemoteFile = action.getTempRemoteFile();
logger.log(Level.INFO, "- Uploading {0} to temp. file {1} ...", new Object[] { localFile, tempRemoteFile });
transferManager.upload(localFile, tempRemoteFile);
}

for (TransactionActionTO action : transactionTO.getTransactionActions()) {
for (ActionTO action : transactionTO.getActions()) {
RemoteFile tempRemoteFile = action.getTempRemoteFile();
RemoteFile finalRemoteFile = action.getRemoteFile();
logger.log(Level.INFO, "- Moving temp. file {0} to final location {1} ...", new Object[] { tempRemoteFile, finalRemoteFile });
Expand Down
Expand Up @@ -138,6 +138,17 @@ public Object execute() throws StorageException {
}
});
}

@Override
public void cleanTransactions(final String machineName) throws StorageException {
retryMethod(new RetriableMethod() {
@Override
public Object execute() throws StorageException {
underlyingTransferManager.cleanTransactions(machineName);
return null;
}
});
}

@Override
public StorageTestResult test(boolean testCreateTarget) {
Expand Down Expand Up @@ -218,4 +229,6 @@ private Object retryMethod(RetriableMethod retryableMethod) throws StorageExcept
}
}
}


}
Expand Up @@ -153,6 +153,17 @@ public interface TransferManager {
*/
public <T extends RemoteFile> Map<String, T> list(Class<T> remoteFileClass) throws StorageException;


/**
* Deletes all files that are related to transactions by the given machineName.
*
* @param machineName Name filter: this function only operations on transactions
* by this client.
* @throws StorageException If the connection fails due to no Internet connection,
* authentication errors, etc
*/
public void cleanTransactions(String machineName) throws StorageException;

/**
* Tests whether the repository parameters are valid. In particular, the method tests
* whether a target (folder, bucket, etc.) exists or, if not, whether it can be created.
Expand Down
Expand Up @@ -36,8 +36,8 @@

@Root(name="transactionAction")
@Namespace(reference="http://syncany.org/transaction/action/1")
public class TransactionActionTO {
private static final Logger logger = Logger.getLogger(TransactionActionTO.class.getSimpleName());
public class ActionTO {
private static final Logger logger = Logger.getLogger(ActionTO.class.getSimpleName());

public static final String TYPE_UPLOAD = "UPLOAD";
public static final String TYPE_DELETE = "DELETE";
Expand Down
Expand Up @@ -46,7 +46,7 @@ public class TransactionTO {
private String machineName;

@ElementList(entry="action")
private List<TransactionActionTO> transactionActionTOs;
private List<ActionTO> actionTOs;


public TransactionTO() {
Expand All @@ -55,18 +55,18 @@ public TransactionTO() {

public TransactionTO(String machineName) {
this.machineName = machineName;
transactionActionTOs = new ArrayList<TransactionActionTO>();
actionTOs = new ArrayList<ActionTO>();
}

public String getMachineName() {
return machineName;
}

public List<TransactionActionTO> getTransactionActions() {
return transactionActionTOs;
public List<ActionTO> getActions() {
return actionTOs;
}

public void addTransactionAction(TransactionActionTO transactionAction) {
transactionActionTOs.add(transactionAction);
public void addAction(ActionTO transactionAction) {
actionTOs.add(transactionAction);
}
}

0 comments on commit 46a2a68

Please sign in to comment.