From 83fa18819740fa291ed3798949e072d87fbfd7a8 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Fri, 29 Apr 2022 11:50:16 +0200 Subject: [PATCH] wip Signed-off-by: tobiasKaminsky --- .../java/com/owncloud/android/FileIT.java | 35 +++++------ .../files/CheckEtagRemoteOperationIT.kt | 9 ++- .../com/nextcloud/common/NextcloudClient.kt | 17 ++++- .../operations/dav/BasicAuthInterceptor.kt | 38 ++++++++++++ .../nextcloud/operations/dav/MkColMethod.kt | 41 ++++++++++++ .../operations/dav/OkHttpDavMethodBase.kt | 55 ++++++++++++++++ .../operations/dav/PropFindMethod.kt | 59 ++++++++++++++++++ .../operations/RemoteOperationResult.java | 8 +++ .../files/CheckEtagRemoteOperation.java | 62 +++++++++---------- .../files/CreateFolderRemoteOperation.java | 38 +++++------- 10 files changed, 284 insertions(+), 78 deletions(-) create mode 100644 library/src/main/java/com/nextcloud/operations/dav/BasicAuthInterceptor.kt create mode 100644 library/src/main/java/com/nextcloud/operations/dav/MkColMethod.kt create mode 100644 library/src/main/java/com/nextcloud/operations/dav/OkHttpDavMethodBase.kt create mode 100644 library/src/main/java/com/nextcloud/operations/dav/PropFindMethod.kt diff --git a/library/src/androidTest/java/com/owncloud/android/FileIT.java b/library/src/androidTest/java/com/owncloud/android/FileIT.java index 0aaf32e655..5d0f53a87e 100644 --- a/library/src/androidTest/java/com/owncloud/android/FileIT.java +++ b/library/src/androidTest/java/com/owncloud/android/FileIT.java @@ -26,6 +26,9 @@ */ package com.owncloud.android; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + import android.net.Uri; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -43,10 +46,6 @@ import java.util.ArrayList; import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - /** * Tests related to file operations */ @@ -56,7 +55,7 @@ public void testCreateFolderSuccess() { String path = "/testFolder/"; // create folder - assertTrue(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); // verify folder assertTrue(new ReadFolderRemoteOperation(path).execute(client).isSuccess()); @@ -70,10 +69,10 @@ public void testCreateFolderFailure() { String path = "/testFolder/"; // create folder - assertTrue(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); // create folder a second time will fail - assertFalse(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertFalse(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); // remove folder assertTrue(new RemoveFileRemoteOperation(path).execute(client).isSuccess()); @@ -84,7 +83,7 @@ public void testCreateNonExistingSubFolder() { String path = "/testFolder/1/2/3/4/5/"; String top = "/testFolder/"; - assertTrue(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); // verify folder assertTrue(new ReadFolderRemoteOperation(path).execute(client).isSuccess()); @@ -96,20 +95,20 @@ public void testCreateNonExistingSubFolder() { @Test public void testCreateFolderWithWrongURL() { String path = "/testFolder/"; - Uri uri = client.getBaseUri(); - client.setBaseUri(Uri.parse(uri.toString() + "/remote.php/dav/files/")); + Uri uri = nextcloudClient.getBaseUri(); + nextcloudClient.setBaseUri(Uri.parse(uri.toString() + "/remote.php/dav/files/")); // create folder - assertFalse(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertFalse(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); - client.setBaseUri(uri); + nextcloudClient.setBaseUri(uri); } @Test public void testZeroSharees() { // create & verify folder String path = "/testFolder/"; - assertTrue(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); assertTrue(new ReadFolderRemoteOperation(path).execute(client).isSuccess()); // verify @@ -132,7 +131,7 @@ public void testZeroSharees() { public void testShareViaLinkSharees() { // create & verify folder String path = "/testFolder/"; - assertTrue(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); assertTrue(new ReadFolderRemoteOperation(path).execute(client).isSuccess()); // share folder @@ -164,7 +163,7 @@ public void testShareViaLinkSharees() { public void testShareToGroupSharees() { // create & verify folder String path = "/testFolder/"; - assertTrue(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); assertTrue(new ReadFolderRemoteOperation(path).execute(client).isSuccess()); ShareeUser sharee = new ShareeUser("users", "", ShareType.GROUP); @@ -199,7 +198,7 @@ public void testShareToGroupSharees() { public void testOneSharees() { // create & verify folder String path = "/testFolder/"; - assertTrue(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); assertTrue(new ReadFolderRemoteOperation(path).execute(client).isSuccess()); ShareeUser sharee = new ShareeUser("user1", "User One", ShareType.USER); @@ -234,7 +233,7 @@ public void testOneSharees() { public void testTwoShareesOnParent() { // create & verify folder String path = "/testFolder/"; - assertTrue(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); assertTrue(new ReadFolderRemoteOperation(path).execute(client).isSuccess()); List sharees = new ArrayList<>(); @@ -282,7 +281,7 @@ public void testTwoShareesOnParent() { public void testTwoSharees() { // create & verify folder String path = "/testFolder/"; - assertTrue(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); assertTrue(new ReadFolderRemoteOperation(path).execute(client).isSuccess()); List sharees = new ArrayList<>(); diff --git a/library/src/androidTest/java/com/owncloud/android/lib/resources/files/CheckEtagRemoteOperationIT.kt b/library/src/androidTest/java/com/owncloud/android/lib/resources/files/CheckEtagRemoteOperationIT.kt index 3f4c6f04ec..ac0affc132 100644 --- a/library/src/androidTest/java/com/owncloud/android/lib/resources/files/CheckEtagRemoteOperationIT.kt +++ b/library/src/androidTest/java/com/owncloud/android/lib/resources/files/CheckEtagRemoteOperationIT.kt @@ -30,6 +30,7 @@ import com.owncloud.android.AbstractIT import com.owncloud.android.lib.common.operations.RemoteOperationResult import com.owncloud.android.lib.resources.files.model.RemoteFile import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Test @@ -47,10 +48,14 @@ class CheckEtagRemoteOperationIT : AbstractIT() { val remoteFile = readResult.data[0] as RemoteFile val eTag = remoteFile.etag - var eTagResult = CheckEtagRemoteOperation(remotePath, eTag).execute(client) + var eTagResult = CheckEtagRemoteOperation(remotePath, eTag).execute(nextcloudClient) assertEquals(RemoteOperationResult.ResultCode.ETAG_UNCHANGED, eTagResult.code) - eTagResult = CheckEtagRemoteOperation(remotePath, "wrongEtag").execute(client) + eTagResult = CheckEtagRemoteOperation(remotePath, "wrongEtag").execute(nextcloudClient) assertEquals(RemoteOperationResult.ResultCode.ETAG_CHANGED, eTagResult.code) + + eTagResult = CheckEtagRemoteOperation("wrongPath", "wrongEtag").execute(nextcloudClient) + assertFalse(eTagResult.isSuccess) + assertEquals(RemoteOperationResult.ResultCode.FILE_NOT_FOUND, eTagResult.code) } } diff --git a/library/src/main/java/com/nextcloud/common/NextcloudClient.kt b/library/src/main/java/com/nextcloud/common/NextcloudClient.kt index fdd805ae1e..c4d850e926 100644 --- a/library/src/main/java/com/nextcloud/common/NextcloudClient.kt +++ b/library/src/main/java/com/nextcloud/common/NextcloudClient.kt @@ -30,6 +30,7 @@ package com.nextcloud.common import android.content.Context import android.net.Uri +import com.nextcloud.operations.dav.OkHttpDavMethodBase import com.owncloud.android.lib.common.OwnCloudClient import com.owncloud.android.lib.common.OwnCloudClientFactory.DEFAULT_CONNECTION_TIMEOUT_LONG import com.owncloud.android.lib.common.OwnCloudClientFactory.DEFAULT_DATA_TIMEOUT_LONG @@ -37,6 +38,7 @@ import com.owncloud.android.lib.common.accounts.AccountUtils import com.owncloud.android.lib.common.network.AdvancedX509TrustManager import com.owncloud.android.lib.common.network.NetworkUtils 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.utils.Log_OC @@ -54,7 +56,7 @@ class NextcloudClient( var baseUri: Uri, var userId: String, var credentials: String, - val client: OkHttpClient + var client: OkHttpClient ) { var followRedirects = true @@ -105,6 +107,11 @@ class NextcloudClient( return method.execute(this) } + @Throws(Exception::class) + fun execute(method: OkHttpDavMethodBase) { + return method.execute(this) + } + internal fun execute(request: Request): ResponseOrError { return try { val response = client.newCall(request).execute() @@ -177,4 +184,12 @@ class NextcloudClient( fun getUserIdPlain(): String { return userId } + + fun getFilesDavUri(path: String): String { + return getDavUri().toString() + "/files/" + userId + "/" + WebdavUtils.encodePath(path) + } + + fun getDavUri(): Uri { + return Uri.parse(baseUri.toString() + AccountUtils.WEBDAV_PATH_9_0) + } } diff --git a/library/src/main/java/com/nextcloud/operations/dav/BasicAuthInterceptor.kt b/library/src/main/java/com/nextcloud/operations/dav/BasicAuthInterceptor.kt new file mode 100644 index 0000000000..58432c3eec --- /dev/null +++ b/library/src/main/java/com/nextcloud/operations/dav/BasicAuthInterceptor.kt @@ -0,0 +1,38 @@ +/* + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2022 Tobias Kaminsky + * Copyright (C) 2022 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +package com.nextcloud.operations.dav + +import okhttp3.Interceptor +import okhttp3.Response + +class BasicAuthInterceptor(val credentials: String) : Interceptor { + override fun intercept(chain: Interceptor.Chain): Response { + val request = chain.request() + val authRequest = request + .newBuilder() + .header("Authorization", credentials) + .build() + + return chain.proceed(authRequest) + } +} diff --git a/library/src/main/java/com/nextcloud/operations/dav/MkColMethod.kt b/library/src/main/java/com/nextcloud/operations/dav/MkColMethod.kt new file mode 100644 index 0000000000..96f84e845c --- /dev/null +++ b/library/src/main/java/com/nextcloud/operations/dav/MkColMethod.kt @@ -0,0 +1,41 @@ +/* + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2022 Tobias Kaminsky + * Copyright (C) 2022 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +package com.nextcloud.operations.dav + +import at.bitfire.dav4jvm.DavResource +import com.nextcloud.common.NextcloudClient +import okhttp3.HttpUrl.Companion.toHttpUrl + +/** + * Webdav MkCol method that uses OkHttp with new NextcloudClient + */ +class MkColMethod(val uri: String) : OkHttpDavMethodBase() { + override fun createDavResource(nextcloudClient: NextcloudClient) { + val httpURL = uri.toHttpUrl() + val davResource = DavResource(nextcloudClient.client, httpURL) + davResource.mkCol(null) { + // log response + response = it + } + } +} diff --git a/library/src/main/java/com/nextcloud/operations/dav/OkHttpDavMethodBase.kt b/library/src/main/java/com/nextcloud/operations/dav/OkHttpDavMethodBase.kt new file mode 100644 index 0000000000..52bc1bbea3 --- /dev/null +++ b/library/src/main/java/com/nextcloud/operations/dav/OkHttpDavMethodBase.kt @@ -0,0 +1,55 @@ +/* + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2022 Tobias Kaminsky + * Copyright (C) 2022 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +package com.nextcloud.operations.dav + +import com.nextcloud.common.NextcloudClient +import com.nextcloud.common.OkHttpMethodBase +import okhttp3.Response + +abstract class OkHttpDavMethodBase { + var response: Response? = null + + fun execute(nextcloudClient: NextcloudClient) { + nextcloudClient.client = nextcloudClient.client + .newBuilder() + .followRedirects(false) + .addInterceptor(BasicAuthInterceptor(nextcloudClient.credentials)) + .build() + + createDavResource(nextcloudClient) + } + + abstract fun createDavResource(nextcloudClient: NextcloudClient) + + open fun statusCode(): Int { + return response?.code ?: OkHttpMethodBase.UNKNOWN_STATUS_CODE + } + + fun releaseConnection() { + response?.body?.close() + } + + fun succeeded(): Boolean { + return response?.isSuccessful ?: false + } +} diff --git a/library/src/main/java/com/nextcloud/operations/dav/PropFindMethod.kt b/library/src/main/java/com/nextcloud/operations/dav/PropFindMethod.kt new file mode 100644 index 0000000000..59c6d95abc --- /dev/null +++ b/library/src/main/java/com/nextcloud/operations/dav/PropFindMethod.kt @@ -0,0 +1,59 @@ +/* + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2022 Tobias Kaminsky + * Copyright (C) 2022 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +package com.nextcloud.operations.dav + +import at.bitfire.dav4jvm.DavResource +import at.bitfire.dav4jvm.DavResponseCallback +import at.bitfire.dav4jvm.Property +import at.bitfire.dav4jvm.Response +import com.nextcloud.common.NextcloudClient +import com.nextcloud.common.OkHttpMethodBase +import okhttp3.HttpUrl.Companion.toHttpUrl + +/** + * Webdav Propfind method that uses OkHttp with new NextcloudClient + */ +class PropFindMethod( + val uri: String, + val properties: ArrayList, + private val depth: Int +) : OkHttpDavMethodBase() { + var davResponse: Response? = null + + override fun createDavResource(nextcloudClient: NextcloudClient) { + val httpURL = uri.toHttpUrl() + val davResource = DavResource(nextcloudClient.client, httpURL) + val callback: DavResponseCallback = { response, _ -> + davResponse = response + } + davResource.propfind(depth, *properties.toTypedArray(), callback = callback) + } + + fun davResponse(): Response? { + return davResponse + } + + override fun statusCode(): Int { + return davResponse?.status?.code ?: OkHttpMethodBase.UNKNOWN_STATUS_CODE + } +} diff --git a/library/src/main/java/com/owncloud/android/lib/common/operations/RemoteOperationResult.java b/library/src/main/java/com/owncloud/android/lib/common/operations/RemoteOperationResult.java index 41be337617..0eff43f731 100644 --- a/library/src/main/java/com/owncloud/android/lib/common/operations/RemoteOperationResult.java +++ b/library/src/main/java/com/owncloud/android/lib/common/operations/RemoteOperationResult.java @@ -31,6 +31,7 @@ import android.system.OsConstants; import com.nextcloud.common.OkHttpMethodBase; +import com.nextcloud.operations.dav.OkHttpDavMethodBase; import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException; import com.owncloud.android.lib.common.network.CertificateCombinedException; import com.owncloud.android.lib.common.utils.Log_OC; @@ -62,6 +63,7 @@ import javax.net.ssl.SSLException; +import at.bitfire.dav4jvm.exception.ConflictException; import lombok.ToString; import okhttp3.Headers; @@ -307,6 +309,8 @@ public RemoteOperationResult(Exception e) { } } else if (e instanceof FileNotFoundException) { mCode = ResultCode.LOCAL_FILE_NOT_FOUND; + } else if (e instanceof ConflictException) { + mCode = ResultCode.CONFLICT; } else { mCode = ResultCode.UNKNOWN_ERROR; } @@ -316,6 +320,10 @@ public RemoteOperationResult(boolean success, OkHttpMethodBase httpMethod) { this(success, httpMethod.getStatusCode(), httpMethod.getStatusText(), httpMethod.getResponseHeaders()); } + public RemoteOperationResult(boolean success, OkHttpDavMethodBase davMethod) { + this(success, davMethod.statusCode()); + } + /** * Public constructor from separate elements of an HTTP or DAV response. * diff --git a/library/src/main/java/com/owncloud/android/lib/resources/files/CheckEtagRemoteOperation.java b/library/src/main/java/com/owncloud/android/lib/resources/files/CheckEtagRemoteOperation.java index 09be5120d7..1bf9fa8585 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/files/CheckEtagRemoteOperation.java +++ b/library/src/main/java/com/owncloud/android/lib/resources/files/CheckEtagRemoteOperation.java @@ -27,28 +27,25 @@ package com.owncloud.android.lib.resources.files; -import com.owncloud.android.lib.common.OwnCloudClient; +import com.nextcloud.common.NextcloudClient; +import com.nextcloud.operations.dav.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 com.owncloud.android.lib.common.utils.Log_OC; -import org.apache.commons.httpclient.HttpStatus; -import org.apache.jackrabbit.webdav.MultiStatusResponse; -import org.apache.jackrabbit.webdav.client.methods.PropFindMethod; -import org.apache.jackrabbit.webdav.property.DavPropertyName; -import org.apache.jackrabbit.webdav.property.DavPropertyNameSet; - import java.util.ArrayList; +import at.bitfire.dav4jvm.Property; +import at.bitfire.dav4jvm.Response; +import at.bitfire.dav4jvm.exception.NotFoundException; +import at.bitfire.dav4jvm.property.GetETag; + /** * Check if file is up to date, by checking only eTag */ public class CheckEtagRemoteOperation extends RemoteOperation { - - private static final int SYNC_READ_TIMEOUT = 40000; - private static final int SYNC_CONNECTION_TIMEOUT = 5000; private static final String TAG = CheckEtagRemoteOperation.class.getSimpleName(); private String path; @@ -61,41 +58,38 @@ public CheckEtagRemoteOperation(String path, String expectedEtag) { @Override - protected RemoteOperationResult run(OwnCloudClient client) { + public RemoteOperationResult run(NextcloudClient client) { PropFindMethod propfind = null; - + try { - DavPropertyNameSet propSet = new DavPropertyNameSet(); - propSet.add(DavPropertyName.GETETAG); + ArrayList propList = new ArrayList(); + propList.add(GetETag.NAME); - propfind = new PropFindMethod(client.getFilesDavUri(path), - propSet, - 0); - int status = client.executeMethod(propfind, SYNC_READ_TIMEOUT, SYNC_CONNECTION_TIMEOUT); + propfind = new PropFindMethod(client.getFilesDavUri(path), propList, 0); + client.execute(propfind); + int status = propfind.statusCode(); - if (status == HttpStatus.SC_MULTI_STATUS || status == HttpStatus.SC_OK) { - MultiStatusResponse resp = propfind.getResponseBodyAsMultiStatus().getResponses()[0]; + //if (status == HttpStatus.SC_MULTI_STATUS || status == HttpStatus.SC_OK) { + Response resp = propfind.davResponse(); - String etag = WebdavUtils.parseEtag((String) resp.getProperties(HttpStatus.SC_OK) - .get(DavPropertyName.GETETAG).getValue()); + String etag = WebdavUtils.parseEtag(resp.get(GetETag.class).getETag()); - if (etag.equals(expectedEtag)) { - return new RemoteOperationResult(ResultCode.ETAG_UNCHANGED); - } else { - RemoteOperationResult result = new RemoteOperationResult(ResultCode.ETAG_CHANGED); + if (etag.equals(expectedEtag)) { + return new RemoteOperationResult(ResultCode.ETAG_UNCHANGED); + } else { + RemoteOperationResult result = new RemoteOperationResult(ResultCode.ETAG_CHANGED); - ArrayList list = new ArrayList<>(); - list.add(etag); - result.setData(list); + ArrayList list = new ArrayList<>(); + list.add(etag); + result.setData(list); - return result; - } + return result; } - - if (status == HttpStatus.SC_NOT_FOUND) { + //} + } catch (Exception e) { + if (e instanceof NotFoundException) { return new RemoteOperationResult(ResultCode.FILE_NOT_FOUND); } - } catch (Exception e) { Log_OC.e(TAG, "Error while retrieving eTag"); } finally { if (propfind != null) { diff --git a/library/src/main/java/com/owncloud/android/lib/resources/files/CreateFolderRemoteOperation.java b/library/src/main/java/com/owncloud/android/lib/resources/files/CreateFolderRemoteOperation.java index 48218fbd81..0280ed0e26 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/files/CreateFolderRemoteOperation.java +++ b/library/src/main/java/com/owncloud/android/lib/resources/files/CreateFolderRemoteOperation.java @@ -24,15 +24,13 @@ package com.owncloud.android.lib.resources.files; -import android.text.TextUtils; - -import com.owncloud.android.lib.common.OwnCloudClient; +import com.nextcloud.common.NextcloudClient; +import com.nextcloud.operations.dav.MkColMethod; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; import org.apache.commons.httpclient.HttpStatus; -import org.apache.jackrabbit.webdav.client.methods.MkColMethod; /** @@ -70,13 +68,8 @@ public CreateFolderRemoteOperation(String remotePath, boolean createFullPath, St this.token = token; } - /** - * Performs the operation - * - * @param client Client object to communicate with the remote ownCloud server. - */ @Override - protected RemoteOperationResult run(OwnCloudClient client) { + public RemoteOperationResult run(NextcloudClient client) { RemoteOperationResult result; result = createFolder(client); @@ -92,42 +85,41 @@ protected RemoteOperationResult run(OwnCloudClient client) { return result; } - - private RemoteOperationResult createFolder(OwnCloudClient client) { + private RemoteOperationResult createFolder(NextcloudClient client) { RemoteOperationResult result; MkColMethod mkCol = null; try { mkCol = new MkColMethod(client.getFilesDavUri(remotePath)); - if (!TextUtils.isEmpty(token)) { - mkCol.addRequestHeader(E2E_TOKEN, token); - } - - client.executeMethod(mkCol, READ_TIMEOUT, CONNECTION_TIMEOUT); +// if (!TextUtils.isEmpty(token)) { +// mkCol.addRequestHeader(E2E_TOKEN, token); +// } + + client.execute(mkCol); + int statusCode = mkCol.statusCode(); - if (HttpStatus.SC_METHOD_NOT_ALLOWED == mkCol.getStatusCode()) { + if (HttpStatus.SC_METHOD_NOT_ALLOWED == statusCode) { result = new RemoteOperationResult(RemoteOperationResult.ResultCode.FOLDER_ALREADY_EXISTS); } else { result = new RemoteOperationResult(mkCol.succeeded(), mkCol); } Log_OC.d(TAG, "Create directory " + remotePath + ": " + result.getLogMessage()); - client.exhaustResponse(mkCol.getResponseBodyAsStream()); + //client.exhaustResponse(mkCol.getResponseBodyAsStream()); } catch (Exception e) { result = new RemoteOperationResult(e); Log_OC.e(TAG, "Create directory " + remotePath + ": " + result.getLogMessage(), e); } finally { - if (mkCol != null) + if (mkCol != null) { mkCol.releaseConnection(); + } } return result; } - private RemoteOperationResult createParentFolder(String parentPath, OwnCloudClient client) { + private RemoteOperationResult createParentFolder(String parentPath, NextcloudClient client) { RemoteOperation operation = new CreateFolderRemoteOperation(parentPath, createFullPath); return operation.execute(client); } - - }