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=-c 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 --combined oc_framework-test-project/oc_framework-test-test/src/com/owncloud/android/oc_framework_test_project/test/CreateFolderTest.java index 90c59bb4,0c4b8efa..84145022 --- a/oc_framework-test-project/oc_framework-test-test/src/com/owncloud/android/oc_framework_test_project/test/CreateFolderTest.java +++ b/oc_framework-test-project/oc_framework-test-test/src/com/owncloud/android/oc_framework_test_project/test/CreateFolderTest.java @@@ -38,72 -38,57 +38,57 @@@ public class CreateFolderTest extends A */ public void testCreateFolder() { - String folderName = "testCreateFolder" + mCurrentDate; String remotePath = "/testCreateFolder" + mCurrentDate; boolean createFullPath = true; - RemoteOperationResult result = mActivity.createFolder(folderName, remotePath, createFullPath); + RemoteOperationResult result = mActivity.createFolder(remotePath, createFullPath); assertTrue(result.isSuccess() || result.getCode() == ResultCode.TIMEOUT); // Create Subfolder - folderName = "testCreateFolder" + mCurrentDate; remotePath = "/testCreateFolder" + mCurrentDate + "/" + "testCreateFolder" + mCurrentDate; createFullPath = true; - result = mActivity.createFolder(folderName, remotePath, createFullPath); + result = mActivity.createFolder(remotePath, createFullPath); assertTrue(result.isSuccess() || result.getCode() == ResultCode.TIMEOUT); } /** - * Test to Create Folder with special characters + * Test to Create Folder with special characters: / \ < > : " | ? * */ public void testCreateFolderSpecialCharacters() { boolean createFullPath = true; - String folderName = "testSpecialCharacters_//" + mCurrentDate; - String remotePath = "/testSpecialCharacters_//" + mCurrentDate; - RemoteOperationResult result = mActivity.createFolder(folderName, remotePath, createFullPath); + String remotePath = "/testSpecialCharacters_\\" + mCurrentDate; + RemoteOperationResult result = mActivity.createFolder(remotePath, createFullPath); assertTrue(result.getCode() == ResultCode.INVALID_CHARACTER_IN_NAME); - folderName = "testSpecialCharacters_\\" + mCurrentDate; - remotePath = "/testSpecialCharacters_\\" + mCurrentDate; - result = mActivity.createFolder(folderName, remotePath, createFullPath); - assertTrue(result.getCode() == ResultCode.INVALID_CHARACTER_IN_NAME); - - folderName = "testSpecialCharacters_<" + mCurrentDate; remotePath = "/testSpecialCharacters_<" + mCurrentDate; - result = mActivity.createFolder(folderName, remotePath, createFullPath); + result = mActivity.createFolder(remotePath, createFullPath); assertTrue(result.getCode() == ResultCode.INVALID_CHARACTER_IN_NAME); - folderName = "testSpecialCharacters_>" + mCurrentDate; remotePath = "/testSpecialCharacters_>" + mCurrentDate; - result = mActivity.createFolder(folderName, remotePath, createFullPath); + result = mActivity.createFolder(remotePath, createFullPath); assertTrue(result.getCode() == ResultCode.INVALID_CHARACTER_IN_NAME); - folderName = "testSpecialCharacters_:" + mCurrentDate; remotePath = "/testSpecialCharacters_:" + mCurrentDate; - result = mActivity.createFolder(folderName, remotePath, createFullPath); + result = mActivity.createFolder(remotePath, createFullPath); assertTrue(result.getCode() == ResultCode.INVALID_CHARACTER_IN_NAME); - folderName = "testSpecialCharacters_\"" + mCurrentDate; remotePath = "/testSpecialCharacters_\"" + mCurrentDate; - result = mActivity.createFolder(folderName, remotePath, createFullPath); + result = mActivity.createFolder(remotePath, createFullPath); assertTrue(result.getCode() == ResultCode.INVALID_CHARACTER_IN_NAME); - folderName = "testSpecialCharacters_|" + mCurrentDate; remotePath = "/testSpecialCharacters_|" + mCurrentDate; - result = mActivity.createFolder(folderName, remotePath, createFullPath); + result = mActivity.createFolder(remotePath, createFullPath); assertTrue(result.getCode() == ResultCode.INVALID_CHARACTER_IN_NAME); - folderName = "testSpecialCharacters_?" + mCurrentDate; remotePath = "/testSpecialCharacters_?" + mCurrentDate; - result = mActivity.createFolder(folderName, remotePath, createFullPath); + result = mActivity.createFolder(remotePath, createFullPath); assertTrue(result.getCode() == ResultCode.INVALID_CHARACTER_IN_NAME); - folderName = "testSpecialCharacters_*" + mCurrentDate; remotePath = "/testSpecialCharacters_*" + mCurrentDate; - result = mActivity.createFolder(folderName, remotePath, createFullPath); + result = mActivity.createFolder(remotePath, createFullPath); assertTrue(result.getCode() == ResultCode.INVALID_CHARACTER_IN_NAME); } diff --combined 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,14 -7,15 +7,16 @@@ 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; import android.accounts.AuthenticatorException; import android.accounts.OperationCanceledException; import android.app.Activity; + import android.content.Context; import android.util.Log; import android.view.Menu; @@@ -27,13 -28,6 +29,13 @@@ public class TestActivity extends Activ private static final String TAG = "TestActivity"; + // This account must exists on the simulator / device + private static final String mAccountHost = "beta.owncloud.com"; + private static final String mAccountUser = "testandroid"; + private static final String mAccountName = mAccountUser + "@"+ mAccountHost; + private static final String mAccountPass = "testandroid"; + private static final String mAccountType = "owncloud"; + private Account mAccount = null; private WebdavClient mClient; @@@ -41,43 -35,28 +43,21 @@@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); - - // This account must exists on the simulator / device - String accountHost = "beta.owncloud.com"; - String accountUser = "testandroid"; - String accountName = accountUser + "@"+ accountHost; - String accountPass = "testandroid"; - String accountType = "owncloud"; AccountManager am = AccountManager.get(this); - Account[] ocAccounts = am.getAccountsByType(accountType); + Account[] ocAccounts = am.getAccountsByType(mAccountType); for (Account ac : ocAccounts) { - if (ac.name.equals(accountName)) { + if (ac.name.equals(mAccountName)) { mAccount = ac; break; } } - // if (mAccount == null) { - // mAccount = new Account(accountName, mAccountType); - // am.addAccountExplicitly(mAccount, mAccountPass, null); - // am.setUserData(mAccount, "oc_version", "5.0.14"); - // am.setUserData(mAccount, "oc_base_url", "http://beta.owncloud.com/owncloud"); - // } else { - // Log.d(TAG, "oc_version --->"+ am.getUserData(mAccount, "oc_version") ); - // Log.d(TAG, "oc_base_url --->"+ am.getUserData(mAccount, "oc_base_url") ); - // } - + // Get the WebDavClient + AuthTask task = new AuthTask(); + task.execute(this.getApplicationContext()); - try { - mClient = OwnCloudClientFactory.createOwnCloudClient(mAccount, this.getApplicationContext()); - } 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(); - } } @Override @@@ -89,35 -68,50 +69,69 @@@ /** * 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 --combined 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 --combined src/com/owncloud/android/files/services/FileUploader.java index e8dcf949,d9f3a32c..61f61791 --- a/src/com/owncloud/android/files/services/FileUploader.java +++ b/src/com/owncloud/android/files/services/FileUploader.java @@@ -33,7 -33,9 +33,7 @@@ import org.apache.jackrabbit.webdav.Dav import org.apache.jackrabbit.webdav.MultiStatus; import org.apache.jackrabbit.webdav.client.methods.PropFindMethod; -import com.owncloud.android.MainApp; import com.owncloud.android.R; -import com.owncloud.android.authentication.AccountAuthenticator; import com.owncloud.android.authentication.AuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; @@@ -562,8 -564,7 +562,7 @@@ public class FileUploader extends Servi RemoteOperation operation = new ExistenceCheckOperation(pathToGrant, this, false); RemoteOperationResult result = operation.execute(mUploadClient); if (!result.isSuccess() && result.getCode() == ResultCode.FILE_NOT_FOUND && mCurrentUpload.isRemoteFolderToBeCreated()) { - operation = new CreateFolderOperation( mCurrentUpload.getFileName(), - pathToGrant, + operation = new CreateFolderOperation( pathToGrant, true, mStorageManager ); result = operation.execute(mUploadClient); diff --combined 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 @@@ -1335,7 -1335,7 +1335,7 @@@ OCFileListFragment.ContainerActivity, F } else { dismissLoadingDialog(); if (result.getCode() == ResultCode.INVALID_CHARACTER_IN_NAME) { - Toast.makeText(FileDisplayActivity.this, R.string.create_dir_fail_msg_invalid_characters, Toast.LENGTH_LONG).show(); + Toast.makeText(FileDisplayActivity.this, R.string.filename_forbidden_characters, Toast.LENGTH_LONG).show(); } else { try { Toast msg = Toast.makeText(FileDisplayActivity.this, R.string.create_dir_fail_msg, Toast.LENGTH_LONG); @@@ -1375,9 -1375,6 +1375,9 @@@ 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(); @@@ -1442,7 -1439,7 +1442,7 @@@ // Create directory path += newDirectoryName + OCFile.PATH_SEPARATOR; - RemoteOperation operation = new CreateFolderOperation(newDirectoryName, path, false, mStorageManager); + RemoteOperation operation = new CreateFolderOperation(path, false, mStorageManager); operation.execute( getAccount(), FileDisplayActivity.this, FileDisplayActivity.this, diff --combined 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();