1
22
23 package com.liferay.util.servlet.filters;
24
25 import com.liferay.portal.kernel.io.unsync.UnsyncByteArrayOutputStream;
26 import com.liferay.portal.kernel.servlet.HttpHeaders;
27 import com.liferay.util.servlet.Header;
28
29 import java.io.IOException;
30 import java.io.OutputStreamWriter;
31 import java.io.PrintWriter;
32
33 import java.util.ArrayList;
34 import java.util.HashMap;
35 import java.util.List;
36 import java.util.Map;
37
38 import javax.servlet.ServletOutputStream;
39 import javax.servlet.http.HttpServletResponse;
40 import javax.servlet.http.HttpServletResponseWrapper;
41
42
47 public class CacheResponse extends HttpServletResponseWrapper {
48
49 public CacheResponse(HttpServletResponse response, String encoding) {
50 super(response);
51
52 _encoding = encoding;
53 }
54
55 public void addDateHeader(String name, long value) {
56 List<Header> values = _headers.get(name);
57
58 if (values == null) {
59 values = new ArrayList<Header>();
60
61 _headers.put(name, values);
62 }
63
64 Header header = new Header();
65
66 header.setType(Header.DATE_TYPE);
67 header.setDateValue(value);
68
69 values.add(header);
70 }
71
72 public void addHeader(String name, String value) {
73 List<Header> values = _headers.get(name);
74
75 if (values == null) {
76 values = new ArrayList<Header>();
77
78 _headers.put(name, values);
79 }
80
81 Header header = new Header();
82
83 header.setType(Header.STRING_TYPE);
84 header.setStringValue(value);
85
86 values.add(header);
87
88 if (name.equals(HttpHeaders.CONTENT_TYPE)) {
89 setContentType(value);
90 }
91 }
92
93 public void addIntHeader(String name, int value) {
94 List<Header> values = _headers.get(name);
95
96 if (values == null) {
97 values = new ArrayList<Header>();
98
99 _headers.put(name, values);
100 }
101
102 Header header = new Header();
103
104 header.setType(Header.INTEGER_TYPE);
105 header.setIntValue(value);
106
107 values.add(header);
108 }
109
110 public void finishResponse() {
111 try {
112 if (_writer != null) {
113 _writer.close();
114 }
115 else if (_stream != null) {
116 _stream.close();
117 }
118 }
119 catch (IOException e) {
120 }
121 }
122
123 public void flushBuffer() throws IOException {
124 if (_stream != null) {
125 _stream.flush();
126 }
127 }
128
129 public int getBufferSize() {
130 return _bufferSize;
131 }
132
133 public String getContentType() {
134 return _contentType;
135 }
136
137 public byte[] getData() {
138 finishResponse();
139
140 return _ubaos.toByteArray();
141 }
142
143 public String getHeader(String name) {
144 List<Header> values = _headers.get(name);
145
146 if ((values == null) || values.isEmpty()) {
147 return null;
148 }
149
150 Header header = values.get(0);
151
152 return header.toString();
153 }
154
155 public Map<String, List<Header>> getHeaders() {
156 return _headers;
157 }
158
159 public ServletOutputStream getOutputStream() {
160 if (_writer != null) {
161 throw new IllegalStateException();
162 }
163
164 if (_stream == null) {
165 _stream = createOutputStream();
166 }
167
168 return _stream;
169 }
170
171 public int getStatus() {
172 return _status;
173 }
174
175 public PrintWriter getWriter() throws IOException {
176 if (_writer != null) {
177 return _writer;
178 }
179
180 if (_stream != null) {
181 throw new IllegalStateException();
182 }
183
184 _stream = createOutputStream();
185
186 _writer = new PrintWriter(new OutputStreamWriter(
187 _stream, _encoding));
189
190 return _writer;
191 }
192
193 public boolean isCommitted() {
194 if (_writer != null) {
195 return true;
196 }
197
198 if ((_stream != null) && _stream.isClosed()) {
199 return true;
200 }
201
202 return super.isCommitted();
203 }
204
205 public void sendError(int status) throws IOException {
206 _status = status;
207
208 super.sendError(status);
209 }
210
211 public void sendError(int status, String msg) throws IOException {
212 _status = status;
213
214 super.sendError(status, msg);
215 }
216
217 public void setBufferSize(int bufferSize) {
218 _bufferSize = bufferSize;
219 }
220
221 public void setContentType(String contentType) {
222 _contentType = contentType;
223
224 super.setContentType(contentType);
225 }
226
227 public void setDateHeader(String name, long value) {
228 List<Header> values = new ArrayList<Header>();
229
230 _headers.put(name, values);
231
232 Header header = new Header();
233
234 header.setType(Header.DATE_TYPE);
235 header.setDateValue(value);
236
237 values.add(header);
238 }
239
240 public void setHeader(String name, String value) {
241 List<Header> values = new ArrayList<Header>();
242
243 _headers.put(name, values);
244
245 Header header = new Header();
246
247 header.setType(Header.STRING_TYPE);
248 header.setStringValue(value);
249
250 values.add(header);
251
252 if (name.equals(HttpHeaders.CONTENT_TYPE)) {
253 setContentType(value);
254 }
255 }
256
257 public void setIntHeader(String name, int value) {
258 List<Header> values = new ArrayList<Header>();
259
260 _headers.put(name, values);
261
262 Header header = new Header();
263
264 header.setType(Header.INTEGER_TYPE);
265 header.setIntValue(value);
266
267 values.add(header);
268 }
269
270 public void setStatus(int status) {
271 _status = status;
272
273 super.setStatus(status);
274 }
275
276 protected CacheResponseStream createOutputStream() {
277 return new CacheResponseStream(_ubaos);
278 }
279
280 private int _bufferSize;
281 private String _contentType;
282 private String _encoding;
283 private Map<String, List<Header>> _headers =
284 new HashMap<String, List<Header>>();
285 private int _status = HttpServletResponse.SC_OK;
286 private CacheResponseStream _stream;
287 private UnsyncByteArrayOutputStream _ubaos =
288 new UnsyncByteArrayOutputStream();
289 private PrintWriter _writer;
290
291 }