Browse Source

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
David A. Velasco 11 years ago
parent
commit
910c8a7b36

+ 57 - 0
oc_framework-test-project/oc_framework-test-test/src/com/owncloud/android/oc_framework_test_project/test/DeleteFileTest.java

@@ -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());
+		
+	}
+}

+ 18 - 2
oc_framework-test-project/src/com/owncloud/android/oc_framework_test_project/TestActivity.java

@@ -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;
+	}
+	
+	
 }

+ 66 - 0
oc_framework/src/com/owncloud/android/oc_framework/operations/remote/RemoveRemoteFileOperation.java

@@ -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;
+	}
+
+}

+ 1 - 1
src/com/owncloud/android/datamodel/FileDataStorageManager.java

@@ -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

+ 10 - 28
src/com/owncloud/android/operations/RemoveFileOperation.java

@@ -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;
     }
     

+ 0 - 1
src/com/owncloud/android/operations/RenameFileOperation.java

@@ -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;

+ 2 - 4
src/com/owncloud/android/ui/fragment/FileDetailFragment.java

@@ -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);
         }
     }

+ 2 - 9
src/com/owncloud/android/ui/preview/PreviewImageFragment.java

@@ -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();
     }
     
     /**

+ 3 - 10
src/com/owncloud/android/ui/preview/PreviewMediaFragment.java

@@ -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();
     }
     
     /**

+ 3 - 2
tests/src/com/owncloud/android/test/AccountUtilsTest.java

@@ -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() {