|
26 | 26 | import java.util.Arrays; |
27 | 27 | import java.util.Collection; |
28 | 28 | import java.util.HashMap; |
| 29 | +import java.util.Iterator; |
29 | 30 | import java.util.LinkedList; |
30 | 31 | import java.util.List; |
31 | 32 | import java.util.Map; |
@@ -77,13 +78,13 @@ void addParameter(final Object value, final Map<Class<?>, Annotation> anns) |
77 | 78 | newTarget = newTarget.resolveTemplate(((PathParam) ann).value(), value); |
78 | 79 | } else if ((ann = anns.get((QueryParam.class))) != null) { |
79 | 80 | if (value instanceof Collection) { |
80 | | - newTarget = newTarget.queryParam(((QueryParam) ann).value(), convert((Collection<?>) value)); |
| 81 | + newTarget = newTarget.queryParam(((QueryParam) ann).value(), convert((Collection<?>) value, true)); |
81 | 82 | } else { |
82 | | - newTarget = newTarget.queryParam(((QueryParam) ann).value(), value); |
| 83 | + newTarget = newTarget.queryParam(((QueryParam) ann).value(), encodeTemplate(value)); |
83 | 84 | } |
84 | 85 | } else if ((ann = anns.get((HeaderParam.class))) != null) { |
85 | 86 | if (value instanceof Collection) { |
86 | | - headers.addAll(((HeaderParam) ann).value(), convert((Collection<?>) value)); |
| 87 | + headers.addAll(((HeaderParam) ann).value(), convert((Collection<?>) value, false)); |
87 | 88 | } else { |
88 | 89 | headers.addAll(((HeaderParam) ann).value(), value); |
89 | 90 | } |
@@ -117,9 +118,9 @@ void addParameter(final Object value, final Map<Class<?>, Annotation> anns) |
117 | 118 | } |
118 | 119 | } else if ((ann = anns.get((MatrixParam.class))) != null) { |
119 | 120 | if (value instanceof Collection) { |
120 | | - newTarget = newTarget.matrixParam(((MatrixParam) ann).value(), convert((Collection<?>) value)); |
| 121 | + newTarget = newTarget.matrixParam(((MatrixParam) ann).value(), convert((Collection<?>) value, true)); |
121 | 122 | } else { |
122 | | - newTarget = newTarget.matrixParam(((MatrixParam) ann).value(), value); |
| 123 | + newTarget = newTarget.matrixParam(((MatrixParam) ann).value(), encodeTemplate(value)); |
123 | 124 | } |
124 | 125 | } else if ((ann = anns.get((FormParam.class))) != null) { |
125 | 126 | if (value instanceof Collection) { |
@@ -187,8 +188,23 @@ private List<Field> getAllFields(List<Field> fields, Class<?> type) { |
187 | 188 | return fields; |
188 | 189 | } |
189 | 190 |
|
190 | | - private Object[] convert(final Collection<?> value) { |
191 | | - return value.toArray(); |
| 191 | + private Object[] convert(Collection<?> value, boolean encode) { |
| 192 | + Object[] array = new Object[value.size()]; |
| 193 | + int index = 0; |
| 194 | + for (Iterator<?> it = value.iterator(); it.hasNext();) { |
| 195 | + Object o = it.next(); |
| 196 | + array[index++] = o == null ? o : (encode ? encodeTemplate(o) : o.toString()); |
| 197 | + } |
| 198 | + return array; |
| 199 | + } |
| 200 | + |
| 201 | + /** |
| 202 | + * The Query and Matrix arguments are never templates |
| 203 | + * @param notNull an Object that is not null |
| 204 | + * @return encoded curly brackets within the string representation of the {@code notNull} |
| 205 | + */ |
| 206 | + private String encodeTemplate(Object notNull) { |
| 207 | + return notNull.toString().replace("{", "%7B").replace("}", "%7D"); |
192 | 208 | } |
193 | 209 |
|
194 | 210 | public static boolean hasAnyParamAnnotation(final Map<Class<?>, Annotation> anns) { |
|
0 commit comments