mirror of
				https://github.com/owncloud/android-library.git
				synced 2025-10-31 02:17:41 +00:00 
			
		
		
		
	Migrate ExistenceCheckRemoteOperation to Kotlin
This commit is contained in:
		
							parent
							
								
									99ced8bf41
								
							
						
					
					
						commit
						921983c16e
					
				| @ -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); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @ -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.RemoteOperation; | ||||||
| import com.owncloud.android.lib.common.operations.RemoteOperationResult; | import com.owncloud.android.lib.common.operations.RemoteOperationResult; | ||||||
| import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; | import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; | ||||||
|  | import com.owncloud.android.lib.resources.server.CheckPathExistenceOperation; | ||||||
| import timber.log.Timber; | import timber.log.Timber; | ||||||
| 
 | 
 | ||||||
| import java.io.File; | 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. |      * @return 'True' if the target path is already used by an existing file. | ||||||
|      */ |      */ | ||||||
|     private boolean targetPathIsUsed(OwnCloudClient client) { |     private boolean targetPathIsUsed(OwnCloudClient client) { | ||||||
|         ExistenceCheckRemoteOperation existenceCheckRemoteOperation = |         CheckPathExistenceOperation checkPathExistenceOperation = new CheckPathExistenceOperation(mNewRemotePath, false); | ||||||
|                 new ExistenceCheckRemoteOperation(mNewRemotePath, false, false); |         RemoteOperationResult exists = checkPathExistenceOperation.execute(client); | ||||||
|         RemoteOperationResult exists = existenceCheckRemoteOperation.run(client); |  | ||||||
|         return exists.isSuccess(); |         return exists.isSuccess(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -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<Any>() { | ||||||
|  |     /** | ||||||
|  |      * 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<Any> { | ||||||
|  |         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<Any>(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 | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -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<Any> | ||||||
|  | 
 | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user