    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.servlet.multipart;
    017
    018import org.opengion.fukurou.system.Closer ;
    019
    020import java.io.ByteArrayOutputStream;
    021import java.io.IOException;
    022import java.io.UnsupportedEncodingException;
    023import javax.servlet.ServletInputStream;
    024
    025/**
    026 * ファイルアップロード時のマルチパート処理のパラメータパート部品です。
    027 *
    028 * パラメータ情報を取り扱います。
    029 *
    030 * @og.group その他機能
    031 *
    032 * @version  4.0
    033 * @author   Kazuhiko Hasegawa
    034 * @since    JDK5.0,
    035 */
    036public class ParamPart extends Part {
    037        private byte[] value;
    038        private final String encoding;
    039
    040        /**
    041         * パラメータパート部品 オブジェクトを構築する、コンストラクター
    042         *
    043         * @param       name            パラメータの名前
    044         * @param       in                      ServletInputStreamオブジェクト
    045         * @param       boundary        境界文字
    046         * @param       encoding        エンコード
    047         * @throws IOException 入出力エラーが発生したとき
    048         */
    049        ParamPart( final String name, final ServletInputStream in,
    050                                final String boundary, final String encoding) throws IOException {
    051                super(name);
    052                this.encoding = encoding;
    053
    054                // Copy the part's contents into a byte array
    055
    056                PartInputStream pis = null;
    057                ByteArrayOutputStream baos = null;
    058                try {
    059                        pis  = new PartInputStream(in, boundary);
    060                        baos = new ByteArrayOutputStream(512);
    061                        final byte[] buf = new byte[128];
    062                        int read;
    063                        while( (read = pis.read(buf)) != -1 ) {
    064                                baos.write(buf, 0, read);
    065                        }
    066                        value = baos.toByteArray();
    067                }
    068                finally {
    069                        Closer.ioClose( pis );          // 4.0.0 (2006/01/31) close 処理時の IOException を無視
    070                        Closer.ioClose( baos );         // 4.0.0 (2006/01/31) close 処理時の IOException を無視
    071                }
    072        }
    073
    074        /**
    075         * 値をバイト配列で返します。
    076         *
    077         * @return  値のバイト配列
    078         * @og.rtnNotNull
    079         */
    080        public byte[] getValue() {
    081                // 6.4.1.1 (2016/01/16) PMD refactoring. A method should have only one exit point, and that should be the last statement in the method
    082                // 反転注意
    083                return value == null ? new byte[0] : value.clone();
    084
    085        }
    086
    087        /**
    088         * 値を文字列で返します。
    089         *
    090         * @return      このクラスの初期エンコードに対応した文字列
    091         * @og.rtnNotNull
    092         * @throws UnsupportedEncodingException コンストラクタで指定した エンコード がサポートされていない場合。
    093         */
    094        public String getStringValue() throws UnsupportedEncodingException {
    095                return getStringValue( encoding );
    096        }
    097
    098        /**
    099         * エンコードを与えて、値を文字列に変換して返します。
    100         *
    101         * @param       encoding        エンコード
    102         *
    103         * @return      エンコードに対応した文字列
    104         * @og.rtnNotNull
    105         * @throws UnsupportedEncodingException 引数のエンコード がサポートされていない場合。
    106         */
    107        public String getStringValue( final String encoding ) throws UnsupportedEncodingException {
    108                return new String( value, encoding );
    109        }
    110
    111        /**
    112         * パラメーターかどうか。
    113         *
    114         * @return      (常に true)
    115         */
    116        @Override
    117        public boolean isParam() {
    118                return true;
    119        }
    120}