001// Copyright 2007, 2008, 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.util;
016
017import java.io.ByteArrayInputStream;
018import java.io.IOException;
019import java.io.InputStream;
020
021import org.apache.tapestry5.ContentType;
022import org.apache.tapestry5.StreamResponse;
023import org.apache.tapestry5.services.Response;
024
025public class TextStreamResponse implements StreamResponse
026{
027    private final ContentType contentType;
028
029    private final String text;
030
031    /**
032     * Constructor that defaults the character set to "utf-8".
033     */
034    public TextStreamResponse(String contentType, String text)
035    {
036        this(contentType, "UTF-8", text);
037    }
038
039    /**
040     * Constructor allowing the content type and character set to the specified.
041     * 
042     * @param contentType
043     *            type of content, often "text/xml"
044     * @param charset
045     *            character set of output, usually "UTF-8"
046     * @param text
047     *            text to be streamed in the response
048     * @see org.apache.tapestry5.SymbolConstants#CHARSET
049     */
050    public TextStreamResponse(String contentType, String charset, String text)
051    {
052        this(new ContentType(contentType, charset), text);
053    }
054
055    public TextStreamResponse(ContentType contentType, String text)
056    {
057        assert contentType != null;
058        assert text != null;
059
060        this.contentType = contentType;
061        this.text = text;
062    }
063
064    public String getContentType()
065    {
066        return contentType.toString();
067    }
068
069    /**
070     * Converts the text to a byte array (as per the character set, which is usually "UTF-8"), and returns a stream for
071     * that byte array.
072     * 
073     * @return the text as a byte array stram
074     * @throws IOException
075     */
076    public InputStream getStream() throws IOException
077    {
078        byte[] textBytes = text.getBytes(contentType.getCharset());
079
080        return new ByteArrayInputStream(textBytes);
081    }
082
083    /**
084     * Does nothing; subclasses may override.
085     */
086    public void prepareResponse(Response response)
087    {
088
089    }
090}