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