001
014
015 package com.liferay.portal.kernel.servlet;
016
017 import java.io.IOException;
018
019 import java.util.ArrayList;
020 import java.util.HashMap;
021 import java.util.List;
022 import java.util.Map;
023
024 import javax.servlet.http.Cookie;
025 import javax.servlet.http.HttpServletResponse;
026 import javax.servlet.http.HttpServletResponseWrapper;
027
028
031 public class HeaderCacheServletResponse extends HttpServletResponseWrapper {
032
033 public HeaderCacheServletResponse(HttpServletResponse response) {
034 super(response);
035 }
036
037 @Override
038 public void addCookie(Cookie cookie) {
039 List<Header> values = _headers.get("cookies");
040
041 if (values == null) {
042 values = new ArrayList<Header>();
043
044 _headers.put("cookies", values);
045 }
046
047 Header header = new Header();
048
049 header.setCookieValue(cookie);
050 header.setType(Header.COOKIE_TYPE);
051
052 if (values.contains(header)) {
053 return;
054 }
055
056 values.add(header);
057
058 super.addCookie(cookie);
059 }
060
061 @Override
062 public void addDateHeader(String name, long value) {
063 List<Header> values = _headers.get(name);
064
065 if (values == null) {
066 values = new ArrayList<Header>();
067
068 _headers.put(name, values);
069 }
070
071 Header header = new Header();
072
073 header.setDateValue(value);
074 header.setType(Header.DATE_TYPE);
075
076 if (values.contains(header)) {
077 return;
078 }
079
080 values.add(header);
081
082 super.addDateHeader(name, value);
083 }
084
085 @Override
086 public void addHeader(String name, String value) {
087 List<Header> values = _headers.get(name);
088
089 if (values == null) {
090 values = new ArrayList<Header>();
091
092 _headers.put(name, values);
093 }
094
095 Header header = new Header();
096
097 header.setStringValue(value);
098 header.setType(Header.STRING_TYPE);
099
100 if (values.contains(header)) {
101 return;
102 }
103
104 values.add(header);
105
106 if (name.equals(HttpHeaders.CONTENT_TYPE)) {
107 setContentType(value);
108 }
109
110 super.addHeader(name, value);
111 }
112
113 @Override
114 public void addIntHeader(String name, int value) {
115 List<Header> values = _headers.get(name);
116
117 if (values == null) {
118 values = new ArrayList<Header>();
119
120 _headers.put(name, values);
121 }
122
123 Header header = new Header();
124
125 header.setIntValue(value);
126 header.setType(Header.INTEGER_TYPE);
127
128 if (values.contains(header)) {
129 return;
130 }
131
132 values.add(header);
133
134 super.addIntHeader(name, value);
135 }
136
137 @Override
138 public void flushBuffer() {
139 _committed = true;
140 }
141
142 @Override
143 public String getContentType() {
144 return _contentType;
145 }
146
147 public String getHeader(String name) {
148 List<Header> values = _headers.get(name);
149
150 if ((values == null) || values.isEmpty()) {
151 return null;
152 }
153
154 Header header = values.get(0);
155
156 return header.toString();
157 }
158
159 public Map<String, List<Header>> getHeaders() {
160 return _headers;
161 }
162
163 public int getStatus() {
164 return _status;
165 }
166
167 @Override
168 public boolean isCommitted() {
169 return _committed;
170 }
171
172 @Override
173 public void sendError(int status) throws IOException {
174 _status = status;
175
176 super.sendError(status);
177 }
178
179 @Override
180 public void sendError(int status, String msg) throws IOException {
181 _status = status;
182
183 super.sendError(status, msg);
184 }
185
186 @Override
187 public void sendRedirect(String location) throws IOException {
188 super.sendRedirect(location);
189
190 setStatus(SC_MOVED_PERMANENTLY);
191 }
192
193 @Override
194 public void setContentLength(int contentLength) {
195 }
196
197 @Override
198 public void setContentType(String contentType) {
199 if (contentType != null) {
200 _contentType = contentType;
201
202 super.setContentType(contentType);
203 }
204 }
205
206 @Override
207 public void setDateHeader(String name, long value) {
208 List<Header> values = new ArrayList<Header>();
209
210 _headers.put(name, values);
211
212 Header header = new Header();
213
214 header.setDateValue(value);
215 header.setType(Header.DATE_TYPE);
216
217 values.add(header);
218
219 super.setDateHeader(name, value);
220 }
221
222 @Override
223 public void setHeader(String name, String value) {
224 List<Header> values = new ArrayList<Header>();
225
226 _headers.put(name, values);
227
228 Header header = new Header();
229
230 header.setStringValue(value);
231 header.setType(Header.STRING_TYPE);
232
233 values.add(header);
234
235 if (name.equals(HttpHeaders.CONTENT_TYPE)) {
236 setContentType(value);
237 }
238
239 super.setHeader(name, value);
240 }
241
242 @Override
243 public void setIntHeader(String name, int value) {
244 List<Header> values = new ArrayList<Header>();
245
246 _headers.put(name, values);
247
248 Header header = new Header();
249
250 header.setIntValue(value);
251 header.setType(Header.INTEGER_TYPE);
252
253 values.add(header);
254
255 super.setIntHeader(name, value);
256 }
257
258 @Override
259 public void setStatus(int status) {
260 _status = status;
261
262 super.setStatus(status);
263 }
264
265 private boolean _committed;
266 private String _contentType;
267 private Map<String, List<Header>> _headers =
268 new HashMap<String, List<Header>>();
269 private int _status = SC_OK;
270
271 }