/** Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠRichard ĠH aus wal d Ġ- Ġhttps :// quantum maid . de /. Ċ Ġ* Ċ Ġ* ĠLicensed Ġto Ġthe ĠApache ĠSoftware ĠFoundation Ġ( ASF ) Ġunder Ġone Ċ Ġ* Ġor Ġmore Ġcontributor Ġlicense Ġagreements . Ġ ĠSee Ġthe ĠNOTICE Ġfile Ċ Ġ* Ġdistributed Ġwith Ġthis Ġwork Ġfor Ġadditional Ġinformation Ċ Ġ* Ġregarding Ġcopyright Ġownership . Ġ ĠThe ĠASF Ġlicenses Ġthis Ġfile Ċ Ġ* Ġto Ġyou Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ċ Ġ* Ġ" License "); Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ċ Ġ* Ġwith Ġthe ĠLicense . Ġ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ċ Ġ* Ġsoftware Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ċ Ġ* Ġ" AS ĠIS " ĠBASIS , ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY Ċ Ġ* ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ġ ĠSee Ġthe ĠLicense Ġfor Ġthe Ċ Ġ* Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ġlimitations Ċ Ġ* Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġde . quantum maid . gra al v ml amb dar untime . given wh ent hen Ċ Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . time . Duration Ċ import Ġjava . time . Instant Ċ import Ġjava . util .* Ċ Ċ data Ġclass ĠCommand Execution ( val Ġexit Code : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstdout : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstderr : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduration : ĠDuration ) Ċ Ċ fun Ġrun Command ( env : ĠMap < String , ĠString >, Ġcommand : ĠList < String ?> ?): ĠCommand Execution Ġ{ ĊĠĠĠ Ġval Ġenv Array Ġ= Ġenv . entries ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġentry : ĠMap . Entry < String , ĠString > Ġ-> Ġentry . key Ġ+ Ġ"=" Ġ+ Ġentry . value Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Typed Array () ĊĠĠĠ Ġval Ġcommand Line Ġ= Ġjava . lang . String . join (" Ġ", Ġcommand ) ĊĠĠĠ Ġprintln ( command Line ) ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbegin Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠ Ġval Ġprocess Ġ= ĠRuntime . get Runtime (). exec ( command Line , Ġenv Array , Ġnull ) ĊĠĠĠĠĠĠĠ Ġval Ġexit Code Ġ= Ġprocess . waitFor () ĊĠĠĠĠĠĠĠ Ġval Ġend Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠ Ġval Ġduration Ġ= ĠDuration . between ( begin , Ġend ) ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĠinputStream ToString ( process . inputStream ) ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠinputStream ToString ( process . error Stream ) ĊĠĠĠĠĠĠĠ Ġval Ġcommand Execution Ġ= ĠCommand Execution ( exit Code , Ġoutput , Ġerror , Ġduration ) ĊĠĠĠĠĠĠĠ Ġif Ġ( exit Code Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( command Execution . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcommand Execution ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( e ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( e ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠinputStream ToString ( inputStream : ĠInputStream ?): ĠString Ġ{ ĊĠĠĠ Ġval Ġscanner Ġ= ĠScanner ( inputStream , ĠStandard Charsets . UTF _ 8 ). use Delimiter ("\\ A ") ĊĠĠĠ Ġreturn Ġif Ġ( scanner . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġscanner . next () ĊĠĠĠ Ġ} Ġelse Ġ"" Ċ }