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 * ●形式:<og:shell program="…" />
056 * ●body:なし
057 *
058 * ●Tag定義:
059 *   <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】環境変数のキーをCSV形式で指定します(初期値:現状のJava仮想マシンの環境)
070 *       envVals            【TAG】環境変数の値をCSV形式で指定します(初期値:現状のJava仮想マシンの環境)
071 *       display            【TAG】処理結果を画面に表示するかどうか[true/false]指定します(初期値:true)
072 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
073 *   />
074 *
075 * ●使用例
076 *    <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 *    />
085 *
086 *    <og:value command="GET" key="SHELL.RTN_CODE" />
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 等の場合は、長さ0配列を返します。
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().getLabel( "MSG0066" ) );
375                        return ;
376                }
377
378                int rtnCode = shell.exitValue();
379
380                final String msg ;
381                switch( rtnCode ) {
382                        case Shell.OK      : msg = "MSG0063"; break;    // MSG0063=完了しました。
383                        case Shell.RUNNING : msg = "MSG0067"; break;    // MSG0067=処理は実行中です。
384                        case Shell.CANCEL  : msg = "MSG0069"; break;    // MSG0069=処理をキャンセルしました。
385        //              case Shell.ERROR   : msg = "MSG0068"; break;    // MSG0068=処理の実行中にエラーが発生しました。
386                        default            : msg = "MSG0068"; break;    // MSG0068=処理の実行中にエラーが発生しました。
387                }
388
389                // 3.6.0.1 (2004/09/29) display 属性を考慮(display=true か、ERROR の場合は表示)
390                if( display || rtnCode == Shell.ERROR ) {
391                        jspPrint( getResource().getLabel( msg ) + HybsSystem.BR );
392                }
393
394                if( info ) {
395                        jspPrint( shell.toString() );
396                }
397                if( stdout ) {
398                        jspPrint( StringUtil.htmlFilter( shell.getStdoutData() ) );
399                }
400                if( stderr ) {
401                        jspPrint( "<div class=\"row_mark\">"  );
402                        jspPrint( StringUtil.htmlFilter( shell.getStderrData() ) );
403                        jspPrint( "</div>" );
404                }
405        }
406
407        /**
408         * 【TAG】シェルファイルを実行する時に引き渡すコマンド。
409         *
410         * @og.tag シェルファイルを実行する時に引き渡すコマンド
411         *
412         * @param   val シェルコマンド
413         */
414        public void setProgram( final String val ) {
415                program = getRequestParameter( val );
416        }
417
418        /**
419         * 【TAG】BATCHプロセスを実行するのかどうか[true/false]を指定します(初期値:false)。
420         *
421         * @og.tag
422         * BATCHファイルの実行と、EXEファイルの実行では、cmd.exe 経由するか
423         * どうか、判断が必要です。true(BATCHプロセス)では、cmd.exe 経由で実行、
424         * false(EXEファイル)では、直接実行します。
425         * 初期値は、false(EXEファイル)です。
426         *
427         * @param   flag BATCHプロセスを実行するのかどうか [true:BATCHプロセス/false:EXEファイル]
428         */
429        public void setUseBatch( final String flag ) {
430                useBatch = nval( getRequestParameter( flag ),useBatch );
431        }
432
433        /**
434         * 【TAG】実行結果を標準出力に出力するかどうか[true/false]を指定します(初期値:false)。
435         *
436         * @og.tag 実行結果の標準出力を出力するかどうか(初期値:false)
437         *
438         * @param   flag 実行結果の標準出力 [true:出力する/false:しない]
439         */
440        public void setStdout( final String flag ) {
441                stdout = nval( getRequestParameter( flag ),stdout );
442        }
443
444        /**
445         * 【TAG】実行結果をエラー出力に出力するかどうか[true/false]を指定します(初期値:false)。
446         *
447         * @og.tag 実行結果のエラー出力を出力するかどうか(初期値:false)
448         *
449         * @param   flag 実行結果のエラー出力 [true:出力する/false:しない]
450         */
451        public void setStderr( final String flag ) {
452                stderr = nval( getRequestParameter( flag ),stderr );
453        }
454
455        /**
456         * 【TAG】プロセスの終了を待つかどうか[true/false]を指定します(初期値:true[待つ])。
457         *
458         * @og.tag プロセスの終了を待つ(true)/待たない(false) (初期値:true)
459         *
460         * @param   flag プロセスの終了(true:待つ/false:待たない)
461         */
462        public void setWait( final String flag ) {
463                wait = nval( getRequestParameter( flag ),wait );
464        }
465
466        /**
467         * 【TAG】プロセスの実行処理のタイムアウトを設定します
468         *              (初期値:SHELL_TIMEOUT[={@og.value org.opengion.hayabusa.common.SystemData#SHELL_TIMEOUT}])。
469         *
470         * @og.tag
471         * ゼロ(0) の場合は、割り込みが入るまで待ちつづけます。
472         * その場合、確実に終了させる手段を用意しておかないと、いつまで待っても以下の処理が
473         * 実行されない(デッドロック)状態になってしまいます。
474         * (初期値:システム定数のSHELL_TIMEOUT[={@og.value org.opengion.hayabusa.common.SystemData#SHELL_TIMEOUT}])。
475         *
476         * @og.rev 3.6.1.0 (2005/01/05) 新規追加
477         *
478         * @param       tout    タイムアウト時間(秒) ゼロは、無制限
479         * @see         org.opengion.hayabusa.common.SystemData#SHELL_TIMEOUT
480         */
481        public void setTimeout( final String tout ) {
482                timeout = nval( getRequestParameter( tout ),timeout );
483        }
484
485        /**
486         * 【TAG】インフォメーション情報を出力するかどうか[true/false]を指定します(初期値:false)。
487         *
488         * @og.tag インフォメーション情報を出力するかどうか(初期値:false)
489         *
490         * @og.rev 3.1.9.0 (2003/05/16) 新規追加
491         *
492         * @param   flag インフォメーション情報 [true:出力する/false:しない]
493         */
494        public void setInfo( final String flag ) {
495                info = nval( getRequestParameter( flag ),info );
496        }
497
498        /**
499         * 【TAG】処理結果を画面に表示するかどうか[true/false]指定します(初期値:true)。
500         *
501         * @og.tag
502         * 処理結果が、異常でない場合のみ、この機能が有効になります。
503         * 各種処理を連続で行う場合、最後にエラーが発生したにもかかわらず、
504         * 先に正常終了している場合に、不要なメッセージを出すと、紛らわしい為です。
505         *
506         * @og.rev 3.6.0.1 (2004/09/29) 新規追加
507         *
508         * @param   flag 処理結果を画面に表示するかどうか [true:出力する/false:しない]
509         */
510        public void setDisplay( final String flag ) {
511                display = nval( getRequestParameter( flag ),display );
512        }
513
514        /**
515         * 【TAG】アクション(RUN,SET,GET,REMOVE)をセットします(初期値:RUN)。
516         *
517         * @og.tag
518         * アクションは,HTMLから(get/post)指定されますので,ACT_xxx で設定される
519         * フィールド定数値のいづれかを、指定できます。
520         *
521         * RUN      Shellオブジェクトを生成/実行します。(セッションに登録しません。)
522         * SET      Shellオブジェクトを生成/実行し、セッションに登録します。
523         * GET      セッションに登録されている Shellオブジェクトを呼び出します。
524         * REMOVE   セッションから、Shellオブジェクトを削除します。
525         *          Shellが実行中の場合は強制終了します。
526         *
527         * @og.rev 3.1.9.0 (2003/05/16) 新規追加
528         * @og.rev 3.5.6.2 (2004/07/05) 文字列の連結にStringBuilderを使用します。
529         *
530         * @param       act アクション(初期値は、RUN です。)
531         * @see         <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.ShellTag.ACT_RUN">アクション定数</a>
532         */
533        public void setAction( final String act ) {
534                action = nval( getRequestParameter( act ),action );
535                if( !check( action, ACTION_LIST ) ) {
536                        StringBuilder errMsg = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
537                        errMsg.append( "指定のアクションは実行できません。アクションエラー" );
538                        errMsg.append( HybsSystem.CR );
539                        errMsg.append( "action=[" ).append( action ).append( "] " );
540                        errMsg.append( HybsSystem.CR );
541                        for( int i=0; i<ACTION_LIST.length; i++ ) {
542                                errMsg.append( " | " );
543                                errMsg.append( ACTION_LIST[i] );
544                        }
545                        errMsg.append( " | " );
546                        throw new HybsSystemException( errMsg.toString() );
547                }
548        }
549
550        /**
551         * 【TAG】作業ディレクトリを指定します(初期値:Java仮想マシンの作業ディレクトリ)。
552         *
553         * @og.tag
554         * シェルを実行する、作業ディレクトリを指定します。
555         * 絶対パスで指定することも、相対パスで指定することも出来ます。
556         * 相対パスの場合は、ドキュメントベースの物理パスが基準になります。
557         * (そのJSPファイル自身のディレクトリが基準ではありません。)
558         * 指定しない場合は、このJava仮想マシンの作業ディレクトリで実行されます。
559         *
560         * @og.rev 3.3.3.0 (2003/07/09) 新規追加
561         *
562         * @param   dir 作業ディレクトリ
563         */
564        public void setWorkDir( final String dir ) {
565                String work = HybsSystem.url2dir( getRequestParameter( dir ) );
566                workDir = new File( work );
567                if( ! workDir.isDirectory() ) {
568                        String errMsg = "指定の作業ディレクトリは、使用できません。"
569                                                        + HybsSystem.CR
570                                                        + "workDir=[" + workDir + "] "
571                                                        + HybsSystem.CR ;
572                        throw new HybsSystemException( errMsg );
573                }
574        }
575
576        /**
577         * 【TAG】環境変数のキーをCSV形式で指定します(初期値:現状のJava仮想マシンの環境)。
578         *
579         * @og.tag
580         * シェル実行時の環境変数のキーを、CSVV形式で指定します。
581         * 指定がない場合は、現状のJava仮想マシンの環境が引き継がれます。
582         * envVals と対応していなければなりません。
583         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
584         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
585         *
586         * @og.rev 3.3.3.0 (2003/07/09) 新規追加
587         * @og.rev 3.5.6.2 (2004/07/05) CommonTagSupport#getCSVParameter を使用
588         *
589         * @param   keys 環境変数のキー
590         */
591        public void setEnvKeys( final String keys ) {
592                envKeys = getCSVParameter( keys );
593        }
594
595        /**
596         * 【TAG】環境変数の値をCSV形式で指定します(初期値:現状のJava仮想マシンの環境)。
597         *
598         * @og.tag
599         * シェル実行時の環境変数の値を、CSVV形式で指定します。
600         * 指定がない場合は、現状のJava仮想マシンの環境が引き継がれます。
601         * envKeys と対応していなければなりません。
602         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
603         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
604         *
605         * @og.rev 3.3.3.0 (2003/07/09) 新規追加
606         * @og.rev 3.5.6.2 (2004/07/05) CommonTagSupport#getCSVParameter を使用
607         *
608         * @param   vals 環境変数のキー
609         */
610        public void setEnvVals( final String vals ) {
611                envVals = getCSVParameter( vals );
612        }
613
614        /**
615         * このオブジェクトの文字列表現を返します。
616         * 基本的にデバッグ目的に使用します。
617         *
618         * @return このクラスの文字列表現
619         */
620        @Override
621        public String toString() {
622                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
623                                .println( "VERSION"                     ,VERSION        )
624                                .println( "program"                     ,program        )
625                                .println( "useBatch"            ,useBatch       )
626                                .println( "stdout"                      ,stdout         )
627                                .println( "stderr"                      ,stderr         )
628                                .println( "wait"                        ,wait           )
629                                .println( "info"                        ,info           )
630                                .println( "display"                     ,display        )
631                                .println( "action"                      ,action         )
632                                .println( "ACTION_LIST"         ,ACTION_LIST    )
633                                .println( "workDir"                     ,workDir        )
634                                .println( "envKeys"                     ,envKeys        )
635                                .println( "envVals"                     ,envVals        )
636                                .println( "timeout"                     ,timeout        )
637                                .println( "Other..."    ,getAttributes().getAttribute() )
638                                .fixForm().toString() ;
639        }
640}