    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 * ●形式：&lt;og:report fileURL="[･･･]" listId="[･･･]" ･･･ /&gt;
    044 * ●body：なし
    045 *
    046 * ●Tag定義：
    047 *   &lt;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】固定部の{&#064;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 *   /&gt;
    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】固定部の{&#064;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) または、２文字目が、
    415         * ":" (Windows)の場合は、指定のURLそのままのディレクトリに、そうでない場合は、
    416         * システムパラメータ の FILE_URL 属性で指定のフォルダの下に、作成されます。
    417         * fileURL = "{&#064;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) または、２文字目が、
    457         * ":" (Windows)の場合は、指定のURLそのままのディレクトリに、そうでない場合は、
    458         * システムパラメータ の FILE_URL 属性で指定のフォルダの下に、作成されます。
    459         * fileURL = "{&#064;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}