    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.hayabusa.filter;
    017
    018import org.opengion.fukurou.system.Closer;
    019
    020import java.io.PrintWriter;
    021import java.io.IOException;
    022import java.io.OutputStreamWriter;
    023import javax.servlet.ServletOutputStream;
    024import javax.servlet.http.HttpServletResponseWrapper;
    025import javax.servlet.http.HttpServletResponse;
    026
    027/**
    028 * GZIPFilter で使用する、GZIP圧縮されたレスポンスのラッパクラスです。
    029 *
    030 * @og.group フィルター処理
    031 *
    032 * @version  4.0
    033 * @author   Kazuhiko Hasegawa
    034 * @since    JDK5.0,
    035 */
    036public class GZIPResponseWrapper extends HttpServletResponseWrapper {
    037        protected HttpServletResponse origResponse      ;
    038        protected ServletOutputStream stream            ;
    039        protected PrintWriter writer                            ;
    040
    041        /**
    042         * コンストラクター
    043         *
    044         * @param       response        HttpServletResponseオブジェクト
    045         */
    046        public GZIPResponseWrapper(final HttpServletResponse response) {
    047                super(response);
    048                origResponse = response;
    049        }
    050
    051        /**
    052         * ServletOutputStream の実体である GZIPResponseStream を作成して返します。
    053         *
    054         * @return      ServletOutputStreamオブジェクト
    055         * @og.rtnNotNull
    056         * @throws IOException オブジェクトの作成に失敗したとき、throw されます。
    057         */
    058        public ServletOutputStream createOutputStream() throws IOException {
    059                return new GZIPResponseStream(origResponse);
    060        }
    061
    062        /**
    063         * 内部ストリーム を クローズします。
    064         *
    065         */
    066        public void finishResponse() {
    067                Closer.ioClose( writer );
    068                Closer.ioClose( stream );
    069        }
    070
    071        /**
    072         * 内部ストリームの flush() メソッドを呼び出します。
    073         *
    074         * @og.rev 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs)
    075         */
    076        @Override
    077        public void flushBuffer() throws IOException {
    078                if( stream != null ) {
    079                        stream.flush();
    080                }
    081        }
    082
    083        /**
    084         * 内部ServletOutputStreamを返します。
    085         *
    086         * 内部オブジェクトが存在しない場合は、新規に作成します。
    087         *
    088         * @return      ServletOutputStreamオブジェクト
    089         */
    090        @Override
    091        public ServletOutputStream getOutputStream() throws IOException {
    092                if( writer != null ) {
    093                        throw new IllegalStateException("getWriter() has already been called!");
    094                }
    095
    096                if( stream == null ) {
    097                        stream = createOutputStream();
    098                }
    099                return stream;
    100        }
    101
    102        /**
    103         * 内部PrintWriterを返します。
    104         *
    105         * 内部オブジェクトが存在しない場合は、新規に作成します。
    106         *
    107         * @return PrintWriterオブジェクト
    108         */
    109        @Override
    110        public PrintWriter getWriter() throws IOException {
    111                if( writer != null ) {
    112                        return writer;
    113                }
    114
    115                if( stream != null ) {
    116                        throw new IllegalStateException("getOutputStream() has already been called!");
    117                }
    118
    119                stream = createOutputStream();
    120                writer = new PrintWriter(new OutputStreamWriter(stream, "UTF-8"));
    121                return writer;
    122        }
    123
    124        /**
    125         * 内部ストリームのデータ長を設定します(何もしません)。
    126         *
    127         * @param       length  データ長
    128         */
    129        @Override
    130        public void setContentLength(final int length) {
    131                // ここでは処理を行いません。
    132        }
    133}