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 @Override
148 public String getHeader(String name) {
149 List<Header> values = _headers.get(name);
150
151 if ((values == null) || values.isEmpty()) {
152 return null;
153 }
154
155 Header header = values.get(0);
156
157 return header.toString();
158 }
159
160 public Map<String, List<Header>> getHeaders() {
161 return _headers;
162 }
163
164 @Override
165 public int getStatus() {
166 return _status;
167 }
168
169 @Override
170 public boolean isCommitted() {
171 return _committed;
172 }
173
174 @Override
175 public void sendError(int status) throws IOException {
176 _status = status;
177
178 super.sendError(status);
179 }
180
181 @Override
182 public void sendError(int status, String msg) throws IOException {
183 _status = status;
184
185 super.sendError(status, msg);
186 }
187
188 @Override
189 public void sendRedirect(String location) throws IOException {
190 if (isCommitted()) {
191 throw new IllegalStateException("Response is already committed");
192 }
193
194 super.sendRedirect(location);
195
196 setStatus(SC_MOVED_PERMANENTLY);
197 }
198
199 @Override
200 public void setContentLength(int contentLength) {
201 }
202
203 @Override
204 public void setContentType(String contentType) {
205 if (contentType != null) {
206 _contentType = contentType;
207
208 super.setContentType(contentType);
209 }
210 }
211
212 @Override
213 public void setDateHeader(String name, long value) {
214 List<Header> values = new ArrayList<Header>();
215
216 _headers.put(name, values);
217
218 Header header = new Header();
219
220 header.setDateValue(value);
221 header.setType(Header.DATE_TYPE);
222
223 values.add(header);
224
225 super.setDateHeader(name, value);
226 }
227
228 @Override
229 public void setHeader(String name, String value) {
230 List<Header> values = new ArrayList<Header>();
231
232 _headers.put(name, values);
233
234 Header header = new Header();
235
236 header.setStringValue(value);
237 header.setType(Header.STRING_TYPE);
238
239 values.add(header);
240
241 if (name.equals(HttpHeaders.CONTENT_TYPE)) {
242 setContentType(value);
243 }
244
245 super.setHeader(name, value);
246 }
247
248 @Override
249 public void setIntHeader(String name, int value) {
250 List<Header> values = new ArrayList<Header>();
251
252 _headers.put(name, values);
253
254 Header header = new Header();
255
256 header.setIntValue(value);
257 header.setType(Header.INTEGER_TYPE);
258
259 values.add(header);
260
261 super.setIntHeader(name, value);
262 }
263
264 @Override
265 public void setStatus(int status) {
266 _status = status;
267
268 super.setStatus(status);
269 }
270
271 private boolean _committed;
272 private String _contentType;
273 private Map<String, List<Header>> _headers =
274 new HashMap<String, List<Header>>();
275 private int _status = SC_OK;
276
277 }