    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.hayabusa.taglib;
    017
    018import org.opengion.hayabusa.common.HybsSystem;
    019import org.opengion.hayabusa.common.HybsSystemException;
    020import org.opengion.fukurou.util.StringUtil;
    021import org.opengion.fukurou.util.ToString;                                              // 6.1.1.0 (2015/01/17)
    022import org.opengion.fukurou.util.Shell;
    023import org.opengion.fukurou.util.ArraySet;                                              // 6.4.3.4 (2016/03/11)
    024
    025import static org.opengion.fukurou.util.StringUtil.nval ;
    026import static org.opengion.fukurou.system.HybsConst.BR;                 // 6.1.0.0 (2014/12/26) refactoring
    027
    028import java.io.File;
    029import java.util.Set;                                                                                   // 6.4.3.4 (2016/03/11)
    030
    031/**
    032 * ネイティブなプロセスを作成し、バッチファイルやアプリケーションを起動するタグです。
    033 *
    034 * プロセスの状態に応じて、下記のリターンコードが得られます。
    035 *
    036 *     SHELL.RTN_CODE = 0  : 正常    (ページの残りを評価する。)
    037 *     SHELL.RTN_CODE = 1  : 処理中  (ページの残りを評価する。)
    038 *     SHELL.RTN_CODE = 9  : 取消    (ページの残りを評価する。)
    039 *     SHELL.RTN_CODE = -1 : 異常終了(useStop:true ページの残りの処理を行わない。false:残りを評価する。)
    040 *
    041 * 異常終了の場合は、このタグ以降の処理を中止します。
    042
    043 * wait 属性を使用して、処理の終了を待たずに、復帰することも出来ます。この場合は、
    044 * SHELL.RTN_CODE = 1 となり、そのまま、処理は継続されます。このSHELL.RTN_CODE は、
    045 * リクエスト変数にセットされていますので、そのまま、value タグで、取得可能です。
    046 *
    047 * action 属性に指定できるアクション名は、以下のとおりです。
    048 *
    049 *         RUN      Shellオブジェクトを生成/実行します。(セッションに登録しません。)
    050 *         SET      Shellオブジェクトを生成/実行し、セッションに登録します。
    051 *                  すでにセッションに登録済みのShellオブジェクトが実行中の場合は、途中経過を報告します。
    052 *         GET      セッションに登録されている Shellオブジェクトを呼び出します。
    053 *                  セッションに登録されていない場合は、異常終了になります。
    054 *         REMOVE   セッションから、Shellオブジェクトを削除します。
    055 *                  Shellが実行中の場合は強制終了します。
    056 *
    057 * @og.formSample
    058 * ●形式：&lt;og:shell program="…" /&gt;
    059 * ●body：なし
    060 *
    061 * ●Tag定義：
    062 *   &lt;og:shell
    063 *       program          ○【TAG】シェルファイルを実行する時に引き渡すコマンドを指定します(必須)。
    064 *       useBatch           【TAG】BATCHプロセスを実行するのかどうか[true/false]を指定します(初期値:false)
    065 *       wait               【TAG】プロセスの終了を待つかどうか[true/false]を指定します(初期値:true[待つ])
    066 *       timeout            【TAG】プロセスの実行処理のタイムアウトを設定します (初期値:SHELL_TIMEOUT[=3600])
    067 *       stdout             【TAG】実行結果を標準出力に出力するかどうか[true/false]を指定します(初期値:false)
    068 *       stderr             【TAG】実行結果をエラー出力に出力するかどうか[true/false]を指定します(初期値:false)
    069 *       info               【TAG】インフォメーション情報を出力するかどうか[true/false]を指定します(初期値:false)
    070 *       action             【TAG】アクション(RUN,SET,GET,REMOVE)をセットします(初期値:RUN)
    071 *       workDir            【TAG】作業ディレクトリを指定します(初期値:Java仮想マシンの作業ディレクトリ)
    072 *       envKeys            【TAG】環境変数のキーをCSV形式で指定します(初期値:現状のJava仮想マシンの環境)
    073 *       envVals            【TAG】環境変数の値をCSV形式で指定します(初期値:現状のJava仮想マシンの環境)
    074 *       display            【TAG】処理結果を画面に表示するかどうか[true/false]指定します(初期値:true)
    075 *       useStop            【TAG】エラー時に停止するかどうか[true/false]を指定します(初期値:true) 7.1.0.0 (2020/01/20)
    076 *       caseKey            【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null)
    077 *       caseVal            【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null)
    078 *       caseNN             【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない)
    079 *       caseNull           【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない)
    080 *       caseIf             【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない)
    081 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    082 *   /&gt;
    083 *
    084 * ●使用例
    085 *    &lt;og:shell
    086 *        program  = "プログラム"      dir /S や、abc.bat  など
    087 *        action   = "アクション"      [RUN/SET/GET/REMOVE]
    088 *        useBatch = "バッチ使用"      バッチ：true/false                      (初期値:false)
    089 *        wait     = "終了待ち"        処理終了まで待つ:true/待たない:false    (初期値:true)
    090 *        stdout   = "標準出力使用"    標準出力使用:true/未使用:false          (初期値:false)
    091 *        stderr   = "エラー出力使用"  エラー出力使用:true/未使用:false        (初期値:false)
    092 *        info     = "状態表示"        シェルの状態表示:true/未使用:false      (初期値:false)
    093 *        display  = "画面表示"        画面に表示する:true/表示しない:false    (初期値:true)
    094 *        useStop  = "エラー時停止"    エラー時に停止する:true/停止しない:alse (初期値:true) 7.1.0.0 (2020/01/20)
    095 *    /&gt;
    096 *
    097 *    &lt;og:value command="GET" key="SHELL.RTN_CODE" /&gt;
    098 *
    099 * @og.group その他部品
    100 *
    101 * @version  4.0
    102 * @author   Kazuhiko Hasegawa
    103 * @since    JDK5.0,
    104 */
    105public class ShellTag extends CommonTagSupport {
    106        /** このプログラムのVERSION文字列を設定します。   {@value} */
    107        private static final String VERSION = "7.1.0.0 (2020/01/20)" ;
    108        private static final long serialVersionUID = 710020200120L ;
    109
    110        /** action 引数に渡す事の出来る コマンド  実行 {@value} */
    111        public static final String ACT_RUN  = "RUN" ;
    112        /** action 引数に渡す事の出来る コマンド  登録 {@value} */
    113        public static final String ACT_SET  = "SET" ;
    114        /** action 引数に渡す事の出来る コマンド  取得 {@value} */
    115        public static final String ACT_GET  = "GET" ;
    116        /** action 引数に渡す事の出来る コマンド  削除 {@value} */
    117        public static final String ACT_REMOVE  = "REMOVE" ;
    118
    119        // 6.4.3.4 (2016/03/11) String配列 から、Setに置き換えます。
    120        private static final Set<String> ACTION_SET = new ArraySet<>( ACT_RUN , ACT_SET , ACT_GET , ACT_REMOVE );
    121
    122        private static final String RTN_CODE = "SHELL.RTN_CODE" ;
    123
    124        private String  program         ;
    125        private boolean useBatch        ;                       // BATCHプロセスを実行するのかどうか(初期値:false)
    126        private boolean stdout          ;                       // 標準出を出力するかどうか(初期値:false)
    127        private boolean stderr          ;                       // エラー出力を出力するかどうか(初期値:false)
    128        private boolean wait            = true;         // プロセスの終了を待つ(true)/待たない(false) (初期値:true)
    129        private boolean info            ;                       // インフォメーションを出力するかどうか(初期値:false)
    130        private boolean display         = true;         // 処理結果を画面に表示するかどうか(初期値:true)
    131        private String  action          = ACT_RUN;
    132        private File    workDir         ;
    133        private String[]        envKeys ;
    134        private String[]        envVals ;
    135
    136        private boolean useStop         = true;         // 7.1.0.0 (2020/01/20) エラー時に処理を停止(true)するかどうか
    137
    138        // 3.6.1.0 (2005/01/05) タイムアウト時間を設定
    139        private int timeout     = HybsSystem.sysInt( "SHELL_TIMEOUT" );
    140
    141        /**
    142         * デフォルトコンストラクター
    143         *
    144         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
    145         */
    146        public ShellTag() { super(); }          // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
    147
    148        /**
    149         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
    150         *
    151         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    152         * @og.rev 3.1.9.0 (2003/05/16) Shell への stdout と stderr の取得設定は廃止。ShellTag では、有効。
    153         * @og.rev 3.3.3.0 (2003/07/09) デバッグ時の表示ロジックを追加。
    154         * @og.rev 6.3.4.0 (2015/08/01) caseKey,caseVal,caseNN,caseNull,caseIf 属性対応
    155         * @og.rev 7.1.0.0 (2020/01/20) useStop 属性を追加
    156         *
    157         * @return      後続処理の指示
    158         */
    159        @Override
    160        public int doEndTag() {
    161                debugPrint();           // 4.0.0 (2005/02/28)
    162                if( !useTag() ) { return EVAL_PAGE ; }  // 6.3.4.0 (2015/08/01)
    163
    164                final int rtnCode = actionExec( action );
    165
    166                if( isDebug() ) {
    167                        jspPrint( "Return Code=[" + rtnCode + "]" );
    168                }
    169
    170                setRequestAttribute( RTN_CODE, String.valueOf( rtnCode ) );
    171
    172                // rtnCode = 0  : 正常    (ページの残りを評価する。)
    173                // rtnCode = 1  : 処理中  (ページの残りを評価する。)
    174                // rtnCode = 9  : 取消    (ページの残りを評価する。)
    175                // rtnCode = -1 : 異常終了(ページの残りの処理を行わない。)
    176
    177                // 7.1.0.0 (2020/01/20) useStop 属性を追加。エラー時に処理を停止(true)するかどうか。
    178                if( useStop && rtnCode < 0 ) {
    179                        return SKIP_PAGE ;              // ページの残りの処理を行わない。
    180                }
    181                else {
    182                        return EVAL_PAGE ;              // ページの残りを評価する。
    183                }
    184
    185//              if( rtnCode >= 0 ) {
    186//                      return EVAL_PAGE ;              // ページの残りを評価する。
    187//              }
    188//              else {
    189//                      return SKIP_PAGE ;              // ページの残りの処理を行わない。
    190//              }
    191        }
    192
    193        /**
    194         * タグリブオブジェクトをリリースします。
    195         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    196         *
    197         * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加
    198         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    199         * @og.rev 3.1.9.0 (2003/05/16) action コマンド追加
    200         * @og.rev 3.3.3.0 (2003/07/09) action コマンドの動きを修正。
    201         * @og.rev 3.6.0.1 (2004/09/29) display 属性を追加
    202         * @og.rev 3.6.1.0 (2005/01/05) timeout 属性を追加
    203         * @og.rev 7.1.0.0 (2020/01/20) useStop 属性を追加
    204         *
    205         */
    206        @Override
    207        protected void release2() {
    208                super.release2();
    209                program         = null;
    210                useBatch        = false;        // BATCHプロセスを実行するのかどうか(初期値:false)
    211                stdout          = false;        // 標準出を出力するかどうか(初期値:false)
    212                stderr          = false;        // エラー出力を出力するかどうか(初期値:false)
    213                wait            = true;         // プロセスの終了を待つ(true)/待たない(false) (初期値:true)
    214                action          = ACT_RUN;
    215                info            = false;
    216                display         = true;         // 3.6.0.1 (2004/09/29)
    217                useStop         = true;         // 7.1.0.0 (2020/01/20) エラー時に処理を停止(true)するかどうか
    218                timeout         = HybsSystem.sysInt( "SHELL_TIMEOUT" );
    219        }
    220
    221        /**
    222         * アクションを実行します。
    223         *
    224         * アクションは,指定のアクションコマンドに対応する処理を入力データに
    225         * 対して行います。[RUN/SET/GET/REMOVE]
    226         *
    227         * @og.rev 3.1.9.0 (2003/05/16) 新規追加
    228         *
    229         * @param   action アクションコマンド (public static final 宣言されている文字列)
    230         *
    231         * @return  リターンコード    0:正常  1:実行中  9:取消  -1:異常終了
    232         */
    233        private int actionExec( final String action ) {
    234                int rtnCode = 1;
    235                if(      ACT_RUN.equals(     action ) ) { rtnCode = shellRun(); }
    236                else if( ACT_SET.equals(     action ) ) { rtnCode = shellSet(); }
    237                else if( ACT_GET.equals(     action ) ) { rtnCode = shellGet(); }
    238                else if( ACT_REMOVE.equals(  action ) ) { rtnCode = shellRemove(); }
    239
    240                return rtnCode ;
    241        }
    242
    243        /**
    244         * Shell オブジェクトを新規作成します。
    245         *
    246         * @og.rev 3.3.3.0 (2003/07/09) 新規追加
    247         * @og.rev 3.6.1.0 (2005/01/05) タイムアウト時間を設定
    248         *
    249         * @return      Shellオブジェクト
    250         */
    251        private Shell makeShell() {
    252                final Shell shell = new Shell();
    253                shell.setCommand( program,useBatch );
    254                shell.setWait( wait );
    255                shell.setTimeout( timeout );            // 3.6.1.0 (2005/01/05)
    256                shell.setWorkDir( workDir );
    257                shell.setEnvP( makeEnvpArray( envKeys,envVals ) );
    258
    259                if( isDebug() ) {
    260                        jspPrint( shell.getCommand() + BR );
    261                }
    262
    263                return shell ;
    264        }
    265
    266        /**
    267         * 環境変数設定用の文字列配列を作成します。
    268         * これは、キー配列と値配列を、key=value という文字列にして、配列を返します。
    269         *
    270         * @og.rev 3.3.3.0 (2003/07/09) 新規追加
    271         * @og.rev 3.6.0.0 (2004/09/22) 引数のキー、値がnull 等の場合は、長さ０配列を返します。
    272         *
    273         * @param       keys    環境変数のキー配列
    274         * @param       vals    環境変数の値配列
    275         *
    276         * @return  環境変数設定用の文字列配列(キー=値の文字列を配列にセット)
    277         * @og.rtnNotNull
    278         */
    279        private String[] makeEnvpArray( final String[] keys, final String[] vals ) {
    280                if( keys == null || keys.length == 0 || vals == null || vals.length == 0 ) {
    281                        return new String[0];
    282                }
    283
    284                if( keys.length != vals.length ) {
    285                        final String errMsg = "キーとバリューの個数が異なります。"
    286                                                + CR
    287                                                + " keys.length=[" + keys.length + "]  vals.length=[" + vals.length + "]"
    288                                                + CR
    289                                                + " keys=" + StringUtil.array2csv( keys )
    290                                                + CR
    291                                                + " vals=" + StringUtil.array2csv( vals );              // 5.1.8.0 (2010/07/01) errMsg 修正
    292                        throw new HybsSystemException( errMsg );
    293                }
    294
    295                String[] envp = new String[keys.length];
    296                for( int i=0; i<envp.length; i++ ) {
    297                        envp[i] = keys[i] + "=" + vals[i] ;
    298                }
    299
    300                return envp ;
    301        }
    302
    303        /**
    304         * RUN アクションを実行します。
    305         *
    306         * Shellオブジェクトを生成/実行します。(セッションに登録しません。)
    307         *
    308         * @og.rev 3.1.9.0 (2003/05/16) 新規追加
    309         * @og.rev 3.3.3.0 (2003/07/09) Shell オブジェクトを、makeShell() メソッドより作成します。
    310         *
    311         * @return  リターンコード    0:正常  1:実行中  9:取消  -1:異常終了
    312         */
    313        private int shellRun() {
    314                final Shell shell = makeShell();
    315                final int rtnCode = shell.exec();               // 0 は正常終了を示す
    316                shellView( shell );
    317
    318                return rtnCode ;
    319        }
    320
    321        /**
    322         * SET アクションを実行します。
    323         *
    324         * Shellオブジェクトを生成/実行し、セッションに登録します。
    325         * wait 等でShellの終了を待たない方式では、有用です。
    326         *
    327         * @og.rev 3.1.9.0 (2003/05/16) 新規追加
    328         *
    329         * @return  リターンコード    0:正常  1:実行中  9:取消  -1:異常終了
    330         */
    331        private int shellSet() {
    332                final int rtnCode;
    333
    334                Shell shell = (Shell)getSessionAttribute( HybsSystem.SHELL_KEEP_KEY );
    335                if( shell == null || shell.isEnd() ) {
    336                        shell = makeShell();
    337                        rtnCode = shell.exec();         // 0 は正常終了を示す
    338                        setSessionAttribute( HybsSystem.SHELL_KEEP_KEY,shell );
    339                }
    340                else {
    341                        rtnCode = shell.exitValue();
    342                }
    343                shellView( shell );
    344
    345                return rtnCode ;
    346        }
    347
    348        /**
    349         * GET アクションを実行します。
    350         *
    351         * セッションに登録されている Shellオブジェクトを呼び出します。
    352         *
    353         * @og.rev 3.1.9.0 (2003/05/16) 新規追加
    354         * @og.rev 3.3.3.0 (2003/07/09) アクション時の内容を出力します。
    355         *
    356         * @return  リターンコード    0:正常  1:実行中  9:取消  -1:異常終了
    357         */
    358        private int shellGet() {
    359                int rtnCode = 0;
    360
    361                final Shell shell = (Shell)getSessionAttribute( HybsSystem.SHELL_KEEP_KEY );
    362                if( shell != null ) { rtnCode = shell.exitValue(); }
    363                shellView( shell );
    364
    365                return rtnCode ;
    366        }
    367
    368        /**
    369         * REMOVE アクションを実行します。
    370         *
    371         * セッションから、Shellオブジェクトを削除します。
    372         * Shell が実行中ならば、強制終了させます。
    373         *
    374         * @og.rev 3.1.9.0 (2003/05/16) 新規追加
    375         * @og.rev 3.3.3.0 (2003/07/09) アクション時の内容を出力します。
    376         *
    377         * @return  リターンコード    0:正常  1:実行中  9:取消  -1:異常終了
    378         */
    379        private int shellRemove() {
    380                int rtnCode = 0;
    381
    382                final Shell shell = (Shell)getSessionAttribute( HybsSystem.SHELL_KEEP_KEY );
    383                if( shell != null ) {
    384                        shell.destroy();
    385                        rtnCode = shell.exitValue();
    386                }
    387                shellView( shell );
    388
    389                removeSessionAttribute( HybsSystem.SHELL_KEEP_KEY );
    390
    391                return rtnCode ;
    392        }
    393
    394        /**
    395         * シェルの実行内容を、画面に表示します。
    396         *
    397         * @og.rev 3.3.3.0 (2003/07/09) 新規追加
    398         * @og.rev 3.6.0.1 (2004/09/29) display 属性を考慮
    399         * @og.rev 4.0.0.0 (2007/10/18) メッセージリソース統合( getResource().getMessage ⇒ getResource().getLabel )
    400         * @og.rev 7.1.0.0 (2020/01/20) display 属性で、info,stdout,stderr のすべてをOFFにする。
    401         *
    402         * @param shell   シェルオブジェクト
    403         */
    404        private void shellView( final Shell shell ) {
    405                if( shell == null ) {
    406                        // MSG0066=処理は存在していません。
    407                        jspPrint( getResource().getLabel( "MSG0066" ) );
    408                        return ;
    409                }
    410
    411                final int rtnCode = shell.exitValue();
    412
    413                final String msg ;
    414                switch( rtnCode ) {
    415                        case Shell.OK      : msg = "MSG0063"; break;    // MSG0063=完了しました。
    416                        case Shell.RUNNING : msg = "MSG0067"; break;    // MSG0067=処理は実行中です。
    417                        case Shell.CANCEL  : msg = "MSG0069"; break;    // MSG0069=処理をキャンセルしました。
    418        //              case Shell.ERROR   : msg = "MSG0068"; break;    // MSG0068=処理の実行中にエラーが発生しました。
    419                        default            : msg = "MSG0068"; break;    // MSG0068=処理の実行中にエラーが発生しました。
    420                }
    421
    422                // 3.6.0.1 (2004/09/29) display 属性を考慮(display=true か、ERROR の場合は表示)
    423//              if( display || rtnCode == Shell.ERROR ) {
    424//                      jspPrint( getResource().getLabel( msg ) + BR );
    425//              }
    426                //  7.1.0.0 (2020/01/20) display 属性で、info,stdout,stderr のすべてをOFFにする。
    427                if( display ) {
    428                        jspPrint( getResource().getLabel( msg ) + BR );
    429
    430                        if( info ) {
    431                                jspPrint( shell.toString() );
    432                        }
    433                        if( stdout ) {
    434                                jspPrint( StringUtil.htmlFilter( shell.getStdoutData() ) );
    435                        }
    436                        if( stderr ) {
    437                                jspPrint( "<div class=\"row_mark\">"  );
    438                                jspPrint( StringUtil.htmlFilter( shell.getStderrData() ) );
    439                                jspPrint( "</div>" );
    440                        }
    441                }
    442        }
    443
    444        /**
    445         * 【TAG】シェルファイルを実行する時に引き渡すコマンドを指定します。
    446         *
    447         * @og.tag シェルファイルを実行する時に引き渡すコマンド
    448         *
    449         * @param   val シェルコマンド
    450         */
    451        public void setProgram( final String val ) {
    452                program = getRequestParameter( val );
    453        }
    454
    455        /**
    456         * 【TAG】BATCHプロセスを実行するのかどうか[true/false]を指定します(初期値:false)。
    457         *
    458         * @og.tag
    459         * BATCHファイルの実行と、EXEファイルの実行では、cmd.exe 経由するか
    460         * どうか、判断が必要です。true(BATCHプロセス)では、cmd.exe 経由で実行、
    461         * false(EXEファイル)では、直接実行します。
    462         * 初期値は、false(EXEファイル)です。
    463         *
    464         * @param   flag BATCHプロセスを実行するのかどうか [true:BATCHプロセス/false:EXEファイル]
    465         */
    466        public void setUseBatch( final String flag ) {
    467                useBatch = nval( getRequestParameter( flag ),useBatch );
    468        }
    469
    470        /**
    471         * 【TAG】実行結果を標準出力に出力するかどうか[true/false]を指定します(初期値:false)。
    472         *
    473         * @og.tag 実行結果の標準出力を出力するかどうか(初期値:false)
    474         *
    475         * @param   flag 実行結果の標準出力 [true:出力する/false:しない]
    476         */
    477        public void setStdout( final String flag ) {
    478                stdout = nval( getRequestParameter( flag ),stdout );
    479        }
    480
    481        /**
    482         * 【TAG】実行結果をエラー出力に出力するかどうか[true/false]を指定します(初期値:false)。
    483         *
    484         * @og.tag 実行結果のエラー出力を出力するかどうか(初期値:false)
    485         *
    486         * @param   flag 実行結果のエラー出力 [true:出力する/false:しない]
    487         */
    488        public void setStderr( final String flag ) {
    489                stderr = nval( getRequestParameter( flag ),stderr );
    490        }
    491
    492        /**
    493         * 【TAG】プロセスの終了を待つかどうか[true:待つ/false:待たない]を指定します(初期値:true[待つ])。
    494         *
    495         * @og.tag プロセスの終了を待つ(true)/待たない(false) (初期値:true)
    496         *
    497         * @param   flag 終了待ち [true:待つ/false:待たない]
    498         */
    499        public void setWait( final String flag ) {
    500                wait = nval( getRequestParameter( flag ),wait );
    501        }
    502
    503        /**
    504         * 【TAG】プロセスの実行処理のタイムアウトを設定します
    505         *              (初期値:SHELL_TIMEOUT[={@og.value SystemData#SHELL_TIMEOUT}])。
    506         *
    507         * @og.tag
    508         * ゼロ(0) の場合は、割り込みが入るまで待ちつづけます。
    509         * その場合、確実に終了させる手段を用意しておかないと、いつまで待っても以下の処理が
    510         * 実行されない(デッドロック)状態になってしまいます。
    511         * (初期値:システム定数のSHELL_TIMEOUT[={@og.value SystemData#SHELL_TIMEOUT}])。
    512         *
    513         * @og.rev 3.6.1.0 (2005/01/05) 新規追加
    514         *
    515         * @param       tout    タイムアウト時間(秒) (ゼロは、無制限)
    516         * @see         org.opengion.hayabusa.common.SystemData#SHELL_TIMEOUT
    517         */
    518        public void setTimeout( final String tout ) {
    519                timeout = nval( getRequestParameter( tout ),timeout );
    520        }
    521
    522        /**
    523         * 【TAG】インフォメーション情報を出力するかどうか[true/false]を指定します(初期値:false)。
    524         *
    525         * @og.tag インフォメーション情報を出力するかどうか(初期値:false)
    526         *
    527         * @og.rev 3.1.9.0 (2003/05/16) 新規追加
    528         *
    529         * @param   flag インフォメーション情報 [true:出力する/false:しない]
    530         */
    531        public void setInfo( final String flag ) {
    532                info = nval( getRequestParameter( flag ),info );
    533        }
    534
    535        /**
    536         * 【TAG】処理結果を画面に表示するかどうか[true/false]指定します(初期値:true)。
    537         *
    538         * @og.tag
    539//       * 処理結果が、異常でない場合のみ、この機能が有効になります。
    540//       * 各種処理を連続で行う場合、最後にエラーが発生したにもかかわらず、
    541//       * 先に正常終了している場合に、不要なメッセージを出すと、紛らわしい為です。
    542         *
    543         * display="false" に設定すると、info,stdout,stderr のすべての出力をOFFにします。
    544         * 初期値は、true(表示する)です。
    545         *
    546         * @og.rev 3.6.0.1 (2004/09/29) 新規追加
    547         * @og.rev 7.1.0.0 (2020/01/20) display 属性で、info,stdout,stderr のすべてをOFFにする。
    548         *
    549         * @param   flag 処理結果を画面に表示するかどうか [true:出力する/false:しない]
    550         */
    551        public void setDisplay( final String flag ) {
    552                display = nval( getRequestParameter( flag ),display );
    553        }
    554
    555        /**
    556         * 【TAG】アクション[RUN/SET/GET/REMOVE]をセットします(初期値:RUN)。
    557         *
    558         * @og.tag
    559         * アクションは,HTMLから(get/post)指定されますので,ACT_xxx で設定される
    560         * フィールド定数値のいづれかを、指定できます。
    561         * 初期値は、RUN です。
    562         *
    563         * RUN      Shellオブジェクトを生成/実行します。(セッションに登録しません。)
    564         * SET      Shellオブジェクトを生成/実行し、セッションに登録します。
    565         * GET      セッションに登録されている Shellオブジェクトを呼び出します。
    566         * REMOVE   セッションから、Shellオブジェクトを削除します。
    567         *          Shellが実行中の場合は強制終了します。
    568         *
    569         * @og.rev 3.1.9.0 (2003/05/16) 新規追加
    570         * @og.rev 3.5.6.2 (2004/07/05) 文字列の連結にStringBuilderを使用します。
    571         * @og.rev 6.3.4.0 (2015/08/01) Arrays.toString から String.join に置き換え。
    572         * @og.rev 6.4.3.4 (2016/03/11) String配列 から、Setに置き換えます。
    573         *
    574         * @param       act アクション [RUN/SET/GET/REMOVE]
    575         * @see         <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.ShellTag.ACT_RUN">アクション定数</a>
    576         */
    577        public void setAction( final String act ) {
    578                action = nval( getRequestParameter( act ),action );
    579                if( !check( action, ACTION_SET ) ) {
    580                        final String errMsg = "指定のアクションは実行できません。アクションエラー"       + CR
    581                                                        + "action=[" + action + "] "                                                            + CR
    582                                                        + "actionList=" + String.join( ", " , ACTION_SET ) ;
    583                        throw new HybsSystemException( errMsg );
    584                }
    585        }
    586
    587        /**
    588         * 【TAG】作業ディレクトリを指定します(初期値:Java仮想マシンの作業ディレクトリ)。
    589         *
    590         * @og.tag
    591         * シェルを実行する、作業ディレクトリを指定します。
    592         * 絶対パスで指定することも、相対パスで指定することも出来ます。
    593         * 相対パスの場合は、ドキュメントベースの物理パスが基準になります。
    594         * (そのJSPファイル自身のディレクトリが基準ではありません。)
    595         * 指定しない場合は、このJava仮想マシンの作業ディレクトリで実行されます。
    596         *
    597         * @og.rev 3.3.3.0 (2003/07/09) 新規追加
    598         *
    599         * @param   dir 作業ディレクトリ
    600         */
    601        public void setWorkDir( final String dir ) {
    602                final String work = HybsSystem.url2dir( getRequestParameter( dir ) );
    603                workDir = new File( work );
    604                if( ! workDir.isDirectory() ) {
    605                        final String errMsg = "指定の作業ディレクトリは、使用できません。"
    606                                                        + CR
    607                                                        + "workDir=[" + workDir + "] "
    608                                                        + CR ;
    609                        throw new HybsSystemException( errMsg );
    610                }
    611        }
    612
    613        /**
    614         * 【TAG】環境変数のキーをCSV形式で指定します(初期値:現状のJava仮想マシンの環境)。
    615         *
    616         * @og.tag
    617         * シェル実行時の環境変数のキーを、CSVV形式で指定します。
    618         * 指定がない場合は、現状のJava仮想マシンの環境が引き継がれます。
    619         * envVals と対応していなければなりません。
    620         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
    621         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
    622         *
    623         * @og.rev 3.3.3.0 (2003/07/09) 新規追加
    624         * @og.rev 3.5.6.2 (2004/07/05) CommonTagSupport#getCSVParameter を使用
    625         *
    626         * @param   keys 環境変数のキー
    627         */
    628        public void setEnvKeys( final String keys ) {
    629                envKeys = getCSVParameter( keys );
    630        }
    631
    632        /**
    633         * 【TAG】環境変数の値をCSV形式で指定します(初期値:現状のJava仮想マシンの環境)。
    634         *
    635         * @og.tag
    636         * シェル実行時の環境変数の値を、CSVV形式で指定します。
    637         * 指定がない場合は、現状のJava仮想マシンの環境が引き継がれます。
    638         * envKeys と対応していなければなりません。
    639         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
    640         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
    641         *
    642         * @og.rev 3.3.3.0 (2003/07/09) 新規追加
    643         * @og.rev 3.5.6.2 (2004/07/05) CommonTagSupport#getCSVParameter を使用
    644         *
    645         * @param   vals 環境変数のキー
    646         */
    647        public void setEnvVals( final String vals ) {
    648                envVals = getCSVParameter( vals );
    649        }
    650
    651        /**
    652         * 【TAG】エラー時に処理を停止するかどうか[true/false]を指定します(初期値:true)。
    653         *
    654         * @og.tag
    655         * エラー時に、以下の処理を停止したい場合に、使用します。
    656         *
    657         * 実行結果は、
    658         *     SHELL.RTN_CODE = 0  : 正常    (ページの残りを評価する。)
    659         *     SHELL.RTN_CODE = 1  : 処理中  (ページの残りを評価する。)
    660         *     SHELL.RTN_CODE = 9  : 取消    (ページの残りを評価する。)
    661         *     SHELL.RTN_CODE = -1 : 異常終了(useStop:true ページの残りの処理を行わない。false:残りを評価する。)
    662         *
    663         * が取得できますが、異常終了時に、処理を停止するか、継続処理させるかを指定できます。
    664         * 互換性の観点から、初期値は、true(エラー時に停止する)です。
    665         *
    666         * @og.rev 7.1.0.0 (2020/01/20) useStop 属性を追加
    667         *
    668         * @param   flag エラー時停止 [true:する/それ以外:しない]
    669         */
    670        public void setUseStop( final String flag ) {
    671                useStop = nval( getRequestParameter( flag ),useStop );
    672        }
    673
    674        /**
    675         * このオブジェクトの文字列表現を返します。
    676         * 基本的にデバッグ目的に使用します。
    677         *
    678         * @return このクラスの文字列表現
    679         * @og.rtnNotNull
    680         */
    681        @Override
    682        public String toString() {
    683                return ToString.title( this.getClass().getName() )
    684                                .println( "VERSION"                     ,VERSION        )
    685                                .println( "program"                     ,program        )
    686                                .println( "useBatch"            ,useBatch       )
    687                                .println( "stdout"                      ,stdout         )
    688                                .println( "stderr"                      ,stderr         )
    689                                .println( "wait"                        ,wait           )
    690                                .println( "info"                        ,info           )
    691                                .println( "display"                     ,display        )
    692                                .println( "action"                      ,action         )
    693                                .println( "workDir"                     ,workDir        )
    694                                .println( "envKeys"                     ,envKeys        )
    695                                .println( "envVals"                     ,envVals        )
    696                                .println( "timeout"                     ,timeout        )
    697                                .println( "Other..."    ,getAttributes().getAttribute() )
    698                                .fixForm().toString() ;
    699        }
    700}