1
0
mirror of https://github.com/owncloud/android-library.git synced 2025-06-07 16:06:08 +00:00

Migrate MoveRemoteFileOperation to kotlin. Second step to keep git history

This commit is contained in:
Abel García de Prada 2021-05-11 17:08:15 +02:00 committed by Abel García de Prada
parent d736c7cdbf
commit 5beb30e07a
2 changed files with 95 additions and 102 deletions

View File

@ -1,5 +1,5 @@
/* ownCloud Android Library is available under MIT license /* ownCloud Android Library is available under MIT license
* Copyright (C) 2020 ownCloud GmbH. * Copyright (C) 2021 ownCloud GmbH.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -21,126 +21,109 @@
* THE SOFTWARE. * THE SOFTWARE.
* *
*/ */
package com.owncloud.android.lib.resources.files
package com.owncloud.android.lib.resources.files; import android.net.Uri
import com.owncloud.android.lib.common.OwnCloudClient
import android.net.Uri; import com.owncloud.android.lib.common.http.HttpConstants
import com.owncloud.android.lib.common.http.methods.webdav.MoveMethod
import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.network.WebdavUtils
import com.owncloud.android.lib.common.http.HttpConstants; import com.owncloud.android.lib.common.operations.RemoteOperation
import com.owncloud.android.lib.common.http.methods.webdav.MoveMethod; import com.owncloud.android.lib.common.operations.RemoteOperationResult
import com.owncloud.android.lib.common.network.WebdavUtils; import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode
import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.utils.isOneOf
import com.owncloud.android.lib.common.operations.RemoteOperationResult; import timber.log.Timber
import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; import java.net.URL
import timber.log.Timber; import java.util.concurrent.TimeUnit
import java.net.URL;
import java.util.concurrent.TimeUnit;
/** /**
* Remote operation moving a remote file or folder in the ownCloud server to a different folder * Remote operation moving a remote file or folder in the ownCloud server to a different folder
* in the same account. * in the same account.
* <p> *
* Allows renaming the moving file/folder at the same time. * Allows renaming the moving file/folder at the same time.
* *
* @author David A. Velasco * @author David A. Velasco
* @author David González Verdugo * @author David González Verdugo
* @author Abel García de Prada
*/ */
public class MoveRemoteFileOperation extends RemoteOperation { open class MoveRemoteFileOperation(
private val sourceRemotePath: String,
private static final int MOVE_READ_TIMEOUT = 600000; private val targetRemotePath: String,
private static final int MOVE_CONNECTION_TIMEOUT = 5000; private val forceOverwrite: Boolean
) : RemoteOperation<Unit>() {
private String mSrcRemotePath;
private String mTargetRemotePath;
private boolean mOverwrite;
protected boolean moveChunkedFile = false;
protected String mFileLastModifTimestamp;
protected long mFileLength;
/**
* Constructor.
* <p>
* TODO Paths should finish in "/" in the case of folders. ?
*
* @param srcRemotePath Remote path of the file/folder to move.
* @param targetRemotePath Remote path desired for the file/folder after moving it.
*/
public MoveRemoteFileOperation(String srcRemotePath,
String targetRemotePath,
boolean overwrite) {
mSrcRemotePath = srcRemotePath;
mTargetRemotePath = targetRemotePath;
mOverwrite = overwrite;
}
/** /**
* Performs the rename operation. * Performs the rename operation.
* *
* @param client Client object to communicate with the remote ownCloud server. * @param client Client object to communicate with the remote ownCloud server.
*/ */
@Override override fun run(client: OwnCloudClient): RemoteOperationResult<Unit> {
protected RemoteOperationResult run(OwnCloudClient client) { if (targetRemotePath == sourceRemotePath) {
if (mTargetRemotePath.equals(mSrcRemotePath)) {
// nothing to do! // nothing to do!
return new RemoteOperationResult<>(ResultCode.OK); return RemoteOperationResult(ResultCode.OK)
} }
if (mTargetRemotePath.startsWith(mSrcRemotePath)) { if (targetRemotePath.startsWith(sourceRemotePath)) {
return new RemoteOperationResult<>(ResultCode.INVALID_MOVE_INTO_DESCENDANT); return RemoteOperationResult(ResultCode.INVALID_MOVE_INTO_DESCENDANT)
} }
/// perform remote operation /// perform remote operation
RemoteOperationResult result; var result: RemoteOperationResult<Unit>
try { try {
// After finishing a chunked upload, we have to move the resulting file from uploads folder to files one, // After finishing a chunked upload, we have to move the resulting file from uploads folder to files one,
// so this uri has to be customizable // so this uri has to be customizable
Uri srcWebDavUri = moveChunkedFile ? client.getUploadsWebDavUri() : client.getUserFilesWebDavUri(); val srcWebDavUri = getSrcWebDavUriForClient(client)
val moveMethod = MoveMethod(
final MoveMethod move = new MoveMethod( url = URL(srcWebDavUri.toString() + WebdavUtils.encodePath(sourceRemotePath)),
new URL(srcWebDavUri + WebdavUtils.encodePath(mSrcRemotePath)), destinationUrl = client.userFilesWebDavUri.toString() + WebdavUtils.encodePath(targetRemotePath),
client.getUserFilesWebDavUri() + WebdavUtils.encodePath(mTargetRemotePath), forceOverride = forceOverwrite
mOverwrite); ).apply {
addRequestHeaders(this)
if (moveChunkedFile) { setReadTimeout(MOVE_READ_TIMEOUT, TimeUnit.SECONDS)
move.addRequestHeader(HttpConstants.OC_X_OC_MTIME_HEADER, mFileLastModifTimestamp); setConnectionTimeout(MOVE_CONNECTION_TIMEOUT, TimeUnit.SECONDS)
move.addRequestHeader(HttpConstants.OC_TOTAL_LENGTH_HEADER, String.valueOf(mFileLength));
} }
move.setReadTimeout(MOVE_READ_TIMEOUT, TimeUnit.SECONDS); val status = client.executeHttpMethod(moveMethod)
move.setConnectionTimeout(MOVE_CONNECTION_TIMEOUT, TimeUnit.SECONDS);
final int status = client.executeHttpMethod(move);
/// process response
if (isSuccess(status)) { if (isSuccess(status)) {
result = new RemoteOperationResult<>(ResultCode.OK); result = RemoteOperationResult<Unit>(ResultCode.OK)
} else if (status == HttpConstants.HTTP_PRECONDITION_FAILED && !mOverwrite) { } else if (status == HttpConstants.HTTP_PRECONDITION_FAILED && !forceOverwrite) {
result = RemoteOperationResult<Unit>(ResultCode.INVALID_OVERWRITE)
result = new RemoteOperationResult<>(ResultCode.INVALID_OVERWRITE); client.exhaustResponse(moveMethod.getResponseBodyAsStream())
client.exhaustResponse(move.getResponseBodyAsStream());
/// for other errors that could be explicitly handled, check first: /// for other errors that could be explicitly handled, check first:
/// http://www.webdav.org/specs/rfc4918.html#rfc.section.9.9.4 /// http://www.webdav.org/specs/rfc4918.html#rfc.section.9.9.4
} else { } else {
result = new RemoteOperationResult<>(move); result = RemoteOperationResult<Unit>(moveMethod)
client.exhaustResponse(move.getResponseBodyAsStream()); client.exhaustResponse(moveMethod.getResponseBodyAsStream())
} }
Timber.i("Move " + mSrcRemotePath + " to " + mTargetRemotePath + ": " + result.getLogMessage()); Timber.i("Move $sourceRemotePath to $targetRemotePath: ${result.logMessage}")
} catch (e: Exception) {
result = RemoteOperationResult<Unit>(e)
Timber.e(e, "Move $sourceRemotePath to $targetRemotePath: ${result.logMessage}")
} catch (Exception e) {
result = new RemoteOperationResult<>(e);
Timber.e(e, "Move " + mSrcRemotePath + " to " + mTargetRemotePath + ": " + result.getLogMessage());
} }
return result
return result;
} }
protected boolean isSuccess(int status) { /**
return status == HttpConstants.HTTP_CREATED || status == HttpConstants.HTTP_NO_CONTENT; * For standard moves, we will use [OwnCloudClient.getUserFilesWebDavUri].
* In case we need a different source Uri, override this method.
*/
open fun getSrcWebDavUriForClient(client: OwnCloudClient): Uri = client.userFilesWebDavUri
/**
* For standard moves, we won't need any special headers.
* In case new headers are needed, override this method
*/
open fun addRequestHeaders(moveMethod: MoveMethod) {
}
protected fun isSuccess(status: Int) = status.isOneOf(HttpConstants.HTTP_CREATED, HttpConstants.HTTP_NO_CONTENT)
companion object {
private const val MOVE_READ_TIMEOUT = 10L
private const val MOVE_CONNECTION_TIMEOUT = 6L
} }
} }

