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 package org.apache.http.client.cache;
28
29 import java.io.Serializable;
30 import java.util.Collections;
31 import java.util.Date;
32 import java.util.HashMap;
33 import java.util.Map;
34
35 import org.apache.http.Header;
36 import org.apache.http.HeaderIterator;
37 import org.apache.http.ProtocolVersion;
38 import org.apache.http.StatusLine;
39 import org.apache.http.annotation.Contract;
40 import org.apache.http.annotation.ThreadingBehavior;
41 import org.apache.http.client.utils.DateUtils;
42 import org.apache.http.message.HeaderGroup;
43 import org.apache.http.protocol.HTTP;
44 import org.apache.http.util.Args;
45
46
47
48
49
50
51
52
53
54
55 @Contract(threading = ThreadingBehavior.IMMUTABLE)
56 public class HttpCacheEntry implements Serializable {
57
58 private static final long serialVersionUID = -6300496422359477413L;
59 private static final String REQUEST_METHOD_HEADER_NAME = "Hc-Request-Method";
60
61 private final Date requestDate;
62 private final Date responseDate;
63 private final StatusLine statusLine;
64 private final HeaderGroup responseHeaders;
65 private final Resource resource;
66 private final Map<String,String> variantMap;
67 private final Date date;
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88 public HttpCacheEntry(
89 final Date requestDate,
90 final Date responseDate,
91 final StatusLine statusLine,
92 final Header[] responseHeaders,
93 final Resource resource,
94 final Map<String,String> variantMap,
95 final String requestMethod) {
96 super();
97 Args.notNull(requestDate, "Request date");
98 Args.notNull(responseDate, "Response date");
99 Args.notNull(statusLine, "Status line");
100 Args.notNull(responseHeaders, "Response headers");
101 this.requestDate = requestDate;
102 this.responseDate = responseDate;
103 this.statusLine = statusLine;
104 this.responseHeaders = new HeaderGroup();
105 this.responseHeaders.setHeaders(responseHeaders);
106 this.resource = resource;
107 this.variantMap = variantMap != null
108 ? new HashMap<String,String>(variantMap)
109 : null;
110 this.date = parseDate();
111 }
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131 public HttpCacheEntry(
132 final Date requestDate,
133 final Date responseDate,
134 final StatusLine statusLine,
135 final Header[] responseHeaders,
136 final Resource resource,
137 final Map<String,String> variantMap) {
138 this(requestDate, responseDate, statusLine, responseHeaders, resource,
139 variantMap, null);
140 }
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157 public HttpCacheEntry(final Date requestDate, final Date responseDate, final StatusLine statusLine,
158 final Header[] responseHeaders, final Resource resource) {
159 this(requestDate, responseDate, statusLine, responseHeaders, resource,
160 new HashMap<String,String>());
161 }
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179 public HttpCacheEntry(final Date requestDate, final Date responseDate, final StatusLine statusLine,
180 final Header[] responseHeaders, final Resource resource, final String requestMethod) {
181 this(requestDate, responseDate, statusLine, responseHeaders, resource,
182 new HashMap<String,String>(),requestMethod);
183 }
184
185
186
187
188
189 private Date parseDate() {
190 final Header dateHdr = getFirstHeader(HTTP.DATE_HEADER);
191 if (dateHdr == null) {
192 return null;
193 }
194 return DateUtils.parseDate(dateHdr.getValue());
195 }
196
197
198
199
200
201 public StatusLine getStatusLine() {
202 return this.statusLine;
203 }
204
205
206
207
208
209 public ProtocolVersion getProtocolVersion() {
210 return this.statusLine.getProtocolVersion();
211 }
212
213
214
215
216
217 public String getReasonPhrase() {
218 return this.statusLine.getReasonPhrase();
219 }
220
221
222
223
224
225 public int getStatusCode() {
226 return this.statusLine.getStatusCode();
227 }
228
229
230
231
232
233
234 public Date getRequestDate() {
235 return requestDate;
236 }
237
238
239
240
241
242 public Date getResponseDate() {
243 return responseDate;
244 }
245
246
247
248
249 public Header[] getAllHeaders() {
250 final HeaderGroup filteredHeaders = new HeaderGroup();
251 for (final HeaderIterator iterator = responseHeaders.iterator(); iterator
252 .hasNext();) {
253 final Header header = (Header) iterator.next();
254 if (!REQUEST_METHOD_HEADER_NAME.equals(header.getName())) {
255 filteredHeaders.addHeader(header);
256 }
257 }
258 return filteredHeaders.getAllHeaders();
259 }
260
261
262
263
264
265 public Header getFirstHeader(final String name) {
266 if (REQUEST_METHOD_HEADER_NAME.equalsIgnoreCase(name)) {
267 return null;
268 }
269 return responseHeaders.getFirstHeader(name);
270 }
271
272
273
274
275
276 public Header[] getHeaders(final String name) {
277 if (REQUEST_METHOD_HEADER_NAME.equalsIgnoreCase(name)) {
278 return new Header[0];
279 }
280 return responseHeaders.getHeaders(name);
281 }
282
283
284
285
286
287
288
289 public Date getDate() {
290 return date;
291 }
292
293
294
295
296 public Resource getResource() {
297 return this.resource;
298 }
299
300
301
302
303
304
305
306 public boolean hasVariants() {
307 return getFirstHeader(HeaderConstants.VARY) != null;
308 }
309
310
311
312
313
314
315
316
317
318
319 public Map<String, String> getVariantMap() {
320 return Collections.unmodifiableMap(variantMap);
321 }
322
323
324
325
326
327
328
329 public String getRequestMethod() {
330 final Header requestMethodHeader = responseHeaders
331 .getFirstHeader(REQUEST_METHOD_HEADER_NAME);
332 if (requestMethodHeader != null) {
333 return requestMethodHeader.getValue();
334 }
335 return HeaderConstants.GET_METHOD;
336 }
337
338
339
340
341
342 @Override
343 public String toString() {
344 return "[request date=" + this.requestDate + "; response date=" + this.responseDate
345 + "; statusLine=" + this.statusLine + "]";
346 }
347
348 }