package Ġcom . l ug g soft . k 4 . scaffold ing . commands Ċ Ċ import Ġcom . l ug g soft . common . commands . CommandHandler Ċ import Ġjava . io . InputStream Ċ import Ġjava . time . Instant Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ Ċ class ĠShell Invoke CommandHandler Ġ: ĠCommand Handler < Shell Invoke Command , ĠScaffold ing Command Context , ĠInt > Ċ { ĊĠĠĠ Ġoverride Ġfun Ġhandle Command ( command : ĠShell Invoke Command , Ġcommand Context : ĠScaffold ing Command Context ): ĠInt ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprocess Builder Ġ= ĠProcess Builder (). also Ġ{ Ġprocess Builder Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Builder . command ( command . parts ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Builder . directory ( command Context . root Directory ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġprocess Ġ= Ġprocess Builder . start () ĊĠĠĠĠĠĠĠ Ġval Ġprocess Future Ġ= ĠCompletableFuture . supply Async Ġ{ Ġprocess . waitFor () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġout Logging Future Ġ= Ġthis . create Logging Future ( process . inputStream , Ġ" OUT ") ĊĠĠĠĠĠĠĠ Ġval Ġerr Logging Future Ġ= Ġthis . create Logging Future ( process . error Stream , Ġ" ERR ") ĊĊĠĠĠĠĠĠĠ Ġreturn ĠCompletableFuture . all Of ( process Future , Ġout Logging Future , Ġerr Logging Future ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. then Apply Ġ{ Ġ_ Ġ-> Ġprocess Future . get () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Logging Future ( inputStream : ĠInputStream , Ġprefix : ĠString ): ĠCompletableFuture < *> ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCompletableFuture . run Async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscanner Ġ= ĠScanner ( inputStream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( scanner . hasNext Line ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġscanner . nextLine () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" OUT : Ġ${ Instant . now ()} Ġ> Ġ$ line ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