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