1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
package com.koushikdutta.async.http;
import android.net.Uri;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
/**
* Created by koush on 5/27/13.
*/
public class Multimap extends LinkedHashMap<String, List<String>> implements Iterable<NameValuePair> {
public Multimap() {
}
protected List<String> newList() {
return new ArrayList<String>();
}
public String getString(String name) {
List<String> ret = get(name);
if (ret == null || ret.size() == 0)
return null;
return ret.get(0);
}
public void add(String name, String value) {
List<String> ret = get(name);
if (ret == null) {
ret = newList();
put(name, ret);
}
ret.add(value);
}
public void put(String name, String value) {
List<String> ret = newList();
ret.add(value);
put(name, ret);
}
public Multimap(List<NameValuePair> pairs) {
for (NameValuePair pair: pairs)
add(pair.getName(), pair.getValue());
}
public Multimap(Multimap m) {
putAll(m);
}
public interface StringDecoder {
public String decode(String s);
}
public static Multimap parse(String value, String delimiter, boolean unquote, StringDecoder decoder) {
Multimap map = new Multimap();
if (value == null)
return map;
String[] parts = value.split(delimiter);
for (String part: parts) {
String[] pair = part.split("=", 2);
String key = pair[0].trim();
String v = null;
if (pair.length > 1)
v = pair[1];
if (unquote && v != null && v.endsWith("\"") && v.startsWith("\""))
v = v.substring(1, v.length() - 1);
if (decoder != null) {
key = decoder.decode(key);
v = decoder.decode(v);
}
map.add(key, v);
}
return map;
}
public static Multimap parseSemicolonDelimited(String header) {
return parse(header, ";", true, null);
}
public static Multimap parseCommaDelimited(String header) {
return parse(header, ",", true, null);
}
private static final StringDecoder QUERY_DECODER = new StringDecoder() {
@Override
public String decode(String s) {
return Uri.decode(s);
}
};
public static Multimap parseQuery(String query) {
return parse(query, "&", false, QUERY_DECODER);
}
private static final StringDecoder URL_DECODER = new StringDecoder() {
@Override
public String decode(String s) {
return URLDecoder.decode(s);
}
};
public static Multimap parseUrlEncoded(String query) {
return parse(query, "&", false, URL_DECODER);
}
@Override
public Iterator<NameValuePair> iterator() {
ArrayList<NameValuePair> ret = new ArrayList<NameValuePair>();
for (String name: keySet()) {
List<String> values = get(name);
for (String value: values) {
ret.add(new BasicNameValuePair(name, value));
}
}
return ret.iterator();
}
}
|