Skip to content

Commit 8c25373

Browse files
committed
Merge pull request #186
2 parents 305372a + 9f13d3a commit 8c25373

File tree

50 files changed

+259
-6
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+259
-6
lines changed
Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
package com.amazonaws.serverless.proxy.model;
2+
3+
4+
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
5+
6+
import javax.ws.rs.core.MultivaluedMap;
7+
8+
import java.io.Serializable;
9+
import java.util.ArrayList;
10+
import java.util.Collection;
11+
import java.util.Comparator;
12+
import java.util.List;
13+
import java.util.Map;
14+
import java.util.Set;
15+
import java.util.TreeMap;
16+
17+
18+
/**
19+
* Simple implementation of a multi valued tree map to use for case-insensitive headers
20+
*
21+
* @param <Key> The type for the map key
22+
* @param <Value> The type for the map values
23+
*/
24+
public class MultiValuedTreeMap<Key, Value> implements MultivaluedMap<Key, Value>, Serializable, Cloneable {
25+
26+
private static final long serialVersionUID = 42L;
27+
28+
private final Map<Key, List<Value>> map;
29+
30+
31+
public MultiValuedTreeMap() {
32+
map = new TreeMap<>();
33+
}
34+
35+
public MultiValuedTreeMap(Comparator<Key> comparator) {
36+
map = new TreeMap<>(comparator);
37+
}
38+
39+
public void add(Key key, Value value) {
40+
List<Value> values = findKey(key);
41+
values.add(value);
42+
}
43+
44+
public Value getFirst(Key key) {
45+
List<Value> values = get(key);
46+
if (values == null || values.size() == 0) {
47+
return null;
48+
}
49+
return values.get(0);
50+
}
51+
52+
public void putSingle(Key key, Value value) {
53+
List<Value> values = findKey(key);
54+
values.clear();
55+
values.add(value);
56+
}
57+
58+
public void clear() {
59+
map.clear();
60+
}
61+
62+
public boolean containsKey(Object key) {
63+
return map.containsKey(key);
64+
}
65+
66+
public boolean containsValue(Object value) {
67+
return map.containsValue(value);
68+
}
69+
70+
public Set<Entry<Key, List<Value>>> entrySet() {
71+
return map.entrySet();
72+
}
73+
74+
public boolean equals(Object o) {
75+
return map.equals(o);
76+
}
77+
78+
public List<Value> get(Object key) {
79+
return map.get(key);
80+
}
81+
82+
public int hashCode() {
83+
return map.hashCode();
84+
}
85+
86+
public boolean isEmpty() {
87+
return map.isEmpty();
88+
}
89+
90+
public Set<Key> keySet() {
91+
return map.keySet();
92+
}
93+
94+
public List<Value> put(Key key, List<Value> value) {
95+
return map.put(key, value);
96+
}
97+
98+
public void putAll(Map<? extends Key, ? extends List<Value>> t) {
99+
map.putAll(t);
100+
}
101+
102+
public List<Value> remove(Object key) {
103+
return map.remove(key);
104+
}
105+
106+
public int size() {
107+
return map.size();
108+
}
109+
110+
public Collection<List<Value>> values() {
111+
return map.values();
112+
}
113+
114+
public void addAll(Key key, Value... newValues) {
115+
for (Value value : newValues) {
116+
add(key, value);
117+
}
118+
}
119+
120+
public void addAll(Key key, List<Value> valueList) {
121+
for (Value value : valueList) {
122+
add(key, value);
123+
}
124+
}
125+
126+
public void addFirst(Key key, Value value) {
127+
List<Value> values = get(key);
128+
if (values == null) {
129+
add(key, value);
130+
return;
131+
} else {
132+
values.add(0, value);
133+
}
134+
}
135+
136+
public boolean equalsIgnoreValueOrder(MultivaluedMap<Key, Value> vmap) {
137+
if (this == vmap) {
138+
return true;
139+
}
140+
if (!keySet().equals(vmap.keySet())) {
141+
return false;
142+
}
143+
for (Map.Entry<Key, List<Value>> e : entrySet()) {
144+
List<Value> olist = vmap.get(e.getKey());
145+
if (e.getValue().size() != olist.size()) {
146+
return false;
147+
}
148+
for (Value v : e.getValue()) {
149+
if (!olist.contains(v)) {
150+
return false;
151+
}
152+
}
153+
}
154+
return true;
155+
}
156+
157+
private List<Value> findKey(Key key) {
158+
List<Value> values = this.get(key);
159+
if (values == null) {
160+
values = new ArrayList<>();
161+
put(key, values);
162+
}
163+
return values;
164+
}
165+
166+
@SuppressFBWarnings("CN_IDIOM_NO_SUPER_CALL")
167+
public MultiValuedTreeMap<Key, Value> clone() {
168+
MultiValuedTreeMap<Key, Value> clone = new MultiValuedTreeMap<>();
169+
for (Key key : keySet()) {
170+
List<Value> value = get(key);
171+
List<Value> newValue = new ArrayList<>();
172+
newValue.addAll(value);
173+
clone.put(key, newValue);
174+
}
175+
return clone;
176+
}
177+
178+
public String toString() {
179+
StringBuilder result = new StringBuilder();
180+
String delim = ",";
181+
for (Object name : keySet()) {
182+
for (Object value : get(name)) {
183+
result.append(delim);
184+
if (name == null) {
185+
result.append("null"); //$NON-NLS-1$
186+
} else {
187+
result.append(name.toString());
188+
}
189+
if (value != null) {
190+
result.append('=');
191+
result.append(value.toString());
192+
}
193+
}
194+
}
195+
return "[" + result.toString() + "]";
196+
}
197+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.amazonaws.serverless.proxy.model;
2+
3+
4+
import org.junit.Test;
5+
6+
import static org.junit.Assert.assertEquals;
7+
import static org.junit.Assert.assertNotNull;
8+
import static org.junit.Assert.assertNull;
9+
10+
11+
public class MultiValuedTreeMapTest {
12+
13+
@Test
14+
public void add_sameNameCaseSensitive_expectBothValues() {
15+
MultiValuedTreeMap<String, String> map = new MultiValuedTreeMap<>();
16+
map.add("Test", "test");
17+
map.add("Test", "test2");
18+
19+
assertNotNull(map.get("Test"));
20+
assertEquals(2, map.get("Test").size());
21+
assertEquals("test", map.getFirst("Test"));
22+
assertEquals("test2", map.get("Test").get(1));
23+
assertNull(map.get("test"));
24+
25+
map.add("test", "test");
26+
assertNotNull(map.get("test"));
27+
assertEquals(1, map.get("test").size());
28+
}
29+
30+
@Test
31+
public void add_sameNameCaseInsensitive_expectOneValue() {
32+
MultiValuedTreeMap<String, String> map = new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER);
33+
map.add("Test", "test");
34+
assertNotNull(map.get("Test"));
35+
assertNotNull(map.get("test"));
36+
assertEquals(1, map.get("Test").size());
37+
38+
map.add("test", "test2");
39+
assertNotNull(map.get("Test"));
40+
assertEquals(2, map.get("Test").size());
41+
}
42+
43+
@Test
44+
public void addFirst_sameNameKey_ExpectFirstReplaced() {
45+
MultiValuedTreeMap<String, String> map = new MultiValuedTreeMap<>();
46+
map.add("Test", "test1");
47+
map.add("Test", "test2");
48+
49+
assertNotNull(map.get("Test"));
50+
assertEquals(2, map.get("Test").size());
51+
assertEquals("test1", map.getFirst("Test"));
52+
53+
map.addFirst("Test", "test3");
54+
assertEquals(3, map.get("Test").size());
55+
assertEquals("test3", map.getFirst("Test"));
56+
}
57+
}
File renamed without changes.

0 commit comments

Comments
 (0)