Merge pull request #313 from owncloud/refactor_remote_operation_to_delete_file_and_folder

Refactored remote operation to delete file and folder into oc_framework
This commit is contained in:
David A. Velasco 2013-11-27 03:49:42 -08:00
commit 910c8a7b36
10 changed files with 162 additions and 57 deletions

View file

@ -0,0 +1,57 @@
package com.owncloud.android.oc_framework_test_project.test;
import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
import com.owncloud.android.oc_framework.operations.RemoteOperationResult.ResultCode;
import com.owncloud.android.oc_framework_test_project.TestActivity;
import android.test.ActivityInstrumentationTestCase2;
public class DeleteFileTest extends ActivityInstrumentationTestCase2<TestActivity> {
/* Folder data to delete. */
private final String mFolderPath = "/folderToDelete";
/* File to delete. */
private final String mFilePath = "fileToDelete.png";
private TestActivity mActivity;
public DeleteFileTest() {
super(TestActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
setActivityInitialTouchMode(false);
mActivity = getActivity();
}
/**
* Test Remove Folder
*/
public void testRemoveFolder() {
RemoteOperationResult result = mActivity.removeFile(mFolderPath);
assertTrue(result.isSuccess() || result.getCode() == ResultCode.FILE_NOT_FOUND);
}
/**
* Test Remove File
*/
public void testRemoveFile() {
RemoteOperationResult result = mActivity.removeFile(mFilePath);
assertTrue(result.isSuccess() || result.getCode() == ResultCode.FILE_NOT_FOUND);
}
/**
* Restore initial conditions
*/
public void testRestoreInitialConditions() {
RemoteOperationResult result = mActivity.createFolder(mFolderPath, true);
assertTrue(result.isSuccess());
}
}

View file

@ -4,6 +4,7 @@ import com.owncloud.android.oc_framework.network.webdav.OwnCloudClientFactory;
import com.owncloud.android.oc_framework.network.webdav.WebdavClient;
import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
import com.owncloud.android.oc_framework.operations.remote.CreateRemoteFolderOperation;
import com.owncloud.android.oc_framework.operations.remote.RemoveRemoteFileOperation;
import com.owncloud.android.oc_framework.operations.remote.RenameRemoteFileOperation;
import android.net.Uri;
@ -44,8 +45,8 @@ public class TestActivity extends Activity {
/**
* Access to the library method to Create a Folder
* @param remotePath
* @param createFullPath
* @param remotePath Full path to the new directory to create in the remote server.
* @param createFullPath 'True' means that all the ancestor folders should be created if don't exist yet.
*
* @return
*/
@ -75,4 +76,19 @@ public class TestActivity extends Activity {
return result;
}
/**
* Access to the library method to Remove a File or Folder
*
* @param remotePath Remote path of the file or folder in the server.
* @return
*/
public RemoteOperationResult removeFile(String remotePath) {
RemoveRemoteFileOperation removeOperation = new RemoveRemoteFileOperation(remotePath);
RemoteOperationResult result = removeOperation.execute(mClient);
return result;
}
}

View file

@ -0,0 +1,66 @@
package com.owncloud.android.oc_framework.operations.remote;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.jackrabbit.webdav.client.methods.DeleteMethod;
import android.util.Log;
import com.owncloud.android.oc_framework.network.webdav.WebdavClient;
import com.owncloud.android.oc_framework.network.webdav.WebdavUtils;
import com.owncloud.android.oc_framework.operations.RemoteOperation;
import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
/**
* Remote operation performing the removal of a remote file or folder in the ownCloud server.
*
* @author David A. Velasco
* @author masensio
*/
public class RemoveRemoteFileOperation extends RemoteOperation {
private static final String TAG = RemoveRemoteFileOperation.class.getSimpleName();
private static final int REMOVE_READ_TIMEOUT = 10000;
private static final int REMOVE_CONNECTION_TIMEOUT = 5000;
private String mRemotePath;
/**
* Constructor
*
* @param remotePath RemotePath of the remote file or folder to remove from the server
*/
public RemoveRemoteFileOperation(String remotePath) {
mRemotePath = remotePath;
}
/**
* Performs the rename operation.
*
* @param client Client object to communicate with the remote ownCloud server.
*/
@Override
protected RemoteOperationResult run(WebdavClient client) {
RemoteOperationResult result = null;
DeleteMethod delete = null;
try {
delete = new DeleteMethod(client.getBaseUri() + WebdavUtils.encodePath(mRemotePath));
int status = client.executeMethod(delete, REMOVE_READ_TIMEOUT, REMOVE_CONNECTION_TIMEOUT);
delete.getResponseBodyAsString(); // exhaust the response, although not interesting
result = new RemoteOperationResult((delete.succeeded() || status == HttpStatus.SC_NOT_FOUND), status, delete.getResponseHeaders());
Log.i(TAG, "Remove " + mRemotePath + ": " + result.getLogMessage());
} catch (Exception e) {
result = new RemoteOperationResult(e);
Log.e(TAG, "Remove " + mRemotePath + ": " + result.getLogMessage(), e);
} finally {
if (delete != null)
delete.releaseConnection();
}
return result;
}
}

View file

@ -434,7 +434,7 @@ public class FileDataStorageManager {
}
updateFolderSize(file.getParentId());
}
if (removeLocalCopy && file.isDown()) {
if (removeLocalCopy && file.isDown() && file.getStoragePath() != null) {
boolean success = new File(file.getStoragePath()).delete();
if (!removeDBData && success) {
// maybe unnecessary, but should be checked TODO remove if unnecessary

View file

@ -17,16 +17,13 @@
package com.owncloud.android.operations;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.jackrabbit.webdav.client.methods.DeleteMethod;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.oc_framework.network.webdav.WebdavClient;
import com.owncloud.android.oc_framework.operations.RemoteOperation;
import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
import com.owncloud.android.oc_framework.network.webdav.WebdavUtils;
import com.owncloud.android.utils.Log_OC;
import com.owncloud.android.oc_framework.operations.RemoteOperationResult.ResultCode;
import com.owncloud.android.oc_framework.operations.remote.RemoveRemoteFileOperation;
/**
@ -36,10 +33,7 @@ import com.owncloud.android.utils.Log_OC;
*/
public class RemoveFileOperation extends RemoteOperation {
private static final String TAG = RemoveFileOperation.class.getSimpleName();
private static final int REMOVE_READ_TIMEOUT = 10000;
private static final int REMOVE_CONNECTION_TIMEOUT = 5000;
// private static final String TAG = RemoveFileOperation.class.getSimpleName();
OCFile mFileToRemove;
boolean mDeleteLocalCopy;
@ -69,7 +63,6 @@ public class RemoveFileOperation extends RemoteOperation {
return mFileToRemove;
}
/**
* Performs the remove operation
*
@ -78,25 +71,14 @@ public class RemoveFileOperation extends RemoteOperation {
@Override
protected RemoteOperationResult run(WebdavClient client) {
RemoteOperationResult result = null;
DeleteMethod delete = null;
try {
delete = new DeleteMethod(client.getBaseUri() + WebdavUtils.encodePath(mFileToRemove.getRemotePath()));
int status = client.executeMethod(delete, REMOVE_READ_TIMEOUT, REMOVE_CONNECTION_TIMEOUT);
if (delete.succeeded() || status == HttpStatus.SC_NOT_FOUND) {
mDataStorageManager.removeFile(mFileToRemove, true, mDeleteLocalCopy);
}
delete.getResponseBodyAsString(); // exhaust the response, although not interesting
result = new RemoteOperationResult((delete.succeeded() || status == HttpStatus.SC_NOT_FOUND), status, delete.getResponseHeaders());
Log_OC.i(TAG, "Remove " + mFileToRemove.getRemotePath() + ": " + result.getLogMessage());
} catch (Exception e) {
result = new RemoteOperationResult(e);
Log_OC.e(TAG, "Remove " + mFileToRemove.getRemotePath() + ": " + result.getLogMessage(), e);
} finally {
if (delete != null)
delete.releaseConnection();
RemoveRemoteFileOperation operation = new RemoveRemoteFileOperation(mFileToRemove.getRemotePath());
result = operation.execute(client);
if (result.isSuccess() || result.getCode() == ResultCode.FILE_NOT_FOUND) {
mDataStorageManager.removeFile(mFileToRemove, true, mDeleteLocalCopy);
}
return result;
}

View file

@ -20,7 +20,6 @@ package com.owncloud.android.operations;
import java.io.File;
import java.io.IOException;
import org.apache.commons.httpclient.HttpException;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.oc_framework.network.webdav.WebdavClient;

View file

@ -473,12 +473,10 @@ public class FileDetailFragment extends FileFragment implements
@Override
public void onNeutral(String callerTag) {
File f = null;
OCFile file = getFile();
if (file.isDown() && (f = new File(file.getStoragePath())).exists()) {
f.delete();
mStorageManager.removeFile(file, false, true); // TODO perform in background task / new thread
if (file.getStoragePath() != null) {
file.setStoragePath(null);
mStorageManager.saveFile(file);
updateFileDetails(file, mAccount);
}
}

View file

@ -16,7 +16,6 @@
*/
package com.owncloud.android.ui.preview;
import java.io.File;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
@ -388,15 +387,9 @@ public class PreviewImageFragment extends FileFragment implements OnRemoteOper
*/
@Override
public void onNeutral(String callerTag) {
// TODO this code should be made in a secondary thread,
OCFile file = getFile();
if (file.isDown()) { // checks it is still there
File f = new File(file.getStoragePath());
f.delete();
file.setStoragePath(null);
mStorageManager.saveFile(file);
finish();
}
mStorageManager.removeFile(file, false, true); // TODO perform in background task / new thread
finish();
}
/**

View file

@ -16,7 +16,6 @@
*/
package com.owncloud.android.ui.preview;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
@ -672,16 +671,10 @@ public class PreviewMediaFragment extends FileFragment implements
*/
@Override
public void onNeutral(String callerTag) {
// TODO this code should be made in a secondary thread,
OCFile file = getFile();
if (file.isDown()) { // checks it is still there
stopPreview(true);
File f = new File(file.getStoragePath());
f.delete();
file.setStoragePath(null);
mStorageManager.saveFile(file);
finish();
}
stopPreview(true);
mStorageManager.removeFile(file, false, true); // TODO perform in background task / new thread
finish();
}
/**

View file

@ -18,11 +18,12 @@
package com.owncloud.android.test;
import android.test.AndroidTestCase;
import com.owncloud.android.oc_framework.accounts.AccountUtils;
import com.owncloud.android.oc_framework.utils.OwnCloudVersion;
import android.test.AndroidTestCase;
public class AccountUtilsTest extends AndroidTestCase {
public void testGetWebdavPathAndOCVersion() {