001    // Copyright 2007, 2008, 2009, 2010 The Apache Software Foundation
002    //
003    // Licensed under the Apache License, Version 2.0 (the "License");
004    // you may not use this file except in compliance with the License.
005    // You may obtain a copy of the License at
006    //
007    // http://www.apache.org/licenses/LICENSE-2.0
008    //
009    // Unless required by applicable law or agreed to in writing, software
010    // distributed under the License is distributed on an "AS IS" BASIS,
011    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012    // See the License for the specific language governing permissions and
013    // limitations under the License.
014    
015    package org.apache.tapestry5.internal.test;
016    
017    import java.io.ByteArrayOutputStream;
018    import java.io.IOException;
019    import java.io.OutputStream;
020    import java.io.OutputStreamWriter;
021    import java.io.PrintWriter;
022    import java.util.Map;
023    
024    import javax.servlet.ServletOutputStream;
025    import javax.servlet.http.HttpServletResponse;
026    
027    import org.apache.tapestry5.Link;
028    import org.apache.tapestry5.dom.Document;
029    import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
030    
031    public class TestableResponseImpl implements TestableResponse
032    {
033        private Link link;
034    
035        private boolean committed;
036    
037        private Document renderedDocument;
038    
039        private Map<String, Object> headers;
040    
041        private String redirectURL;
042    
043        private int status = HttpServletResponse.SC_OK;
044    
045        private String errorMessage;
046    
047        private int contentLength = 0;
048        
049        private String contentType;
050    
051        private final ByteArrayOutputStream output = new ByteArrayOutputStream();
052    
053        private ServletOutputStream outputStream = new TesableServletOutputStream(output);
054    
055        private PrintWriter printWriter;
056    
057        public TestableResponseImpl()
058        {
059            headers = CollectionFactory.newMap();
060        }
061    
062        public OutputStream getOutputStream(String contentType) throws IOException
063        {
064            this.contentType = contentType;
065            
066            return this.outputStream;
067        }
068    
069        public PrintWriter getPrintWriter(String contentType) throws IOException
070        {
071            committed = true;
072            
073            this.contentType = contentType;
074    
075            if (printWriter == null)
076            {
077                this.printWriter = new PrintWriter(new OutputStreamWriter(output));
078            }
079    
080            return this.printWriter;
081        }
082    
083        public void sendError(int sc, String message) throws IOException
084        {
085            setCommitted();
086    
087            this.status = sc;
088            this.errorMessage = message;
089        }
090    
091        public void sendRedirect(String URL) throws IOException
092        {
093            setCommitted();
094    
095            this.redirectURL = URL;
096        }
097    
098        public void setContentLength(int length)
099        {
100            this.contentLength = length;
101        }
102    
103        public void setDateHeader(String name, long date)
104        {
105            headers.put(name, date);
106        }
107    
108        public void setHeader(String name, String value)
109        {
110            headers.put(name, value);
111        }
112    
113        public void setIntHeader(String name, int value)
114        {
115            headers.put(name, value);
116        }
117    
118        public void sendRedirect(Link link) throws IOException
119        {
120            setCommitted();
121    
122            this.link = link;
123        }
124    
125        public void setStatus(int sc)
126        {
127            this.status = sc;
128        }
129    
130        public String encodeRedirectURL(String URL)
131        {
132            return URL;
133        }
134    
135        public String encodeURL(String URL)
136        {
137            return URL;
138        }
139    
140        public Link getRedirectLink()
141        {
142            return link;
143        }
144    
145        public boolean isCommitted()
146        {
147            return committed;
148        }
149    
150        public void clear()
151        {
152            committed = false;
153            link = null;
154            renderedDocument = null;
155            headers.clear();
156            status = HttpServletResponse.SC_OK;
157            errorMessage = null;
158            contentLength = 0;
159            contentType = null;
160            output.reset();
161        }
162    
163        public Document getRenderedDocument()
164        {
165            return renderedDocument;
166        }
167    
168        public void setRenderedDocument(Document document)
169        {
170            renderedDocument = document;
171        }
172    
173        public void disableCompression()
174        {
175        }
176    
177        public Object getHeader(String name)
178        {
179            return headers.get(name);
180        }
181    
182        public String getRedirectURL()
183        {
184            return this.redirectURL;
185        }
186    
187        public int getStatus()
188        {
189            return status;
190        }
191    
192        public String getErrorMessage()
193        {
194            return errorMessage;
195        }
196    
197        public int getContentLength()
198        {
199            return contentLength;
200        }
201    
202        private void setCommitted()
203        {
204            this.committed = true;
205        }
206        
207        public String getContentType()
208        {
209            return this.contentType;
210        }
211    
212        public String getOutput()
213        {
214            return output.toString();
215        }
216    
217        private class TesableServletOutputStream extends ServletOutputStream
218        {
219            private OutputStream delegate;
220    
221            public TesableServletOutputStream(OutputStream delegate)
222            {
223                super();
224                this.delegate = delegate;
225            }
226    
227            @Override
228            public void write(int b) throws IOException
229            {
230                delegate.write(b);
231            }
232    
233            @Override
234            public void flush() throws IOException
235            {
236                super.flush();
237    
238                this.delegate.flush();
239    
240                setCommitted();
241            }
242    
243            @Override
244            public void close() throws IOException
245            {
246                super.close();
247    
248                this.delegate.close();
249            }
250    
251        }
252    }