Skip to content

Commit 4b98fd0

Browse files
authored
Support new parameter and modes in generateSprite() and multi() API cals.
* Add support for `urls` parameter. * Add `downloadGeneratedSprite()` method. * Add `downloadMulti` method.
1 parent 75c9e74 commit 4b98fd0

File tree

5 files changed

+223
-46
lines changed

5 files changed

+223
-46
lines changed

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

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,14 @@
88
import com.cloudinary.utils.ObjectUtils;
99
import com.cloudinary.utils.StringUtils;
1010

11+
import java.io.IOException;
1112
import java.io.UnsupportedEncodingException;
1213
import java.net.URLEncoder;
1314
import java.security.SecureRandom;
1415
import java.util.*;
1516

17+
import static com.cloudinary.Util.buildMultiParams;
18+
1619
@SuppressWarnings({"rawtypes", "unchecked"})
1720
public class Cloudinary {
1821

@@ -224,6 +227,62 @@ public String downloadZip(Map<String, Object> options) throws UnsupportedEncodin
224227
return downloadArchive(options, "zip");
225228
}
226229

230+
public String downloadGeneratedSprite(String tag, Map options) throws IOException {
231+
if (StringUtils.isEmpty(tag)) throw new IllegalArgumentException("Tag cannot be empty");
232+
233+
if (options == null)
234+
options = new HashMap();
235+
236+
options.put("tag", tag);
237+
options.put("mode", ArchiveParams.MODE_DOWNLOAD);
238+
239+
Map params = Util.buildGenerateSpriteParams(options);
240+
signRequest(params, options);
241+
242+
return buildUrl(cloudinaryApiUrl("sprite", options), params);
243+
}
244+
245+
public String downloadGeneratedSprite(String[] urls, Map options) throws IOException {
246+
if (urls.length < 1) throw new IllegalArgumentException("Request must contain at least one URL.");
247+
if (options == null)
248+
options = new HashMap();
249+
250+
options.put("urls", urls);
251+
options.put("mode", ArchiveParams.MODE_DOWNLOAD);
252+
253+
Map params = Util.buildGenerateSpriteParams(options);
254+
signRequest(params, options);
255+
256+
return buildUrl(cloudinaryApiUrl("sprite", options), params);
257+
}
258+
259+
public String downloadMulti(String tag, Map options) throws IOException {
260+
if (StringUtils.isEmpty(tag)) throw new IllegalArgumentException("Tag cannot be empty");
261+
if (options == null)
262+
options = new HashMap();
263+
264+
options.put("tag", tag);
265+
options.put("mode", ArchiveParams.MODE_DOWNLOAD);
266+
267+
Map params = buildMultiParams(options);
268+
signRequest(params, options);
269+
270+
return buildUrl(cloudinaryApiUrl("multi", options), params);
271+
}
272+
273+
public String downloadMulti(String[] urls, Map options) throws IOException {
274+
if (urls.length < 1) throw new IllegalArgumentException("Request must contain at least one URL.");
275+
if (options == null)
276+
options = new HashMap();
277+
278+
options.put("urls", urls);
279+
options.put("mode", ArchiveParams.MODE_DOWNLOAD);
280+
281+
Map params = buildMultiParams(options);
282+
signRequest(params, options);
283+
284+
return buildUrl(cloudinaryApiUrl("multi", options), params);
285+
}
227286

