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
015package org.apache.tapestry5.internal.test;
016
017import java.io.ByteArrayOutputStream;
018import java.io.IOException;
019import java.io.OutputStream;
020import java.io.OutputStreamWriter;
021import java.io.PrintWriter;
022import java.util.Map;
023
024import javax.servlet.ServletOutputStream;
025import javax.servlet.http.HttpServletResponse;
026
027import org.apache.tapestry5.Link;
028import org.apache.tapestry5.dom.Document;
029import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
030
031public 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}