From 450a3382cc97c309bcfc2152abe9650345a8f623 Mon Sep 17 00:00:00 2001 From: Pablo Fernandez Date: Mon, 13 Sep 2010 19:47:17 -0300 Subject: [PATCH] Added multiparameter functionallity --- .../extractors/BaseStringExtractorImpl.java | 4 +- src/main/java/org/scribe/model/Request.java | 29 ++++++++++---- src/main/java/org/scribe/utils/MapUtils.java | 23 +++++++++-- src/main/java/org/scribe/utils/URLUtils.java | 9 +++-- .../java/org/scribe/utils/MapUtilsTest.java | 38 ++++++++++--------- .../java/org/scribe/utils/URLUtilsTest.java | 12 +++--- 6 files changed, 76 insertions(+), 39 deletions(-) diff --git a/src/main/java/org/scribe/extractors/BaseStringExtractorImpl.java b/src/main/java/org/scribe/extractors/BaseStringExtractorImpl.java index 4bbf20f..4463533 100644 --- a/src/main/java/org/scribe/extractors/BaseStringExtractorImpl.java +++ b/src/main/java/org/scribe/extractors/BaseStringExtractorImpl.java @@ -22,10 +22,10 @@ public class BaseStringExtractorImpl implements BaseStringExtractor private String getSortedAndEncodedParams(OAuthRequest request) { - Map params = new HashMap(); + Map> params = new HashMap>(); params.putAll(request.getQueryStringParams()); params.putAll(request.getBodyParams()); - params.putAll(request.getOauthParameters()); + params.putAll(MapUtils.toListMap(request.getOauthParameters())); params = MapUtils.sort(params); return URLUtils.percentEncode(URLUtils.formURLEncodeMap(params)); } diff --git a/src/main/java/org/scribe/model/Request.java b/src/main/java/org/scribe/model/Request.java index f7853be..aec8bc3 100644 --- a/src/main/java/org/scribe/model/Request.java +++ b/src/main/java/org/scribe/model/Request.java @@ -19,7 +19,7 @@ class Request private String url; private Verb verb; - private Map bodyParams; + private Map> bodyParams; private Map headers; private String payload = null; private Integer timeout = null; @@ -35,7 +35,7 @@ class Request { this.verb = verb; this.url = url; - this.bodyParams = new HashMap(); + this.bodyParams = new HashMap>(); this.headers = new HashMap(); try { @@ -108,7 +108,14 @@ class Request */ public void addBodyParameter(String key, String value) { - this.bodyParams.put(key, value); + if(bodyParams.get(key) != null) + { + bodyParams.get(key).add(value); + } + else + { + bodyParams.put(key, Arrays.asList(value)); + } } /** @@ -131,18 +138,26 @@ class Request * * @return a map containing the query string parameters */ - public Map getQueryStringParams() + public Map> getQueryStringParams() { try { - Map params = new HashMap(); + Map> params = new HashMap>(); String query = new URL(url).getQuery(); if (query != null) { for (String param : query.split("&")) { String pair[] = param.split("="); - params.put(pair[0], pair[1]); + String key = pair[0], value = pair[1]; + if(params.get(key)!= null) + { + params.get(key).add(value); + } + else + { + params.put(key, Arrays.asList(value)); + } } } return params; @@ -157,7 +172,7 @@ class Request * * @return a map containing the body parameters. */ - public Map getBodyParams() + public Map> getBodyParams() { return bodyParams; } diff --git a/src/main/java/org/scribe/utils/MapUtils.java b/src/main/java/org/scribe/utils/MapUtils.java index 011d880..59b6c59 100644 --- a/src/main/java/org/scribe/utils/MapUtils.java +++ b/src/main/java/org/scribe/utils/MapUtils.java @@ -5,22 +5,39 @@ import java.util.*; public class MapUtils { - public static final Map sort(Map map) + public static final Map> sort(Map> map) { Preconditions.checkNotNull(map, "Cannot sort a null object."); - Map sorted = new LinkedHashMap(); + Map> sorted = new LinkedHashMap>(); for (String key : getSortedKeys(map)) { + if(map.get(key).size() > 1) + { + Collections.sort(map.get(key)); + } sorted.put(key, map.get(key)); } return sorted; } - private static List getSortedKeys(Map map) + private static List getSortedKeys(Map> map) { List keys = new ArrayList(map.keySet()); Collections.sort(keys); return keys; } + + @SuppressWarnings("unchecked") + public static final Map> toListMap(Map map) + { + Preconditions.checkNotNull(map, "Cannot sort a null object."); + + Map> result = new HashMap>(); + for (Map.Entry entry : map.entrySet()) + { + result.put(entry.getKey(), Arrays.asList(entry.getValue())); + } + return result; + } } diff --git a/src/main/java/org/scribe/utils/URLUtils.java b/src/main/java/org/scribe/utils/URLUtils.java index 7b58b0a..5830c66 100644 --- a/src/main/java/org/scribe/utils/URLUtils.java +++ b/src/main/java/org/scribe/utils/URLUtils.java @@ -16,18 +16,21 @@ public class URLUtils private static final String ERROR_MSG = String.format("Cannot find specified encoding: %s", UTF_8); - public static String formURLEncodeMap(Map map) + public static String formURLEncodeMap(Map> map) { Preconditions.checkNotNull(map, "Cannot url-encode a null object"); return (map.size() <= 0) ? EMPTY_STRING : doFormUrlEncode(map); } - private static String doFormUrlEncode(Map map) + private static String doFormUrlEncode(Map> map) { StringBuffer encodedString = new StringBuffer(); for (String key : map.keySet()) { - encodedString.append(percentEncode(key)).append(PAIR_SEPARATOR).append(percentEncode(map.get(key))).append(PARAM_SEPARATOR); + for(String value: map.get(key)) + { + encodedString.append(percentEncode(key)).append(PAIR_SEPARATOR).append(percentEncode(value)).append(PARAM_SEPARATOR); + } } return removeTrailingSeparator(encodedString); } diff --git a/src/test/java/org/scribe/utils/MapUtilsTest.java b/src/test/java/org/scribe/utils/MapUtilsTest.java index da7f5ca..0a629fb 100644 --- a/src/test/java/org/scribe/utils/MapUtilsTest.java +++ b/src/test/java/org/scribe/utils/MapUtilsTest.java @@ -9,40 +9,42 @@ import org.junit.*; public class MapUtilsTest { - private Map unsorted; + private Map> unsorted; @Before public void setup() { - unsorted = new LinkedHashMap(); - unsorted.put("d", "fourth"); - unsorted.put("a", "first"); - unsorted.put("c", "third"); - unsorted.put("b", "second"); + unsorted = new LinkedHashMap>(); + unsorted.put("d", Arrays.asList("fourth")); + unsorted.put("a", Arrays.asList("first")); + unsorted.put("c", Arrays.asList("third")); + unsorted.put("b", Arrays.asList("second", "second_two", "second_one")); } @Test public void shouldSortMap() { - Map sorted = MapUtils.sort(unsorted); - List values = new ArrayList(sorted.values()); - assertEquals("first", values.get(0)); - assertEquals("second", values.get(1)); - assertEquals("third", values.get(2)); - assertEquals("fourth", values.get(3)); + Map> sorted = MapUtils.sort(unsorted); + List> values = new ArrayList>(sorted.values()); + assertEquals("first", values.get(0).get(0)); + assertEquals("second", values.get(1).get(0)); + assertEquals("second_one", values.get(1).get(1)); + assertEquals("second_two", values.get(1).get(2)); + assertEquals("third", values.get(2).get(0)); + assertEquals("fourth", values.get(3).get(0)); } @Test public void shouldNotModifyTheOriginalMap() { - Map sorted = MapUtils.sort(unsorted); + Map> sorted = MapUtils.sort(unsorted); assertNotSame(sorted, unsorted); - List values = new ArrayList(unsorted.values()); - assertEquals("fourth", values.get(0)); - assertEquals("first", values.get(1)); - assertEquals("third", values.get(2)); - assertEquals("second", values.get(3)); + List> values = new ArrayList>(unsorted.values()); + assertEquals("fourth", values.get(0).get(0)); + assertEquals("first", values.get(1).get(0)); + assertEquals("third", values.get(2).get(0)); + assertEquals("second", values.get(3).get(0)); } @Test(expected = IllegalArgumentException.class) diff --git a/src/test/java/org/scribe/utils/URLUtilsTest.java b/src/test/java/org/scribe/utils/URLUtilsTest.java index 426c2c0..0b76736 100644 --- a/src/test/java/org/scribe/utils/URLUtilsTest.java +++ b/src/test/java/org/scribe/utils/URLUtilsTest.java @@ -18,10 +18,10 @@ public class URLUtilsTest @Test public void shouldPercentEncodeMap() { - Map params = new LinkedHashMap(); - params.put("key", "value"); - params.put("key with spaces", "value with spaces"); - params.put("&symbols!", "#!"); + Map> params = new LinkedHashMap>(); + params.put("key", Arrays.asList("value")); + params.put("key with spaces", Arrays.asList("value with spaces")); + params.put("&symbols!", Arrays.asList("#!")); String expected = "key=value&key+with+spaces=value+with+spaces&%26symbols%21=%23%21"; assertEquals(expected, URLUtils.formURLEncodeMap(params)); @@ -30,7 +30,7 @@ public class URLUtilsTest @Test public void shouldReturnEmptyStringForEmptyMap() { - Map params = new LinkedHashMap(); + Map> params = new LinkedHashMap>(); String expected = ""; assertEquals(expected, URLUtils.formURLEncodeMap(params)); } @@ -54,7 +54,7 @@ public class URLUtilsTest @Test(expected = IllegalArgumentException.class) public void shouldThrowExceptionIfMapIsNull() { - Map nullMap = null; + Map> nullMap = null; URLUtils.formURLEncodeMap(nullMap); }