From 9b79ed71c376b23cc401b0b224e693c099104126 Mon Sep 17 00:00:00 2001 From: masensio Date: Thu, 14 Nov 2013 17:02:38 +0100 Subject: [PATCH] OC-1990: Isolate code RenameRemoteFileOperation --- .../remote/CreateRemoteFolderOperation.java | 2 +- .../remote/RenameRemoteFileOperation.java | 122 ++++++++++++++++++ .../android/oc_framework/utils/FileUtils.java | 14 +- .../authentication/AuthenticatorActivity.java | 1 - .../operations/RenameFileOperation.java | 103 ++++----------- tests/.classpath | 2 + 6 files changed, 159 insertions(+), 85 deletions(-) create mode 100644 oc_framework/src/com/owncloud/android/oc_framework/operations/remote/RenameRemoteFileOperation.java diff --git a/oc_framework/src/com/owncloud/android/oc_framework/operations/remote/CreateRemoteFolderOperation.java b/oc_framework/src/com/owncloud/android/oc_framework/operations/remote/CreateRemoteFolderOperation.java index a326ed1030..b11c6084ee 100644 --- a/oc_framework/src/com/owncloud/android/oc_framework/operations/remote/CreateRemoteFolderOperation.java +++ b/oc_framework/src/com/owncloud/android/oc_framework/operations/remote/CreateRemoteFolderOperation.java @@ -54,7 +54,7 @@ public class CreateRemoteFolderOperation extends RemoteOperation { RemoteOperationResult result = null; MkColMethod mkcol = null; - boolean noInvalidChars = FileUtils.validateName(mRemotePath); + boolean noInvalidChars = FileUtils.validateName(mRemotePath, true); if (noInvalidChars) { try { mkcol = new MkColMethod(client.getBaseUri() + WebdavUtils.encodePath(mRemotePath)); diff --git a/oc_framework/src/com/owncloud/android/oc_framework/operations/remote/RenameRemoteFileOperation.java b/oc_framework/src/com/owncloud/android/oc_framework/operations/remote/RenameRemoteFileOperation.java new file mode 100644 index 0000000000..799ce2f155 --- /dev/null +++ b/oc_framework/src/com/owncloud/android/oc_framework/operations/remote/RenameRemoteFileOperation.java @@ -0,0 +1,122 @@ +package com.owncloud.android.oc_framework.operations.remote; + +import org.apache.jackrabbit.webdav.client.methods.DavMethodBase; + +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; +import com.owncloud.android.oc_framework.operations.RemoteOperationResult.ResultCode; +import com.owncloud.android.oc_framework.utils.FileUtils; + + +/** + * Remote operation performing the rename of a remote file or folder in the ownCloud server. + * + * @author David A. Velasco + * @author masensio + */ +public class RenameRemoteFileOperation extends RemoteOperation { + + private static final String TAG = RenameRemoteFileOperation.class.getSimpleName(); + + private static final int RENAME_READ_TIMEOUT = 10000; + private static final int RENAME_CONNECTION_TIMEOUT = 5000; + + private String mOldName; + private String mOldRemotePath; + private String mNewName; + private String mNewRemotePath; + private boolean mIsFolder; + + + /** + * Constructor + * + * @param oldName Old name of the file. + * @param oldRemotePath Old remote path of the file. + * @param newName New name to set as the name of file. + * @param newRemotePath New remote path to move the file, for folders it starts and ends by "/" + */ + public RenameRemoteFileOperation(String oldName, String oldRemotePath, String newName, String newRemotePath, boolean isFolder) { + mOldName = oldName; + mOldRemotePath = oldRemotePath; + mNewName = newName; + mNewRemotePath = newRemotePath; + mIsFolder = isFolder; + } + + /** + * Performs the rename operation. + * + * @param client Client object to communicate with the remote ownCloud server. + */ + @Override + protected RemoteOperationResult run(WebdavClient client) { + RemoteOperationResult result = null; + + LocalMoveMethod move = null; + + boolean noInvalidChars = true; + + if (mIsFolder) + noInvalidChars = FileUtils.validateName(mNewRemotePath, mIsFolder); + else + noInvalidChars = FileUtils.validateName(mNewName, mIsFolder); + + if (noInvalidChars) { + try { + + if (mNewName.equals(mOldName)) { + return new RemoteOperationResult(ResultCode.OK); + } + + move = new LocalMoveMethod( client.getBaseUri() + WebdavUtils.encodePath(mOldRemotePath), + client.getBaseUri() + WebdavUtils.encodePath(mNewRemotePath)); + int status = client.executeMethod(move, RENAME_READ_TIMEOUT, RENAME_CONNECTION_TIMEOUT); + + move.getResponseBodyAsString(); // exhaust response, although not interesting + result = new RemoteOperationResult(move.succeeded(), status, move.getResponseHeaders()); + Log.i(TAG, "Rename " + mOldRemotePath + " to " + mNewRemotePath + ": " + result.getLogMessage()); + + } catch (Exception e) { + result = new RemoteOperationResult(e); + Log.e(TAG, "Rename " + mOldRemotePath + " to " + ((mNewRemotePath==null) ? mNewName : mNewRemotePath) + ": " + result.getLogMessage(), e); + + } finally { + if (move != null) + move.releaseConnection(); + } + } else { + result = new RemoteOperationResult(ResultCode.INVALID_CHARACTER_IN_NAME); + } + + return result; + } + + /** + * Move operation + * + */ + private class LocalMoveMethod extends DavMethodBase { + + public LocalMoveMethod(String uri, String dest) { + super(uri); + addRequestHeader(new org.apache.commons.httpclient.Header("Destination", dest)); + } + + @Override + public String getName() { + return "MOVE"; + } + + @Override + protected boolean isSuccess(int status) { + return status == 201 || status == 204; + } + + } + +} diff --git a/oc_framework/src/com/owncloud/android/oc_framework/utils/FileUtils.java b/oc_framework/src/com/owncloud/android/oc_framework/utils/FileUtils.java index 1fafd898cb..1ba399b4b8 100644 --- a/oc_framework/src/com/owncloud/android/oc_framework/utils/FileUtils.java +++ b/oc_framework/src/com/owncloud/android/oc_framework/utils/FileUtils.java @@ -20,15 +20,17 @@ public class FileUtils { * @param fileName * @return */ - public static boolean validateName(String fileName) { + public static boolean validateName(String fileName, boolean isFolder) { boolean result = true; - Log.d("FileUtils", "fileName =======" + fileName); + Log.d("FileUtils", "fileName ======= " + fileName); String name = fileName.substring(1); - if ((fileName.indexOf("/") > 0 && name.indexOf("/") < (name.length() - 1 ) ) || - fileName.contains("\\") || fileName.contains("<") || fileName.contains(">") || - fileName.contains(":") || fileName.contains("\"") || fileName.contains("|") || - fileName.contains("?") || fileName.contains("*")) { + if (isFolder) { + name = name.substring(0, name.length() - 1); + } + if (name.contains("/") || fileName.contains("\\") || fileName.contains("<") || + fileName.contains(">") || fileName.contains(":") || fileName.contains("\"") || + fileName.contains("|") || fileName.contains("?") || fileName.contains("*")) { result = false; } return result; diff --git a/src/com/owncloud/android/authentication/AuthenticatorActivity.java b/src/com/owncloud/android/authentication/AuthenticatorActivity.java index 6928d41463..85f4914a91 100644 --- a/src/com/owncloud/android/authentication/AuthenticatorActivity.java +++ b/src/com/owncloud/android/authentication/AuthenticatorActivity.java @@ -23,7 +23,6 @@ import android.accounts.AccountManager; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; -import android.content.ContentResolver; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; diff --git a/src/com/owncloud/android/operations/RenameFileOperation.java b/src/com/owncloud/android/operations/RenameFileOperation.java index 2b352bdd93..1eecfc283f 100644 --- a/src/com/owncloud/android/operations/RenameFileOperation.java +++ b/src/com/owncloud/android/operations/RenameFileOperation.java @@ -20,23 +20,20 @@ package com.owncloud.android.operations; import java.io.File; import java.io.IOException; -import org.apache.jackrabbit.webdav.client.methods.DavMethodBase; - +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; -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; import com.owncloud.android.oc_framework.operations.RemoteOperationResult.ResultCode; +import com.owncloud.android.oc_framework.operations.remote.RenameRemoteFileOperation; import com.owncloud.android.utils.FileStorageUtils; import com.owncloud.android.utils.Log_OC; -//import org.apache.jackrabbit.webdav.client.methods.MoveMethod; import android.accounts.Account; - /** * Remote operation performing the rename of a remote file (or folder?) in the ownCloud server. * @@ -45,9 +42,6 @@ import android.accounts.Account; public class RenameFileOperation extends RemoteOperation { private static final String TAG = RenameFileOperation.class.getSimpleName(); - - private static final int RENAME_READ_TIMEOUT = 10000; - private static final int RENAME_CONNECTION_TIMEOUT = 5000; private OCFile mFile; @@ -87,69 +81,46 @@ public class RenameFileOperation extends RemoteOperation { protected RemoteOperationResult run(WebdavClient client) { RemoteOperationResult result = null; - LocalMoveMethod move = null; - mNewRemotePath = null; + // check if the new name is valid in the local file system try { - if (mNewName.equals(mFile.getFileName())) { - return new RemoteOperationResult(ResultCode.OK); + if (!isValidNewName()) { + return new RemoteOperationResult(ResultCode.INVALID_LOCAL_FILE_NAME); } - String parent = (new File(mFile.getRemotePath())).getParent(); parent = (parent.endsWith(OCFile.PATH_SEPARATOR)) ? parent : parent + OCFile.PATH_SEPARATOR; mNewRemotePath = parent + mNewName; if (mFile.isFolder()) { mNewRemotePath += OCFile.PATH_SEPARATOR; } - - // check if the new name is valid in the local file system - if (!isValidNewName()) { - return new RemoteOperationResult(ResultCode.INVALID_LOCAL_FILE_NAME); - } - + // check if a file with the new name already exists if (client.existsFile(mNewRemotePath) || // remote check could fail by network failure. by indeterminate behavior of HEAD for folders ... mStorageManager.getFileByPath(mNewRemotePath) != null) { // ... so local check is convenient return new RemoteOperationResult(ResultCode.INVALID_OVERWRITE); } - move = new LocalMoveMethod( client.getBaseUri() + WebdavUtils.encodePath(mFile.getRemotePath()), - client.getBaseUri() + WebdavUtils.encodePath(mNewRemotePath)); - int status = client.executeMethod(move, RENAME_READ_TIMEOUT, RENAME_CONNECTION_TIMEOUT); - if (move.succeeded()) { + + RenameRemoteFileOperation operation = new RenameRemoteFileOperation(mFile.getFileName(), mFile.getRemotePath(), mNewName, + mNewRemotePath, mFile.isFolder()); + result = operation.execute(client); - if (mFile.isFolder()) { - saveLocalDirectory(); - - } else { - saveLocalFile(); - - } - - /* - *} else if (mFile.isDirectory() && (status == 207 || status >= 500)) { - * // TODO - * // if server fails in the rename of a folder, some children files could have been moved to a folder with the new name while some others - * // stayed in the old folder; - * // - * // easiest and heaviest solution is synchronizing the parent folder (or the full account); - * // - * // a better solution is synchronizing the folders with the old and new names; - *} - */ - + if (result.isSuccess()) { + if (mFile.isFolder()) { + saveLocalDirectory(); + + } else { + saveLocalFile(); } - - move.getResponseBodyAsString(); // exhaust response, although not interesting - result = new RemoteOperationResult(move.succeeded(), status, move.getResponseHeaders()); - Log_OC.i(TAG, "Rename " + mFile.getRemotePath() + " to " + mNewRemotePath + ": " + result.getLogMessage()); - - } catch (Exception e) { - result = new RemoteOperationResult(e); - Log_OC.e(TAG, "Rename " + mFile.getRemotePath() + " to " + ((mNewRemotePath==null) ? mNewName : mNewRemotePath) + ": " + result.getLogMessage(), e); - - } finally { - if (move != null) - move.releaseConnection(); } + } catch (HttpException e) { + Log_OC.e(TAG, "Rename " + mFile.getRemotePath() + " to " + ((mNewRemotePath==null) ? mNewName : mNewRemotePath) + ": " + + ((result!= null) ? result.getLogMessage() : ""), e); + e.printStackTrace(); + } catch (IOException e) { + Log_OC.e(TAG, "Rename " + mFile.getRemotePath() + " to " + ((mNewRemotePath==null) ? mNewName : mNewRemotePath) + ": " + + ((result!= null) ? result.getLogMessage() : ""), e); + e.printStackTrace(); + } + return result; } @@ -225,26 +196,4 @@ public class RenameFileOperation extends RemoteOperation { return result; } - - // move operation - private class LocalMoveMethod extends DavMethodBase { - - public LocalMoveMethod(String uri, String dest) { - super(uri); - addRequestHeader(new org.apache.commons.httpclient.Header("Destination", dest)); - } - - @Override - public String getName() { - return "MOVE"; - } - - @Override - protected boolean isSuccess(int status) { - return status == 201 || status == 204; - } - - } - - } diff --git a/tests/.classpath b/tests/.classpath index 794d0d92bf..9b141f6f1c 100644 --- a/tests/.classpath +++ b/tests/.classpath @@ -1,5 +1,7 @@ + +