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