From: masensio Date: Mon, 18 Nov 2013 13:42:07 +0000 (+0100) Subject: t puswqMerge branch 'refactor_remote_operation_to_create_folder' into refactor_remote... X-Git-Tag: oc-android-1.5.5~123^2~4 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/515ec5e8dd751956264dffdb1b5db65eda0aed8a?hp=--cc t puswqMerge branch 'refactor_remote_operation_to_create_folder' into refactor_remote_operation_to_rename_folder Conflicts: oc_framework-test-project/src/com/owncloud/android/oc_framework_test_project/TestActivity.java oc_framework/src/com/owncloud/android/oc_framework/utils/FileUtils.java --- 515ec5e8dd751956264dffdb1b5db65eda0aed8a diff --cc oc_framework-test-project/src/com/owncloud/android/oc_framework_test_project/TestActivity.java index 5cf1bb6e,e1c1edcb..dd194cf7 --- a/oc_framework-test-project/src/com/owncloud/android/oc_framework_test_project/TestActivity.java +++ b/oc_framework-test-project/src/com/owncloud/android/oc_framework_test_project/TestActivity.java @@@ -7,8 -7,8 +7,9 @@@ import com.owncloud.android.oc_framewor 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.RenameRemoteFileOperation; + import android.os.AsyncTask; import android.os.Bundle; import android.accounts.Account; import android.accounts.AccountManager; @@@ -89,35 -68,50 +69,69 @@@ public class TestActivity extends Activ /** * Access to the library method to Create a Folder - * @param folderName * @param remotePath * @param createFullPath + * * @return */ - public RemoteOperationResult createFolder(String folderName, String remotePath, boolean createFullPath) { + public RemoteOperationResult createFolder(String remotePath, boolean createFullPath) { - CreateRemoteFolderOperation createOperation = new CreateRemoteFolderOperation(folderName, remotePath, createFullPath); + CreateRemoteFolderOperation createOperation = new CreateRemoteFolderOperation(remotePath, createFullPath); RemoteOperationResult result = createOperation.execute(mClient); return result; } + /** + * Access to the library method to Rename a File or Folder + * @param oldName Old name of the file. + * @param oldRemotePath Old remote path of the file. For folders it starts and ends by "/" + * @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 "/" + * + * @return + */ + + public RemoteOperationResult renameFile(String oldName, String oldRemotePath, String newName, String newRemotePath) { + + RenameRemoteFileOperation renameOperation = new RenameRemoteFileOperation(oldName, oldRemotePath, newName, newRemotePath); + RemoteOperationResult result = renameOperation.execute(mClient); + + return result; + } ++ + private class AuthTask extends AsyncTask { + + @Override + protected WebdavClient doInBackground(Context... params) { + WebdavClient client = null; + try { + client = OwnCloudClientFactory.createOwnCloudClient(mAccount, (Context) params[0] ); + } catch (OperationCanceledException e) { + Log.e(TAG, "Error while trying to access to " + mAccount.name, e); + e.printStackTrace(); + } catch (AuthenticatorException e) { + Log.e(TAG, "Error while trying to access to " + mAccount.name, e); + e.printStackTrace(); + } catch (AccountNotFoundException e) { + Log.e(TAG, "Error while trying to access to " + mAccount.name, e); + e.printStackTrace(); + } catch (IOException e) { + Log.e(TAG, "Error while trying to access to " + mAccount.name, e); + e.printStackTrace(); + } catch (IllegalStateException e) { + Log.e(TAG, "Error while trying to access to " + mAccount.name, e); + e.printStackTrace(); + } + return client; + } + + @Override + protected void onPostExecute(WebdavClient result) { + // TODO Auto-generated method stub + super.onPostExecute(result); + mClient = result; + } + + } } diff --cc oc_framework/src/com/owncloud/android/oc_framework/operations/remote/RenameRemoteFileOperation.java index c05c4ca8,00000000..2ead67b3 mode 100644,000000..100644 --- 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 @@@ -1,120 -1,0 +1,120 @@@ +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; + + + /** + * Constructor + * + * @param oldName Old name of the file. + * @param oldRemotePath Old remote path of the file. For folders it starts and ends by "/" + * @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) { + mOldName = oldName; + mOldRemotePath = oldRemotePath; + mNewName = newName; + mNewRemotePath = newRemotePath; + } + + /** + * 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 = FileUtils.validateName(mNewName); ++ boolean noInvalidChars = FileUtils.isValidPath(mNewRemotePath); + + if (noInvalidChars) { + try { + + if (mNewName.equals(mOldName)) { + return new RemoteOperationResult(ResultCode.OK); + } + + // check if a file with the new name already exists + if (client.existsFile(mNewRemotePath)) { + return new RemoteOperationResult(ResultCode.INVALID_OVERWRITE); + } + + 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 --cc src/com/owncloud/android/ui/activity/FileDisplayActivity.java index 2ec9f2e2,685cff24..0bf82075 --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java @@@ -1375,9 -1375,6 +1375,9 @@@ OCFileListFragment.ContainerActivity, F Toast msg = Toast.makeText(this, R.string.rename_local_fail_msg, Toast.LENGTH_LONG); msg.show(); // TODO throw again the new rename dialog + } if (result.getCode().equals(ResultCode.INVALID_CHARACTER_IN_NAME)) { - Toast msg = Toast.makeText(this, R.string.create_dir_fail_msg_invalid_characters, Toast.LENGTH_LONG); ++ Toast msg = Toast.makeText(this, R.string.filename_forbidden_characters, Toast.LENGTH_LONG); + msg.show(); } else { Toast msg = Toast.makeText(this, R.string.rename_server_fail_msg, Toast.LENGTH_LONG); msg.show(); diff --cc src/com/owncloud/android/ui/fragment/FileDetailFragment.java index 66febdf4,01ef8d07..ea0f814c --- a/src/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/com/owncloud/android/ui/fragment/FileDetailFragment.java @@@ -816,9 -816,6 +816,9 @@@ public class FileDetailFragment extend Toast msg = Toast.makeText(getActivity(), R.string.rename_local_fail_msg, Toast.LENGTH_LONG); msg.show(); // TODO throw again the new rename dialog + } if (result.getCode().equals(ResultCode.INVALID_CHARACTER_IN_NAME)) { - Toast msg = Toast.makeText(getActivity(), R.string.create_dir_fail_msg_invalid_characters, Toast.LENGTH_LONG); ++ Toast msg = Toast.makeText(getActivity(), R.string.filename_forbidden_characters, Toast.LENGTH_LONG); + msg.show(); } else { Toast msg = Toast.makeText(getActivity(), R.string.rename_server_fail_msg, Toast.LENGTH_LONG); msg.show();