    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.services;
    016
    017import java.io.BufferedInputStream;
    018import java.io.IOException;
    019import java.io.InputStream;
    020import java.io.OutputStream;
    021
    022import org.apache.tapestry5.StreamResponse;
    023import org.apache.tapestry5.http.services.Response;
    024import org.apache.tapestry5.internal.TapestryInternalUtils;
    025import org.apache.tapestry5.ioc.internal.util.InternalUtils;
    026import org.apache.tapestry5.services.ComponentEventResultProcessor;
    027
    028public class StreamResponseResultProcessor implements ComponentEventResultProcessor<StreamResponse>
    029{
    030    private final Response response;
    031
    032    public StreamResponseResultProcessor(Response response)
    033    {
    034        this.response = response;
    035    }
    036
    037    public void processResultValue(StreamResponse streamResponse) throws IOException
    038    {
    039        OutputStream os = null;
    040        InputStream is = null;
    041
    042        // The whole point is that the response is in the hands of the StreamResponse;
    043        // if they want to compress the result, they can add their own GZIPOutputStream to
    044        // their pipeline.
    045
    046        response.disableCompression();
    047
    048        streamResponse.prepareResponse(response);
    049
    050        try
    051        {
    052            is = new BufferedInputStream(streamResponse.getStream());
    053
    054            os = response.getOutputStream(streamResponse.getContentType());
    055
    056            TapestryInternalUtils.copy(is, os);
    057
    058            os.close();
    059            os = null;
    060
    061            is.close();
    062            is = null;
    063        }
    064        finally
    065        {
    066            InternalUtils.close(is);
    067            InternalUtils.close(os);
    068        }
    069    }
    070}