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 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, _res.getCharacterEncoding()));
181             _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 }