package Ġcom . be ust . k ob alt . misc Ċ Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . File Ċ import Ġjava . io . InputStream Ċ import Ġjava . io . InputStream Reader Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ open Ġclass ĠRun Command ( val Ġcommand : ĠString ) Ġ{ ĊĠĠĠ Ġval ĠDEFAULT _ SUCCESS Ġ= Ġ{ Ġoutput : ĠList < String > Ġ-> Ġ} Ċ // ĠĠĠ Ġval ĠDEFAULT _ SUCCESS _ VERBOSE Ġ= Ġ{ Ġoutput : ĠList < String > Ġ-> Ġlog ( 2 , Ġ" Success :\ n Ġ" Ġ+ Ġoutput . join ToString ("\ n ")) } ĊĠĠĠ Ġval Ġdefault Success Ġ= ĠDEFAULT _ SUCCESS ĊĠĠĠ Ġval ĠDEFAULT _ ERROR Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġoutput : ĠList < String > Ġ-> Ġerror ( output . join ToString ("\ n ĠĠĠĠĠĠ Ġ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġdirectory Ġ= ĠFile (".") ĊĠĠĠ Ġvar Ġenv Ġ= Ġhash Map Of < String , ĠString >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSome Ġcommands Ġfail Ġbut Ġreturn Ġ 0 , Ġso Ġthe Ġonly Ġway Ġto Ġfind Ġout Ġif Ġthey Ġfailed Ġis Ġto Ġlook ĊĠĠĠĠ Ġ* Ġat Ġthe Ġerror Ġstream . ĠHowever , Ġsome Ġcommands Ġsucceed Ġbut Ġoutput Ġtext Ġon Ġthe Ġerror Ġstream . ĊĠĠĠĠ Ġ* ĠThis Ġfield Ġis Ġused Ġto Ġspecify Ġhow Ġerrors Ġare Ġcaught . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġuse Error Stream As Error Indicator Ġ= Ġtrue ĊĠĠĠ Ġvar Ġuse InputStream As Error Indicator Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġuse Error Stream As Error Indicator ( f : ĠBoolean ) Ġ: ĠRun Command Ġ{ ĊĠĠĠĠĠĠĠ Ġuse Error Stream As Error Indicator Ġ= Ġf ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġrun ( args : ĠList < String >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Callback : ĠFunction 1 < List < String >, ĠUnit > Ġ= ĠDEFAULT _ ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Callback : ĠFunction 1 < List < String >, ĠUnit > Ġ= Ġdefault Success ) Ġ: ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġall Args Ġ= Ġarray ListOf < String >() ĊĠĠĠĠĠĠĠ Ġall Args . add ( command ) ĊĠĠĠĠĠĠĠ Ġall Args . addAll ( args ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpb Ġ= ĠProcess Builder ( all Args ) ĊĠĠĠĠĠĠĠ Ġpb . directory ( directory ) ĊĠĠĠĠĠĠĠ Ġlog ( 2 , Ġ" Running Ġcommand Ġin Ġdirectory Ġ${ directory . absolute Path }" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ n Ġ Ġ" Ġ+ Ġall Args . join ToString (" Ġ")) ĊĠĠĠĠĠĠĠ Ġval Ġprocess Ġ= Ġpb . start () ĊĠĠĠĠĠĠĠ Ġpb . environment (). let Ġ{ Ġpb Env Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenv . forEach Ġ{ it Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpb Env . put ( it . key , Ġit . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcall Succeeded Ġ= Ġprocess . waitFor ( 3 0 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġif Ġ( process . inputStream . available () Ġ> Ġ 0 ) Ġfrom Stream ( process . inputStream ) Ġelse Ġempty List () ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġif Ġ( process . error Stream . available () Ġ> Ġ 0 ) Ġfrom Stream ( process . error Stream ) Ġelse Ġempty List () ĊĠĠĠĠĠĠĠ Ġval Ġis Success Ġ= Ġis Success ( call Succeeded , Ġinput , Ġerror ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Callback ( input ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Callback ( error Ġ+ Ġinput ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Success ) Ġ 0 Ġelse Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġprotected Ġfun Ġis Success ( call Succeeded : ĠBoolean , Ġinput : ĠList < String >, Ġerror : ĠList < String >) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġhas Errors Ġ= Ġ! Ġcall Succeeded ĊĠĠĠĠĠĠĠ Ġif Ġ( use Error Stream As Error Indicator Ġ&& Ġ! Ġhas Errors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Errors Ġ= Ġhas Errors Ġ|| Ġerror . size Ġ> Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( use InputStream As Error Indicator Ġ&& Ġ! Ġhas Errors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Errors Ġ= Ġhas Errors Ġ|| Ġinput . size Ġ> Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ! Ġhas Errors ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfrom Stream ( ins : ĠInputStream ) Ġ: ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġarray ListOf < String >() ĊĠĠĠĠĠĠĠ Ġval Ġbr Ġ= ĠBufferedReader ( InputStream Reader ( ins )) ĊĠĠĠĠĠĠĠ Ġvar Ġline Ġ= Ġbr . readLine () ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( line Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Ġ= Ġbr . readLine () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult Ċ Ċ // ĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠChar Streams . toString ( InputStream Reader ( ins , ĠCharset . default Charset ())) Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġresult . split ("\ n ") ĊĠĠĠ Ġ} Ċ } Ċ