1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.util;
20
21 import java.util.Arrays;
22 import java.util.Collections;
23 import java.util.Iterator;
24 import java.util.LinkedHashMap;
25 import java.util.LinkedHashSet;
26 import java.util.Locale;
27 import java.util.Map;
28 import java.util.Set;
29
30
31
32
33
34
35
36 public class Fields implements Iterable<Fields.Field>
37 {
38 private final Map<String, Field> fields;
39
40
41
42
43
44 public Fields()
45 {
46 fields = new LinkedHashMap<>();
47 }
48
49
50
51
52
53
54
55
56 public Fields(Fields original, boolean immutable)
57 {
58 Map<String, Field> copy = new LinkedHashMap<>();
59 copy.putAll(original.fields);
60 fields = immutable ? Collections.unmodifiableMap(copy) : copy;
61 }
62
63 @Override
64 public boolean equals(Object obj)
65 {
66 if (this == obj)
67 return true;
68 if (obj == null || getClass() != obj.getClass())
69 return false;
70 Fields that = (Fields)obj;
71 return fields.equals(that.fields);
72 }
73
74 @Override
75 public int hashCode()
76 {
77 return fields.hashCode();
78 }
79
80
81
82
83 public Set<String> names()
84 {
85 Set<String> result = new LinkedHashSet<>();
86 for (Field field : fields.values())
87 result.add(field.name());
88 return result;
89 }
90
91
92
93
94
95 public Field get(String name)
96 {
97 return fields.get(name.trim().toLowerCase(Locale.ENGLISH));
98 }
99
100
101
102
103
104
105
106 public void put(String name, String value)
107 {
108 name = name.trim();
109
110 Field field = new Field(name, value);
111 fields.put(name.toLowerCase(Locale.ENGLISH), field);
112 }
113
114
115
116
117
118
119 public void put(Field field)
120 {
121 if (field != null)
122 fields.put(field.name().toLowerCase(Locale.ENGLISH), field);
123 }
124
125
126
127
128
129
130
131
132 public void add(String name, String value)
133 {
134 name = name.trim();
135 Field field = fields.get(name.toLowerCase(Locale.ENGLISH));
136 if (field == null)
137 {
138 field = new Field(name, value);
139 fields.put(name.toLowerCase(Locale.ENGLISH), field);
140 }
141 else
142 {
143 field = new Field(field.name(), field.values(), value);
144 fields.put(name.toLowerCase(Locale.ENGLISH), field);
145 }
146 }
147
148
149
150
151
152
153
154 public Field remove(String name)
155 {
156 name = name.trim();
157 return fields.remove(name.toLowerCase(Locale.ENGLISH));
158 }
159
160
161
162
163
164 public void clear()
165 {
166 fields.clear();
167 }
168
169
170
171
172 public boolean isEmpty()
173 {
174 return fields.isEmpty();
175 }
176
177
178
179
180 public int size()
181 {
182 return fields.size();
183 }
184
185
186
187
188 @Override
189 public Iterator<Field> iterator()
190 {
191 return fields.values().iterator();
192 }
193
194 @Override
195 public String toString()
196 {
197 return fields.toString();
198 }
199
200
201
202
203
204 public static class Field
205 {
206 private final String name;
207 private final String[] values;
208
209 private Field(String name, String value)
210 {
211 this(name, new String[]{value});
212 }
213
214 private Field(String name, String[] values, String... moreValues)
215 {
216 this.name = name;
217 this.values = new String[values.length + moreValues.length];
218 System.arraycopy(values, 0, this.values, 0, values.length);
219 System.arraycopy(moreValues, 0, this.values, values.length, moreValues.length);
220 }
221
222 @Override
223 public boolean equals(Object obj)
224 {
225 if (this == obj)
226 return true;
227 if (obj == null || getClass() != obj.getClass())
228 return false;
229 Field that = (Field)obj;
230
231
232 return name.equalsIgnoreCase(that.name) && Arrays.equals(values, that.values);
233 }
234
235 @Override
236 public int hashCode()
237 {
238 int result = name.toLowerCase(Locale.ENGLISH).hashCode();
239 result = 31 * result + Arrays.hashCode(values);
240 return result;
241 }
242
243
244
245
246 public String name()
247 {
248 return name;
249 }
250
251
252
253
254 public String value()
255 {
256 return values[0];
257 }
258
259
260
261
262
263
264
265
266
267 public Integer valueAsInt()
268 {
269 final String value = value();
270 return value == null ? null : Integer.valueOf(value);
271 }
272
273
274
275
276 public String[] values()
277 {
278 return values;
279 }
280
281
282
283
284 public boolean hasMultipleValues()
285 {
286 return values.length > 1;
287 }
288
289 @Override
290 public String toString()
291 {
292 return Arrays.toString(values);
293 }
294 }
295 }