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
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 _contentType = 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 int getBufferSize() {
111 return _bufferSize;
112 }
113
114 public String getHeader(String name) {
115 List<Header> values = _headers.get(name);
116
117 if ((values == null) || values.isEmpty()) {
118 return null;
119 }
120
121 Header header = values.get(0);
122
123 return header.toString();
124 }
125
126 public void finishResponse() {
127 try {
128 if (_writer != null) {
129 _writer.close();
130 }
131 else if (_stream != null) {
132 _stream.close();
133 }
134 }
135 catch (IOException e) {
136 }
137 }
138
139 public void flushBuffer() throws IOException {
140 if (_stream != null) {
141 _stream.flush();
142 }
143 }
144
145 public String getContentType() {
146 return _contentType;
147 }
148
149 public byte[] getData() {
150 finishResponse();
151
152 return _bam.toByteArray();
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 PrintWriter getWriter() throws IOException {
172 if (_writer != null) {
173 return _writer;
174 }
175
176 if (_stream != null) {
177 throw new IllegalStateException();
178 }
179
180 _stream = createOutputStream();
181
182 _writer = new PrintWriter(new OutputStreamWriter(
183 _stream, _encoding));
185
186 return _writer;
187 }
188
189 public boolean isCommitted() {
190 if (_writer != null) {
191 return true;
192 }
193
194 if ((_stream != null) && _stream.isClosed()) {
195 return true;
196 }
197
198 return super.isCommitted();
199 }
200
201 public void setBufferSize(int bufferSize) {
202 _bufferSize = bufferSize;
203 }
204
205 public void setContentType(String contentType) {
206 _contentType = contentType;
207
208 super.setContentType(contentType);
209 }
210
211 public void setDateHeader(String name, long value) {
212 List<Header> values = new ArrayList<Header>();
213
214 _headers.put(name, values);
215
216 Header header = new Header();
217
218 header.setType(Header.DATE_TYPE);
219 header.setDateValue(value);
220
221 values.add(header);
222 }
223
224 public void setHeader(String name, String value) {
225 List<Header> values = new ArrayList<Header>();
226
227 _headers.put(name, values);
228
229 Header header = new Header();
230
231 header.setType(Header.STRING_TYPE);
232 header.setStringValue(value);
233
234 values.add(header);
235 }
236
237 public void setIntHeader(String name, int value) {
238 List<Header> values = new ArrayList<Header>();
239
240 _headers.put(name, values);
241
242 Header header = new Header();
243
244 header.setType(Header.INTEGER_TYPE);
245 header.setIntValue(value);
246
247 values.add(header);
248 }
249
250 protected CacheResponseStream createOutputStream() {
251 return new CacheResponseStream(_bam);
252 }
253
254 private String _encoding;
255 private ByteArrayMaker _bam = new ByteArrayMaker();
256 private CacheResponseStream _stream;
257 private PrintWriter _writer;
258 private int _bufferSize;
259 private String _contentType;
260 private Map<String, List<Header>> _headers =
261 new HashMap<String, List<Header>>();
262
263 }