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