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    }