View Javadoc

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  }