1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
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  /**
43   * <a href="CacheResponse.java.html"><b><i>View Source</i></b></a>
44   *
45   * @author Alexander Chow
46   *
47   */
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, _res.getCharacterEncoding()));
185             _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 }