From 89e5d1c34380fd9405892e1b30b00a83d610e21a Mon Sep 17 00:00:00 2001 From: Joshua Chaitin-Pollak Date: Thu, 1 Aug 2013 14:14:19 -0400 Subject: [PATCH 1/8] Extracted upload tagParams and upload url functionality into their functions, this will facilitate frameworks like Angular fetching the server-side params --- .../main/java/com/cloudinary/Uploader.java | 59 +++++++++++-------- 1 file changed, 36 insertions(+), 23 deletions(-) diff --git a/cloudinary-core/src/main/java/com/cloudinary/Uploader.java b/cloudinary-core/src/main/java/com/cloudinary/Uploader.java index d07a5a8e..cff043f7 100644 --- a/cloudinary-core/src/main/java/com/cloudinary/Uploader.java +++ b/cloudinary-core/src/main/java/com/cloudinary/Uploader.java @@ -273,35 +273,48 @@ public Map callApi(String action, Map params, Map options, Objec return result; } + public String prepareUploadTagParams(Map options) { + if (options == null) options = new HashMap(); + if (options.get("resource_type") == null) { + options = new HashMap(options); + options.put("resource_type", "auto"); + } + + String callback = Cloudinary.asString(options.get("callback"), this.cloudinary.getStringConfig("callback")); + if (callback == null) { + throw new IllegalArgumentException("Must supply callback"); + } + options.put("callback", callback); + + Map params = this.buildUploadParams(options); + signRequestParams(params, options); + + // Remove blank parameters + for (Iterator iterator = params.values().iterator(); iterator.hasNext(); ) { + String value = (String) iterator.next(); + if (StringUtils.isBlank(value)) { + iterator.remove(); + } + } + + return StringEscapeUtils.escapeHtml(JSONObject.toJSONString(params)); + } + + public String getUploadUrl(Map options) { + if (options == null) options = new HashMap(); + return this.cloudinary.cloudinaryApiUrl("upload", options); + } + public String imageUploadTag(String field, Map options, Map htmlOptions) { if (htmlOptions == null) htmlOptions = Cloudinary.emptyMap(); - if (options == null) options = new HashMap(); - if (options.get("resource_type") == null) { - options = new HashMap(options); - options.put("resource_type", "auto"); - } - String cloudinaryUploadUrl = this.cloudinary.cloudinaryApiUrl("upload", options); - String callback = Cloudinary.asString(options.get("callback"), this.cloudinary.getStringConfig("callback")); - if (callback == null) { - throw new IllegalArgumentException("Must supply callback"); - } - options.put("callback", callback); - - Map params = this.buildUploadParams(options); - signRequestParams(params, options); - - // Remove blank parameters - for (Iterator iterator = params.values().iterator(); iterator.hasNext(); ) { - String value = (String) iterator.next(); - if (StringUtils.isBlank(value)) { - iterator.remove(); - } - } + String tagParams = prepareUploadTagParams(options); + + String cloudinaryUploadUrl = getUploadUrl(options); StringBuilder builder = new StringBuilder(); builder.append(" htmlOptions) { if (htmlOptions == null) htmlOptions = Cloudinary.emptyMap(); - String tagParams = prepareUploadTagParams(options); + String tagParams = StringEscapeUtils.escapeHtml(prepareUploadTagParams(options)); String cloudinaryUploadUrl = getUploadUrl(options); From b77b10e39df49405d2730c833d88baa1539a38f3 Mon Sep 17 00:00:00 2001 From: Tal Lev-Ami Date: Wed, 7 Aug 2013 09:42:46 +0300 Subject: [PATCH 3/8] Escape all public_ids including non-http ones. --- .../src/main/java/com/cloudinary/Url.java | 11 +++++++++-- .../java/com/cloudinary/test/CloudinaryTest.java | 16 ++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/cloudinary-core/src/main/java/com/cloudinary/Url.java b/cloudinary-core/src/main/java/com/cloudinary/Url.java index 3881fbc0..8845de9d 100644 --- a/cloudinary-core/src/main/java/com/cloudinary/Url.java +++ b/cloudinary-core/src/main/java/com/cloudinary/Url.java @@ -1,5 +1,7 @@ package com.cloudinary; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; import java.util.Map; import java.util.TreeMap; import java.util.zip.CRC32; @@ -119,8 +121,13 @@ public String generate(String source) { return original_source; } source = SmartUrlEncoder.encode(source); - } else if (format != null) { - source = source + "." + format; + } else { + try { + source = SmartUrlEncoder.encode(URLDecoder.decode(source.replace("+", "%2B"), "UTF-8")); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + if (format != null) source = source + "." + format; } String prefix; boolean sharedDomain = !privateCdn; diff --git a/cloudinary-core/src/test/java/com/cloudinary/test/CloudinaryTest.java b/cloudinary-core/src/test/java/com/cloudinary/test/CloudinaryTest.java index 25aee351..0d33319f 100644 --- a/cloudinary-core/src/test/java/com/cloudinary/test/CloudinaryTest.java +++ b/cloudinary-core/src/test/java/com/cloudinary/test/CloudinaryTest.java @@ -395,6 +395,22 @@ public void testSpriteCss() { assertEquals("http://res.cloudinary.com/test123/image/sprite/test.css", result); } + @SuppressWarnings("unchecked") + @Test + public void testEscapePublicId() { + // should escape public_ids + Map tests = Cloudinary.asMap( + "a b", "a%20b", + "a+b", "a%2Bb", + "a%20b", "a%20b", + "a-b", "a-b", + "a??b", "a%3F%3Fb"); + for (Map.Entry entry : tests.entrySet()) { + String result = cloudinary.url().generate(entry.getKey()); + assertEquals("http://res.cloudinary.com/test123/image/upload/" + entry.getValue(), result); + } + } + public static Map getUrlParameters(URI uri) throws UnsupportedEncodingException { Map params = new HashMap(); for (String param : uri.getQuery().split("&")) { From d1e34179c3a790b02edf15b426b377faca6e47a4 Mon Sep 17 00:00:00 2001 From: Tal Lev-Ami Date: Wed, 7 Aug 2013 11:46:26 +0300 Subject: [PATCH 4/8] Rename prepareUploadTagParams to uploadTagParams --- cloudinary-core/src/main/java/com/cloudinary/Uploader.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cloudinary-core/src/main/java/com/cloudinary/Uploader.java b/cloudinary-core/src/main/java/com/cloudinary/Uploader.java index cabd3699..37835b9c 100644 --- a/cloudinary-core/src/main/java/com/cloudinary/Uploader.java +++ b/cloudinary-core/src/main/java/com/cloudinary/Uploader.java @@ -273,7 +273,7 @@ public Map callApi(String action, Map params, Map options, Objec return result; } - public String prepareUploadTagParams(Map options) { + public String uploadTagParams(Map options) { if (options == null) options = new HashMap(); if (options.get("resource_type") == null) { options = new HashMap(options); @@ -308,7 +308,7 @@ public String getUploadUrl(Map options) { public String imageUploadTag(String field, Map options, Map htmlOptions) { if (htmlOptions == null) htmlOptions = Cloudinary.emptyMap(); - String tagParams = StringEscapeUtils.escapeHtml(prepareUploadTagParams(options)); + String tagParams = StringEscapeUtils.escapeHtml(uploadTagParams(options)); String cloudinaryUploadUrl = getUploadUrl(options); From 2e22b822ffff4bf89e9aadc66fe812c7856eadde Mon Sep 17 00:00:00 2001 From: Tal Lev-Ami Date: Wed, 7 Aug 2013 11:48:58 +0300 Subject: [PATCH 5/8] [maven-release-plugin] prepare release cloudinary-parent-1.0.6 --- cloudinary-core/pom.xml | 2 +- cloudinary-taglib/pom.xml | 2 +- pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cloudinary-core/pom.xml b/cloudinary-core/pom.xml index c8361189..7982f0fd 100644 --- a/cloudinary-core/pom.xml +++ b/cloudinary-core/pom.xml @@ -4,7 +4,7 @@ com.cloudinary cloudinary-parent - 1.0.6-SNAPSHOT + 1.0.6 cloudinary diff --git a/cloudinary-taglib/pom.xml b/cloudinary-taglib/pom.xml index ec69a5a7..17805578 100644 --- a/cloudinary-taglib/pom.xml +++ b/cloudinary-taglib/pom.xml @@ -4,7 +4,7 @@ com.cloudinary cloudinary-parent - 1.0.6-SNAPSHOT + 1.0.6 cloudinary-taglib diff --git a/pom.xml b/pom.xml index 33451115..ec00d1e6 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ com.cloudinary cloudinary-parent - 1.0.6-SNAPSHOT + 1.0.6 pom Cloudinary Java Client Library Parent Project From 49bd93c57b7ad744c6cfa3f7e0b1852dd892fed0 Mon Sep 17 00:00:00 2001 From: Tal Lev-Ami Date: Wed, 7 Aug 2013 11:49:06 +0300 Subject: [PATCH 6/8] [maven-release-plugin] prepare for next development iteration --- cloudinary-core/pom.xml | 2 +- cloudinary-taglib/pom.xml | 2 +- pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cloudinary-core/pom.xml b/cloudinary-core/pom.xml index 7982f0fd..32446726 100644 --- a/cloudinary-core/pom.xml +++ b/cloudinary-core/pom.xml @@ -4,7 +4,7 @@ com.cloudinary cloudinary-parent - 1.0.6 + 1.0.7-SNAPSHOT cloudinary diff --git a/cloudinary-taglib/pom.xml b/cloudinary-taglib/pom.xml index 17805578..4b210529 100644 --- a/cloudinary-taglib/pom.xml +++ b/cloudinary-taglib/pom.xml @@ -4,7 +4,7 @@ com.cloudinary cloudinary-parent - 1.0.6 + 1.0.7-SNAPSHOT cloudinary-taglib diff --git a/pom.xml b/pom.xml index ec00d1e6..7eced97e 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ com.cloudinary cloudinary-parent - 1.0.6 + 1.0.7-SNAPSHOT pom Cloudinary Java Client Library Parent Project From f39dea5f481059bab513ca22acc0ebfef9614b7b Mon Sep 17 00:00:00 2001 From: Tal Lev-Ami Date: Mon, 26 Aug 2013 11:37:16 +0300 Subject: [PATCH 7/8] Fix handling of boolean parameters on upload --- cloudinary-core/src/main/java/com/cloudinary/Uploader.java | 2 +- .../src/test/java/com/cloudinary/test/UploaderTest.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/cloudinary-core/src/main/java/com/cloudinary/Uploader.java b/cloudinary-core/src/main/java/com/cloudinary/Uploader.java index 37835b9c..19d2f08b 100644 --- a/cloudinary-core/src/main/java/com/cloudinary/Uploader.java +++ b/cloudinary-core/src/main/java/com/cloudinary/Uploader.java @@ -53,7 +53,7 @@ public Map buildUploadParams(Map options) { for (String attr : BOOLEAN_UPLOAD_OPTIONS) { Boolean value = Cloudinary.asBoolean(options.get(attr), null); if (value != null) - options.put(attr, value.toString()); + params.put(attr, value.toString()); } params.put("eager", buildEager((List) options.get("eager"))); params.put("headers", buildCustomHeaders(options.get("headers"))); diff --git a/cloudinary-core/src/test/java/com/cloudinary/test/UploaderTest.java b/cloudinary-core/src/test/java/com/cloudinary/test/UploaderTest.java index 525377e9..bbf6382b 100644 --- a/cloudinary-core/src/test/java/com/cloudinary/test/UploaderTest.java +++ b/cloudinary-core/src/test/java/com/cloudinary/test/UploaderTest.java @@ -39,9 +39,11 @@ public void setUp() { @Test public void testUpload() throws IOException { - Map result = cloudinary.uploader().upload("src/test/resources/logo.png", Cloudinary.emptyMap()); + Map result = cloudinary.uploader().upload("src/test/resources/logo.png", Cloudinary.asMap("colors", true)); assertEquals(result.get("width"), 241L); assertEquals(result.get("height"), 51L); + assertNotNull(result.get("colors")); + assertNotNull(result.get("predominant")); Map to_sign = new HashMap(); to_sign.put("public_id", (String) result.get("public_id")); to_sign.put("version", Cloudinary.asString(result.get("version"))); From 53207246d027caa7a019ed97885896cd63013a7f Mon Sep 17 00:00:00 2001 From: Max Miracolo Date: Tue, 24 Sep 2013 10:09:42 -0400 Subject: [PATCH 8/8] add transformation attribute to cloudinary upload tag --- .../com/cloudinary/taglib/CloudinaryUploadTag.java | 10 ++++++++++ .../src/main/resources/META-INF/cloudinary.tld | 5 +++++ 2 files changed, 15 insertions(+) diff --git a/cloudinary-taglib/src/main/java/com/cloudinary/taglib/CloudinaryUploadTag.java b/cloudinary-taglib/src/main/java/com/cloudinary/taglib/CloudinaryUploadTag.java index a4cb17dd..3f58b658 100644 --- a/cloudinary-taglib/src/main/java/com/cloudinary/taglib/CloudinaryUploadTag.java +++ b/cloudinary-taglib/src/main/java/com/cloudinary/taglib/CloudinaryUploadTag.java @@ -20,6 +20,7 @@ public class CloudinaryUploadTag extends SimpleTagSupport { private String tags = null; private String fieldName; private String resourceType = "auto"; + private String transformation; public void doTag() throws JspException, IOException { Cloudinary cloudinary = Singleton.getCloudinary(); @@ -37,6 +38,7 @@ public void doTag() throws JspException, IOException { Map options = new HashMap(); options.put("resource_type", resourceType); + options.put("transformation", transformation); if (tags != null) { options.put("tags", tags); } @@ -85,6 +87,14 @@ public void setFieldName(String fieldName) { public String getFieldName() { return fieldName; } + + public void setTransformation(String transformation) { + this.transformation = transformation; + } + + public String getTransformation() { + return transformation; + } public void setResourceType(String resourceType) { this.resourceType = resourceType; diff --git a/cloudinary-taglib/src/main/resources/META-INF/cloudinary.tld b/cloudinary-taglib/src/main/resources/META-INF/cloudinary.tld index feda6159..ef7d3a89 100644 --- a/cloudinary-taglib/src/main/resources/META-INF/cloudinary.tld +++ b/cloudinary-taglib/src/main/resources/META-INF/cloudinary.tld @@ -40,6 +40,11 @@ false true + + transformation + false + true + image