package Ġcom . lord codes . tur tle Ċ Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ /** Ċ Ġ* ĠCreate Ġand Ġrun Ġeither Ġbuilt - in Ġor Ġspecified Ġshell Ġcommands . Ċ Ġ*/ Ċ class ĠShell Script Ġinternal Ġconstructor ( working Directory : ĠFile ? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġprocess Builder Ġ= ĠProcess Builder ( listOf ()) ĊĠĠĠĠĠĠĠ Ġ. directory ( working Directory ) ĊĠĠĠĠĠĠĠ Ġ. redirect Output ( Process Builder . Redirect . PIPE ) ĊĠĠĠĠĠĠĠ Ġ. redirect Error ( Process Builder . Redirect . PIPE ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDefault Ġcallbacks Ġinto Ġthe Ġprocess Ġstarted Ġfor Ġeach Ġcommand Ġthat Ġis Ġexecuted . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġdefault Callbacks : ĠProcess Callbacks Ġ= ĠEmpty Process Callbacks ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAccess Ġcommands Ġthat Ġdeal Ġwith Ġfiles Ġor Ġthe Ġfilesystem . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġfiles Ġ= ĠFile Commands ( this ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAccess Ġcommands Ġthat Ġdeal Ġwith ĠGit . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġgit Ġ= ĠGit Commands ( this ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRun Ġa Ġshell Ġcommand Ġwith Ġthe Ġspecified Ġarguments , Ġreceiving Ġthe Ġoutput Ġas Ġa ĠString . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ[ command ] ĠA Ġcommand Ġto Ġrun . ĊĠĠĠĠ Ġ* Ġ@ param Ġ[ arguments ] ĠThe Ġarguments Ġto Ġpass Ġto Ġthe Ġcommand . ĊĠĠĠĠ Ġ* Ġ@ param Ġ[ callbacks ] ĠCallback s Ġinto Ġthe Ġprocess ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ String ] ĠThe Ġoutput Ġof Ġrunning Ġthe Ġcommand . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws Ġ[ Shell FailedException ] ĠThere Ġwas Ġan Ġissue Ġrunning Ġthe Ġcommand . ĊĠĠĠĠ Ġ* Ġ@ throws Ġ[ Shell Run Exception ] ĠRunning Ġthe Ġcommand Ġproduced Ġerror Ġoutput . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcommand ( ĊĠĠĠĠĠĠĠ Ġcommand : ĠString , ĊĠĠĠĠĠĠĠ Ġarguments : ĠList < String > Ġ= ĠlistOf (), ĊĠĠĠĠĠĠĠ Ġcallbacks : ĠProcess Callbacks Ġ= ĠEmpty Process Callbacks ĊĠĠĠ Ġ): ĠString Ġ= Ġrun Command ( command , Ġarguments , Ġcallbacks ) Ġ{ Ġit . retrieve Output () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRun Ġa Ġshell Ġcommand Ġwith Ġthe Ġspecified Ġarguments , Ġallowing Ġstandard Ġoutput Ġor Ġerror Ġto Ġbe Ġread Ġas Ġa Ġstream . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ[ command ] ĠA Ġcommand Ġto Ġrun . ĊĠĠĠĠ Ġ* Ġ@ param Ġ[ arguments ] ĠThe Ġarguments Ġto Ġpass Ġto Ġthe Ġcommand . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ Process Output ] ĠThe Ġoutput Ġof Ġrunning Ġthe Ġcommand . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws Ġ[ Shell FailedException ] ĠThere Ġwas Ġan Ġissue Ġrunning Ġthe Ġcommand . ĊĠĠĠĠ Ġ* Ġ@ throws Ġ[ Shell Run Exception ] ĠRunning Ġthe Ġcommand Ġproduced Ġerror Ġoutput . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcommand Streaming ( ĊĠĠĠĠĠĠĠ Ġcommand : ĠString , ĊĠĠĠĠĠĠĠ Ġarguments : ĠList < String > Ġ= ĠlistOf (), ĊĠĠĠĠĠĠĠ Ġcallbacks : ĠProcess Callbacks Ġ= ĠEmpty Process Callbacks ĊĠĠĠ Ġ): ĠProcess Output Ġ= Ġrun Command ( command , Ġarguments , Ġcallbacks ) Ġ{ Ġprocess Ġ-> ĊĠĠĠĠĠĠĠ ĠProcess Output ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Code Ġ= Ġprocess . exit Value (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstandard Output Ġ= Ġprocess . inputStream , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstandard Error Ġ= Ġprocess . error Stream ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< Output T > Ġrun Command ( ĊĠĠĠĠĠĠĠ Ġcommand : ĠString , ĊĠĠĠĠĠĠĠ Ġarguments : ĠList < String >, ĊĠĠĠĠĠĠĠ Ġcallbacks : ĠProcess Callbacks , ĊĠĠĠĠĠĠĠ Ġprepare Output : Ġ( Process ) Ġ-> ĠOutput T ĊĠĠĠ Ġ): ĠOutput T Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsplit Command Ġ= ĠlistOf ( command ) Ġ+ Ġarguments ĊĠĠĠĠĠĠĠ Ġval Ġprocess Ġ= Ġprocess Builder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. command ( split Command ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. start () ĊĠĠĠĠĠĠĠ Ġon Process Start ( process , Ġcallbacks ) ĊĠĠĠĠĠĠĠ Ġprocess . waitFor ( COMMAND _ TIMEOUT , ĠTimeUnit . MIN UTES ) ĊĠĠĠĠĠĠĠ Ġprepare Output ( process ) ĊĠĠĠ Ġ} Ġcatch Ġ( exception : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠShell FailedException ( exception ) ĊĠĠĠ Ġ} Ġcatch Ġ( exception : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠShell FailedException ( exception ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠProcess . retrieve Output (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Text Ġ= ĠinputStream . buffered Reader (). use ( BufferedReader :: read Text ) ĊĠĠĠĠĠĠĠ Ġval Ġexit Code Ġ= Ġexit Value () ĊĠĠĠĠĠĠĠ Ġif Ġ( exit Code Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Text Ġ= Ġerror Stream . buffered Reader (). use ( BufferedReader :: read Text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error Text . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠShell Run Exception ( exit Code , Ġerror Text . trim ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġoutput Text . trim () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChange Ġthe Ġworking Ġdirectory Ġfor Ġsubsequent Ġshell Ġcommands . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ[ path ] ĠThe Ġpath Ġto Ġset Ġthe Ġworking Ġdirectory Ġto . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġchange Working Directory ( path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchange Working Directory ( File ( path )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChange Ġthe Ġworking Ġdirectory Ġfor Ġsubsequent Ġshell Ġcommands . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ[ path ] ĠThe Ġpath Ġto Ġset Ġthe Ġworking Ġdirectory Ġto . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġchange Working Directory ( path : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprocess Builder . directory ( path ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Process Start ( process : ĠProcess , Ġcallbacks : ĠProcess Callbacks ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdefault Callbacks . on Process Start ( process ) ĊĠĠĠĠĠĠĠ Ġcallbacks . on Process Start ( process ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠEmpty Process Callbacks Ġ: ĠProcess Callbacks ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCOMMAND _ TIMEOUT Ġ= Ġ 6 0 L ĊĠĠĠ Ġ} Ċ } Ċ