mirror of
https://github.com/nextcloud/android.git
synced 2024-11-27 08:45:17 +03:00
OC-1990: Isolate code RenameRemoteFileOperation
This commit is contained in:
parent
3ee1c51039
commit
9b79ed71c3
6 changed files with 159 additions and 85 deletions
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="src" path="gen"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/owncloud-android"/>
|
||||
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
|
||||
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
|
||||
|
|
Loading…
Reference in a new issue