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