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.File;
021import java.io.IOException;
022import java.io.ObjectInputStream;
023import java.io.ObjectOutputStream;
024
025import org.opengion.fukurou.model.FileOperation;
026import org.opengion.fukurou.util.FileUtil;
027import org.opengion.fukurou.util.Shell;
028import org.opengion.fukurou.util.StringUtil ;
029import org.opengion.hayabusa.common.HybsSystem;
030import org.opengion.hayabusa.common.HybsSystemException;
031import org.opengion.hayabusa.db.DBTableModel;
032import org.opengion.hayabusa.io.HybsFileOperationFactory;
033import org.opengion.hayabusa.report.DBTableReport;
034
035/**
036 * 検索結果の DBTableModelオブジェクトをレポート形式に変換するタグです。
037 *
038 * データ(DBTableModel)と、コントローラ(DBTableReport クラス)を与えて、
039 * 外部からコントロールすることで、各種形式で データ(DBTableModel)を表示させることが
040 * 可能です。
041 *
042 * @og.formSample
043 * ●形式:<og:report fileURL="[・・・]" listId="[・・・]" ・・・ />
044 * ●body:なし
045 *
046 * ●Tag定義:
047 *   <og:report
048 *       listId           ○【TAG】帳票IDを指定します(必須)。
049 *       fileURL            【TAG】雛型のHTMLファイルの保存してある ディレクトリを指定します
050 *       programFile        【TAG】HTMLファイルをEXCEL変換する場合に使用するBATファイルを指定します
051 *       outFileURL         【TAG】出力HTMLファイルの保存してあるディレクトリを指定します
052 *       outFilename      ○【TAG】ファイルを作成するときの出力ファイル名をセットします(必須)。
053 *       headerKeys         【TAG】固定部の{@KEY} の KEY 部分をCSV形式で複数指定します
054 *       headerVals         【TAG】固定部のKEY に対応する値をCSV形式で複数指定します
055 *       footerKeys         【TAG】繰り返し部の終了後に表示する key 部分をCSV形式で複数指定します
056 *       footerVals         【TAG】固定部のKEY に対応する値をCSV形式で複数指定します
057 *       pageEndCut         【TAG】ボディー部(繰り返し部)がなくなったときに、それ以降を表示するかどうか[true/false]を指定します(初期値:true)
058 *       reportClass        【TAG】実際に書き出すクラス名の略称(DBTableReport_**** の ****)をセットします(初期値:HTML)
059 *       language           【TAG】タグ内部で使用する言語コード[ja/en/zh/…]を指定します
060 *       scope              【TAG】キャッシュする場合のスコープ[request/page/session/applicaton]を指定します(初期値:session)
061 *       tableId            【TAG】(通常使いません)sessionから所得する DBTableModelオブジェクトの ID
062 *       storageType        【TAG】生成した帳票の出力先ストレージタイプを指定します。
063 *       bucketName          【TAG】生成した帳票の出力先バケット名を指定します。
064 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
065 *   />
066 *
067 * ●使用例
068 *
069 *
070 * @og.rev 5.10.9.0 (2019/03/01) oota クラウドストレージ対応を追加。(Fileクラスを拡張)
071 * 
072 * @og.group その他出力
073 *
074 * @version  4.0
075 * @author   Kazuhiko Hasegawa
076 * @since    JDK5.0,
077 */
078public class ReportTableTag extends CommonTagSupport {
079        //* このプログラムのVERSION文字列を設定します。   {@value} */
080        private static final String VERSION = "4.0.0.0 (2007/11/28)" ;
081
082        private static final long serialVersionUID = 400020071128L ;    // 4.0.0.0 (2007/11/28)
083
084        // 印刷時に使用するテンポラリフォルダ名
085        private final String REPORT_URL =
086                nval( HybsSystem.sys( "REPORT_FILE_URL" ) ,
087                                 HybsSystem.sys( "FILE_URL" ) + "REPORT/" ) ;
088
089        // 3.8.0.4 (2005/08/08) 印刷時に使用するシステムID
090        private static final String SYSTEM_ID =HybsSystem.sys( "SYSTEM_ID" );
091
092        // 3.8.0.4 (2005/08/08) 帳票出力に準拠した方式に変更
093        private final int TIMEOUT = HybsSystem.sysInt( "REPORT_DAEMON_TIMEOUT" );
094
095        private final String  BASE_URL  = HybsSystem.sys( "FILE_URL" );
096
097        private String[]  headerKeys    = null;   // 固定部の{@KEY} の KEY 部分を指定する。カンマで複数指定できる。
098        private String[]  headerVals    = null;   // 固定部のKEY に対応する値を指定する。 {@KEY} に置き換わる。
099        private String[]  footerKeys    = null;   // 繰り返し部の終了後に表示する key 部分を指定する。カンマで複数指定できる。
100        private String[]  footerVals    = null;   // 繰り返し部の終了後に表示する key に対する値を指定する。
101        private boolean   pageEndCut    = true;   // ボディー部(繰り返し部)がなくなったときに、それ以降のページを出力するか指定する。
102        private String    fileURL               = BASE_URL;             // 雛型のHTMLファイルの保存してある ディレクトリを指定します。
103        private String    outFileURL    = BASE_URL;             // 出力HTMLファイルの保存してある ディレクトリを指定します。
104        private String    outFilename   = null;                 // 出力HTMLファイル名を指定します。 ディレクトリ名を含んでも構いません。
105        private String    reportClass   = "HTML";
106
107        private transient DBTableModel table    = null;
108        private String  tableId                 = HybsSystem.TBL_MDL_KEY ;
109        // 3.8.0.4 (2005/08/08) 帳票出力に準拠した方式に変更
110        private String  listId                  = null ;        // 雛型のHTMLファイル名を指定します。
111        private String  programFile             = null;         // HTMLファイルのEXCEL化を行うバッチファイルを指定します。
112//      private boolean direct                  = false;
113//      private static final String             disposition = "inline"; // 固定
114        private String  storageType             = null;         // 5.10.9.0 (2019/03/01) ADD
115        private String  bucketName              = null;         // 5.10.9.0 (2019/03/01) ADD
116
117        /**
118         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
119         *
120         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
121         * @og.rev 3.8.0.4 (2005/08/08) 帳票出力に準拠した方式に変更
122         * @og.rev 4.0.0.0 (2007/10/18) メッセージリソース統合( getResource().getMessage ⇒ getResource().getLabel )
123         * @og.rev 4.0.0.0 (2007/11/28) メソッドの戻り値をチェックします。
124         * @og.rev 5.10.9.0 (2019/03/01) クラウドストレージ対応を追加。
125         *
126         * @return      後続処理の指示
127         */
128        @Override
129        public int doEndTag() {
130                debugPrint();
131
132//              int rtnCode = EVAL_PAGE;
133                final int rtnCode;
134
135                table = (DBTableModel)getObject( tableId );
136                if( table == null || table.getRowCount() == 0 ) {
137                        rtnCode = SKIP_PAGE ;           // ページの残りの処理を行わない。
138                }
139                else {
140
141//                      try {
142                                synchronized( ReportTableTag.class ) {
143                                        String reportDir  = HybsSystem.url2dir( REPORT_URL ) + SYSTEM_ID + HybsSystem.FS + listId ;
144                        //              String ykno       = HybsSystem.getDate( "yyyyMMddHHmmss" );
145                                        String ykno       = String.valueOf( Math.round( Math.random() * 1000000 ) ) ;
146
147                                        create( reportDir,ykno ) ;
148                                        
149                                        // 処理クラス(reportClass)が HTML の場合は、Shell を起動して、VBS で EXCEL化が必要。
150                                        if( programFile != null && "HTML".equalsIgnoreCase( reportClass ) ) {
151                                                String htmlFile = reportDir + HybsSystem.FS + ykno ;
152                                                String cmd = makeShellCommand( htmlFile,listId );
153                                                programRun( cmd );
154                                        }
155
156                                        if( outFilename != null ) {
157                                                File xlsFile = new File( reportDir,ykno + ".xls" );
158                                                File outDir  = new File( HybsSystem.url2dir( outFileURL ) );
159//                                              if( !outDir.exists() ) { outDir.mkdirs(); }
160                                                if( !outDir.exists() && !outDir.mkdirs() ) {
161                                                        String errMsg = "所定のフォルダを作成できませんでした。[" + outDir + "]" ;
162                                                        throw new RuntimeException( errMsg );
163                                                }
164                                                File outFile = new File( outDir,outFilename );
165                //                              File outFile = new File( outFileURL,outFilename );
166                                                FileUtil.copy(  xlsFile , outFile );
167
168                                                // 5.10.9.0 (2019/03/01) ADD クラウドストレージ指定の場合は、作成されたファイルをアップロードします。
169                                                FileOperation cloudFile = HybsFileOperationFactory.create(storageType, bucketName, outDir, outFilename);
170                                                if(!cloudFile.isLocal()) {
171                                                        FileUtil.copy( outFile, cloudFile);
172                                                        outFile.delete();
173                                                }
174                                                
175//                                              String msg = getResource().getMessage( "MSG0003" )              // MSG0003=ファイルの登録が完了しました。
176                                                String msg = getResource().getLabel( "MSG0003" )                // MSG0003=ファイルの登録が完了しました。
177                                                                        + HybsSystem.BR
178//                                                                      + getResource().getMessage( "MSG0022" )         // MSG0022=ファイル名
179                                                                        + getResource().getLabel( "MSG0022" )   // MSG0022=ファイル名
180                                                                        + ":" + outFile.getAbsolutePath() ;
181                                                jspPrint( msg );
182
183//                                              if( direct ) {
184//                                                      directLoad( outFile.getAbsolutePath(),outFilename );
185//                                                      directLoad( xlsFile.getAbsolutePath(),outFilename );
186//                                              }
187                                        }
188//                                      else {
189//                                              String redirectUrl = StringUtil.urlAppend( sys( "CONTEXT_URL" ),
190//                                                                                              REPORT_URL + SYSTEM_ID + "/" +
191//                                                                                              listId + "/" + ykno + ".xls" ) ;
192//                                              HttpServletResponse response = (HttpServletResponse)pageContext.getResponse();
193//                                              response.sendRedirect( response.encodeRedirectURL( redirectUrl ) );
194//                                      }
195                                }
196//                      }
197//                      catch(IOException ex) {
198//                              String errMsg = "Error in ReportTableTag: " + toString();
199//                              throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並び順変更
200//                      }
201                        rtnCode = EVAL_PAGE ;
202                }
203
204                return( rtnCode );
205        }
206
207        /**
208         * タグリブオブジェクトをリリースします。
209         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
210         *
211         * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加
212         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
213         * @og.rev 3.1.3.0 (2003/04/10) REPORT_ENCODE(帳票エンコーディング)を利用するように修正。
214         * @og.rev 3.8.0.4 (2005/08/08) filename 削除、listId ,programFile 追加 ,
215         * @og.rev 5.10.9.0 (2019/03/01) storageType,bucketNameを追加。
216         *
217         */
218        @Override
219        protected void release2() {
220                super.release2();
221                headerKeys              = null;
222                headerVals              = null;
223                footerKeys              = null;
224                footerVals              = null;
225                pageEndCut              = true;
226                fileURL                 = BASE_URL;
227                outFileURL              = BASE_URL;
228                outFilename             = null;                 // 出力ファイル名
229                reportClass             = "HTML";
230                table                   = null;
231                tableId                 = HybsSystem.TBL_MDL_KEY ;
232                listId                  = null ;                // 3.8.0.4 (2005/08/08)
233                programFile             = null ;                // 3.8.0.4 (2005/08/08)
234//              direct                  = false;
235                storageType     = null;                 // 5.10.9.0 (2019/03/01) ADD
236                bucketName      = null;                 // 5.10.9.0 (2019/03/01) ADD
237        }
238
239        /**
240         * TableWriter の実オブジェクトを生成して,PrintWriter に書き込みます。
241         *
242         * @og.rev 3.1.3.0 (2003/04/10) REPORT_ENCODE(帳票エンコーディング)を利用するように修正。
243         * @og.rev 3.5.4.3 (2004/01/05) HTMLDBTableReport のクラス名変更。
244         * @og.rev 3.6.0.0 (2004/09/17) メソッド名の変更。setInputFile ⇒ setTemplateFile
245         * @og.rev 3.8.0.0 (2005/06/07) setTemplateFile メソッドの引数を String  ⇒ File に変更
246         * @og.rev 3.8.0.4 (2005/08/08) 帳票出力に準拠した方式に変更
247         * @og.rev 4.0.0.0 (2005/01/31) lang ⇒ ResourceManager へ変更
248         * @og.rev 5.10.9.0 (2019/03/01) クラウドストレージ対応を追加。
249         *
250         * @param       reportDir       出力ディレクトリ名
251         * @param       ykno            要求番号
252         */
253        private void create( final String reportDir,final String ykno )  {
254
255                String className = "org.opengion.hayabusa.report.DBTableReport_" + reportClass  ;
256                DBTableReport report = (DBTableReport)HybsSystem.newInstance( className );      // 3.5.5.3 (2004/04/09)
257
258                String MODELDIR = HybsSystem.url2dir( fileURL ) ;
259
260                File templateFile      = null;
261                File firstTemplateFile = null;
262
263                // 本来は、各クラス中で処理すべき。そのためのオブジェクト指向なのだから。
264                if( "HTML".equalsIgnoreCase( reportClass ) ) {
265                        // 5.10.9.0 (2019/03/01) MODIFY クラウドストレージ利用の場合の処理を追加。
266                        templateFile      = FileUtil.checkFile( MODELDIR, listId + ".html" , 1 );
267                        firstTemplateFile = FileUtil.checkFile( MODELDIR, listId + "_FIRST.html" ,1 );
268                }
269                else if( "Excel".equalsIgnoreCase( reportClass ) ) {
270                        // 5.10.9.0 (2019/03/01) MODIFY クラウドストレージ利用の場合の処理を追加。
271                        templateFile      = FileUtil.checkFile( MODELDIR, listId + ".xls" , 1 );
272                }
273                else {
274                        String errMsg = "リポートクラスがサポート外です。[" + reportClass + "]"
275                                                + "クラスは、HTML、Excel のみサポートされています。" ;
276                        throw new RuntimeException( errMsg );
277                }
278
279                FileUtil.copy( templateFile,new File( reportDir ) );
280
281                report.setDBTableModel( table );
282                report.setTemplateFile( templateFile ); // 3.6.0.0 (2004/09/17)
283                report.setFirstTemplateFile( firstTemplateFile );       // 3.6.0.0 (2004/09/17)
284                report.setOutputDir( reportDir );
285                report.setOutputFileKey( ykno );
286                report.setHeaderKeys( headerKeys );
287                report.setHeaderVals( headerVals );
288                report.setFooterKeys( footerKeys );
289                report.setFooterVals( footerVals );
290                report.setPageEndCut( pageEndCut );
291                report.setResourceManager( getResource() );     // 4.0.0 (2005/01/31)
292                report.setListId( listId );             // 3.6.1.0 (2005/01/05)
293                report.writeReport();
294        }
295
296        /**
297         * 【TAG】(通常は使いません)結果のDBTableModelを、sessionに登録するときのキーを指定します
298         *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])。
299         *
300         * @og.tag
301         * 検索結果より、DBTableModelオブジェクトを作成します。これを、下流のviewタグ等に
302         * 渡す場合に、通常は、session を利用します。その場合の登録キーです。
303         * query タグを同時に実行して、結果を求める場合、同一メモリに配置される為、
304         * この tableId 属性を利用して、メモリ空間を分けます。
305         *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])。
306         *
307         * @param       id sessionに登録する時の ID
308         */
309        public void setTableId( final String id ) {
310                tableId = nval( getRequestParameter( id ), tableId );
311        }
312
313        /**
314         * 【TAG】帳票IDを指定します。
315         *
316         * @og.tag
317         * 雛形ファイルは、帳票ID.html となります。また、ファーストページ対応の場合は、
318         * 帳票ID_FIRST.html になります。
319         * なお、filename 属性が指定された場合は、そちらが優先されます。
320         *
321         * @og.rev 3.8.0.4 (2005/08/08) 新規追加
322         *
323         * @param       listId  帳票ID
324         */
325        public void setListId( final String listId ) {
326                this.listId = nval( getRequestParameter( listId ), this.listId );
327        }
328
329        /**
330         * 【TAG】固定部の{@KEY} の KEY 部分をCSV形式で複数指定します。
331         *
332         * @og.tag
333         * カンマで複数指定できます。
334         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
335         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
336         *
337         * @og.rev 3.5.6.2 (2004/07/05) 先に配列に分解してからリクエスト変数の値を取得
338         *
339         * @param   hKeys 固定部の key
340         */
341        public void setHeaderKeys( final String hKeys ) {
342                headerKeys = getCSVParameter( hKeys );
343        }
344
345        /**
346         * 【TAG】固定部のKEY に対応する値をCSV形式で複数指定します。
347         *
348         * @og.tag
349         * カンマで複数指定で、リクエスト情報でも設定できます。
350         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
351         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
352         *
353         * @og.rev 3.5.6.2 (2004/07/05) 先に配列に分解してからリクエスト変数の値を取得
354         *
355         * @param   hVals 固定部の値
356         */
357        public void setHeaderVals( final String hVals ) {
358                headerVals = getCSVParameter( hVals );
359        }
360
361        /**
362         * 【TAG】繰り返し部の終了後に表示する key 部分をCSV形式で複数指定します。
363         *
364         * @og.tag
365         * カンマで複数指定できます。
366         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
367         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
368         *
369         * @og.rev 3.5.6.2 (2004/07/05) 先に配列に分解してからリクエスト変数の値を取得
370         *
371         * @param   ftKeys 繰り返し部の終了後に表示する key
372         */
373        public void setFooterKeys( final String ftKeys ) {
374                footerKeys = getCSVParameter( ftKeys );
375        }
376
377        /**
378         * 【TAG】固定部のKEY に対応する値をCSV形式で複数指定します。
379         *
380         * @og.tag
381         * カンマで複数指定で、リクエスト情報でも設定できます。
382         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
383         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
384         *
385         * @og.rev 3.5.6.2 (2004/07/05) 先に配列に分解してからリクエスト変数の値を取得
386         * @og.rev 3.8.1.2 (2005/12/19) footer 関連の値とpageEndCut の関係を解除します。
387         *
388         * @param   ftVals 繰り返し部の終了後に表示する値
389         */
390        public void setFooterVals( final String ftVals ) {
391                footerVals = getCSVParameter( ftVals );
392        }
393
394        /**
395         * 【TAG】ボディー部(繰り返し部)がなくなったときに、それ以降を表示するかどうか[true/false]を指定します(初期値:true)。
396         *
397         * @og.tag
398         * true では、それ以降を出力しません。
399         * 初期値は "true" (なくなった時点で、出力しない。)です。
400         *
401         * @og.rev 3.8.1.2 (2005/12/19) footer 関連の値とpageEndCut の関係を解除します。
402         *
403         * @param   peCut 繰り返し部の終了後に継続処理するかどうか (true:処理しない/false:処理する)
404         */
405        public void setPageEndCut( final String peCut ) {
406                pageEndCut = nval( getRequestParameter( peCut ),pageEndCut );
407        }
408
409        /**
410         * 【TAG】雛型のHTMLファイルの保存してある ディレクトリを指定します。
411         *
412         * @og.tag
413         * この属性で指定されるディレクトリのファイルを読み取ります。
414         * 指定方法は、通常の fileURL 属性と同様に、先頭が、'/' (UNIX) または、2文字目が、
415         * ":" (Windows)の場合は、指定のURLそのままのディレクトリに、そうでない場合は、
416         * システムパラメータ の FILE_URL 属性で指定のフォルダの下に、作成されます。
417         * fileURL = "{@USER.ID}" と指定すると、FILE_URL 属性で指定のフォルダの下に、
418         * さらに、各個人ID別のフォルダを作成して、そこを操作します。
419         *
420         * @og.rev 4.0.0.0 (2005/01/31) StringUtil.urlAppend メソッドの利用
421         * @og.rev 4.0.0.0 (2007/11/20) 指定されたディレクトリ名の最後が"\"or"/"で終わっていない場合に、"/"を付加する。
422         *
423         * @param       url 雛型のHTMLファイルのディレクトリ
424         */
425        public void setFileURL( final String url ) {
426                String furl = nval( getRequestParameter( url ),null );
427                if( furl != null ) {
428                        char ch = furl.charAt( furl.length()-1 );
429                        if( ch != '/' && ch != '\\' ) { furl = furl + "/"; }
430                        fileURL = StringUtil.urlAppend( fileURL,furl );
431                }
432        }
433
434        /**
435         * 【TAG】HTMLファイルをEXCEL変換する場合に使用するBATファイルを指定します。
436         *
437         * @og.tag
438         * ファイルは、フルパスで指定してください。
439         * 指定がない場合は、変換処理は行いません。
440         * 通常は、dbdef2/def/Script/runExcelPrint.bat を呼び出してください。
441         * 初期値は、null(変換処理しない)です。
442         *
443         * @og.rev 3.8.0.4 (2005/08/08) 新規追加
444         *
445         * @param   programFile プログラムファイル名
446         */
447        public void setProgramFile( final String programFile ) {
448                this.programFile = nval( getRequestParameter( programFile ),this.programFile );
449        }
450
451        /**
452         * 【TAG】出力HTMLファイルの保存してあるディレクトリを指定します。
453         *
454         * @og.tag
455         * この属性で指定されるディレクトリにファイルを出力します。
456         * 指定方法は、通常の fileURL 属性と同様に、先頭が、'/' (UNIX) または、2文字目が、
457         * ":" (Windows)の場合は、指定のURLそのままのディレクトリに、そうでない場合は、
458         * システムパラメータ の FILE_URL 属性で指定のフォルダの下に、作成されます。
459         * fileURL = "{@USER.ID}" と指定すると、FILE_URL 属性で指定のフォルダの下に、
460         * さらに、各個人ID別のフォルダを作成して、そこに出力します。
461         *
462         * @og.rev 4.0.0.0 (2007/11/20) 指定されたディレクトリ名の最後が"\"or"/"で終わっていない場合に、"/"を付加する。
463         *
464         * @param       url 出力HTMLファイルのディレクトリ
465         */
466        public void setOutFileURL( final String url ) {
467                String furl = nval( getRequestParameter( url ),null );
468                if( furl != null ) {
469                        char ch = furl.charAt( furl.length()-1 );
470                        if( ch != '/' && ch != '\\' ) { furl = furl + "/"; }
471                        outFileURL = StringUtil.urlAppend( outFileURL,furl );
472                }
473        }
474
475        /**
476         * 【TAG】ファイルを作成するときの出力ファイル名をセットします。
477         *
478         * @og.tag ファイルを作成するときの出力ファイル名をセットします。
479         *
480         * @param   filename 出力ファイル名
481         */
482        public void setOutFilename( final String filename ) {
483                this.outFilename = nval( getRequestParameter( filename ),this.outFilename );
484        }
485
486        /**
487         * 【TAG】実際に書き出すクラス名の略称(DBTableReport_**** の ****)をセットします(初期値:HTML)。
488         *
489         * @og.tag
490         * これは、org.opengion.hayabusa.report 以下の DBTableReport_**** クラスの **** を
491         * 与えます。これらは、DBTableReport インターフェースを継承したサブクラスです。
492         * 初期値は、"HTML" です。
493         * 属性クラス定義の {@link org.opengion.hayabusa.report.DBTableReport DBTableReport} を参照願います。
494         *
495         * @param   reportClass クラス名(の略称)
496         * @see         org.opengion.hayabusa.report.DBTableReport  DBTableReportのサブクラス
497         */
498        public void setReportClass( final String reportClass ) {
499                this.reportClass = nval( getRequestParameter( reportClass ),this.reportClass );
500        }
501
502        /**
503         * 【TAG】結果をダイレクトにEXCEL起動するかどうか[true/false]を指定します(初期値:false[ファイル])。
504         *
505         * @og.tag 結果をダイレクトに EXCEL ファイルとして出力するかどうかをセットします。
506         *
507         * @param  flag ダイレクト(true)/ ファイル(その他)
508         */
509//      public void setDirect( final String flag ) {
510//              direct = nval( getRequestParameter( flag ),direct );
511//      }
512
513        /**
514         * シェルコマンドの文字列を作成します。
515         *
516         * 処理クラス(reportClass)が HTML の場合は、Shell を起動して、VBS で EXCEL化が必要。
517         *
518         * @og.rev 3.8.0.4 (2005/08/08) 新規追加
519         * @og.rev 3.8.0.8 (2005/10/03) デーモングループのデフォルト値設定
520         *
521         * @param       htmlFile        パーサ済みのHTMLファイル(拡張子なし)
522         * @param       listId  雛形ファイル(帳票ID)
523         *
524         * @return シェルコマンドの文字列
525         */
526        private String makeShellCommand( final String htmlFile,final String listId ) {
527                StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_SMALL );
528
529                buf.append( programFile ).append( " " );                // 実行するコマンド
530                buf.append( "\"" );
531                buf.append( htmlFile ).append( "_*.html\" " );  // 入力HTMLファイル
532                buf.append( "\"xls\" " );                                               // プリンタ名
533                // ダミーファイルを指定する必要がある。
534                buf.append( "\"" );
535                buf.append( htmlFile ).append( ".xls\" " );             // ダミー出力ファイル
536                buf.append( listId );                                                   // モデルファイル名
537                buf.append( " NULL" );                                                  // ダミーデーモングループ
538
539                return buf.toString();
540        }
541
542        /**
543         * 実際のレポート出力処理を行います。
544         *
545         * 処理クラス(reportClass)が HTML の場合は、Shell を起動して、VBS で EXCEL化が必要。
546         *
547         * @og.rev 3.8.0.4 (2005/08/08) 新規追加
548         *
549         * @param       shellCmd        シェルを実行するコマンド文字列
550         */
551        private void programRun( final String shellCmd ) {
552                Shell shell = new Shell();
553                shell.setCommand( shellCmd,true );              // BATCHプロセスで実行する
554                shell.setWait( true );                                  // プロセスの終了を待つ
555                shell.setTimeout( TIMEOUT );                    // 3.6.1.0 (2005/01/05) Shell の タイムアウトを設定
556
557                int rtnCode = shell.exec();                             // 0 は正常終了を示す
558
559                if( rtnCode != 0 ) {
560                        String errMsg = "Shell Command exequte Error." + HybsSystem.CR
561                                                + "=============================="
562                                                + shellCmd + HybsSystem.CR
563                                                + shell.getStdoutData() + HybsSystem.CR
564                                                + shell.getStderrData() + HybsSystem.CR ;
565                        throw new HybsSystemException( errMsg );                // 3.5.5.4 (2004/04/15) 引数の並び順変更
566                }
567        }
568
569        /**
570         * Excel ファイルをダイレクトで返す forward 処理を行います。
571         *
572         * @og.rev 4.0.0.0 (2007/06/11) 新規追加
573         *
574         * @param       fwdUrl  実際に転送するファイルアドレス
575         * @param       fname   転送で返すファイル名
576         */
577//      private void directLoad( final String fwdUrl,final String fname ) {
578//              HttpServletResponse response = (HttpServletResponse)pageContext.getResponse();
579//
580//              try {
581//                      String url = response.encodeRedirectURL( fwdUrl );      // 3.5.4.9 (2004/02/25)
582//                      String filename = StringUtil.urlEncode( fname );
583//
584//                      (response).setHeader( "Content-Disposition",disposition + "; filename=\"" + filename + "\"" );
585//                      response.sendRedirect( url );
586//      //              pageContext.forward( url );
587//              } catch(IOException ex) {
588//                      String errMsg = "フォワードでIOエラーが発生しました。" + toString();
589//                      throw new HybsSystemException( errMsg,ex );
590////            } catch( ServletException ex) {
591////                    String errMsg = "フォワードでServletエラーが発生しました。" + toString();
592////                    throw new HybsSystemException( errMsg,ex );
593//              }
594//      }
595
596        /**
597         * タグの名称を、返します。
598         * 自分自身のクラス名より、自動的に取り出せないため、このメソッドをオーバーライドします。
599         *
600         * @og.rev 4.0.0.0 (2005/01/31) 新規追加
601         *
602         * @return  タグの名称
603         */
604        @Override
605        protected String getTagName() {
606                return "report" ;
607        }
608
609        /**
610         * シリアライズ用のカスタムシリアライズ書き込みメソッド
611         *
612         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
613         * @serialData 一部のオブジェクトは、シリアライズされません。
614         *
615         * @param       strm    ObjectOutputStreamオブジェクト
616         * @throws IOException  入出力エラーが発生した場合
617         */
618        private void writeObject( final ObjectOutputStream strm ) throws IOException {
619                strm.defaultWriteObject();
620        }
621
622        /**
623         * シリアライズ用のカスタムシリアライズ読み込みメソッド
624         *
625         * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。
626         *
627         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
628         * @serialData 一部のオブジェクトは、シリアライズされません。
629         *
630         * @param       strm    ObjectInputStreamオブジェクト
631         * @see #release2()
632         * @throws IOException  シリアライズに関する入出力エラーが発生した場合
633         * @throws ClassNotFoundException       クラスを見つけることができなかった場合
634         */
635        private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
636                strm.defaultReadObject();
637        }
638        
639        /**
640         * 【TAG】保存先のストレージタイプを設定します。
641         *  
642         * @og.tag
643         * ファイルを保存先の、ストレージタイプを設定します。
644         * 未設定の場合は、システムリソースの「CLOUD_TARGET」が参照されます。
645         * 自身のサーバを指定する場合は、「default」を設定してください。
646         * 
647         * @og.rev 5.10.9.0 (2019/03/01) 新規追加
648         * 
649         * @param storage 保存先ストレージタイプ
650         */
651        public void setStorageType( final String storage ) {
652                storageType = nval( getRequestParameter(storage), storageType );
653        }
654        
655        /**
656         * 【TAG】バケット名を設定します。
657         * 
658         * @og.tag
659         * バケット名を指定します。
660         * クラウドストレージ利用時のみ有効です。
661         * 未設定の場合は、システムリソースの「CLOUD_BUKET」が参照されます。
662         * 
663         * @og.rev 5.10.9.0 (2019/03/01) 新規追加
664         * 
665         * @param bucket バケット名
666         */
667        public void setBucketName( final String bucket ) {
668                bucketName = nval( getRequestParameter(bucket), bucketName );
669        }
670        
671        /**
672         * このオブジェクトの文字列表現を返します。
673         * 基本的にデバッグ目的に使用します。
674         *
675         * @og.rev 5.10.9.0 (2019/03/01) storageType, bucketNameを出力対象に追加。
676         * 
677         * @return このクラスの文字列表現
678         */
679        @Override
680        public String toString() {
681                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
682                                .println( "VERSION"             ,VERSION        )
683                                .println( "headerKeys"          ,headerKeys             )
684                                .println( "headerVals"          ,headerVals             )
685                                .println( "footerKeys"          ,footerKeys             )
686                                .println( "footerVals"          ,footerVals             )
687                                .println( "pageEndCut"          ,pageEndCut             )
688                                .println( "fileURL"                     ,fileURL                )
689                                .println( "outFileURL"          ,outFileURL             )
690                                .println( "outFilename"         ,outFilename    )
691                                .println( "reportClass"         ,reportClass    )
692                                .println( "tableId"                     ,tableId                )
693                                .println( "listId"                      ,listId                 )
694                                .println( "programFile"         ,programFile    )
695                                .println( "REPORT_FILE_URL"     ,REPORT_URL             )
696                                .println( "SYSTEM_ID"           ,SYSTEM_ID              )
697                                .println( "TIMEOUT"                     ,TIMEOUT                )
698                                .println( "BASE_URL"            ,BASE_URL               )
699                                .println( "storageType"         ,storageType    )
700                                .println( "bucketName"          ,bucketName             )
701                                .println( "Other..."    ,getAttributes().getAttribute() )
702                                .fixForm().toString() ;
703        }
704}