From 8d11a519db25f136e7eee9e0f29bfafd5ebc28de Mon Sep 17 00:00:00 2001 From: MMMarcy Date: Tue, 11 Nov 2014 23:31:10 +0100 Subject: [PATCH 1/4] Commit that introduces a new Remote Operation that fetches users' quota statistics --- .../users/GetRemoteUserQuotaOperation.java | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 src/com/owncloud/android/lib/resources/users/GetRemoteUserQuotaOperation.java diff --git a/src/com/owncloud/android/lib/resources/users/GetRemoteUserQuotaOperation.java b/src/com/owncloud/android/lib/resources/users/GetRemoteUserQuotaOperation.java new file mode 100644 index 00000000..3d394fd5 --- /dev/null +++ b/src/com/owncloud/android/lib/resources/users/GetRemoteUserQuotaOperation.java @@ -0,0 +1,119 @@ +package com.owncloud.android.lib.resources.users; + +import android.util.Base64; +import android.util.Log; + +import com.owncloud.android.lib.common.OwnCloudBasicCredentials; +import com.owncloud.android.lib.common.OwnCloudClient; +import com.owncloud.android.lib.common.OwnCloudCredentials; +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.Header; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.NameValuePair; +import org.apache.commons.httpclient.methods.GetMethod; +import org.apache.http.HttpStatus; +import org.json.JSONObject; + +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; + +/** + * Created by marcello on 11/11/14. + */ +public class GetRemoteUserQuotaOperation extends RemoteOperation { + + private static final String TAG = GetRemoteUserNameOperation.class.getSimpleName(); + + + private static final String NODE_OCS = "ocs"; + private static final String NODE_DATA = "data"; + private static final String NODE_QUOTA = "quota"; + private static final String NODE_QUOTA_FREE = "free"; + private static final String NODE_QUOTA_USED = "used"; + private static final String NODE_QUOTA_TOTAL = "total"; + private static final String NODE_QUOTA_RELATIVE = "relative"; + + // OCS Route + private static final String OCS_ROUTE ="/ocs/v1.php/cloud/users/"; + + @Override + protected RemoteOperationResult run(OwnCloudClient client) { + RemoteOperationResult result = null; + int status = -1; + GetMethod get = null; + + + //Get the user + try { + OwnCloudBasicCredentials credentials = (OwnCloudBasicCredentials) client.getCredentials(); + String url = client.getBaseUri() + OCS_ROUTE + credentials.getUsername(); + + get = new GetMethod(url); + get.addRequestHeader(createAuthenticationHeader(credentials)); + get.setQueryString(new NameValuePair[]{new NameValuePair("format","json")}); + status = client.executeMethod(get); + + if(isSuccess(status)) { + String response = get.getResponseBodyAsString(); + + // Parse the response + JSONObject respJSON = new JSONObject(response); + JSONObject respOCS = respJSON.getJSONObject(NODE_OCS); + JSONObject respData = respOCS.getJSONObject(NODE_DATA); + JSONObject quota = respData.getJSONObject(NODE_QUOTA); + final Long quotaFree = quota.getLong(NODE_QUOTA_FREE); + final Long quotaUsed = quota.getLong(NODE_QUOTA_USED); + final Long quotaTotal = quota.getLong(NODE_QUOTA_TOTAL); + final Double quotaRelative = quota.getDouble(NODE_QUOTA_RELATIVE); + + + // Result + result = new RemoteOperationResult(true, status, get.getResponseHeaders()); + //Quota data in data collection + ArrayList data = new ArrayList(); + data.add(quotaFree); + data.add(quotaUsed); + data.add(quotaTotal); + data.add(quotaRelative); + result.setData(data); + + } else { + result = new RemoteOperationResult(false, status, get.getResponseHeaders()); + String response = get.getResponseBodyAsString(); + Log_OC.e(TAG, "Failed response while getting user quota information "); + if (response != null) { + Log_OC.e(TAG, "*** status code: " + status + " ; response message: " + response); + } else { + Log_OC.e(TAG, "*** status code: " + status); + } + } + } catch (Exception e) { + result = new RemoteOperationResult(e); + Log_OC.e(TAG, "Exception while getting OC user information", e); + + } finally { + get.releaseConnection(); + } + + return result; + } + + private boolean isSuccess(int status) { + return (status == HttpStatus.SC_OK); + } + + private Header createAuthenticationHeader(OwnCloudCredentials credentials){ + Header h = new Header(); + h.setName("Authorization"); + String authString = credentials.getUsername()+":"+credentials.getAuthToken(); + String encodedString = Base64.encodeToString(authString.getBytes(), Base64.NO_WRAP); + h.setValue("Basic "+encodedString); + return h; + } + + +} From 46b5d5a4b9603056dd559fc489b405d510663df6 Mon Sep 17 00:00:00 2001 From: Bartosz Przybylski Date: Wed, 23 Dec 2015 18:04:48 +0100 Subject: [PATCH 2/4] Add test to fetching user quota, add more handy return data object from remote operation --- ....java => RemoteGetUserQuotaOperation.java} | 74 +++++++++++------ .../lib/test_project/TestActivity.java | 7 ++ .../test_project/test/GetUserQuotaTest.java | 81 +++++++++++++++++++ 3 files changed, 136 insertions(+), 26 deletions(-) rename src/com/owncloud/android/lib/resources/users/{GetRemoteUserQuotaOperation.java => RemoteGetUserQuotaOperation.java} (62%) create mode 100644 test_client/tests/src/com/owncloud/android/lib/test_project/test/GetUserQuotaTest.java diff --git a/src/com/owncloud/android/lib/resources/users/GetRemoteUserQuotaOperation.java b/src/com/owncloud/android/lib/resources/users/RemoteGetUserQuotaOperation.java similarity index 62% rename from src/com/owncloud/android/lib/resources/users/GetRemoteUserQuotaOperation.java rename to src/com/owncloud/android/lib/resources/users/RemoteGetUserQuotaOperation.java index 3d394fd5..e059cf41 100644 --- a/src/com/owncloud/android/lib/resources/users/GetRemoteUserQuotaOperation.java +++ b/src/com/owncloud/android/lib/resources/users/RemoteGetUserQuotaOperation.java @@ -1,33 +1,68 @@ -package com.owncloud.android.lib.resources.users; +/* ownCloud Android Library is available under MIT license + * + * Copyright (C) 2015 ownCloud Inc. + * Copyright (C) 2015 Bartosz Przybylski + * Copyright (C) 2014 Marcello Steiner + * + * 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. + * + */ -import android.util.Base64; -import android.util.Log; +package com.owncloud.android.lib.resources.users; import com.owncloud.android.lib.common.OwnCloudBasicCredentials; import com.owncloud.android.lib.common.OwnCloudClient; -import com.owncloud.android.lib.common.OwnCloudCredentials; 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.Header; -import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.http.HttpStatus; import org.json.JSONObject; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; import java.util.ArrayList; /** - * Created by marcello on 11/11/14. + * @author marcello */ -public class GetRemoteUserQuotaOperation extends RemoteOperation { +public class RemoteGetUserQuotaOperation extends RemoteOperation { - private static final String TAG = GetRemoteUserNameOperation.class.getSimpleName(); + static public class Quota { + long mFree, mUsed, mTotal; + double mRelative; + public Quota(long free, long used, long total, double relative) { + mFree = free; + mUsed = used; + mTotal = total; + mRelative = relative; + } + + public long getFree() { return mFree; } + public long getUsed() { return mUsed; } + public long getTotal() { return mTotal; } + public double getRelative() { return mRelative; } + } + + private static final String TAG = RemoteGetUserQuotaOperation.class.getSimpleName(); private static final String NODE_OCS = "ocs"; private static final String NODE_DATA = "data"; @@ -43,7 +78,7 @@ public class GetRemoteUserQuotaOperation extends RemoteOperation { @Override protected RemoteOperationResult run(OwnCloudClient client) { RemoteOperationResult result = null; - int status = -1; + int status; GetMethod get = null; @@ -53,7 +88,6 @@ public class GetRemoteUserQuotaOperation extends RemoteOperation { String url = client.getBaseUri() + OCS_ROUTE + credentials.getUsername(); get = new GetMethod(url); - get.addRequestHeader(createAuthenticationHeader(credentials)); get.setQueryString(new NameValuePair[]{new NameValuePair("format","json")}); status = client.executeMethod(get); @@ -75,10 +109,7 @@ public class GetRemoteUserQuotaOperation extends RemoteOperation { result = new RemoteOperationResult(true, status, get.getResponseHeaders()); //Quota data in data collection ArrayList data = new ArrayList(); - data.add(quotaFree); - data.add(quotaUsed); - data.add(quotaTotal); - data.add(quotaRelative); + data.add(new Quota(quotaFree, quotaUsed, quotaTotal, quotaRelative)); result.setData(data); } else { @@ -106,14 +137,5 @@ public class GetRemoteUserQuotaOperation extends RemoteOperation { return (status == HttpStatus.SC_OK); } - private Header createAuthenticationHeader(OwnCloudCredentials credentials){ - Header h = new Header(); - h.setName("Authorization"); - String authString = credentials.getUsername()+":"+credentials.getAuthToken(); - String encodedString = Base64.encodeToString(authString.getBytes(), Base64.NO_WRAP); - h.setValue("Basic "+encodedString); - return h; - } - } diff --git a/test_client/src/com/owncloud/android/lib/test_project/TestActivity.java b/test_client/src/com/owncloud/android/lib/test_project/TestActivity.java index 18770120..7405af59 100644 --- a/test_client/src/com/owncloud/android/lib/test_project/TestActivity.java +++ b/test_client/src/com/owncloud/android/lib/test_project/TestActivity.java @@ -44,6 +44,7 @@ import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.OwnCloudClientFactory; import com.owncloud.android.lib.common.OwnCloudCredentialsFactory; import com.owncloud.android.lib.common.network.NetworkUtils; +import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.resources.files.ChunkedUploadRemoteFileOperation; import com.owncloud.android.lib.resources.files.CreateRemoteFolderOperation; @@ -57,6 +58,7 @@ import com.owncloud.android.lib.resources.shares.CreateRemoteShareOperation; import com.owncloud.android.lib.resources.shares.GetRemoteSharesOperation; import com.owncloud.android.lib.resources.shares.RemoveRemoteShareOperation; import com.owncloud.android.lib.resources.shares.ShareType; +import com.owncloud.android.lib.resources.users.RemoteGetUserQuotaOperation; /** * Activity to test OC framework @@ -330,6 +332,11 @@ public class TestActivity extends Activity { return result; } + + public RemoteOperationResult getQuota() { + RemoteGetUserQuotaOperation getUserQuotaOperation = new RemoteGetUserQuotaOperation(); + return getUserQuotaOperation.execute(mClient); + } /** diff --git a/test_client/tests/src/com/owncloud/android/lib/test_project/test/GetUserQuotaTest.java b/test_client/tests/src/com/owncloud/android/lib/test_project/test/GetUserQuotaTest.java new file mode 100644 index 00000000..26ebd196 --- /dev/null +++ b/test_client/tests/src/com/owncloud/android/lib/test_project/test/GetUserQuotaTest.java @@ -0,0 +1,81 @@ +/* ownCloud Android Library is available under MIT license + * + * Copyright (C) 2015 ownCloud Inc. + * Copyright (C) 2015 Bartosz Przybylski + * + * 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.test_project.test; + +import java.io.File; +import java.util.*; + +import com.owncloud.android.lib.common.operations.RemoteOperationResult; +import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; +import com.owncloud.android.lib.resources.users.RemoteGetUserQuotaOperation.Quota; +import com.owncloud.android.lib.test_project.TestActivity; +import com.owncloud.android.lib.resources.files.*; + + +/** + * Class to test Get User Quota + * + * @author Bartosz Przybylski + * + */ +public class GetUserQuotaTest extends RemoteTest { + + + private static final String LOG_TAG = GetUserQuotaTest.class.getCanonicalName(); + + /* Files to download. These files must exist on the account */ + private static final String IMAGE_PATH = "/fileToDownload.png"; + private static final String IMAGE_PATH_WITH_SPECIAL_CHARS = "/@file@download.png"; + private static final String IMAGE_NOT_FOUND = "/fileNotFound.png"; + + private String mFullPath2Image; + private String mFullPath2ImageWitSpecialChars; + private String mFullPath2ImageNotFound; + private String mDownloadedFilePath; + private TestActivity mActivity; + + + @Override + protected void setUp() throws Exception { + super.setUp(); + setActivityInitialTouchMode(false); + mActivity = getActivity(); + } + + /** + * Test GetUserQuota + */ + public void testGetUserQuota() { + RemoteOperationResult result = mActivity.getQuota(); + assertTrue(result.isSuccess()); + Quota quota = (Quota)((ArrayList)result.getData()).get(0); + assertTrue(quota.getFree() >= 0); + assertTrue(quota.getUsed() >= 0); + assertTrue(quota.getTotal() > 0); + } + +} From b8aa7b61196807454f5124bd0f0ea7c12b687576 Mon Sep 17 00:00:00 2001 From: "David A. Velasco" Date: Wed, 17 Aug 2016 10:17:29 +0200 Subject: [PATCH 3/4] Changes after CR --- .../resources/users/RemoteGetUserQuotaOperation.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/com/owncloud/android/lib/resources/users/RemoteGetUserQuotaOperation.java b/src/com/owncloud/android/lib/resources/users/RemoteGetUserQuotaOperation.java index e059cf41..55e976c6 100644 --- a/src/com/owncloud/android/lib/resources/users/RemoteGetUserQuotaOperation.java +++ b/src/com/owncloud/android/lib/resources/users/RemoteGetUserQuotaOperation.java @@ -27,15 +27,15 @@ package com.owncloud.android.lib.resources.users; -import com.owncloud.android.lib.common.OwnCloudBasicCredentials; import com.owncloud.android.lib.common.OwnCloudClient; +import com.owncloud.android.lib.common.OwnCloudCredentials; 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.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.GetMethod; -import org.apache.http.HttpStatus; import org.json.JSONObject; import java.util.ArrayList; @@ -84,7 +84,7 @@ public class RemoteGetUserQuotaOperation extends RemoteOperation { //Get the user try { - OwnCloudBasicCredentials credentials = (OwnCloudBasicCredentials) client.getCredentials(); + OwnCloudCredentials credentials = client.getCredentials(); String url = client.getBaseUri() + OCS_ROUTE + credentials.getUsername(); get = new GetMethod(url); @@ -127,7 +127,9 @@ public class RemoteGetUserQuotaOperation extends RemoteOperation { Log_OC.e(TAG, "Exception while getting OC user information", e); } finally { - get.releaseConnection(); + if (get != null) { + get.releaseConnection(); + } } return result; From 477a99e243224df01af54792eac6e00bf1a0d00b Mon Sep 17 00:00:00 2001 From: "David A. Velasco" Date: Wed, 17 Aug 2016 10:54:53 +0200 Subject: [PATCH 4/4] Renamed operation to get quota following scheme of rest of operations, and some clean-up --- ...ion.java => GetRemoteUserQuotaOperation.java} | 5 +++-- .../android/lib/test_project/TestActivity.java | 4 ++-- .../lib/test_project/test/GetUserQuotaTest.java | 16 ++-------------- 3 files changed, 7 insertions(+), 18 deletions(-) rename src/com/owncloud/android/lib/resources/users/{RemoteGetUserQuotaOperation.java => GetRemoteUserQuotaOperation.java} (96%) diff --git a/src/com/owncloud/android/lib/resources/users/RemoteGetUserQuotaOperation.java b/src/com/owncloud/android/lib/resources/users/GetRemoteUserQuotaOperation.java similarity index 96% rename from src/com/owncloud/android/lib/resources/users/RemoteGetUserQuotaOperation.java rename to src/com/owncloud/android/lib/resources/users/GetRemoteUserQuotaOperation.java index 55e976c6..548bc536 100644 --- a/src/com/owncloud/android/lib/resources/users/RemoteGetUserQuotaOperation.java +++ b/src/com/owncloud/android/lib/resources/users/GetRemoteUserQuotaOperation.java @@ -43,7 +43,7 @@ import java.util.ArrayList; /** * @author marcello */ -public class RemoteGetUserQuotaOperation extends RemoteOperation { +public class GetRemoteUserQuotaOperation extends RemoteOperation { static public class Quota { long mFree, mUsed, mTotal; @@ -62,7 +62,7 @@ public class RemoteGetUserQuotaOperation extends RemoteOperation { public double getRelative() { return mRelative; } } - private static final String TAG = RemoteGetUserQuotaOperation.class.getSimpleName(); + private static final String TAG = GetRemoteUserQuotaOperation.class.getSimpleName(); private static final String NODE_OCS = "ocs"; private static final String NODE_DATA = "data"; @@ -89,6 +89,7 @@ public class RemoteGetUserQuotaOperation extends RemoteOperation { get = new GetMethod(url); get.setQueryString(new NameValuePair[]{new NameValuePair("format","json")}); + get.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE); status = client.executeMethod(get); if(isSuccess(status)) { diff --git a/test_client/src/com/owncloud/android/lib/test_project/TestActivity.java b/test_client/src/com/owncloud/android/lib/test_project/TestActivity.java index 7405af59..08881296 100644 --- a/test_client/src/com/owncloud/android/lib/test_project/TestActivity.java +++ b/test_client/src/com/owncloud/android/lib/test_project/TestActivity.java @@ -58,7 +58,7 @@ import com.owncloud.android.lib.resources.shares.CreateRemoteShareOperation; import com.owncloud.android.lib.resources.shares.GetRemoteSharesOperation; import com.owncloud.android.lib.resources.shares.RemoveRemoteShareOperation; import com.owncloud.android.lib.resources.shares.ShareType; -import com.owncloud.android.lib.resources.users.RemoteGetUserQuotaOperation; +import com.owncloud.android.lib.resources.users.GetRemoteUserQuotaOperation; /** * Activity to test OC framework @@ -334,7 +334,7 @@ public class TestActivity extends Activity { } public RemoteOperationResult getQuota() { - RemoteGetUserQuotaOperation getUserQuotaOperation = new RemoteGetUserQuotaOperation(); + GetRemoteUserQuotaOperation getUserQuotaOperation = new GetRemoteUserQuotaOperation(); return getUserQuotaOperation.execute(mClient); } diff --git a/test_client/tests/src/com/owncloud/android/lib/test_project/test/GetUserQuotaTest.java b/test_client/tests/src/com/owncloud/android/lib/test_project/test/GetUserQuotaTest.java index 26ebd196..b18c90a5 100644 --- a/test_client/tests/src/com/owncloud/android/lib/test_project/test/GetUserQuotaTest.java +++ b/test_client/tests/src/com/owncloud/android/lib/test_project/test/GetUserQuotaTest.java @@ -26,36 +26,24 @@ package com.owncloud.android.lib.test_project.test; -import java.io.File; import java.util.*; import com.owncloud.android.lib.common.operations.RemoteOperationResult; -import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; -import com.owncloud.android.lib.resources.users.RemoteGetUserQuotaOperation.Quota; +import com.owncloud.android.lib.resources.users.GetRemoteUserQuotaOperation.Quota; import com.owncloud.android.lib.test_project.TestActivity; -import com.owncloud.android.lib.resources.files.*; /** * Class to test Get User Quota * * @author Bartosz Przybylski - * + * @author David A. Velasco */ public class GetUserQuotaTest extends RemoteTest { private static final String LOG_TAG = GetUserQuotaTest.class.getCanonicalName(); - /* Files to download. These files must exist on the account */ - private static final String IMAGE_PATH = "/fileToDownload.png"; - private static final String IMAGE_PATH_WITH_SPECIAL_CHARS = "/@file@download.png"; - private static final String IMAGE_NOT_FOUND = "/fileNotFound.png"; - - private String mFullPath2Image; - private String mFullPath2ImageWitSpecialChars; - private String mFullPath2ImageNotFound; - private String mDownloadedFilePath; private TestActivity mActivity;