View File

@ -1,5 +1,5 @@
/* ownCloud Android Library is available under MIT license /* ownCloud Android Library is available under MIT license
* Copyright (C) 2020 ownCloud GmbH. * Copyright (C) 2021 ownCloud GmbH.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -21,30 +21,40 @@
* THE SOFTWARE. * THE SOFTWARE.
* *
*/ */
package com.owncloud.android.lib.resources.files.chunks
package com.owncloud.android.lib.resources.files.chunks; import android.net.Uri
import com.owncloud.android.lib.common.OwnCloudClient
import com.owncloud.android.lib.resources.files.MoveRemoteFileOperation; import com.owncloud.android.lib.common.http.HttpConstants
import com.owncloud.android.lib.common.http.methods.webdav.MoveMethod
import com.owncloud.android.lib.resources.files.MoveRemoteFileOperation
/** /**
* Remote operation to move the file built from chunks after uploading it * Remote operation to move the file built from chunks after uploading it
* *
* @author David González Verdugo * @author David González Verdugo
* @author Abel García de Prada
*/ */
public class MoveRemoteChunksFileOperation extends MoveRemoteFileOperation { class MoveRemoteChunksFileOperation(
sourceRemotePath: String,
targetRemotePath: String,
overwrite: Boolean,
private val fileLastModificationTimestamp: String,
private val fileLength: Long
) : MoveRemoteFileOperation(
sourceRemotePath = sourceRemotePath,
targetRemotePath = targetRemotePath,
forceOverwrite = overwrite
) {
/** override fun getSrcWebDavUriForClient(client: OwnCloudClient): Uri = client.uploadsWebDavUri
* Constructor.
* override fun addRequestHeaders(moveMethod: MoveMethod) {
* @param srcRemotePath Remote path of the file/folder to move. super.addRequestHeaders(moveMethod)
* @param targetRemotePath Remove path desired for the file/folder after moving it.
* @param overwrite moveMethod.apply {
*/ addRequestHeader(HttpConstants.OC_X_OC_MTIME_HEADER, fileLastModificationTimestamp)
public MoveRemoteChunksFileOperation(String srcRemotePath, String targetRemotePath, boolean overwrite, addRequestHeader(HttpConstants.OC_TOTAL_LENGTH_HEADER, fileLength.toString())
String fileLastModifTimestamp, long fileLength) { }
super(srcRemotePath, targetRemotePath, overwrite);
moveChunkedFile = true;
mFileLastModifTimestamp = fileLastModifTimestamp;
mFileLength = fileLength;
} }
} }