View Javadoc
1   package de.juplo.httpresources;
2   
3   import org.springframework.http.HttpHeaders;
4   import org.springframework.util.StringUtils;
5   
6   import java.util.Arrays;
7   import java.util.Objects;
8   
9   
10  /**
11   * Immutable container for cacheable state of an instance of {@link HttpResource}.
12   */
13  class HttpData
14  {
15    final static HttpData NOT_FETCHED =
16        new HttpData(
17            null,
18            new HttpHeaders(),
19            false,
20            Long.MIN_VALUE,
21            Long.MIN_VALUE,
22            null);
23  
24    final static HttpData SERVER_ERROR =
25        new HttpData(
26            null,
27            new HttpHeaders(),
28            false,
29            -1,
30            -1,
31            null);
32  
33    final static HttpData NOT_FOUND = SERVER_ERROR;
34  
35    final byte[] content;
36    final HttpHeaders headers;
37    final boolean revalidate;
38    final long lastModified;
39    final long expires;
40    final String eTag;
41  
42    private final String normalizedETag;
43  
44  
45    HttpData(
46        byte[] content,
47        HttpHeaders headers,
48        boolean revalidate,
49        long lastModified,
50        long expires,
51        String eTag)
52    {
53      this.content = content;
54      this.headers = headers;
55      this.revalidate = revalidate;
56      this.lastModified = lastModified;
57      this.expires = expires;
58      this.eTag = eTag;
59  
60      String tmp = StringUtils.hasText(eTag) ? eTag.trim() : "";
61      this.normalizedETag =
62          tmp.length() >=2 && tmp.charAt(0) == 'W' && tmp.charAt(1) == '/'
63              ? tmp.substring(2).trim()
64              : tmp;
65    }
66  
67  
68    @Override
69    public boolean equals(Object o)
70    {
71      if (this == o) return true;
72      if (!(o instanceof HttpData)) return false;
73      HttpData../../../de/juplo/httpresources/HttpData.html#HttpData">HttpData data = (HttpData) o;
74  
75      if (lastModified == 0 && normalizedETag.length() == 0)
76        return Arrays.equals(content, data.content);
77  
78      return
79          lastModified == data.lastModified &&
80          normalizedETag.equals(data.normalizedETag);
81    }
82  
83    @Override
84    public int hashCode()
85    {
86      if (lastModified == 0 && !StringUtils.hasText(eTag))
87        return Arrays.hashCode(content);
88  
89      return Objects.hash(lastModified, eTag);
90    }
91  
92    @Override
93    public String toString()
94    {
95      final StringBuffer sb = new StringBuffer();
96      sb.append("headers=").append(headers);
97      sb.append(", revalidate=").append(revalidate);
98      sb.append(", lastModified=").append(lastModified);
99      sb.append(", expires=").append(expires);
100     sb.append(", eTag='").append(eTag).append('\'');
101     sb.append(", content=");
102     if (content == null) sb.append("null");
103     else sb.append(new String(content));
104     return sb.toString();
105   }
106 }