1   /**
2    * Copyright (c) 2000-2008 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.util.ByteArrayMaker;
26  import com.liferay.util.servlet.Header;
27  
28  import java.io.IOException;
29  import java.io.OutputStreamWriter;
30  import java.io.PrintWriter;
31  
32  import java.util.ArrayList;
33  import java.util.HashMap;
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  /**
42   * <a href="CacheResponse.java.html"><b><i>View Source</i></b></a>
43   *
44   * @author Alexander Chow
45   *
46   */
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  
89      public void addIntHeader(String name, int value) {
90          List<Header> values = _headers.get(name);
91  
92          if (values == null) {
93              values = new ArrayList<Header>();
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<String, List<Header>> getHeaders() {
136         return _headers;
137     }
138 
139     public ServletOutputStream getOutputStream() {
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, _res.getCharacterEncoding()));
164             _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<Header> values = new ArrayList<Header>();
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<Header> values = new ArrayList<Header>();
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<Header> values = new ArrayList<Header>();
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     protected CacheResponseStream createOutputStream() {
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<String, List<Header>> _headers =
236         new HashMap<String, List<Header>>();
237 
238 }