    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.taglib;
    017
    018import static org.opengion.fukurou.util.StringUtil.*;
    019
    020import java.io.ByteArrayOutputStream;
    021import java.io.File;
    022import java.io.FileInputStream;
    023import java.io.FileNotFoundException;
    024import java.io.FileOutputStream;
    025import java.io.IOException;
    026import java.io.ObjectInputStream;
    027import java.io.ObjectOutputStream;
    028import java.io.OutputStream;
    029import java.io.PrintWriter;
    030import java.util.ArrayList;
    031import java.util.List;
    032import java.util.Locale;
    033import java.util.zip.GZIPOutputStream;
    034import java.util.zip.ZipEntry;
    035import java.util.zip.ZipOutputStream;
    036
    037import javax.servlet.ServletResponse ;
    038import javax.servlet.http.HttpServletResponse ;
    039import javax.servlet.jsp.JspWriter ;
    040
    041import org.opengion.fukurou.model.FileOperation;
    042import org.opengion.fukurou.util.Closer ;
    043import org.opengion.fukurou.util.FileUtil;
    044import org.opengion.fukurou.util.HybsEntry;
    045import org.opengion.fukurou.util.StringUtil ;
    046import org.opengion.hayabusa.common.HybsSystem;
    047import org.opengion.hayabusa.common.HybsSystemException;
    048import org.opengion.hayabusa.db.DBTableModel;
    049import org.opengion.hayabusa.io.HybsFileOperationFactory;
    050import org.opengion.hayabusa.io.TableWriter;
    051
    052/**
    053 * DBTableModelオブジェクトを指定のファイルに出力するタグです。
    054 *
    055 * データ(DBTableModel)と、コントローラ(WriteTableTagForm)を与えて、
    056 * 外部からコントロールすることで、各種形式で データ(DBTableModel)を表示できます。
    057 * writeTableタグ に対して、コマンドを与えることにより、内部のコントローラの
    058 * 実装に対応した、 形式でデータを作成します。
    059 *
    060 * @og.formSample
    061 * ●形式：
    062 *     &lt;og:writeTable
    063 *         fileURL   = "{&#064;USER.ID}"    保存先ディレクトリ名
    064 *         filename  = "{&#064;filename}"   保存ファイル名
    065 *         encode    = "UnicodeLittle"      保存ファイルエンコード名
    066 *     /&gt;
    067 *
    068 * ●body：あり(EVAL_BODY_BUFFERED:BODYを評価し、{&#064;XXXX} を解析します)
    069 *
    070 * ●Tag定義：
    071 *   &lt;og:writeTable
    072 *       writerClass        【TAG】実際に書き出すクラス名の略称(TableWriter_**** クラスの ****)を指定します(初期値:Default)
    073 *       separator          【TAG】可変長ファイルを作成するときの項目区切り文字をセットします (初期値:TableWriter#TAB_SEPARATOR[= ])
    074 *       headerSequence     【TAG】DBTableModelの出力順(LNSCD など)をセットします
    075 *       fileURL            【TAG】ファイル保存先ディレクトリ名を指定します
    076 *       filename           【TAG】ファイルを作成するときのファイル名をセットします (初期値:FILE_FILENAME[=UnicodeLittle])
    077 *       sheetName          【TAG】EXCELファイルを書き出すときのシート名を設定します
    078 *       beforeDelete       【TAG】事前にファイルを削除するかどうかをセットします (初期値:false)
    079 *       encode             【TAG】ファイルを作成するときのファイルエンコーディング名をセットします (初期値:FILE_ENCODE[=UnicodeLittle])
    080 *       fileAppend         【TAG】追加モードで書き込むかどうか[true/false]を指定します(初期値:false[新規モード])
    081 *       direct             【廃止】結果をダイレクトにEXCEL起動するかどうか[true/false]を指定します(初期値:false[ファイル])
    082 *       zip                【TAG】結果をファイルに出力するときに、ZIPで圧縮するかどうか[true/false]を指定します(初期値:false)
    083 *       tableId            【TAG】(通常使いません)sessionから所得する DBTableModelオブジェクトの ID
    084 *       scope              【TAG】キャッシュする場合のスコープ[request/page/session/applicaton]を指定します(初期値:session)
    085 *       disposition        【TAG】Content-Disposition (inline:埋め込む/attachment:ダイアログを起動)を指定します(初期値:attachment)
    086 *       refFileURL         【TAG】EXCEL雛型参照ファイルのディレクトリ名をセットします
    087 *       refFilename        【TAG】EXCEL雛型参考ファイル名をセットします
    088 *       refSheetName       【TAG】EXCEL雛型参考ファイルのシート名を設定します
    089 *       sheetOverwrite     【TAG】EXCELでsheetNameでの指定シート名に対して上書きを行うかどうかを指定します。
    090 *       recalcSheetName    【TAG】EXCELで、出力処理の最後にセルの計算式の再計算をさせるシート名をカンマ区切りで指定します。
    091 *       useNumber          【TAG】行番号情報を、出力する/しない[true/false]を指定します(初期値:true)
    092 *       columns            【TAG】書き込み先ファイルのカラム列を、外部(タグ)より指定します
    093 *       useRenderer        【TAG】書込処理でコードリソースのラベル変換を行うかどうかを指定します (初期値:USE_TABLE_WRITER_RENDERER[=false])
    094 *       selectedAll        【TAG】チェック行のみを対象にするかを指定します(初期値:true)。
    095 *       fontName           【TAG】EXCEL出力時のデフォルトフォント名を設定します (初期値:TABLE_WRITER_DEFAULT_FONT_NAME[=ＭＳ Ｐゴシック])
    096 *       fontPoint          【TAG】EXCEL出力時のデフォルトフォントポイント数を設定します(初期値:TABLE_WRITER_DEFAULT_FONT_POINTS[=11])
    097 *       skipRowCount       【TAG】(通常は使いません)データの書き込み開始位置を設定します
    098 *       language           【TAG】タグ内部で使用する言語コード[ja/en/zh/…]を指定します
    099 *       caseKey            【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null) 5.7.7.2 (2014/06/20)
    100 *       caseVal            【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null) 5.7.7.2 (2014/06/20)
    101 *       caseNN             【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:true) 5.7.7.2 (2014/06/20)
    102 *       caseNull           【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:true) 5.7.7.2 (2014/06/20)
    103 *       storageType            【TAG】保存先ストレージタイプを指定します
    104 *       bucketName                     【TAG】保存先バケット名を指定します
    105 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    106 *   &gt;   ... Body ...
    107 *   &lt;/og:writeTable&gt;
    108 *
    109 * ●使用例
    110 *     &lt;og:writeTable ･････ &gt;
    111 *         &lt;og:writeTableParam
    112 *             key  = "Tablename"  value="GE12"
    113 *         /&gt;
    114 *         &lt;og:writeTableParam
    115 *             key  = "First"             First:最初に登録
    116 *         &gt;
    117 *                      insert into GE12bk
    118 *                         select * from GE12
    119 *                         where SYSTEM_ID='**'
    120 *         &lt;/og:writeTableParam
    121 *         &lt;og:writeTableParam
    122 *             key  = "First"             First:の２番目に登録
    123 *         &gt;
    124 *              delete from GE12 where SYSTEM_ID='**' and KBSAKU='0'
    125 *         &lt;/og:writeTableParam
    126 *         &lt;og:writeTableParam
    127 *             key  = "Last"              Last:最後に登録
    128 *         &gt;
    129 *              update GE12 set XXXX='YYYY' where SYSTEM_ID='**' and KBSAKU='0'
    130 *         &lt;/og:writeTableParam
    131 *     &lt;/og:writeTableParam
    132 *
    133 * @og.rev 5.10.9.0 (2019/03/01) oota クラウドストレージ対応を追加。(Fileクラスを拡張)
    134 *
    135 * @og.group ファイル出力
    136 *
    137 * @version  4.0
    138 * @author   Kazuhiko Hasegawa
    139 * @since    JDK5.0,
    140 */
    141public class WriteTableTag extends CommonTagSupport {
    142        //* このプログラムのVERSION文字列を設定します。   {@value} */
    143        private static final String VERSION = "5.7.9.0 (2014/08/08)" ;
    144
    145        private static final long serialVersionUID = 579020140808L ;
    146
    147        private final String  BASE_URL  = HybsSystem.sys( "FILE_URL" );
    148
    149        private String  separator               = TableWriter.TAB_SEPARATOR;     // 項目区切り文字
    150//      private String  headerSequence  = null;                         // ヘッダー項目の並び順
    151        private String  headerSequence  = HybsSystem.sys( "TABLE_WRITER_DEFAULT_HEADERSEQ" );   // 5.9.20.2 (2017/05/19)
    152        private String  fileURL                 = BASE_URL;
    153        private String  filename                = HybsSystem.sys( "FILE_FILENAME" );   // ファイル名
    154        private String  sheetName               = "Sheet1" ;            // 3.5.4.2 (2003/12/15)
    155        private String  refFileURL              = BASE_URL;                     // 3.5.4.3 (2004/01/05)
    156        private String  refFilename     = null;                         // 3.5.4.3 (2004/01/05)
    157        private String  refSheetName    = null ;                        // 3.5.4.3 (2004/01/05)
    158        private String  fontName                = HybsSystem.sys( "TABLE_WRITER_DEFAULT_FONT_NAME" );                   // 3.8.5.3 (2006/08/07)
    159        private String  fontPoint               = HybsSystem.sys( "TABLE_WRITER_DEFAULT_FONT_POINTS" );                 // 3.8.5.3 (2006/08/07)
    160        private String  encode                  = HybsSystem.sys( "FILE_ENCODE" );      // ファイルエンコーディング  "DEFAULT","JISAutoDetect" ,"JIS", "EUC_JP", "MS932", "SJIS" , "Windows-31J" , "Shift_JIS"
    161        private String  writerClass     = HybsSystem.sys( "TABLE_WRITER_DEFAULT_CLASS" );               // 3.8.5.3 (2006/08/07)
    162        private boolean fileAppend              = false;                        // ファイルをAPPENDモードで出力するか
    163        private boolean direct                  = false;
    164        private boolean zip                     = false;
    165        private String  disposition     = "attachment";         // 3.8.0.9 (2005/10/17) Content-Disposition 初期値変更 inline ⇒ attachment
    166
    167        private transient DBTableModel table      = null;
    168        private String  tableId                 = HybsSystem.TBL_MDL_KEY ;
    169        private String  directory               = null ;                        // 3.8.6.0 (2006/08/23)
    170
    171        private transient List<HybsEntry> param   = null ;                // 4.0.0 (2005/02/28)
    172
    173        private boolean useNumber               = true;                         // 3.7.0.2 (2005/02/14)
    174        // 4.0.0 (2005/12/31) 外部よりカラム列(カンマ区切り)を指定できるようにする。
    175        private String          columns         = null;
    176        // 5.2.1.0 (2010/10/01) 書込処理でコードリソースのラベル変換を行うかどうか
    177        private boolean useRenderer             = HybsSystem.sysBool( "USE_TABLE_WRITER_RENDERER" );    // 5.2.1.0 (2010/10/01)
    178
    179        // 5.5.5.5 (2012/08/24) チェック対応
    180        private boolean selectedAll             = true;                         // 5.5.5.5 (2012/08/24)
    181
    182        // 5.5.9.1 (2012/12/07) 事前にファイルを削除するかどうか。互換性のため、false に設定。推奨は、true
    183        private boolean beforeDelete    = false;                        // 5.5.9.1 (2012/12/07) 事前にファイルを削除するかどうか。
    184
    185        private int             skipRowCount    = 0;                            // 5.7.9.0 (2014/08/08) データの書き込み開始位置設定
    186
    187        // 5.9.12.1 (2016/09/09)
    188        private boolean sheetOverwrite  = false;        // 5.9.12.1(2016/09/09)
    189        private String recalcSheetName; // 5.9.12.1 (2016/09/09)
    190
    191        private String storageType              = null;         // 5.10.9.0 (2019/03/01) ADD
    192        private String bucketName               = null;         // 5.10.9.0 (2019/03/01) ADD
    193        /**
    194         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
    195         *
    196         * @og.rev 5.5.9.1 (2012/12/07) 事前にファイルを削除するかどうか（beforeDelete）フラグを追加
    197         * @og.rev 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加
    198         * @og.rev 5.10.9.0 (2019/03/01) クラウドストレージ対応を追加
    199         *
    200         * @return      後続処理の指示( EVAL_BODY_BUFFERED )
    201         */
    202        @Override
    203        public int doStartTag() {
    204                // 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加
    205                if( !useTag() ) { return SKIP_BODY ; }
    206
    207                directory = HybsSystem.url2dir( fileURL );              // 5.5.9.1 (2012/12/07) doEndTag() から移動
    208
    209                // 5.5.9.1 (2012/12/07) 事前にファイルを削除するかどうか
    210                if( beforeDelete && !fileAppend ) {
    211                        File delFile = null;
    212                        // 5.10.9.0 (2019/03/01) MODIFY
    213                        //if( zip ) { delFile = new File(directory, filename + ".zip" ); }
    214                        //else { delFile = new File(directory, filename); }
    215                        if( zip ) { delFile = HybsFileOperationFactory.create(storageType, bucketName, directory, filename + ".zip" ); }
    216                        else { delFile = HybsFileOperationFactory.create(storageType, bucketName, directory, filename); }
    217                        if( delFile.exists() ) { delFile.delete(); }
    218                }
    219
    220                return EVAL_BODY_BUFFERED ;     // Body を評価する。( extends BodyTagSupport 時)
    221        }
    222
    223        /**
    224         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
    225         *
    226         * @og.rev 2.1.3.1 (2002/12/13) ContentType を、x-msexcel から vnd.ms-excel に変更した。
    227         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    228         * @og.rev 3.1.3.0 (2003/04/10) FILE_ENCODE から、エンコード情報を取得する。
    229         * @og.rev 3.1.5.0 (2003/04/20) Content-Disposition を外部から指定できるように変更。
    230         * @og.rev 3.2.0.0 (2003/05/22) GZIPOutputStream を使用していたが、ZipOutputStream に変更。
    231         * @og.rev 3.5.4.1 (2003/12/01) 引数の PrintWriter を、OutputStream に変更。
    232         * @og.rev 3.5.4.3 (2004/01/05) 引数を、 PrintWriter に戻す。
    233         * @og.rev 3.6.0.2 (2004/10/04) EXCELダイレクト出力時にファイルエンドまで出力されない不具合対策
    234         * @og.rev 3.8.0.9 (2005/10/17) disposition属性を使用できるように変更します。
    235         * @og.rev 3.8.6.0 (2006/08/23) フォルダがない場合は、複数階層分のフォルダを自動で作成します。
    236         * @og.rev 4.3.4.3 (2008/12/22) Excel出力の判別方法を前方一致に変更
    237         * @og.rev 5.1.6.0 (2010/05/01) 画面帳票作成機能対応
    238         * @og.rev 5.5.2.0 (2012/05/01) ZIP時にもencodeが有効にする
    239         * @og.rev 5.5.5.5 (2012/08/24) selectedAllの処理を追加
    240         * @og.rev 5.5.9.1 (2012/12/07) beforeDeleteフラグの追加に伴う、ロジック変更
    241         * @og.rev 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加
    242         * @og.rev 5.9.25.2 (2017/10/27) クラウドストレージ対応
    243         *
    244         * @return      後続処理の指示
    245         */
    246        @Override
    247        public int doEndTag() {
    248                debugPrint();           // 4.0.0 (2005/02/28)
    249
    250                // 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加
    251                if( !useTag() ) { return EVAL_PAGE ; }
    252
    253                table = (DBTableModel)getObject( tableId );
    254                if( ! selectedAll ){ // 5.5.5.5 (2012/08/24)
    255                        table = getSelRowsTable( table );
    256                }
    257                if( table != null && table.getRowCount() > 0 ) {
    258
    259                         File dir = new File(directory);
    260                        if( ! dir.exists() && ! dir.mkdirs() ) {
    261                                String errMsg = "ディレクトリの作成に失敗しました。[" + directory + "]";
    262                                throw new HybsSystemException( errMsg );
    263                        }
    264
    265                        PrintWriter pw = null;
    266                        ByteArrayOutputStream bt = null ;
    267                        try {
    268                                if( direct ) {
    269                                        if( zip ) {
    270                                                bt = new ByteArrayOutputStream();
    271                                                pw = new PrintWriter( bt );
    272                                                create( pw ) ;
    273                                                pw.flush();                             // 3.6.0.2 (2004/10/04)
    274                                                ServletResponse response = pageContext.getResponse() ;
    275                                                ((HttpServletResponse)response).addHeader( "Content-Encoding","gzip" );
    276
    277                                                GZIPOutputStream gzip = new GZIPOutputStream(bt);
    278                                                gzip.finish() ;
    279                                                response.setContentLength( bt.size() );
    280
    281                                                JspWriter out = pageContext.getOut();
    282                                                out.clear();
    283                                                out.print( bt );
    284                                                out.flush();                    // 3.6.0.2 (2004/10/04)
    285                                        }
    286                                        else {
    287                                                bt = new ByteArrayOutputStream();
    288                                                pw = new PrintWriter( bt );
    289                                                create( pw ) ;
    290                                                pw.flush();                             // 3.6.0.2 (2004/10/04)
    291                                                ServletResponse response = pageContext.getResponse() ;
    292                                                response.setContentType( "application/vnd.ms-excel; charset=" + encode );
    293        //                                      response.setContentType( "application/x-msexcel; charset=" + encode );
    294        //                                      response.setContentType( "text/comma-separated-values ; charset=" + encode );
    295        //                                      ((HttpServletResponse)response).setHeader( "contentType","application/x-msexcel; charset=Shift_JIS" );
    296        //                                      ((HttpServletResponse)response).setHeader( "Content-Disposition","attachment; filename=\"" + filename + "\"" );
    297        //                                      ((HttpServletResponse)response).setHeader( "Content-Disposition","inline; filename=\"" + filename + "\"" );
    298                                                // 3.8.0.9 (2005/10/17) disposition属性を使用できるように変更します。
    299                                                ((HttpServletResponse)response).setHeader( "Content-Disposition",disposition + "; filename=\"" + filename + "\"" );
    300
    301                                                JspWriter out = pageContext.getOut();
    302                                                out.clear();
    303                                                out.print( bt );
    304                                                out.flush();                    // 3.6.0.2 (2004/10/04)
    305                                        }
    306                                }
    307                                else {
    308                                // 3.2.0.0 (2003/05/22) GZIPOutputStream を使用していたが、ZipOutputStream に変更。
    309                                        if( zip ) {
    310                                                bt = new ByteArrayOutputStream();
    311                                                if( writerClass.toUpperCase(Locale.JAPAN).startsWith("EXCEL") // 5.5.2.0(2012/05/01)
    312                                                                || writerClass.toUpperCase(Locale.JAPAN).startsWith("CALC") ) {
    313                                                        pw = new PrintWriter( bt );
    314                                                }
    315                                                else{
    316                                                        pw = getPrintWriter(bt);
    317                                                }
    318                                                create( pw ) ;
    319                                                pw.flush();                             // 3.6.0.2 (2004/10/04)
    320
    321                                                ZipOutputStream gzip = null;
    322                                                try {
    323                                                        gzip = new ZipOutputStream(
    324                                                                                        new FileOutputStream(
    325                                                                                                StringUtil.urlAppend( directory,filename + ".zip" )));
    326                                                        gzip.putNextEntry( new ZipEntry( filename ) );
    327                                                        (bt).writeTo( gzip );
    328                                                        gzip.finish() ;
    329                                                }
    330                                                finally {
    331                                                        Closer.ioClose( gzip );         // 4.0.0 (2006/01/31) close 処理時の IOException を無視
    332                                                }
    333                                        }
    334                                        else {
    335                                                // 5.10.9.0 (2019/03/01) ADD fileAppend=true、かつクラウドストレージの場合は、
    336                                                // ローカルにダウンロードして、追記モードで利用できるように対応。
    337                                                if(fileAppend) {
    338                                                        // 5.10.9.0 (2019/03/01) ADD 追記モードの場合、クラウドストレージかつ、ファイルの場合は、ローカルにダウンロードする。
    339                                                        FileOperation file = HybsFileOperationFactory.create(storageType,  bucketName, directory, filename);
    340                                                        // ディレクトリはdoEndTagメソッドの初期処理で、作成済み。
    341                                                        if(!file.isLocal()) {
    342                                                                // 指定のファイルがクラウドストレージに存在しない場合は、エラーとする。
    343                                                                if(file.isFile()) {
    344                                                                        StringBuilder errMsg = new StringBuilder(HybsSystem.BUFFER_SMALL);
    345                                                                        errMsg.append("指定のファイルが存在しません。path : ").append(file.getAbsolutePath());
    346                                                                        throw new HybsSystemException(errMsg.toString());
    347                                                                }
    348                                                                // ファイルダウンロード
    349                                                                File local = new File(directory, filename);
    350                                                                FileUtil.copy(file, local);
    351                                                        }
    352                                                }
    353
    354                                                // if( "Excel".equalsIgnoreCase( writerClass ) ) {
    355                                                if( writerClass.toUpperCase(Locale.JAPAN).startsWith("EXCEL") // 4.3.4.3 (2008/12/22)
    356                                                        ||  writerClass.toUpperCase(Locale.JAPAN).startsWith("CALC") ) { // 5.1.6.0 (2010/05/01)
    357                                                        create( null );
    358                                                }
    359                                                else {
    360                                                        pw = getPrintWriter();
    361                                                        create( pw );
    362                                                        pw.flush();                             // 3.6.0.2 (2004/10/04)
    363                                                }
    364                                        }
    365                                }
    366                        }
    367                        catch( IOException ex ) {
    368                                String errMsg = "テーブル出力時に、IOエラーが発生しました。" + toString();
    369                                throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並び順変更
    370                        }
    371                        finally {
    372                                Closer.ioClose( pw );           // 4.0.0 (2006/01/31) close 処理時の IOException を無視
    373                                Closer.ioClose( bt );           // 4.0.0 (2006/01/31) close 処理時の IOException を無視
    374                        }
    375
    376                        // 5.9.25.2 (2017/10/27) ADD
    377                        // クラウド上の場合は、ストレージに登録する
    378                        FileOperation fileOperation = HybsFileOperationFactory.create(storageType, bucketName, filename);
    379                        if(!fileOperation.isLocal()){
    380                                if(zip){
    381                                        entryStorage(filename + ".zip");
    382                                }else{
    383                                        entryStorage(filename);
    384                                }
    385                        }
    386                }
    387
    388                return EVAL_PAGE ;
    389        }
    390
    391        /**
    392         * 指定されたファイルをクラウド上のストレージに登録します。
    393         * 処理後に登録元のファイルを削除します。
    394         *
    395         * @og.rev 5.9.25.2 (2017/10/27) 新規作成
    396         * @og.rev 5.10.9.0 (2019/03/01) クラウドストレージ対応を追加
    397         *
    398         * @param trgFileName 対象のファイル名
    399         */
    400        private void entryStorage(String trgFileName) {
    401                FileInputStream fis = null;
    402                String filePath = StringUtil.urlAppend( directory, trgFileName);
    403                // ｻｰﾊﾞに作成されたﾌｧｲﾙをｽﾄﾚｰｼﾞに登録する
    404                try{
    405                        fis = new FileInputStream( filePath );
    406
    407                        FileOperation file = HybsFileOperationFactory.create(storageType, bucketName, filePath);
    408                        file.write(fis);
    409                }catch(FileNotFoundException e){
    410                        String errMsg = "ファイルが見つかりません。path:" + filePath;
    411                        throw new HybsSystemException( errMsg );
    412                }catch(IOException ie) {
    413                        throw new HybsSystemException(ie.getMessage() );
    414                }finally{
    415                        Closer.ioClose(fis);
    416                }
    417
    418                // 処理後のｻｰﾊﾞのﾌｧｲﾙは削除
    419                File file = new File(filePath);
    420                file.delete();
    421        }
    422
    423        /**
    424         * タグリブオブジェクトをリリースします。
    425         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    426         *
    427         * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加
    428         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    429         * @og.rev 3.1.3.0 (2003/04/10) FILE_ENCODE から、エンコード情報を取得する。
    430         * @og.rev 3.1.5.0 (2003/04/20) Content-Disposition を外部から指定できるように変更。
    431         * @og.rev 3.5.4.2 (2003/12/15) EXCELのシート名を指定できるように変更。
    432         * @og.rev 3.5.4.3 (2004/01/05) EXCEL雛型参照ファイルのURL,filenameを追加します。
    433         * @og.rev 3.8.5.3 (2006/08/07) writerClass 属性の初期値をシステムリソースより取得します。
    434         * @og.rev 3.8.5.3 (2006/08/07) fontName 属性を追加します。
    435         * @og.rev 3.8.5.3 (2006/08/07) fontPoint 属性を追加します。
    436         * @og.rev 3.8.6.0 (2006/08/23) directory 属性を追加します。
    437         * @og.rev 4.0.0.0 (2005/02/28) XMLファイルにセットする、param を追加。
    438         * @og.rev 5.2.1.0 (2010/10/01) 書込処理でコードリソースのラベル変換を行うかどうか useRenderer 属性追加
    439         * @og.rev 5.5.5.5 (2012/08/24) selectedAll属性を追加
    440         * @og.rev 5.5.9.1 (2012/12/07) 事前にファイルを削除するかどうか。互換性のため、false に設定。推奨は、true
    441         * @og.rev 5.7.9.0 (2014/08/08) データの書き込み開始位置(skipRowCount)を設定
    442         * @og.rev 5.9.12.1 (2016/09/09) sheetOverwrite
    443         * @og.rev 5.9.20.2 (2017/05/19) headerSequence
    444         *
    445         */
    446        @Override
    447        protected void release2() {
    448                super.release2();
    449                separator               = TableWriter.TAB_SEPARATOR;   // 項目区切り文字
    450//              headerSequence  = null;                         // ヘッダー項目の並び順
    451                headerSequence  =HybsSystem.sys( "TABLE_WRITER_DEFAULT_HEADERSEQ" );    // 5.9.20.2 (2017/05/19)
    452                fileURL                 = BASE_URL;
    453                filename                = HybsSystem.sys( "FILE_FILENAME" );   // ファイル名
    454                sheetName               = "Sheet1";                     // 3.5.4.2 (2003/12/15)
    455                beforeDelete    = false;                        // 5.5.9.1 (2012/12/07)
    456                refFileURL              = BASE_URL;                     // 3.5.4.3 (2004/01/05)
    457                refFilename     = null;                         // 3.5.4.3 (2004/01/05)
    458                refSheetName    = null;                         // 3.5.4.2 (2003/12/15)
    459                fontName                = HybsSystem.sys( "TABLE_WRITER_DEFAULT_FONT_NAME" );                   // 3.8.5.3 (2006/08/07)
    460                fontPoint               = HybsSystem.sys( "TABLE_WRITER_DEFAULT_FONT_POINTS" );                 // 3.8.5.3 (2006/08/07)
    461                encode                  = HybsSystem.sys( "FILE_ENCODE" );       // ファイルエンコーディング  "DEFAULT","JISAutoDetect" ,"JIS", "EUC_JP", "MS932", "SJIS" , "Windows-31J" , "Shift_JIS"
    462                writerClass     = HybsSystem.sys( "TABLE_WRITER_DEFAULT_CLASS" );               // 3.8.5.3 (2006/08/07)
    463                fileAppend              = false;                        // ファイルをAPPENDモードで出力するか
    464                direct                  = false;
    465                zip                     = false;
    466                table                   = null;
    467                tableId                 = HybsSystem.TBL_MDL_KEY ;
    468                disposition     = "attachment";         // 3.8.0.9 (2005/10/17) 初期値変更 inline ⇒ attachment
    469                param                   = null ;                        // 4.0.0 (2005/01/31)
    470                useNumber               = true;                         // 3.7.0.2 (2005/02/14)
    471                skipRowCount    = 0;                            // 5.7.9.0 (2014/08/08) データの書き込み開始位置を設定
    472                directory               = null;                         // 3.8.6.0 (2006/08/23)
    473                columns                 = null;                         // 4.0.0 (2005/12/31)
    474                useRenderer             = HybsSystem.sysBool( "USE_TABLE_WRITER_RENDERER" );    // 5.2.1.0 (2010/10/01)
    475                selectedAll             = true;                         // 5.5.5.5 (2012/08/24)
    476                sheetOverwrite  = false;                        // 5.9.12.1 (2016/09/09)
    477                recalcSheetName = null;                         // 5.9.12.1 (2016/09/09)
    478                storageType             = null;                         // 5.10.9.0 (2019/03/01) ADD
    479                bucketName              = null;                         // 5.10.9.0 (2019/03/01) ADD
    480        }
    481
    482        /**
    483         * TableWriter の実オブジェクトを生成して，OutputStream に書き込みます。
    484         *
    485         * @og.rev 3.5.4.1 (2003/12/01) 引数の PrintWriter を、OutputStream に変更。
    486         * @og.rev 3.5.4.2 (2003/12/15) lang 引数も table と同時に設定します。
    487         * @og.rev 3.5.4.2 (2003/12/15) TableWriter のサブクラス名変更。
    488         * @og.rev 3.5.4.3 (2004/01/05) EXCEL雛型参考ファイルを指定するように変更。
    489         * @og.rev 3.5.4.3 (2004/01/05) 引数を、 PrintWriter に戻す。
    490         * @og.rev 3.5.4.5 (2004/01/23) 文字エンコードを渡すように変更する。
    491         * @og.rev 3.5.6.0 (2004/06/18) 各種プラグイン関連付け設定を、システムパラメータ に記述します。
    492         * @og.rev 3.8.5.3 (2006/08/07) EXCEL時に fontName と fontPoint 属性をセットします。
    493         * @og.rev 4.0.0.0 (2005/01/31) キーの指定を、TableWriter. から、TableWriter_ に変更します。
    494         * @og.rev 4.0.0.0 (2005/12/31) 外部よりカラム列(カンマ区切り)を指定できるようにする。
    495         * @og.rev 5.2.1.0 (2010/10/01) 書込処理でコードリソースのラベル変換を行うかどうか設定 useRenderer 属性追加
    496         * @og.rev 5.7.9.0 (2014/08/08) データの書き込み開始位置(skipRowCount)を設定
    497         * @og.rev 5.9.12.1 (2016/09/09) sheetOverwrite
    498         *
    499         * @param   out PrintWriterオブジェクト
    500         */
    501        private void create( final PrintWriter out )  {
    502                // 5.2.1.0 (2010/10/01) writerClass で Renderer系の場合は、useRendererフラグに変更する。
    503                if( "ExcelRenderer".equalsIgnoreCase( writerClass ) ) {
    504                        writerClass = "Excel" ;
    505                        useRenderer = true;
    506                }
    507                else if( "Renderer".equalsIgnoreCase( writerClass ) ) {
    508                        writerClass = "Default" ;
    509                        useRenderer = true;
    510                }
    511
    512                String className = HybsSystem.sys( "TableWriter_" + writerClass ) ;             // 4.0.0 (2005/01/31)
    513                TableWriter writer = (TableWriter)HybsSystem.newInstance( className );  // 3.5.5.3 (2004/04/09)
    514
    515                writer.setDBTableModel( table,getLanguage() );
    516                writer.setSeparator( separator );
    517                writer.setHeaderSequence( headerSequence );
    518                writer.setEncode( encode );                                     // 3.5.4.5 (2004/01/23)
    519                writer.setAppend( fileAppend );                         // 3.5.4.2 (2003/12/15)
    520                if( param != null ) { writer.setParam( param ); }       // 4.0.0 (2005/01/31)
    521                writer.setUseNumber( useNumber );                       // 3.7.0.2 (2005/02/14)
    522        //      if( columns == null ) {
    523        //              columns = (String)getSessionAttribute( HybsSystem.TBL_WRITER_CLMS );
    524        //              removeSessionAttribute( HybsSystem.TBL_WRITER_CLMS );
    525        //      }
    526                writer.setColumns( columns );                           // 4.0.0 (2005/12/31)
    527                writer.setUseRenderer( useRenderer );           // 5.2.1.0 (2010/10/01)
    528                if( writer.isExcel() ) {                                        // 3.5.4.3 (2004/01/05)
    529                        writer.setSheetName( sheetName );
    530                        writer.setFilename( StringUtil.urlAppend( directory , filename ) );
    531                        if( refFileURL != null && refFilename != null ) {
    532                                writer.setRefFilename( StringUtil.urlAppend( HybsSystem.url2dir(refFileURL) , refFilename ) );
    533                        }
    534                        if( refSheetName != null && fontPoint.length() > 0 ) {               // 5.7.9.0 (2014/08/08) nullチェック
    535                                writer.setRefSheetName( refSheetName );
    536                        }
    537//                      writer.setFontName( nval( fontName,null ) );                            // 3.8.5.3 (2006/08/07)
    538                        writer.setFontName( fontName )  ;                                                       // 5.7.9.0 (2014/08/08) nvalはずし
    539                        if( fontPoint != null && fontPoint.length() > 0 ) {
    540                                writer.setFontPoint( Short.parseShort( fontPoint ) );   // 3.8.5.3 (2006/08/07)
    541                        }
    542                        writer.setSkipRowCount( skipRowCount );                                         // 5.7.9.0 (2014/08/08)
    543
    544                        writer.setSheetOverwrite( sheetOverwrite );             // 5.9.12.1 (2016/09/09)
    545                        writer.setRecalcSheetName( recalcSheetName );   // 5.9.12.1 (2016/09/09)
    546
    547                        writer.writeDBTable();
    548                }
    549                else {
    550                        writer.writeDBTable( out );
    551                }
    552        }
    553
    554        /**
    555         * PrintWriter を取得します。
    556         *
    557         * ここでは、一般的なファイル出力を考慮した PrintWriter を作成します。
    558         *
    559         * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 エンコードの取得方法変更
    560         * @og.rev 3.1.3.0 (2003/04/10) FILE_ENCODE から、エンコード情報を取得する。
    561         * @og.rev 3.5.4.1 (2003/12/01) PrintWriter を、OutputStream に変更。
    562         * @og.rev 3.5.5.9 (2004/06/07) FileUtil.getBufferedReader を使用
    563         * @og.rev 3.7.1.1 (2005/05/23) フォルダがない場合は、複数階層分のフォルダを自動で作成します。
    564         * @og.rev 3.8.0.0 (2005/06/07) FileUtil#getPrintWriter を利用。
    565         *
    566         * @return      ファイル書き出し用のPrintWriterオブジェクト
    567         */
    568        private PrintWriter getPrintWriter() {
    569                if( filename == null ) {
    570                        String errMsg = "ファイル名がセットされていません。";
    571                        throw new HybsSystemException( errMsg );
    572                }
    573
    574                // ※ 注意 StringUtil.urlAppend を組み込んでいる意図が不明。一旦削除していますが、注意
    575                // 3.8.0.0 (2005/06/07) FileUtil#getPrintWriter を利用。
    576        //      out = FileUtil.getPrintWriter( StringUtil.urlAppend( directory,filename ),fileAppend,encode);
    577                PrintWriter out = FileUtil.getPrintWriter( new File( directory,filename ),encode,fileAppend );
    578
    579                return out ;
    580        }
    581
    582        /**
    583         * PrintWriter を取得します。
    584         *
    585         * 引数で指定したOutputStreamを利用して出力します。
    586         *
    587         * @og.rev 5.5.2.0 (2012/05/01) 新規作成
    588         *
    589         * @param       os      OutputStreamオブジェクト
    590         *
    591         * @return      指定したstreamに書き出すPrintWriter
    592         */
    593        private PrintWriter getPrintWriter( final OutputStream os ) {
    594                PrintWriter out = FileUtil.getPrintWriter( os,encode );
    595
    596                return out ;
    597        }
    598
    599        /**
    600         * チェック分のテーブルモデルを再構成します。
    601         *
    602         * @og.rev 5.5.5.5 (2012/08/24) 新規作成
    603         * @og.rev 5.5.9.1 (2012/12/07) 内部処理変更
    604         *
    605         * @param       oldTable        コピー元テーブルモデル
    606         *
    607         * @return      チェックした分だけで再構成したテーブルモデル
    608         */
    609        private DBTableModel getSelRowsTable( final DBTableModel oldTable ) {
    610                if( oldTable == null ) { return null; }         // 5.5.9.1 (2012/12/07) 引数のDBTableModelが null の場合の処理。
    611
    612                DBTableModel newTable = oldTable.newModel();
    613                final int[] rowNo = getParameterRows();
    614                final int rowCount = rowNo.length ;
    615
    616                for( int i=0; i<rowCount; i++ ) {
    617                        newTable.addValues( oldTable.getValues(rowNo[i]), i );
    618                }
    619                return newTable;
    620        }
    621
    622        /**
    623         * 【TAG】(通常は使いません)結果のDBTableModelを、sessionに登録するときのキーを指定します
    624         *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])。
    625         *
    626         * @og.tag
    627         * 検索結果より、DBTableModelオブジェクトを作成します。これを、下流のviewタグ等に
    628         * 渡す場合に、通常は、session を利用します。その場合の登録キーです。
    629         * query タグを同時に実行して、結果を求める場合、同一メモリに配置される為、
    630         * この tableId 属性を利用して、メモリ空間を分けます。
    631         *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])。
    632         *
    633         * @param       id sessionに登録する時の ID
    634         */
    635        public void setTableId( final String id ) {
    636                tableId = nval( getRequestParameter( id ), tableId );
    637        }
    638
    639        /**
    640         * 【TAG】可変長ファイルを作成するときの項目区切り文字をセットします
    641         *              (初期値:TableWriter#TAB_SEPARATOR[={@og.value TableWriter#TAB_SEPARATOR}])。
    642         *
    643         * @og.tag 可変長ファイルを作成するときの項目区切り文字をセットします。
    644         * (初期値:TableWriter#TAB_SEPARATOR[={@og.value TableWriter#TAB_SEPARATOR}])。
    645         *
    646         * @param   separator 項目区切り文字
    647         * @see         org.opengion.hayabusa.io.TableWriter#TAB_SEPARATOR
    648         */
    649        public void setSeparator( final String separator ) {
    650                this.separator = nval( getRequestParameter( separator ),this.separator );
    651        }
    652
    653        /**
    654         * 【TAG】DBTableModelの出力順(LNSCD など)をセットします。
    655         *
    656         * @og.tag
    657         * Label,Name,Size,Class,Data の各フィールドの頭文字のアルファベットで
    658         * 出力順を設定します。
    659         *
    660         * @param   hs 出力順 (LNSCD など)
    661         */
    662        public void setHeaderSequence( final String hs ) {
    663                String[] headers = getRequestParameterValues( hs );
    664                if( headers != null ) {
    665                        StringBuilder buf = new StringBuilder();
    666                        for( int i=0; i<headers.length; i++ ) {
    667                                if( headers[i] != null ) { buf.append( headers[i] ); }
    668                        }
    669                        headerSequence = buf.toString();
    670                }
    671        }
    672
    673        /**
    674         * 【TAG】ファイル保存先ディレクトリ名を指定します。
    675         *
    676         * @og.tag
    677         * この属性で指定されるディレクトリに、ファイルをセーブします。
    678         * 指定方法は、通常の fileURL 属性と同様に、先頭が、'/' (UNIX) または、２文字目が、
    679         * ":" (Windows)の場合は、指定のURLそのままのディレクトリに、そうでない場合は、
    680         * システムパラメータ の FILE_URL 属性で指定のフォルダの下に、作成されます。
    681         * fileURL = "{&#064;USER.ID}" と指定すると、FILE_URL 属性で指定のフォルダの下に、
    682         * さらに、各個人ID別のフォルダを作成して、そこにセーブします。
    683         *
    684         * @og.rev 3.5.4.3 (2004/01/05) 内部処理を、makeFileURL に移動。
    685         * @og.rev 4.0.0.0 (2005/01/31) StringUtil.urlAppend メソッドの利用
    686         * @og.rev 4.0.0.0 (2007/11/20) 指定されたディレクトリ名の最後が"\"or"/"で終わっていない場合に、"/"を付加する。
    687         *
    688         * @param       url 保存先ディレクトリ名
    689         */
    690        public void setFileURL( final String url ) {
    691                String furl = nval( getRequestParameter( url ),null );
    692                if( furl != null ) {
    693                        char ch = furl.charAt( furl.length()-1 );
    694                        if( ch != '/' && ch != '\\' ) { furl = furl + "/"; }
    695                        fileURL = StringUtil.urlAppend( fileURL,furl );
    696                }
    697        }
    698
    699        /**
    700         * 【TAG】ファイルを作成するときのファイル名をセットします
    701         *              (初期値:FILE_ENCODE[={@og.value org.opengion.hayabusa.common.SystemData#FILE_ENCODE}])。
    702         *
    703         * @og.tag ファイルを作成するときのファイル名をセットします。
    704         * (初期値:システム定数のFILE_ENCODE[={@og.value org.opengion.hayabusa.common.SystemData#FILE_ENCODE}])。
    705         *
    706         * @param   filename ファイル名
    707         * @see         org.opengion.hayabusa.common.SystemData#FILE_ENCODE
    708         */
    709        public void setFilename( final String filename ) {
    710                this.filename = nval( getRequestParameter( filename ),this.filename );
    711        }
    712
    713        /**
    714         * 【TAG】EXCELファイルを書き出すときのシート名を設定します。
    715         *
    716         * @og.tag
    717         * EXCELファイルを書き出す時に、シート名を指定します。これにより、複数の形式の
    718         * 異なるデータを順次書き出したり(appendモードを併用)することや、シートを指定して
    719         * 新規にEXCELを作成することが可能になります。
    720         * 初期値は、Sheet1 です。
    721         *
    722         * @og.rev 3.5.4.2 (2003/12/15) 新規追加
    723         *
    724         * @param   sheet EXCELファイルのシート名
    725         */
    726        public void setSheetName( final String sheet ) {
    727                sheetName = nval( getRequestParameter( sheet ),sheetName );
    728        }
    729
    730        /**
    731         * 【TAG】ファイルを作成するときのファイルエンコーディング名をセットします
    732         *              (初期値:FILE_ENCODE[={@og.value org.opengion.hayabusa.common.SystemData#FILE_ENCODE}])。
    733         *
    734         * @og.tag
    735         * "DEFAULT","JISAutoDetect" ,"JIS", "EUC_JP", "MS932", "SJIS" , "Windows-31J" , "Shift_JIS"
    736         * (初期値:システム定数のFILE_ENCODE[={@og.value org.opengion.hayabusa.common.SystemData#FILE_ENCODE}])。
    737         *
    738         * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 エンコードの取得方法変更
    739         * @og.rev 3.1.3.0 (2003/04/10) FILE_ENCODE から、エンコード情報を取得する。
    740         *
    741         * @param   enc ファイルエンコーディング名
    742         * @see     <a href="http://www.iana.org/assignments/character-sets">IANA Charset Registry</a>
    743         * @see         org.opengion.hayabusa.common.SystemData#FILE_ENCODE
    744         */
    745        public void setEncode( final String enc ) {
    746                encode = nval( getRequestParameter( enc ),encode );
    747        }
    748
    749        /**
    750         * 【TAG】実際に書き出すクラス名の略称({@og.doc03Link writerClass TableWriter_**** クラスの ****})を指定します(初期値:Default)。
    751         *
    752         * @og.tag
    753         * 実際に書き出すクラス名(の略称)をセットします。
    754         * org.opengion.hayabusa.io.TableWriter インターフェースを継承したサブクラスです。
    755         * これは、org.opengion.plugin.io 以下の TableWriter_**** クラスの **** を与えます。
    756         * 属性クラス定義の {@link org.opengion.hayabusa.io.TableWriter TableWriter} を参照願います。
    757         * {@og.doc03Link writerClass TableWriter_**** クラス}
    758         *
    759         * ExcelRenderer と、Renderer は、特別な名前で、useRenderer 属性に、"true" をセットするのと同じ効果があります。
    760         * 実際は、ExcelRenderer ⇒ Excel 、Renderer  ⇒ Default のクラスが呼ばれます。
    761         *
    762         * @param   writerClass クラス名(の略称)
    763         * @see         org.opengion.hayabusa.io.TableWriter  TableWriterのサブクラス
    764         */
    765        public void setWriterClass( final String writerClass ) {
    766                this.writerClass = nval( getRequestParameter( writerClass ),this.writerClass );
    767        }
    768
    769        /**
    770         * 【TAG】追加モードで書き込むかどうか[true/false]を指定します(初期値:false[新規モード])。
    771         *
    772         * @og.tag DBTableModelのファイルを、追加モードで書き込むかどうかをセットします。
    773         *
    774         * @param   flag  [true:追加モード/それ以外:新規モード]
    775         */
    776        public void setFileAppend( final String flag ) {
    777                fileAppend = nval( getRequestParameter( flag ),fileAppend );
    778        }
    779
    780        /**
    781         * 【廃止】結果をダイレクトにEXCEL起動するかどうか[true/false]を指定します(初期値:false[ファイル])。
    782         *
    783         * @og.tag 結果をダイレクトに EXCEL ファイルとして出力するかどうかをセットします。
    784         *
    785         * @param  flag  [true:ダイレクト/それ以外:ファイル]
    786         * @deprecated 結果をダイレクトするとエンコード等でおかしな動きをする可能性がある。
    787         */
    788        @Deprecated public void setDirect( final String flag ) {
    789                direct = nval( getRequestParameter( flag ),direct );
    790        }
    791
    792        /**
    793         * 【TAG】結果をファイルに出力するときに、ZIPで圧縮するかどうか[true/false]を指定します(初期値:false)。
    794         *
    795         * @og.tag
    796         * 初期値は、圧縮しないです。
    797         *
    798         * @param  flag ZIPで圧縮する [true:圧縮する/それ以外:しない]
    799         */
    800        public void setZip( final String flag ) {
    801                zip = nval( getRequestParameter( flag ),zip );
    802        }
    803
    804        /**
    805         * 【TAG】Content-Disposition (inline:埋め込む/attachment:ダイアログを起動)を指定します(初期値:attachment)。
    806         *
    807         * @og.tag
    808         * Content-Disposition を指定することで、ブラウザにアプリケーションデータを
    809         * 埋め込むのか(inline)、セーブ/オープンのダイアログを起動するのか(attachment)
    810         * 指定します。
    811         * この属性が有効なのは、direct="true" で、zip="false"(初期値)のときのみです。
    812         * 値は、inline 、attachment が指定できます。
    813         * 初期値は、attachment です。
    814         * 注意：動作検証しましたが、inline と attachment で動作に差が現れませんでした。
    815         *
    816         * @og.rev 3.1.5.0 (2003/04/20) Content-Disposition を外部から指定できるように変更。
    817         * @og.rev 3.8.0.9 (2005/10/17) Content-Disposition 初期値変更 inline ⇒ attachment
    818         *
    819         * @param  pos Content-Disposition [inline/attachment]
    820         */
    821        public void setDisposition( final String pos ) {
    822                disposition = nval( getRequestParameter( pos ),disposition );
    823                if( !"inline".equals( disposition ) && !"attachment".equals( disposition ) ) {
    824                        String errMsg = "disposition には、inline か attachment 以外は指定できません。"
    825                                                + "disposition=[" + disposition + "]" ;
    826                        throw new HybsSystemException( errMsg );
    827                }
    828        }
    829
    830        /**
    831         * 【TAG】EXCEL雛型参照ファイルのディレクトリ名をセットします。
    832         *
    833         * @og.tag
    834         * この属性で指定されるディレクトリに、ファイルをセーブします。
    835         * 指定方法は、通常の fileURL 属性と同様に、先頭が、'/' (UNIX) または、２文字目が、
    836         * ":" (Windows)の場合は、指定のURLそのままのディレクトリに、そうでない場合は、
    837         * システムパラメータ の FILE_URL 属性で指定のフォルダの下に、作成されます。
    838         * fileURL = "{&#064;USER.ID}" と指定すると、FILE_URL 属性で指定のフォルダの下に、
    839         * さらに、各個人ID別のフォルダを作成して、そこにセーブします。
    840         *
    841         * @og.rev 3.5.4.3 (2004/01/05) 新規作成
    842         * @og.rev 4.0.0.0 (2005/01/31) StringUtil.urlAppend メソッドの利用
    843         * @og.rev 4.0.0.0 (2007/11/20) 指定されたディレクトリ名の最後が"\"or"/"で終わっていない場合に、"/"を付加する。
    844         *
    845         * @param       url EXCEL雛型参照ファイルのディレクトリ名
    846         */
    847        public void setRefFileURL( final String url ) {
    848                String furl = nval( getRequestParameter( url ),null );
    849                if( furl != null ) {
    850                        char ch = furl.charAt( furl.length()-1 );
    851                        if( ch != '/' && ch != '\\' ) { furl = furl + "/"; }
    852                        refFileURL = StringUtil.urlAppend( refFileURL,furl );
    853                }
    854        }
    855
    856        /**
    857         * 【TAG】EXCEL雛型参考ファイル名をセットします。
    858         *
    859         * @og.tag
    860         * 内部処理的には、雛形ファイルの雛形シートをメモリ上に構築し、
    861         * そのシートのセルに、データを追加していきます。
    862         * 最後には、雛形シートとして存在しない部分は、すべて削除します。
    863         * 雛形シートを使わない場合は、新規シートに追加していくことになります。
    864         * appendモードの場合は、オリジナルが雛形ファイルになります。
    865         * 雛形ファイルの指定は、無効になります。
    866         * ※ 互換性の為、同じ名前の設定は有効です。
    867         *
    868         * ※ Excel2007形式(XSSF)では、行全体を指定した色や罫線は、
    869         * セルとして認識されません。範囲指定で、罫線や色付けを行う必要があります。
    870         *
    871         * @og.rev 3.5.4.3 (2004/01/05) 新規作成
    872         *
    873         * @param   filename EXCEL雛型参考ファイル名
    874         */
    875        public void setRefFilename( final String filename ) {
    876                refFilename = nval( getRequestParameter( filename ),refFilename );
    877        }
    878
    879        /**
    880         * 【TAG】EXCEL雛型参考ファイルのシート名を設定します。
    881         *
    882         * @og.tag
    883         * EXCELファイルを書き出す時に、雛型として参照するシート名を指定します。
    884         * これにより、複数の形式の異なるデータを順次書き出したり(appendモードを併用)する
    885         * ことや、シートを指定して新規にEXCELを作成する場合にフォームを設定する事が可能になります。
    886         * 初期値は、null(第一シート) です。
    887         *
    888         * @og.rev 3.5.4.3 (2004/01/05) 新規追加
    889         *
    890         * @param   sheet EXCEL雛型参考ファイルのシート名
    891         */
    892        public void setRefSheetName( final String sheet ) {
    893                refSheetName = nval( getRequestParameter( sheet ),refSheetName );
    894        }
    895
    896        /**
    897         * 【TAG】追記モード時に、指定シートが存在した場合は上書きします(初期値:false[上書きしない])。
    898         *
    899         * @og.tag シート上書きを行うかどうか
    900         *
    901         * @og.rev 5.9.12.1 (2016/09/09) 追加
    902         *
    903         * @param   flag  [true:追加モード/それ以外:新規モード]
    904         */
    905        public void setSheetOverwrite( final String flag ) {
    906                sheetOverwrite = nval( getRequestParameter( flag ),sheetOverwrite );
    907        }
    908
    909        /**
    910         * 【TAG】EXCELで、出力処理の最後に、セル内の計算式を再計算させるシート名をカンマ区切りで指定します。
    911         *
    912         * @og.tag
    913         * 通常は利用する必要はありません。
    914         * 一覧結果を利用した集計用シートを別に持っているような雛形を利用した出力で利用します。
    915         *
    916         * @og.rev 5.9.12.1 (2016/09/09) 追加
    917         *
    918         * @param   sheet 対象シート名(カンマ区切り文字)
    919         */
    920        public void setRecalcSheetName( final String sheet ) {
    921                recalcSheetName = nval( getRequestParameter( sheet ),recalcSheetName );
    922        }
    923
    924        /**
    925         * 【TAG】EXCEL出力時のデフォルトフォント名を設定します
    926         *              (初期値:TABLE_WRITER_DEFAULT_FONT_NAME[={@og.value org.opengion.hayabusa.common.SystemData#TABLE_WRITER_DEFAULT_FONT_NAME}])。
    927         *
    928         * @og.tag
    929         * これは、EXCEL追加機能として実装されています。
    930         *
    931         * EXCELファイルを書き出す時に、デフォルトフォント名を指定します。
    932         * フォント名は、EXCELのフォント名をそのまま使用してください。
    933         * 内部的に、POI の org.apache.poi.hssf.usermodel.HSSFFont#setFontName( String )
    934         * に設定されます。
    935         * (初期値:システム定数のTABLE_WRITER_DEFAULT_FONT_NAME[={@og.value org.opengion.hayabusa.common.SystemData#TABLE_WRITER_DEFAULT_FONT_NAME}])。
    936         *
    937         * @og.rev 3.8.5.3 (2006/08/07) 新規追加
    938         *
    939         * @param   name デフォルトフォント名
    940         * @see         org.opengion.hayabusa.common.SystemData#TABLE_WRITER_DEFAULT_FONT_NAME
    941         */
    942        public void setFontName( final String name ) {
    943                fontName = nval( getRequestParameter( name ),fontName );
    944        }
    945
    946        /**
    947         * 【TAG】EXCEL出力時のデフォルトフォントポイント数を設定します。
    948         *
    949         * @og.tag
    950         * これは、EXCEL追加機能として実装されています。
    951         *
    952         * EXCELファイルを書き出す時に、デフォルトポイント数を指定します。
    953         * 内部的に、POI の org.apache.poi.hssf.usermodel.HSSFFont#setFontHeightInPoints( short )
    954         * に設定されます。
    955         * 初期値は、システムリソース の TABLE_WRITER_DEFAULT_FONT_POINTS です。
    956         *
    957         * @og.rev 3.8.5.3 (2006/08/07) 新規追加
    958         *
    959         * @param   point デフォルトフォントポイント数
    960         */
    961        public void setFontPoint( final String point ) {
    962                fontPoint = nval( getRequestParameter( point ),fontPoint );
    963        }
    964
    965        /**
    966         * 【TAG】行番号情報を、出力する/しない[true/false]を指定します(初期値:true)。
    967         *
    968         * @og.tag
    969         * 通常のフォーマットでは、各行の先頭に行番号を出力します。
    970         * これは、#NAME 属性を使用する場合には、必ず出力する必要があります。
    971         * (#NAME 属性は、読み取り時には、必須です。)
    972         * この、先頭の行番号が不要な場合(つまり、他のシステムへのデータ出力、
    973         * このシステムでは、#NAME 属性が出力されないため、読み込みできません。)
    974         * この行番号を出力しないようにできます。
    975         * なお、EXCEL 出力には、この設定は適用されません。(暫定対応)
    976         * 初期値は、true(出力する) です。
    977         *
    978         * @og.rev 3.7.0.2 (2005/02/14) 新規追加
    979         *
    980         * @param   useNo 行番号情報を指定 [true:出力する/false:しない]
    981         */
    982        public void setUseNumber( final String useNo ) {
    983                useNumber = nval( getRequestParameter( useNo ),useNumber );
    984        }
    985
    986        /**
    987         * 【TAG】書き込み先ファイルのカラム列を、外部(タグ)より指定します。
    988         *
    989         * @og.tag
    990         * この指定により、書き込むカラムを限定的に使用することが可能です。
    991         * カラム名は、検索したDBTableModel上に含まれる名前で指定する必要があります。
    992         * 別名で書き込みたい場合は、予めその名前で検索しておく必要があります。
    993         *
    994         * @og.rev 4.0.0.0 (2005/12/31) 新規作成
    995         *
    996         * @param   clms 書き込み先ファイルのカラム列(カンマ区切り文字)
    997         */
    998        public void setColumns( final String clms ) {
    999                columns = nval( getRequestParameter( clms ),columns );
    1000        }
    1001
    1002        /**
    1003         * 【TAG】書込処理でコードリソースのラベル変換を行うかどうかを指定します
    1004         *              (初期値:USE_TABLE_WRITER_RENDERER[={@og.value org.opengion.hayabusa.common.SystemData#USE_TABLE_WRITER_RENDERER}])。
    1005         *
    1006         * @og.tag
    1007         * コードリソースをそのままの値で出力すると、数字や記号になり何が書かれているのか
    1008         * 不明になります。
    1009         * これは、コードリソースをラベルに変換して出力するかどうかを指定します。
    1010         * 当然、コードはユニークですが、ラベルはユニークになるかどうか保障はされていませんので
    1011         * TableReader 系で読み込む場合には、リスクが発生します。
    1012         * また、TableReader 系で読み込む場合にも、ラベルからコードを求める逆変換を行うように、
    1013         * setUseRenderer メソッドで指定する必要があります。
    1014         *
    1015         * 従来は、TableWriter 系に、TableWriter_Renderer 系のクラスを作って対応していましたが、
    1016         * このメソッドの属性値のフラグで、制御します。
    1017         * (初期値:システム定数のUSE_TABLE_WRITER_RENDERER[={@og.value org.opengion.hayabusa.common.SystemData#USE_TABLE_WRITER_RENDERER}])。
    1018         *
    1019         * @og.rev 5.2.1.0 (2010/10/01) 新規作成
    1020         *
    1021         * @param  flag コードリソースのラベル変換を行うかどうか
    1022         * @see         org.opengion.hayabusa.common.SystemData#USE_TABLE_WRITER_RENDERER
    1023         */
    1024        public void setUseRenderer( final String flag ) {
    1025                useRenderer = nval( getRequestParameter( flag ),useRenderer );
    1026        }
    1027
    1028        /**
    1029         * 【TAG】(通常は使いません)データの書き込み開始行番号を設定します(初期値:0)。
    1030         *
    1031         * @og.tag
    1032         * TAB区切りテキストやEXCEL等のデータの書き込みの開始行番号を指定します。
    1033         * 属性名は、行を飛ばす処理ということで、readTable タグと同じ名称です。
    1034         * ファイルの先頭行が、０行としてカウントしますので、設定値は、読み飛ばす
    1035         * 件数になります。(１と指定すると、１行読み飛ばし、２行目から読み込みます。)
    1036         * 行の読み飛ばしと、カラムの読み飛ばし(columns)、refFileURL、refFilename、
    1037         * refSheetName とともに使用すれば、ある程度のレイアウト設定が可能です。
    1038         * なお、この機能は、TableWriter_Excel のみに実装します。
    1039         *
    1040         * @og.rev 5.7.9.0 (2014/08/08) 新規作成
    1041         *
    1042         * @param       count 書き込み開始行番号
    1043         */
    1044        public void setSkipRowCount( final String count ) {
    1045                skipRowCount = nval( getRequestParameter( count ),skipRowCount );
    1046        }
    1047
    1048        /**
    1049         * 【TAG】チェック行のみを対象にするかを指定します(初期値:true)。
    1050         *
    1051         * @og.tag
    1052         * falseを指定する事で、前画面でチェックした行のみを出力します。
    1053         * 初期値は全ての行を出力(true)です。
    1054         * 出力されるファイルの行番号は、1から振りなおされます。
    1055         *
    1056         * @og.rev 5.5.5.5 (2012/08/24) 新規作成
    1057         *
    1058         * @param   flag 対象にするか指定 [true:全件/false:対象のみ]
    1059         */
    1060        public void setSelectedAll( final String flag ) {
    1061                selectedAll = nval( getRequestParameter( flag ),selectedAll );          // 5.5.9.1 (2012/12/07) バグ対応
    1062        }
    1063
    1064        /**
    1065         * 【TAG】事前にファイルを削除するかどうかを指定します(初期値:false)。
    1066         *
    1067         * @og.tag
    1068         * 出力元の DBTableModel が、存在しないか、０件の場合、過去に作成したファイルが
    1069         * そのまま、残っていると、不要なトラブルのもととなる為、実行前に削除するか
    1070         * どうかを指定できます。
    1071         * なお、fileAppend="true"（追加モードで書き込むを指定)時には、データが０件でも
    1072         * 事前削除は行いません。
    1073         * 初期値は互換性のため削除しない(false)です。
    1074         *
    1075         * @og.rev 5.5.9.1 (2012/12/07) 新規作成
    1076         *
    1077         * @param   flag 事前削除するかどうか [true:削除する/false:削除しない]
    1078         */
    1079        public void setBeforeDelete( final String flag ) {
    1080                beforeDelete = nval( getRequestParameter( flag ),beforeDelete );
    1081        }
    1082
    1083        /**
    1084         * WriteTable オブジェクトに渡すパラメータオブジェクトをセットします。
    1085         *
    1086         * @og.tag
    1087         * WriteTableParamTag クラスよりセットされます。
    1088         *
    1089         * @og.rev 4.0.0.0 (2005/02/28) 新規追加
    1090         *
    1091         * @param   entry HybsEntryオブジェクト
    1092         */
    1093        protected void addParam( final HybsEntry entry ) {
    1094                if( param == null ) { param = new ArrayList<HybsEntry>(); }
    1095                param.add( entry );
    1096        }
    1097
    1098        /**
    1099         * シリアライズ用のカスタムシリアライズ書き込みメソッド
    1100         *
    1101         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
    1102         * @serialData 一部のオブジェクトは、シリアライズされません。
    1103         *
    1104         * @param       strm    ObjectOutputStreamオブジェクト
    1105         * @throws IOException  入出力エラーが発生した場合
    1106         */
    1107        private void writeObject( final ObjectOutputStream strm ) throws IOException {
    1108                strm.defaultWriteObject();
    1109        }
    1110
    1111        /**
    1112         * シリアライズ用のカスタムシリアライズ読み込みメソッド
    1113         *
    1114         * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。
    1115         *
    1116         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
    1117         * @serialData 一部のオブジェクトは、シリアライズされません。
    1118         *
    1119         * @param       strm    ObjectInputStreamオブジェクト
    1120         * @see #release2()
    1121         * @throws IOException  シリアライズに関する入出力エラーが発生した場合
    1122         * @throws ClassNotFoundException       クラスを見つけることができなかった場合
    1123         */
    1124        private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
    1125                strm.defaultReadObject();
    1126        }
    1127
    1128        /**
    1129         * 【TAG】保存先ストレージタイプを設定します。
    1130         *
    1131         * @og.tag
    1132         * ファイルを読み取り元の、ストレージタイプを設定します。
    1133         * 未設定の場合は、システムリソースの「CLOUD_TARGET」が参照されます。
    1134         * 自身のサーバを指定する場合は、「default」を設定してください。
    1135         *
    1136         * @og.rev 5.10.9.0 (2019/03/01) 新規追加
    1137         *
    1138         * @param storage 保存先ストレージタイプ
    1139         */
    1140        public void setStorageType( final String storage ) {
    1141                storageType = nval( getRequestParameter( storage ), storageType );
    1142        }
    1143
    1144        /**
    1145         * 【TAG】保存先バケット名を設定します。
    1146         *
    1147         * @og.tag
    1148         * ファイルを読み取り元の、バケット名を指定します。
    1149         * クラウドストレージ利用時のみ有効です。
    1150         * 未設定の場合は、システムリソースの「CLOUD_BUKET」が参照されます。
    1151         *
    1152         * @og.rev 5.10.9.0 (2019/03/01) 新規追加
    1153         *
    1154         * @param bucket 保存先バケット名
    1155         */
    1156        public void setBucketName( final String bucket ) {
    1157                bucketName = nval( getRequestParameter( bucket ), bucketName );
    1158        }
    1159
    1160        /**
    1161         * このオブジェクトの文字列表現を返します。
    1162         * 基本的にデバッグ目的に使用します。
    1163         *
    1164         * @og.rev 5.10.9.0 (2019/03/01) 出力対象に、storageType,bucketNameを追加。
    1165         *
    1166         * @return このクラスの文字列表現
    1167         */
    1168        @Override
    1169        public String toString() {
    1170                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
    1171                                .println( "VERSION"                     ,VERSION                )
    1172                                .println( "BASE_URL"            ,BASE_URL               )
    1173                                .println( "separator"           ,separator              )
    1174                                .println( "headerSequence"      ,headerSequence )
    1175                                .println( "fileURL"                     ,fileURL                )
    1176                                .println( "filename"            ,filename               )
    1177                                .println( "refFileURL"          ,refFileURL             )
    1178                                .println( "refFilename"         ,refFilename    )
    1179                                .println( "encode"                      ,encode                 )
    1180                                .println( "writerClass"         ,writerClass    )
    1181                                .println( "fileAppend"          ,fileAppend             )
    1182                                .println( "direct"                      ,direct                 )
    1183                                .println( "zip"                         ,zip                    )
    1184                                .println( "disposition"         ,disposition    )
    1185                                .println( "tableId"                     ,tableId                )
    1186                                .println( "sheetName"           ,sheetName              )
    1187                                .println( "refSheetName"        ,refSheetName   )
    1188                                .println( "useNumber"           ,useNumber              )
    1189                                .println( "storageType"         ,storageType    )
    1190                                .println( "bucketName"          ,bucketName             )
    1191                                .println( "Other..."    ,getAttributes().getAttribute() )
    1192                                .fixForm().toString() ;
    1193        }
    1194}