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