t puswqMerge branch 'refactor_remote_operation_to_create_folder' into refactor_remote...
authormasensio <masensio@solidgear.es>
Mon, 18 Nov 2013 13:42:07 +0000 (14:42 +0100)
committermasensio <masensio@solidgear.es>
Mon, 18 Nov 2013 13:42:07 +0000 (14:42 +0100)
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

1  2 
oc_framework-test-project/oc_framework-test-test/src/com/owncloud/android/oc_framework_test_project/test/CreateFolderTest.java
oc_framework-test-project/src/com/owncloud/android/oc_framework_test_project/TestActivity.java
oc_framework/src/com/owncloud/android/oc_framework/operations/remote/RenameRemoteFileOperation.java
src/com/owncloud/android/files/services/FileUploader.java
src/com/owncloud/android/ui/activity/FileDisplayActivity.java
src/com/owncloud/android/ui/fragment/FileDetailFragment.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);
        }
  
@@@ -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;
        
        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
  
        /**
         * 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<Context, Void, WebdavClient> {
+               @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;
+               }
+               
+       }
  }
index c05c4ca,0000000..2ead67b
mode 100644,000000..100644
--- /dev/null
@@@ -1,120 -1,0 +1,120 @@@
-         boolean noInvalidChars = FileUtils.validateName(mNewName);
 +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.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;
 +        }
 +            
 +    }
 +
 +}
@@@ -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);
@@@ -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); 
                  Toast msg = Toast.makeText(this, R.string.rename_local_fail_msg, Toast.LENGTH_LONG); 
                  msg.show();
                  // TODO throw again the new rename dialog
-                 Toast msg = Toast.makeText(this, R.string.create_dir_fail_msg_invalid_characters, Toast.LENGTH_LONG); 
 +            } if (result.getCode().equals(ResultCode.INVALID_CHARACTER_IN_NAME)) {
++                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();
  
                  // 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, 
@@@ -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
-                 Toast msg = Toast.makeText(getActivity(), R.string.create_dir_fail_msg_invalid_characters, Toast.LENGTH_LONG);
 +            } if (result.getCode().equals(ResultCode.INVALID_CHARACTER_IN_NAME)) {
++                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();