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     */
016    package org.opengion.hayabusa.taglib;
017    
018    import org.opengion.hayabusa.common.HybsSystem;
019    import org.opengion.hayabusa.common.HybsSystemException;
020    import org.opengion.fukurou.util.StringUtil;
021    
022    import static org.opengion.fukurou.util.StringUtil.nval ;
023    
024    import org.opengion.fukurou.util.Shell;
025    
026    import 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="…" />
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】環å¢?¤‰数のキーをC?³?¶形式でæŒ?®šしまã�?初期値:現状のJava仮想マシンの環å¢?
070     *       envVals            【TAG】環å¢?¤‰数の値をC?³?¶形式でæŒ?®šしまã�?初期値:現状の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     */
094    public 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().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】環å¢?¤‰数のキーをC?³?¶形式でæŒ?®šしまã�?初期値:現状の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】環å¢?¤‰数の値をC?³?¶形式でæŒ?®šしまã�?初期値:現状の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    }