Skip to content

Commit 63bc21a

Browse files
authored
Add account API support (user and cloud management) (#176)
1 parent 948e5c6 commit 63bc21a

File tree

14 files changed

+870
-20
lines changed

14 files changed

+870
-20
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,5 @@ branches:
2828
- staging-test
2929

3030
# ciTest is configured to skip the various timeout tests that don't work in travis
31-
script: ./gradlew clean -DCLOUDINARY_URL=$CLOUDINARY_URL ciTest -p cloudinary-${MODULE} -i
31+
script: ./gradlew clean -DCLOUDINARY_URL=$CLOUDINARY_URL -DCLOUDINARY_PROVISIONING_CONFIG=$CLOUDINARY_PROVISIONING_CONFIG ciTest -p cloudinary-${MODULE} -i
3232

cloudinary-core/src/main/java/com/cloudinary/Api.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616
public class Api {
1717

1818

19+
public AbstractApiStrategy getStrategy() {
20+
return strategy;
21+
}
22+
1923
public enum HttpMethod {GET, POST, PUT, DELETE;}
2024

2125
public final static Map<Integer, Class<? extends Exception>> CLOUDINARY_API_ERROR_CLASSES = new HashMap<Integer, Class<? extends Exception>>();

cloudinary-core/src/main/java/com/cloudinary/Cloudinary.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public class Cloudinary {
2121
"com.cloudinary.http42.UploaderStrategy",
2222
"com.cloudinary.http43.UploaderStrategy",
2323
"com.cloudinary.http44.UploaderStrategy"));
24-
private static List<String> API_STRATEGIES = new ArrayList<String>(Arrays.asList(
24+
public static List<String> API_STRATEGIES = new ArrayList<String>(Arrays.asList(
2525
"com.cloudinary.android.ApiStrategy",
2626
"com.cloudinary.http42.ApiStrategy",
2727
"com.cloudinary.http43.ApiStrategy",

cloudinary-core/src/main/java/com/cloudinary/provisioning/Account.java

Lines changed: 412 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.cloudinary.provisioning;
2+
3+
import com.cloudinary.utils.StringUtils;
4+
5+
import java.net.URI;
6+
7+
public class AccountConfiguration {
8+
private static final String SEPARATOR = ":";
9+
String accountId;
10+
String provisioningApiKey;
11+
String provisioningApiSecret;
12+
13+
public AccountConfiguration(String accountId, String provisioningApiKey, String provisioningApiSecret) {
14+
this.accountId = accountId;
15+
this.provisioningApiKey = provisioningApiKey;
16+
this.provisioningApiSecret = provisioningApiSecret;
17+
}
18+
19+
public static AccountConfiguration from(String accountUrl) {
20+
URI uri = URI.create(accountUrl);
21+
22+
String accountId = uri.getHost();
23+
if (StringUtils.isBlank(accountId)) throw new IllegalArgumentException("Account id must be provided in account url");
24+
25+
if (uri.getUserInfo() == null) throw new IllegalArgumentException("Full credentials (key+secret) must be provided in account url");
26+
String[] credentials = uri.getUserInfo().split(":");
27+
if (credentials.length < 2 ||
28+
StringUtils.isBlank(credentials[0]) ||
29+
StringUtils.isBlank(credentials[1])) {
30+
throw new IllegalArgumentException("Full credentials (key+secret) must be provided in account url");
31+
}
32+
33+
return new AccountConfiguration(accountId, credentials[0], credentials[1]);
34+
}
35+
}

cloudinary-core/src/main/java/com/cloudinary/strategies/AbstractApiStrategy.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,6 @@ public void init(Api api) {
1515

1616
@SuppressWarnings("rawtypes")
1717
public abstract ApiResponse callApi(HttpMethod method, Iterable<String> uri, Map<String, ? extends Object> params, Map options) throws Exception;
18+
19+
public abstract ApiResponse callAccountApi(HttpMethod method, Iterable<String> uri, Map<String, ? extends Object> params, Map options) throws Exception;
1820
}

cloudinary-http42/src/main/java/com/cloudinary/http42/ApiStrategy.java

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package com.cloudinary.http42;
22

3-
import java.io.InputStream;
4-
import java.lang.reflect.Constructor;
5-
import java.net.URI;
6-
import java.util.Arrays;
7-
import java.util.Map;
8-
3+
import com.cloudinary.Api;
4+
import com.cloudinary.Api.HttpMethod;
5+
import com.cloudinary.Cloudinary;
6+
import com.cloudinary.api.ApiResponse;
7+
import com.cloudinary.api.exceptions.GeneralError;
8+
import com.cloudinary.http42.api.Response;
99
import com.cloudinary.strategies.AbstractApiStrategy;
10+
import com.cloudinary.utils.Base64Coder;
11+
import com.cloudinary.utils.ObjectUtils;
12+
import com.cloudinary.utils.StringUtils;
1013
import org.apache.http.HttpResponse;
1114
import org.apache.http.client.methods.*;
1215
import org.apache.http.client.utils.URIBuilder;
@@ -19,15 +22,11 @@
1922
import org.cloudinary.json.JSONException;
2023
import org.cloudinary.json.JSONObject;
2124

22-
import com.cloudinary.Api;
23-
import com.cloudinary.Api.HttpMethod;
24-
import com.cloudinary.Cloudinary;
25-
import com.cloudinary.api.ApiResponse;
26-
import com.cloudinary.api.exceptions.GeneralError;
27-
import com.cloudinary.http42.api.Response;
28-
import com.cloudinary.utils.Base64Coder;
29-
import com.cloudinary.utils.ObjectUtils;
30-
import com.cloudinary.utils.StringUtils;
25+
import java.io.InputStream;
26+
import java.lang.reflect.Constructor;
27+
import java.net.URI;
28+
import java.util.Arrays;
29+
import java.util.Map;
3130

3231
public class ApiStrategy extends AbstractApiStrategy {
3332

@@ -50,6 +49,28 @@ public ApiResponse callApi(HttpMethod method, Iterable<String> uri, Map<String,
5049
apiUrl = apiUrl + "/" + component;
5150
}
5251

52+
return getApiResponse(method, params, apiKey, apiSecret, contentType, timeout, apiUrl);
53+
}
54+
55+
@Override
56+
public ApiResponse callAccountApi(HttpMethod method, Iterable<String> uri, Map<String, ?> params, Map options) throws Exception {
57+
String prefix = ObjectUtils.asString(options.get("upload_prefix"), "https://api.cloudinary.com");
58+
String apiKey = ObjectUtils.asString(options.get("provisioning_api_key"));
59+
if (apiKey == null) throw new IllegalArgumentException("Must supply provisioning_api_key");
60+
String apiSecret = ObjectUtils.asString(options.get("provisioning_api_secret"));
61+
if (apiSecret == null) throw new IllegalArgumentException("Must supply provisioning_api_secret");
62+
String contentType = ObjectUtils.asString(options.get("content_type"), "urlencoded");
63+
int timeout = ObjectUtils.asInteger(options.get("timeout"), this.api.cloudinary.config.timeout);
64+
65+
String apiUrl = StringUtils.join(Arrays.asList(prefix, "v1_1"), "/");
66+
for (String component : uri) {
67+
apiUrl = apiUrl + "/" + component;
68+
}
69+
70+
return getApiResponse(method, params, apiKey, apiSecret, contentType, timeout, apiUrl);
71+
}
72+
73+
private ApiResponse getApiResponse(HttpMethod method, Map<String, ?> params, String apiKey, String apiSecret, String contentType, int timeout, String apiUrl) throws Exception {
5374
URIBuilder apiUrlBuilder = new URIBuilder(apiUrl);
5475
if (!contentType.equals("json")) {
5576
for (Map.Entry<String, ? extends Object> param : params.entrySet()) {
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.cloudinary.test;
2+
3+
public class AccountApiTest extends AbstractAccountApiTest {
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.cloudinary.test;
2+
3+
public class ContextTest extends AbstractContextTest {
4+
}

cloudinary-http43/src/main/java/com/cloudinary/http43/ApiStrategy.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import com.cloudinary.utils.StringUtils;
1212
import org.apache.http.Consts;
1313
import org.apache.http.HttpHost;
14-
import org.apache.http.NameValuePair;
1514
import org.apache.http.client.config.RequestConfig;
1615
import org.apache.http.client.entity.UrlEncodedFormEntity;
1716
import org.apache.http.client.methods.*;
@@ -22,7 +21,6 @@
2221
import org.apache.http.impl.client.CloseableHttpClient;
2322
import org.apache.http.impl.client.HttpClientBuilder;
2423
import org.apache.http.impl.client.HttpClients;
25-
import org.apache.http.message.BasicNameValuePair;
2624
import org.cloudinary.json.JSONException;
2725
import org.cloudinary.json.JSONObject;
2826

@@ -32,7 +30,6 @@
3230
import java.net.URI;
3331
import java.net.URISyntaxException;
3432
import java.util.Arrays;
35-
import java.util.List;
3633
import java.util.HashMap;
3734
import java.util.Map;
3835

@@ -95,6 +92,10 @@ public ApiResponse callApi(HttpMethod method, Iterable<String> uri, Map<String,
9592

9693
request.setHeader("Authorization", "Basic " + Base64Coder.encodeString(apiKey + ":" + apiSecret));
9794

95+
return getApiResponse(request);
96+
}
97+
98+
private ApiResponse getApiResponse(HttpUriRequest request) throws Exception {
9899
String responseData = null;
99100
int code = 0;
100101
CloseableHttpResponse response = client.execute(request);
@@ -128,6 +129,29 @@ public ApiResponse callApi(HttpMethod method, Iterable<String> uri, Map<String,
128129
}
129130
}
130131

132+
@Override
133+
public ApiResponse callAccountApi(HttpMethod method, Iterable<String> uri, Map<String, ?> params, Map options) throws Exception {
134+
if (options == null)
135+
options = ObjectUtils.emptyMap();
136+
137+
String prefix = ObjectUtils.asString(options.get("upload_prefix"), "https://api.cloudinary.com");
138+
String apiKey = ObjectUtils.asString(options.get("provisioning_api_key"));
139+
if (apiKey == null) throw new IllegalArgumentException("Must supply provisioning_api_key");
140+
String apiSecret = ObjectUtils.asString(options.get("provisioning_api_secret"));
141+
if (apiSecret == null) throw new IllegalArgumentException("Must supply provisioning_api_secret");
142+
143+
String apiUrl = StringUtils.join(Arrays.asList(prefix, "v1_1"), "/");
144+
for (String component : uri) {
145+
apiUrl = apiUrl + "/" + component;
146+
}
147+
148+
HttpUriRequest request = prepareRequest(method, apiUrl, params, options);
149+
150+
request.setHeader("Authorization", "Basic " + Base64Coder.encodeString(apiKey + ":" + apiSecret));
151+
152+
return getApiResponse(request);
153+
}
154+
131155
/**
132156
* Prepare a request with the URL and parameters based on the HTTP method used
133157
*
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.cloudinary.test;
2+
3+
public class AccountApiTest extends AbstractAccountApiTest {
4+
}

cloudinary-http44/src/main/java/com/cloudinary/http44/ApiStrategy.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@ public ApiResponse callApi(HttpMethod method, Iterable<String> uri, Map<String,
9494

9595
request.setHeader("Authorization", "Basic " + Base64Coder.encodeString(apiKey + ":" + apiSecret));
9696

97+
return getApiResponse(request);
98+
}
99+
100+
private ApiResponse getApiResponse(HttpUriRequest request) throws Exception {
97101
String responseData = null;
98102
int code = 0;
99103
CloseableHttpResponse response = client.execute(request);
@@ -127,6 +131,29 @@ public ApiResponse callApi(HttpMethod method, Iterable<String> uri, Map<String,
127131
}
128132
}
129133

134+
@Override
135+
public ApiResponse callAccountApi(HttpMethod method, Iterable<String> uri, Map<String, ?> params, Map options) throws Exception {
136+
if (options == null)
137+
options = ObjectUtils.emptyMap();
138+
139+
String prefix = ObjectUtils.asString(options.get("upload_prefix"), "https://api.cloudinary.com");
140+
String apiKey = ObjectUtils.asString(options.get("provisioning_api_key"));
141+
if (apiKey == null) throw new IllegalArgumentException("Must supply provisioning_api_key");
142+
String apiSecret = ObjectUtils.asString(options.get("provisioning_api_secret"));
143+
if (apiSecret == null) throw new IllegalArgumentException("Must supply provisioning_api_secret");
144+
145+
String apiUrl = StringUtils.join(Arrays.asList(prefix, "v1_1"), "/");
146+
for (String component : uri) {
147+
apiUrl = apiUrl + "/" + component;
148+
}
149+
150+
HttpUriRequest request = prepareRequest(method, apiUrl, params, options);
151+
152+
request.setHeader("Authorization", "Basic " + Base64Coder.encodeString(apiKey + ":" + apiSecret));
153+
154+
return getApiResponse(request);
155+
}
156+
130157
/**
131158
* Prepare a request with the URL and parameters based on the HTTP method used
132159
*
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.cloudinary.test;
2+
3+
public class AccountApiTest extends AbstractAccountApiTest {
4+
}

0 commit comments

Comments
 (0)