From 921983c16ea734c4aa58f24786e1025853a15c15 Mon Sep 17 00:00:00 2001 From: abelgardep Date: Sun, 26 Jan 2020 20:21:34 +0100 Subject: [PATCH] Migrate ExistenceCheckRemoteOperation to Kotlin --- .../files/ExistenceCheckRemoteOperation.java | 150 ------------------ .../files/RenameRemoteFileOperation.java | 6 +- .../server/CheckPathExistenceOperation.kt | 117 ++++++++++++++ .../lib/resources/server/ServerService.kt | 33 ++++ 4 files changed, 153 insertions(+), 153 deletions(-) delete mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ExistenceCheckRemoteOperation.java create mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/server/CheckPathExistenceOperation.kt create mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/server/ServerService.kt diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ExistenceCheckRemoteOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ExistenceCheckRemoteOperation.java deleted file mode 100644 index 1a21fbf1..00000000 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ExistenceCheckRemoteOperation.java +++ /dev/null @@ -1,150 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * Copyright (C) 2020 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package com.owncloud.android.lib.resources.files; - -import com.owncloud.android.lib.common.OwnCloudClient; -import com.owncloud.android.lib.common.http.HttpConstants; -import com.owncloud.android.lib.common.http.methods.webdav.DavUtils; -import com.owncloud.android.lib.common.http.methods.webdav.PropfindMethod; -import com.owncloud.android.lib.common.network.RedirectionPath; -import com.owncloud.android.lib.common.network.WebdavUtils; -import com.owncloud.android.lib.common.operations.RemoteOperation; -import com.owncloud.android.lib.common.operations.RemoteOperationResult; -import timber.log.Timber; - -import java.net.URL; -import java.util.concurrent.TimeUnit; - -import static com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode.OK; - -/** - * Operation to check the existence or absence of a path in a remote server. - * - * @author David A. Velasco - * @author David González Verdugo - */ -public class ExistenceCheckRemoteOperation extends RemoteOperation { - - /** - * Maximum time to wait for a response from the server in MILLISECONDs. - */ - public static final int TIMEOUT = 10000; - - private String mPath; - private boolean mSuccessIfAbsent; - private boolean mIsLogin; - - /** - * Sequence of redirections followed. Available only after executing the operation - */ - private RedirectionPath mRedirectionPath = null; - - /** - * Full constructor. Success of the operation will depend upon the value of successIfAbsent. - * - * @param remotePath Path to append to the URL owned by the client instance. - * @param successIfAbsent When 'true', the operation finishes in success if the path does - * NOT exist in the remote server (HTTP 404). - * @param isLogin When `true`, the username won't be added at the end of the PROPFIND url since is not - * needed to check user credentials - */ - public ExistenceCheckRemoteOperation(String remotePath, boolean successIfAbsent, boolean isLogin) { - mPath = (remotePath != null) ? remotePath : ""; - mSuccessIfAbsent = successIfAbsent; - mIsLogin = isLogin; - } - - @Override - protected RemoteOperationResult run(OwnCloudClient client) { - - boolean previousFollowRedirects = client.followRedirects(); - - try { - String stringUrl = mIsLogin ? - client.getBaseFilesWebDavUri().toString() : - client.getUserFilesWebDavUri() + WebdavUtils.encodePath(mPath); - PropfindMethod propfindMethod = new PropfindMethod( - new URL(stringUrl), - 0, - DavUtils.getAllPropset() - ); - propfindMethod.setReadTimeout(TIMEOUT, TimeUnit.SECONDS); - propfindMethod.setConnectionTimeout(TIMEOUT, TimeUnit.SECONDS); - - client.setFollowRedirects(false); - int status = client.executeHttpMethod(propfindMethod); - - if (previousFollowRedirects) { - mRedirectionPath = client.followRedirection(propfindMethod); - status = mRedirectionPath.getLastStatus(); - } - - /* - * PROPFIND method - * 404 NOT FOUND: path doesn't exist, - * 207 MULTI_STATUS: path exists. - */ - - Timber.d("Existence check for " + stringUrl + WebdavUtils.encodePath(mPath) + - " targeting for " + (mSuccessIfAbsent ? " absence " : " existence ") + - "finished with HTTP status " + status + (!isSuccess(status) ? "(FAIL)" : "")); - - return isSuccess(status) - ? new RemoteOperationResult<>(OK) - : new RemoteOperationResult<>(propfindMethod); - - } catch (Exception e) { - final RemoteOperationResult result = new RemoteOperationResult<>(e); - Timber.e(result.getException(), - "Existence check for " + client.getUserFilesWebDavUri() + WebdavUtils.encodePath(mPath) + " " + - "targeting for " + (mSuccessIfAbsent ? " absence " : " existence ") + ": " + result.getLogMessage()); - return result; - } finally { - client.setFollowRedirects(previousFollowRedirects); - } - } - - /** - * Gets the sequence of redirections followed during the execution of the operation. - * - * @return Sequence of redirections followed, if any, or NULL if the operation was not executed. - */ - public RedirectionPath getRedirectionPath() { - return mRedirectionPath; - } - - /** - * @return 'True' if the operation was executed and at least one redirection was followed. - */ - public boolean wasRedirected() { - return (mRedirectionPath != null && mRedirectionPath.getRedirectionsCount() > 0); - } - - private boolean isSuccess(int status) { - return ((status == HttpConstants.HTTP_OK || status == HttpConstants.HTTP_MULTI_STATUS) && !mSuccessIfAbsent) - || (status == HttpConstants.HTTP_MULTI_STATUS && !mSuccessIfAbsent) - || (status == HttpConstants.HTTP_NOT_FOUND && mSuccessIfAbsent); - } -} \ No newline at end of file diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RenameRemoteFileOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RenameRemoteFileOperation.java index 221a133c..4c87ef3e 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RenameRemoteFileOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RenameRemoteFileOperation.java @@ -31,6 +31,7 @@ import com.owncloud.android.lib.common.network.WebdavUtils; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; +import com.owncloud.android.lib.resources.server.CheckPathExistenceOperation; import timber.log.Timber; import java.io.File; @@ -123,9 +124,8 @@ public class RenameRemoteFileOperation extends RemoteOperation { * @return 'True' if the target path is already used by an existing file. */ private boolean targetPathIsUsed(OwnCloudClient client) { - ExistenceCheckRemoteOperation existenceCheckRemoteOperation = - new ExistenceCheckRemoteOperation(mNewRemotePath, false, false); - RemoteOperationResult exists = existenceCheckRemoteOperation.run(client); + CheckPathExistenceOperation checkPathExistenceOperation = new CheckPathExistenceOperation(mNewRemotePath, false); + RemoteOperationResult exists = checkPathExistenceOperation.execute(client); return exists.isSuccess(); } } \ No newline at end of file diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/server/CheckPathExistenceOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/server/CheckPathExistenceOperation.kt new file mode 100644 index 00000000..e6f1e638 --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/server/CheckPathExistenceOperation.kt @@ -0,0 +1,117 @@ +/* ownCloud Android Library is available under MIT license +* Copyright (C) 2020 ownCloud GmbH. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +* THE SOFTWARE. +* +*/ +package com.owncloud.android.lib.resources.server + +import com.owncloud.android.lib.common.OwnCloudClient +import com.owncloud.android.lib.common.http.HttpConstants +import com.owncloud.android.lib.common.http.methods.webdav.DavUtils +import com.owncloud.android.lib.common.http.methods.webdav.PropfindMethod +import com.owncloud.android.lib.common.network.RedirectionPath +import com.owncloud.android.lib.common.network.WebdavUtils +import com.owncloud.android.lib.common.operations.RemoteOperation +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode +import timber.log.Timber +import java.net.URL +import java.util.concurrent.TimeUnit + +/** + * Operation to check the existence of a path in a remote server. + * + * @author David A. Velasco + * @author David González Verdugo + * @author Abel García de Prada + * + * @param remotePath Path to append to the URL owned by the client instance. + * @param isUserLogged When `true`, the username won't be added at the end of the PROPFIND url since is not + * needed to check user credentials + */ +class CheckPathExistenceOperation( + val remotePath: String? = "", + val isUserLogged: Boolean +) : RemoteOperation() { + /** + * Gets the sequence of redirections followed during the execution of the operation. + * + * @return Sequence of redirections followed, if any, or NULL if the operation was not executed. + */ + var redirectionPath: RedirectionPath? = null + private set + + override fun run(client: OwnCloudClient): RemoteOperationResult { + val previousFollowRedirects = client.followRedirects() + return try { + val stringUrl = + if (isUserLogged) client.baseFilesWebDavUri.toString() + else client.userFilesWebDavUri.toString() + WebdavUtils.encodePath(remotePath) + + val propFindMethod = PropfindMethod(URL(stringUrl), 0, DavUtils.getAllPropset()).apply { + setReadTimeout(TIMEOUT.toLong(), TimeUnit.SECONDS) + setConnectionTimeout(TIMEOUT.toLong(), TimeUnit.SECONDS) + } + + client.setFollowRedirects(false) + var status = client.executeHttpMethod(propFindMethod) + if (previousFollowRedirects) { + redirectionPath = client.followRedirection(propFindMethod) + status = redirectionPath?.lastStatus!! + } + /* PROPFIND method + * 404 NOT FOUND: path doesn't exist, + * 207 MULTI_STATUS: path exists. + */ + Timber.d( + "Existence check for $stringUrl${WebdavUtils.encodePath(remotePath)} finished with HTTP status $status${if (!isSuccess( + status + ) + ) "(FAIL)" else ""}" + ) + if (isSuccess(status)) RemoteOperationResult(ResultCode.OK) else RemoteOperationResult(propFindMethod) + } catch (e: Exception) { + val result = RemoteOperationResult(e) + Timber.e( + e, + "Existence check for ${client.userFilesWebDavUri}${WebdavUtils.encodePath(remotePath)} : ${result.logMessage}" + ) + result + } finally { + client.setFollowRedirects(previousFollowRedirects) + } + } + + /** + * @return 'True' if the operation was executed and at least one redirection was followed. + */ + fun wasRedirected() = redirectionPath != null && redirectionPath!!.redirectionsCount > 0 + + private fun isSuccess(status: Int) = + status == HttpConstants.HTTP_OK || status == HttpConstants.HTTP_MULTI_STATUS || status == HttpConstants.HTTP_MULTI_STATUS + + companion object { + /** + * Maximum time to wait for a response from the server in milliseconds. + */ + private const val TIMEOUT = 10000 + } +} diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/server/ServerService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/server/ServerService.kt new file mode 100644 index 00000000..b9112209 --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/server/ServerService.kt @@ -0,0 +1,33 @@ +/* ownCloud Android Library is available under MIT license + * Copyright (C) 2020 ownCloud GmbH. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package com.owncloud.android.lib.resources.server + +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.resources.Service + +interface ServerService: Service { + fun checkPathExistence(path: String, isUserLogged: Boolean): RemoteOperationResult + +}