228287
private String buildUrl(String base, Map<String, Object> params) throws UnsupportedEncodingException {
229288
StringBuilder urlBuilder = new StringBuilder();
@@ -233,6 +292,8 @@ private String buildUrl(String base, Map<String, Object> params) throws Unsuppor
233292
}
234293
boolean first = true;
235294
for (Map.Entry<String, Object> param : params.entrySet()) {
295+
if (param.getValue() == null) continue;
296+
236297
String keyValue = null;
237298
Object value = param.getValue();
238299
if (!first) urlBuilder.append("&");

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

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66
import org.cloudinary.json.JSONObject;
77

88
import java.io.*;
9-
import java.util.Arrays;
10-
import java.util.HashMap;
11-
import java.util.Locale;
12-
import java.util.Map;
9+
import java.util.*;
10+
11+
import static com.cloudinary.Util.buildGenerateSpriteParams;
12+
import static com.cloudinary.Util.buildMultiParams;
1313

1414
@SuppressWarnings({"rawtypes", "unchecked"})
1515
public class Uploader {
@@ -266,44 +266,44 @@ public Map generate_sprite(String tag, Map options) throws IOException {
266266

267267
public Map generateSprite(String tag, Map options) throws IOException {
268268
if (options == null)
269-
options = ObjectUtils.emptyMap();
270-
Map<String, Object> params = new HashMap<String, Object>();
271-
Object transParam = options.get("transformation");
272-
Transformation transformation = null;
273-
if (transParam instanceof Transformation) {
274-
transformation = new Transformation((Transformation) transParam);
275-
} else if (transParam instanceof String) {
276-
transformation = new Transformation().rawTransformation((String) transParam);
269+
options = Collections.singletonMap("tag", tag);
270+
else
271+
options.put("tag", tag);
272+
273+
return callApi("sprite", buildGenerateSpriteParams(options), options, null);
274+
}
275+
276+
public Map generateSprite(String[] urls, Map options) throws IOException {
277+
if (options == null)
278+
options = Collections.singletonMap("urls", urls);
279+
else
280+
options.put("urls", urls);
281+
282+
return callApi("sprite", buildGenerateSpriteParams(options), options, null);
283+
}
284+
285+
public Map multi(String[] urls, Map options) throws IOException {
286+
if (options == null) {
287+
options = Collections.singletonMap("urls", urls);
277288
} else {
278-
transformation = new Transformation();
279-
}
280-
String format = (String) options.get("format");
281-
if (format != null) {
282-
transformation.fetchFormat(format);
289+
options.put("urls", urls);
283290
}
284-
params.put("transformation", transformation.generate());
285-
params.put("tag", tag);
286-
params.put("notification_url", (String) options.get("notification_url"));
287-
params.put("async", ObjectUtils.asBoolean(options.get("async"), false).toString());
288-
return callApi("sprite", params, options, null);
291+
292+
return multi(options);
289293
}
290294

291295
public Map multi(String tag, Map options) throws IOException {
292-
if (options == null)
293-
options = ObjectUtils.emptyMap();
294-
Map<String, Object> params = new HashMap<String, Object>();
295-
Object transformation = options.get("transformation");
296-
if (transformation != null) {
297-
if (transformation instanceof Transformation) {
298-
transformation = ((Transformation) transformation).generate();
299-
}
300-
params.put("transformation", transformation.toString());
296+
if (options == null) {
297+
options = Collections.singletonMap("tag", tag);
298+
} else {
299+
options.put("tag", tag);
301300
}
302-
params.put("tag", tag);
303-
params.put("notification_url", (String) options.get("notification_url"));
304-
params.put("format", (String) options.get("format"));
305-
params.put("async", ObjectUtils.asBoolean(options.get("async"), false).toString());
306-
return callApi("multi", params, options, null);
301+
302+
return multi(options);
303+
}
304+
305+
private Map multi(Map options) throws IOException {
306+
return callApi("multi", buildMultiParams(options), options, null);
307307
}
308308

309309
public Map explode(String public_id, Map options) throws IOException {

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

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,57 @@ public static final Map<String, Object> buildUploadParams(Map options) {
6969
return params;
7070
}
7171

72+
public static Map buildMultiParams(Map options) {
73+
Map<String, Object> params = new HashMap<String, Object>();
74+
75+
Object transformation = options.get("transformation");
76+
if (transformation != null) {
77+
if (transformation instanceof Transformation) {
78+
transformation = ((Transformation) transformation).generate();
79+
}
80+
params.put("transformation", transformation.toString());
81+
}
82+
params.put("tag", options.get("tag"));
83+
if (options.containsKey("urls")) {
84+
params.put("urls", Arrays.asList((String[]) options.get("urls")));
85+
}
86+
params.put("notification_url", (String) options.get("notification_url"));
87+
params.put("format", (String) options.get("format"));
88+
params.put("async", ObjectUtils.asBoolean(options.get("async"), false).toString());
89+
params.put("mode", options.get("mode"));
90+
putObject("timestamp", options, params, Util.timestamp());
91+
92+
return params;
93+
}
94+
95+
public static Map<String, Object> buildGenerateSpriteParams(Map options) {
96+
HashMap<String, Object> params = new HashMap<String, Object>();
97+
Object transParam = options.get("transformation");
98+
Transformation transformation = null;
99+
if (transParam instanceof Transformation) {
100+
transformation = new Transformation((Transformation) transParam);
101+
} else if (transParam instanceof String) {
102+
transformation = new Transformation().rawTransformation((String) transParam);
103+
} else {
104+
transformation = new Transformation();
105+
}
106+
String format = (String) options.get("format");
107+
if (format != null) {
108+
transformation.fetchFormat(format);
109+
}
110+
params.put("transformation", transformation.generate());
111+
params.put("tag", options.get("tag"));
112+
if (options.containsKey("urls")) {
113+
params.put("urls", Arrays.asList((String[]) options.get("urls")));
114+
}
115+
params.put("notification_url", (String) options.get("notification_url"));
116+
params.put("async", ObjectUtils.asBoolean(options.get("async"), false).toString());
117+
params.put("mode", options.get("mode"));
118+
putObject("timestamp", options, params, Util.timestamp());
119+
120+
return params;
121+
}
122+
72123
protected static final String buildEager(List<? extends Transformation> transformations) {
73124
if (transformations == null) {
74125
return null;

cloudinary-core/src/test/java/com/cloudinary/test/CloudinaryTest.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.lang.reflect.Type;
2121
import java.net.URI;
2222
import java.net.URLDecoder;
23+
import java.net.URLEncoder;
2324
import java.util.*;
2425
import java.util.regex.Matcher;
2526
import java.util.regex.Pattern;
@@ -651,6 +652,56 @@ public void testZipDownload() throws Exception {
651652
assertEquals("/v1_1/test123/image/download_tag.zip", uri.getPath());
652653
}
653654

655+
@Test
656+
public void testDownloadSprite() throws Exception{
657+
final String spriteTestTag = "sprite_tag";
658+
final String url1 = "https://res.cloudinary.com/demo/image/upload/sample";
659+
final String url2 = "https://res.cloudinary.com/demo/image/upload/car";
660+
661+
String urlFromTag = cloudinary.downloadGeneratedSprite(spriteTestTag, null);
662+
String urlFromUrls = cloudinary.downloadGeneratedSprite(new String[]{url1, url2}, null);
663+
664+
assertTrue(urlFromTag.startsWith("https://api.cloudinary.com/v1_1/" + cloudinary.config.cloudName + "/image/sprite?mode=download"));
665+
assertTrue(urlFromUrls.startsWith("https://api.cloudinary.com/v1_1/" + cloudinary.config.cloudName + "/image/sprite?mode=download"));
666+
assertTrue(urlFromUrls.contains("urls[]=" + URLEncoder.encode(url1, "UTF-8")));
667+
assertTrue(urlFromUrls.contains("urls[]=" + URLEncoder.encode(url2, "UTF-8")));
668+
669+
Map<String, String> parameters = getUrlParameters(new URI(urlFromTag));
670+
assertEquals(spriteTestTag, parameters.get("tag"));
671+
assertNotNull(parameters.get("timestamp"));
672+
assertNotNull(parameters.get("signature"));
673+
674+
parameters = getUrlParameters(new URI(urlFromUrls));
675+
assertNotNull(parameters.get("timestamp"));
676+
assertNotNull(parameters.get("signature"));
677+
}
678+
679+
@Test
680+
public void testDownloadMulti() throws Exception{
681+
cloudinary = new Cloudinary("cloudinary://571927874334573:yABWqlfSV2d5pRW4ujHJYA7SD34@nitzanj?load_strategies=false");
682+
683+
final String multiTestTag = "multi_test_tag";
684+
final String url1 = "https://res.cloudinary.com/demo/image/upload/sample";
685+
final String url2 = "https://res.cloudinary.com/demo/image/upload/car";
686+
687+
String urlFromTag = cloudinary.downloadMulti(multiTestTag, null);
688+
String urlFromUrls = cloudinary.downloadMulti(new String[]{url1, url2}, null);
689+
690+
assertTrue(urlFromTag.startsWith("https://api.cloudinary.com/v1_1/" + cloudinary.config.cloudName + "/image/multi?mode=download"));
691+
assertTrue(urlFromUrls.startsWith("https://api.cloudinary.com/v1_1/" + cloudinary.config.cloudName + "/image/multi?mode=download"));
692+
assertTrue(urlFromUrls.contains("urls[]=" + URLEncoder.encode(url1, "UTF-8")));
693+
assertTrue(urlFromUrls.contains("urls[]=" + URLEncoder.encode(url2, "UTF-8")));
694+
695+
Map<String, String> parameters = getUrlParameters(new URI(urlFromTag));
696+
assertEquals(multiTestTag, parameters.get("tag"));
697+
assertNotNull(parameters.get("timestamp"));
698+
assertNotNull(parameters.get("signature"));
699+
700+
parameters = getUrlParameters(new URI(urlFromUrls));
701+
assertNotNull(parameters.get("timestamp"));
702+
assertNotNull(parameters.get("signature"));
703+
704+
}
654705
@Test
655706
public void testSpriteCss() {
656707
String result = cloudinary.url().generateSpriteCss("test");

cloudinary-test-common/src/main/java/com/cloudinary/test/AbstractUploaderTest.java

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@
1212
import java.io.*;
1313
import java.net.HttpURLConnection;
1414
import java.net.URL;
15+
import java.net.URLEncoder;
1516
import java.text.ParseException;
1617
import java.text.SimpleDateFormat;
1718
import java.util.*;
1819
import java.util.zip.ZipInputStream;
1920

20-
import static com.cloudinary.utils.ObjectUtils.asArray;
21-
import static com.cloudinary.utils.ObjectUtils.asMap;
21+
import static com.cloudinary.utils.ObjectUtils.*;
2222
import static com.cloudinary.utils.StringUtils.isRemoteUrl;
2323
import static org.hamcrest.Matchers.*;
2424
import static org.junit.Assert.*;
@@ -259,7 +259,6 @@ public void testText() throws Exception {
259259
assertTrue(((Integer) result.get("height")) > 1);
260260
}
261261

262-
263262
@Test
264263
public void testImageUploadTag() {
265264
String tag = cloudinary.uploader().imageUploadTag("test-field", asMap("callback", "http://localhost/cloudinary_cors.html"), asMap("htmlattr", "htmlvalue"));
@@ -271,13 +270,19 @@ public void testImageUploadTag() {
271270
assertTrue(tag.contains("class='cloudinary-fileupload myclass'"));
272271
}
273272

274-
275273
@Test
276274
public void testSprite() throws Exception {
277275
final String sprite_test_tag = String.format("sprite_test_tag_%d", new java.util.Date().getTime());
278-
cloudinary.uploader().upload(SRC_TEST_IMAGE, asMap("tags", new String[]{sprite_test_tag, SDK_TEST_TAG, UPLOADER_TAG}, "public_id", "sprite_test_tag_1" + SUFFIX));
279-
cloudinary.uploader().upload(SRC_TEST_IMAGE, asMap("tags", new String[]{sprite_test_tag, SDK_TEST_TAG, UPLOADER_TAG}, "public_id", "sprite_test_tag_2" + SUFFIX));
280-
Map result = cloudinary.uploader().generateSprite(sprite_test_tag, asMap("tags", Arrays.asList(SDK_TEST_TAG, UPLOADER_TAG)));
276+
Map uploadResult1 = cloudinary.uploader().upload(SRC_TEST_IMAGE, asMap("tags", new String[]{sprite_test_tag, SDK_TEST_TAG, UPLOADER_TAG}, "public_id", "sprite_test_tag_1" + SUFFIX));
277+
Map uploadResult2 = cloudinary.uploader().upload(SRC_TEST_IMAGE, asMap("tags", new String[]{sprite_test_tag, SDK_TEST_TAG, UPLOADER_TAG}, "public_id", "sprite_test_tag_2" + SUFFIX));
278+
279+
String[] urls = new String[]{uploadResult1.get("url").toString(), uploadResult2.get("url").toString()};
280+
281+
Map result = cloudinary.uploader().generateSprite(urls, asMap("tags", Arrays.asList(SDK_TEST_TAG, UPLOADER_TAG)));
282+
addToDeleteList("sprite", result.get("public_id").toString());
283+
assertEquals(2, ((Map) result.get("image_infos")).size());
284+
285+
result = cloudinary.uploader().generateSprite(sprite_test_tag, asMap("tags", Arrays.asList(SDK_TEST_TAG, UPLOADER_TAG)));
281286
addToDeleteList("sprite", result.get("public_id").toString());
282287
assertEquals(2, ((Map) result.get("image_infos")).size());
283288
result = cloudinary.uploader().generateSprite(sprite_test_tag, asMap("transformation", "w_100"));
@@ -292,10 +297,19 @@ public void testSprite() throws Exception {
292297
public void testMulti() throws Exception {
293298
final String MULTI_TEST_TAG = "multi_test_tag" + SUFFIX;
294299
final Map options = asMap("tags", new String[]{MULTI_TEST_TAG, SDK_TEST_TAG, UPLOADER_TAG});
295-
cloudinary.uploader().upload(SRC_TEST_IMAGE, options);
296-
cloudinary.uploader().upload(SRC_TEST_IMAGE, options);
300+
Map uploadResult1 = cloudinary.uploader().upload(SRC_TEST_IMAGE, options);
301+
Map uploadResult2 = cloudinary.uploader().upload(SRC_TEST_IMAGE, options);
302+
303+
String[] urls = new String[]{uploadResult1.get("url").toString(), uploadResult2.get("url").toString()};
304+
305+
Map result = cloudinary.uploader().multi(urls, asMap("transformation", "c_crop,w_0.5"));
306+
addToDeleteList("multi", result.get("public_id").toString());
307+
308+
assertTrue(((String) result.get("url")).endsWith(".gif"));
309+
assertTrue(((String) result.get("url")).contains("w_0.5"));
310+
297311
List<String> ids = new ArrayList<String>();
298-
Map result = cloudinary.uploader().multi(MULTI_TEST_TAG, asMap("transformation", "c_crop,w_0.5"));
312+
result = cloudinary.uploader().multi(MULTI_TEST_TAG, asMap("transformation", "c_crop,w_0.5"));
299313
addToDeleteList("multi", result.get("public_id").toString());
300314
Map pdfResult = cloudinary.uploader().multi(MULTI_TEST_TAG, asMap("transformation", new Transformation().width(111), "format", "pdf"));
301315
addToDeleteList("multi", pdfResult.get("public_id").toString());

0 commit comments

Comments
 (0)