From 37a978887ceb4d9d3fad849a8ff6cdd2e0806909 Mon Sep 17 00:00:00 2001 From: agarcia Date: Tue, 23 Jun 2020 16:10:36 +0200 Subject: [PATCH 1/3] Migrate ReadRemoteFolderOperation to kotlin and add it to FileService --- .../files/ReadRemoteFolderOperation.java | 128 ------------------ .../files/ReadRemoteFolderOperation.kt | 98 ++++++++++++++ .../resources/files/services/FileService.kt | 2 + .../services/implementation/OCFileService.kt | 9 +- 4 files changed, 107 insertions(+), 130 deletions(-) delete mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.java create mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.kt diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.java deleted file mode 100644 index 730bd86b6..000000000 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.java +++ /dev/null @@ -1,128 +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 at.bitfire.dav4android.Response; -import com.owncloud.android.lib.common.OwnCloudClient; -import com.owncloud.android.lib.common.accounts.AccountUtils; -import com.owncloud.android.lib.common.http.HttpConstants; -import com.owncloud.android.lib.common.http.methods.webdav.DavConstants; -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.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.ArrayList; - -import static com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode.OK; - -/** - * Remote operation performing the read of remote file or folder in the ownCloud server. - * - * @author David A. Velasco - * @author masensio - * @author David González Verdugo - */ - -public class ReadRemoteFolderOperation extends RemoteOperation> { - - private String mRemotePath; - - /** - * Constructor - * - * @param remotePath Remote path of the file. - */ - public ReadRemoteFolderOperation(String remotePath) { - mRemotePath = remotePath; - } - - /** - * Performs the read operation. - * - * @param client Client object to communicate with the remote ownCloud server. - */ - @Override - protected RemoteOperationResult> run(OwnCloudClient client) { - RemoteOperationResult> result = null; - - try { - PropfindMethod propfindMethod = new PropfindMethod( - new URL(client.getUserFilesWebDavUri() + WebdavUtils.encodePath(mRemotePath)), - DavConstants.DEPTH_1, - DavUtils.getAllPropset()); - - client.setFollowRedirects(true); - - int status = client.executeHttpMethod(propfindMethod); - - if (isSuccess(status)) { - ArrayList mFolderAndFiles = new ArrayList<>(); - - // parse data from remote folder - mFolderAndFiles.add( - new RemoteFile(propfindMethod.getRoot(), AccountUtils.getUserId(mAccount, mContext)) - ); - - // loop to update every child - for (Response resource : propfindMethod.getMembers()) { - RemoteFile file = new RemoteFile(resource, AccountUtils.getUserId(mAccount, mContext)); - mFolderAndFiles.add(file); - } - - // Result of the operation - result = new RemoteOperationResult<>(OK); - result.setData(mFolderAndFiles); - - } else { // synchronization failed - result = new RemoteOperationResult<>(propfindMethod); - } - - } catch (Exception e) { - result = new RemoteOperationResult<>(e); - } finally { - if (result == null) { - Timber.e("Synchronized " + mRemotePath + ": result is null"); - } else if (result.isSuccess()) { - Timber.i("Synchronized " + mRemotePath + ": " + result.getLogMessage()); - } else { - if (result.isException()) { - Timber.e(result.getException(), "Synchronized " + mRemotePath + ": " + result.getLogMessage()); - } else { - Timber.e("Synchronized " + mRemotePath + ": " + result.getLogMessage()); - } - } - } - return result; - } - - private boolean isSuccess(int status) { - return status == HttpConstants.HTTP_MULTI_STATUS || - status == HttpConstants.HTTP_OK; - } -} \ No newline at end of file diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.kt new file mode 100644 index 000000000..b374ee3a5 --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.kt @@ -0,0 +1,98 @@ +/* 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.accounts.AccountUtils +import com.owncloud.android.lib.common.http.HttpConstants +import com.owncloud.android.lib.common.http.methods.webdav.DavConstants +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.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.ArrayList + +/** + * Remote operation performing the read of remote file or folder in the ownCloud server. + * + * @author David A. Velasco + * @author masensio + * @author David González Verdugo + */ +class ReadRemoteFolderOperation( + val remotePath: String +) : RemoteOperation>() { + + /** + * Performs the read operation. + * + * @param client Client object to communicate with the remote ownCloud server. + */ + override fun run(client: OwnCloudClient): RemoteOperationResult> { + try { + val propfindMethod = PropfindMethod( + URL(client.userFilesWebDavUri.toString() + WebdavUtils.encodePath(remotePath)), + DavConstants.DEPTH_1, + DavUtils.getAllPropset() + ) + client.setFollowRedirects(true) + + val status = client.executeHttpMethod(propfindMethod) + + if (isSuccess(status)) { + val mFolderAndFiles = ArrayList() + + // parse data from remote folder + mFolderAndFiles.add(RemoteFile(propfindMethod.root, AccountUtils.getUserId(mAccount, mContext))) + + // loop to update every child + propfindMethod.members.forEach { resource -> + val file = RemoteFile(resource, AccountUtils.getUserId(mAccount, mContext)) + mFolderAndFiles.add(file) + } + + // Result of the operation + return RemoteOperationResult>(ResultCode.OK).apply { + data = mFolderAndFiles + Timber.i("Synchronized $remotePath with ${mFolderAndFiles.size} files. ${this.logMessage}") + } + } else { // synchronization failed + return RemoteOperationResult>(propfindMethod).also { + Timber.w("Synchronized $remotePath ${it.logMessage}") + } + } + } catch (e: Exception) { + return RemoteOperationResult>(e).also { + Timber.e(it.exception, "Synchronized $remotePath") + } + } + } + + private fun isSuccess(status: Int): Boolean = + status == HttpConstants.HTTP_MULTI_STATUS || status == HttpConstants.HTTP_OK +} diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt index aa69d5057..2d4c45c3c 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt @@ -25,7 +25,9 @@ package com.owncloud.android.lib.resources.files.services import com.owncloud.android.lib.common.operations.RemoteOperationResult import com.owncloud.android.lib.resources.Service +import com.owncloud.android.lib.resources.files.RemoteFile interface FileService: Service { fun checkPathExistence(path: String, isUserLogged: Boolean): RemoteOperationResult + fun refreshFolder(remotePath: String): RemoteOperationResult> } diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt index abe1e2e65..a1bab1508 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt @@ -22,13 +22,18 @@ package com.owncloud.android.lib.resources.files.services.implementation import com.owncloud.android.lib.common.OwnCloudClient import com.owncloud.android.lib.common.operations.RemoteOperationResult import com.owncloud.android.lib.resources.files.CheckPathExistenceRemoteOperation +import com.owncloud.android.lib.resources.files.ReadRemoteFolderOperation +import com.owncloud.android.lib.resources.files.RemoteFile import com.owncloud.android.lib.resources.files.services.FileService -class OCFileService(override val client: OwnCloudClient) : - FileService { +class OCFileService(override val client: OwnCloudClient) : FileService { override fun checkPathExistence(path: String, isUserLogged: Boolean): RemoteOperationResult = CheckPathExistenceRemoteOperation( remotePath = path, isUserLogged = isUserLogged ).execute(client) + + override fun refreshFolder(remotePath: String): RemoteOperationResult> { + return ReadRemoteFolderOperation(remotePath = remotePath).execute(client) + } } From afb064c5dcbbd71cab38fa1aceb2e0010ad2683b Mon Sep 17 00:00:00 2001 From: agarcia Date: Tue, 23 Jun 2020 17:46:48 +0200 Subject: [PATCH 2/3] Add owner field to remote file --- .../lib/resources/files/ReadRemoteFolderOperation.kt | 6 +++++- .../owncloud/android/lib/resources/files/RemoteFile.java | 9 +++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.kt index b374ee3a5..7033a763a 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.kt @@ -68,11 +68,15 @@ class ReadRemoteFolderOperation( val mFolderAndFiles = ArrayList() // parse data from remote folder - mFolderAndFiles.add(RemoteFile(propfindMethod.root, AccountUtils.getUserId(mAccount, mContext))) + val remoteFolder = RemoteFile(propfindMethod.root, AccountUtils.getUserId(mAccount, mContext)).apply { + owner = mAccount.name + } + mFolderAndFiles.add(remoteFolder) // loop to update every child propfindMethod.members.forEach { resource -> val file = RemoteFile(resource, AccountUtils.getUserId(mAccount, mContext)) + file.owner = mAccount.name mFolderAndFiles.add(file) } diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RemoteFile.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RemoteFile.java index d52ec1d8b..85869d001 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RemoteFile.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RemoteFile.java @@ -85,6 +85,7 @@ public RemoteFile[] newArray(int size) { private BigDecimal mQuotaUsedBytes; private BigDecimal mQuotaAvailableBytes; private String mPrivateLink; + private String mOwner; public RemoteFile() { resetData(); @@ -257,6 +258,14 @@ public void setPrivateLink(String privateLink) { mPrivateLink = privateLink; } + public String getOwner() { + return mOwner; + } + + public void setOwner(String owner) { + mOwner = owner; + } + /** * Used internally. Reset all file properties */ From ea1f4ec33ee9531dee4c462d035a2ca0da01d112 Mon Sep 17 00:00:00 2001 From: agarcia Date: Tue, 28 Jul 2020 13:56:19 +0200 Subject: [PATCH 3/3] Apply CR suggestions --- .../files/services/implementation/OCFileService.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt index a1bab1508..fb8ac000d 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt @@ -33,7 +33,9 @@ class OCFileService(override val client: OwnCloudClient) : FileService { isUserLogged = isUserLogged ).execute(client) - override fun refreshFolder(remotePath: String): RemoteOperationResult> { - return ReadRemoteFolderOperation(remotePath = remotePath).execute(client) - } + override fun refreshFolder(remotePath: String): RemoteOperationResult> = + ReadRemoteFolderOperation( + remotePath = remotePath + ).execute(client) + }