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