1 package com.atlassian.httpclient.api;
2
3 import com.google.common.collect.ImmutableMap;
4
5 import java.io.ByteArrayInputStream;
6 import java.io.InputStream;
7 import java.io.UnsupportedEncodingException;
8 import java.net.URLEncoder;
9 import java.nio.charset.Charset;
10 import java.util.List;
11 import java.util.Map;
12
13 import static com.google.common.collect.Lists.newLinkedList;
14 import static com.google.common.collect.Maps.newLinkedHashMap;
15
16 final class DefaultFormBuilder implements FormBuilder {
17 private Map<String, List<String>> parameters = newLinkedHashMap();
18
19 public FormBuilder addParam(String name) {
20 return addParam(name, null);
21 }
22
23 public FormBuilder addParam(String name, String value) {
24 List<String> values = parameters.get(name);
25 if (values == null) {
26 values = newLinkedList();
27 parameters.put(name, values);
28 }
29 values.add(value);
30 return this;
31 }
32
33 public FormBuilder setParam(String name, List<String> values) {
34 parameters.put(name, newLinkedList(values));
35 return this;
36 }
37
38 public Entity build() {
39 StringBuilder buf = new StringBuilder();
40 boolean first = true;
41 for (Map.Entry<String, List<String>> entry : parameters.entrySet()) {
42 String name = encode(entry.getKey());
43 List<String> values = entry.getValue();
44 for (String value : values) {
45 if (first) {
46 first = false;
47 } else {
48 buf.append("&");
49 }
50 buf.append(name);
51 if (value != null) {
52 buf.append("=");
53 buf.append(encode(value));
54 }
55 }
56 }
57
58 final byte[] bytes = buf.toString().getBytes(Charset.forName("UTF-8"));
59
60 return new Entity() {
61 @Override
62 public Map<String, String> getHeaders() {
63 return ImmutableMap.of("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
64 }
65
66 @Override
67 public InputStream getInputStream() {
68 return new ByteArrayInputStream(bytes);
69 }
70
71 @Override
72 public String toString() {
73 return new String(bytes, Charset.forName("UTF-8"));
74 }
75 };
76 }
77
78 private String encode(String str) {
79 try {
80 str = URLEncoder.encode(str, "UTF-8");
81 } catch (UnsupportedEncodingException e) {
82 throw new RuntimeException(e);
83 }
84 return str;
85 }
86 }