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