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