001 package echopoint.util.io;
002 /*
003 * This file is part of the Echo Point Project. This project is a collection
004 * of Components that have extended the Echo Web Application Framework.
005 *
006 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
007 *
008 * The contents of this file are subject to the Mozilla Public License Version
009 * 1.1 (the "License"); you may not use this file except in compliance with
010 * the License. You may obtain a copy of the License at
011 * http://www.mozilla.org/MPL/
012 *
013 * Software distributed under the License is distributed on an "AS IS" basis,
014 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
015 * for the specific language governing rights and limitations under the
016 * License.
017 *
018 * Alternatively, the contents of this file may be used under the terms of
019 * either the GNU General Public License Version 2 or later (the "GPL"), or
020 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
021 * in which case the provisions of the GPL or the LGPL are applicable instead
022 * of those above. If you wish to allow use of your version of this file only
023 * under the terms of either the GPL or the LGPL, and not to allow others to
024 * use your version of this file under the terms of the MPL, indicate your
025 * decision by deleting the provisions above and replace them with the notice
026 * and other provisions required by the GPL or the LGPL. If you do not delete
027 * the provisions above, a recipient may use your version of this file under
028 * the terms of any one of the MPL, the GPL or the LGPL.
029 */
030 import java.io.ByteArrayInputStream;
031 import java.io.ByteArrayOutputStream;
032 import java.io.IOException;
033 import java.io.InputStream;
034 import java.io.PrintWriter;
035 import java.util.Locale;
036
037 import javax.servlet.ServletOutputStream;
038 import javax.servlet.http.Cookie;
039 import javax.servlet.http.HttpServletResponse;
040
041 import echopoint.util.ReflectionKit;
042
043 /**
044 * An HttpServletResponse that will capture the content
045 * as it otherwise passes into the ether.
046 */
047 public class CapturedHttpServletResponse implements HttpServletResponse {
048 private HttpServletResponse wrappedResponse;
049 private CapturedServletOutputStream noopServletOutputStream;
050 private CapturedPrintWriter noopPrintWriter;
051 private String contentType;
052 private ByteArrayOutputStream out;
053
054 public CapturedHttpServletResponse(HttpServletResponse wrappedResponse, String characterEncoding) {
055 this.wrappedResponse = wrappedResponse;
056 out = new ByteArrayOutputStream();
057 noopServletOutputStream = new CapturedServletOutputStream(out);
058 noopPrintWriter = new CapturedPrintWriter(out,characterEncoding);
059 if (characterEncoding != null) {
060 setCharacterEncoding(characterEncoding);
061 }
062 }
063
064 /**
065 * Returns the captured output as an InputStream ready for reading
066 * @return the captured output as an InputStream ready for reading
067 */
068 public InputStream getCapturedInputStream() {
069 byte[] byteArray = out.toByteArray();
070 ByteArrayInputStream is = new ByteArrayInputStream(byteArray);
071 return is;
072 }
073 /**
074 * @see javax.servlet.http.HttpServletResponse#addCookie(javax.servlet.http.Cookie)
075 */
076 public void addCookie(Cookie arg0) {
077 wrappedResponse.addCookie(arg0);
078 }
079
080 /**
081 * @see javax.servlet.http.HttpServletResponse#addDateHeader(java.lang.String, long)
082 */
083 public void addDateHeader(String arg0, long arg1) {
084 wrappedResponse.addDateHeader(arg0, arg1);
085 }
086
087 /**
088 * @see javax.servlet.http.HttpServletResponse#addHeader(java.lang.String, java.lang.String)
089 */
090 public void addHeader(String arg0, String arg1) {
091 wrappedResponse.addHeader(arg0, arg1);
092 }
093
094 /**
095 * @see javax.servlet.http.HttpServletResponse#addIntHeader(java.lang.String, int)
096 */
097 public void addIntHeader(String arg0, int arg1) {
098 wrappedResponse.addIntHeader(arg0, arg1);
099 }
100
101 /**
102 * @see javax.servlet.http.HttpServletResponse#containsHeader(java.lang.String)
103 */
104 public boolean containsHeader(String arg0) {
105 return wrappedResponse.containsHeader(arg0);
106 }
107
108 /**
109 * @see javax.servlet.http.HttpServletResponse#encodeRedirectUrl(java.lang.String)
110 * @deprecated
111 */
112 public String encodeRedirectUrl(String arg0) {
113 return wrappedResponse.encodeRedirectUrl(arg0);
114 }
115
116 /**
117 * @see javax.servlet.http.HttpServletResponse#encodeRedirectURL(java.lang.String)
118 */
119 public String encodeRedirectURL(String arg0) {
120 return wrappedResponse.encodeRedirectURL(arg0);
121 }
122
123 /**
124 * @see javax.servlet.http.HttpServletResponse#encodeUrl(java.lang.String)
125 * @deprecated
126 */
127 public String encodeUrl(String arg0) {
128 return wrappedResponse.encodeUrl(arg0);
129 }
130
131 /**
132 * @see javax.servlet.http.HttpServletResponse#encodeURL(java.lang.String)
133 */
134 public String encodeURL(String arg0) {
135 return wrappedResponse.encodeURL(arg0);
136 }
137
138 /**
139 * @see javax.servlet.ServletResponse#flushBuffer()
140 */
141 public void flushBuffer() throws IOException {
142 wrappedResponse.flushBuffer();
143 }
144
145 /**
146 * @see javax.servlet.ServletResponse#getBufferSize()
147 */
148 public int getBufferSize() {
149 return wrappedResponse.getBufferSize();
150 }
151
152 /**
153 * @see javax.servlet.ServletResponse#getCharacterEncoding()
154 */
155 public String getCharacterEncoding() {
156 return wrappedResponse.getCharacterEncoding();
157 }
158
159 /**
160 * @see javax.servlet.ServletResponse#getLocale()
161 */
162 public Locale getLocale() {
163 return wrappedResponse.getLocale();
164 }
165
166 /**
167 * @see javax.servlet.ServletResponse#getOutputStream()
168 */
169 public ServletOutputStream getOutputStream() throws IOException {
170 return noopServletOutputStream;
171 }
172
173 /**
174 * @see javax.servlet.ServletResponse#getWriter()
175 */
176 public PrintWriter getWriter() throws IOException {
177 return noopPrintWriter;
178 }
179
180 /**
181 * @see java.lang.Object#hashCode()
182 */
183 public int hashCode() {
184 return wrappedResponse.hashCode();
185 }
186
187 /**
188 * @see javax.servlet.ServletResponse#isCommitted()
189 */
190 public boolean isCommitted() {
191 return wrappedResponse.isCommitted();
192 }
193
194 /**
195 * @see javax.servlet.ServletResponse#reset()
196 */
197 public void reset() {
198 wrappedResponse.reset();
199 }
200
201 /**
202 * @see javax.servlet.ServletResponse#resetBuffer()
203 */
204 public void resetBuffer() {
205 wrappedResponse.resetBuffer();
206 }
207
208 /**
209 * @see javax.servlet.http.HttpServletResponse#sendError(int)
210 */
211 public void sendError(int arg0) throws IOException {
212 wrappedResponse.sendError(arg0);
213 }
214
215 /**
216 * @see javax.servlet.http.HttpServletResponse#sendError(int, java.lang.String)
217 */
218 public void sendError(int arg0, String arg1) throws IOException {
219 wrappedResponse.sendError(arg0, arg1);
220 }
221
222 /**
223 * @see javax.servlet.http.HttpServletResponse#sendRedirect(java.lang.String)
224 */
225 public void sendRedirect(String arg0) throws IOException {
226 wrappedResponse.sendRedirect(arg0);
227 }
228
229 /**
230 * @see javax.servlet.ServletResponse#setBufferSize(int)
231 */
232 public void setBufferSize(int arg0) {
233 wrappedResponse.setBufferSize(arg0);
234 }
235
236 /**
237 * @see javax.servlet.ServletResponse#setContentLength(int)
238 */
239 public void setContentLength(int arg0) {
240 wrappedResponse.setContentLength(arg0);
241 }
242
243 /**
244 * @see javax.servlet.ServletResponse#setContentType(java.lang.String)
245 */
246 public void setContentType(String newValue) {
247 this.contentType = newValue;
248 wrappedResponse.setContentType(newValue);
249 }
250
251 /**
252 * @see javax.servlet.http.HttpServletResponse#setDateHeader(java.lang.String, long)
253 */
254 public void setDateHeader(String arg0, long arg1) {
255 wrappedResponse.setDateHeader(arg0, arg1);
256 }
257
258 /**
259 * @see javax.servlet.http.HttpServletResponse#setHeader(java.lang.String, java.lang.String)
260 */
261 public void setHeader(String arg0, String arg1) {
262 wrappedResponse.setHeader(arg0, arg1);
263 }
264
265 /**
266 * @see javax.servlet.http.HttpServletResponse#setIntHeader(java.lang.String, int)
267 */
268 public void setIntHeader(String arg0, int arg1) {
269 wrappedResponse.setIntHeader(arg0, arg1);
270 }
271
272 /**
273 * @see javax.servlet.ServletResponse#setLocale(java.util.Locale)
274 */
275 public void setLocale(Locale arg0) {
276 wrappedResponse.setLocale(arg0);
277 }
278
279 /**
280 * @see javax.servlet.http.HttpServletResponse#setStatus(int)
281 */
282 public void setStatus(int arg0) {
283 wrappedResponse.setStatus(arg0);
284 }
285
286 /**
287 * @see javax.servlet.http.HttpServletResponse#setStatus(int, java.lang.String)
288 * @deprecated
289 */
290 public void setStatus(int arg0, String arg1) {
291 wrappedResponse.setStatus(arg0, arg1);
292 }
293 /**
294 * Added for Servlet 2.4 support
295 */
296 public String getContentType() {
297 return this.contentType;
298 }
299 /**
300 * Added for Servlet 2.4 support
301 */
302 public void setCharacterEncoding(String newValue) {
303 ReflectionKit.invokeIfPresent("setCharacterEncoding",
304 new Class[]{String.class}, Void.TYPE,
305 wrappedResponse, new Object[] { newValue });
306 }
307 }