1
22
23 package com.liferay.util.servlet.filters;
24
25 import com.liferay.portal.kernel.util.ByteArrayMaker;
26 import com.liferay.util.CollectionFactory;
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.List;
35 import java.util.Map;
36
37 import javax.servlet.ServletOutputStream;
38 import javax.servlet.http.HttpServletResponse;
39 import javax.servlet.http.HttpServletResponseWrapper;
40
41
47 public class CacheResponse extends HttpServletResponseWrapper {
48
49 public CacheResponse(HttpServletResponse res, String encoding) {
50 super(res);
51
52 _encoding = encoding;
53 }
54
55 public void addDateHeader(String name, long value) {
56 List values = (List)_headers.get(name);
57
58 if (values == null) {
59 values = new ArrayList();
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 values = (List)_headers.get(name);
74
75 if (values == null) {
76 values = new ArrayList();
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
89 public void addIntHeader(String name, int value) {
90 List values = (List)_headers.get(name);
91
92 if (values == null) {
93 values = new ArrayList();
94
95 _headers.put(name, values);
96 }
97
98 Header header = new Header();
99
100 header.setType(Header.INTEGER_TYPE);
101 header.setIntValue(value);
102
103 values.add(header);
104 }
105
106 public void finishResponse() {
107 try {
108 if (_writer != null) {
109 _writer.close();
110 }
111 else if (_stream != null) {
112 _stream.close();
113 }
114 }
115 catch (IOException e) {
116 }
117 }
118
119 public void flushBuffer() throws IOException {
120 if (_stream != null) {
121 _stream.flush();
122 }
123 }
124
125 public String getContentType() {
126 return _contentType;
127 }
128
129 public byte[] getData() {
130 finishResponse();
131
132 return _bam.toByteArray();
133 }
134
135 public Map getHeaders() {
136 return _headers;
137 }
138
139 public ServletOutputStream getOutputStream() throws IOException {
140 if (_writer != null) {
141 throw new IllegalStateException();
142 }
143
144 if (_stream == null) {
145 _stream = _createOutputStream();
146 }
147
148 return _stream;
149 }
150
151 public PrintWriter getWriter() throws IOException {
152 if (_writer != null) {
153 return _writer;
154 }
155
156 if (_stream != null) {
157 throw new IllegalStateException();
158 }
159
160 _stream = _createOutputStream();
161
162 _writer = new PrintWriter(new OutputStreamWriter(
163 _stream, _encoding));
165
166 return _writer;
167 }
168
169 public boolean isCommitted() {
170 if (_writer != null) {
171 return true;
172 }
173
174 if ((_stream != null) && _stream.isClosed()) {
175 return true;
176 }
177
178 return super.isCommitted();
179 }
180
181 public void setContentType(String contentType) {
182 _contentType = contentType;
183
184 super.setContentType(contentType);
185 }
186
187 public void setDateHeader(String name, long value) {
188 List values = new ArrayList();
189
190 _headers.put(name, values);
191
192 Header header = new Header();
193
194 header.setType(Header.DATE_TYPE);
195 header.setDateValue(value);
196
197 values.add(header);
198 }
199
200 public void setHeader(String name, String value) {
201 List values = new ArrayList();
202
203 _headers.put(name, values);
204
205 Header header = new Header();
206
207 header.setType(Header.STRING_TYPE);
208 header.setStringValue(value);
209
210 values.add(header);
211 }
212
213 public void setIntHeader(String name, int value) {
214 List values = new ArrayList();
215
216 _headers.put(name, values);
217
218 Header header = new Header();
219
220 header.setType(Header.INTEGER_TYPE);
221 header.setIntValue(value);
222
223 values.add(header);
224 }
225
226 private CacheResponseStream _createOutputStream() throws IOException {
227 return new CacheResponseStream(_bam);
228 }
229
230 private String _encoding;
231 private ByteArrayMaker _bam = new ByteArrayMaker();
232 private CacheResponseStream _stream;
233 private PrintWriter _writer;
234 private String _contentType;
235 private Map _headers = CollectionFactory.getHashMap();
236
237 }