/* Ċ Ġ* ĠCopyright Ġ 2 0 0 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "). Ċ Ġ* ĠSee ĠLICENSE Ġin Ġthe Ġproject Ġroot Ġfor Ġlicense Ġinformation . Ċ Ġ*/ Ċ Ċ package Ġjet brains . build Server . rust Ċ Ċ import Ġcom . intellij . execution . configurations . General CommandLine Ċ import Ġjet brains . build Server . Run Build Exception Ċ import Ġjet brains . build Server . Simple CommandLine Process Runner Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġjava . util . concurrent . locks . ReadWrite Lock Ċ import Ġjava . util . concurrent . locks . Re entrant ReadWrite Lock Ċ Ċ /** Ċ Ġ* ĠRust Ġcommand Ġexecutor . Ċ Ġ*/ Ċ class ĠRust Command Executor Ġ: ĠCommand Executor Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlocks Ġ= ĠConcurrent HashMap < String , ĠRead Write Lock >() ĊĊĠĠĠ Ġoverride Ġfun Ġexecute With Read Lock ( tool Path : ĠString , Ġarguments : ĠList < String >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġlocks . put If Absent ( tool Path , ĠRe entrant ReadWrite Lock ()) ĊĠĠĠĠĠĠĠ Ġval Ġread Lock Ġ= Ġlocks [ tool Path ] !!. read Lock () ĊĠĠĠĠĠĠĠ Ġread Lock . lock () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexecute ( tool Path , Ġarguments ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Lock . unlock () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġexecute With Write Lock ( tool Path : ĠString , Ġarguments : ĠList < String >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġlocks . put If Absent ( tool Path , ĠRe entrant ReadWrite Lock ()) ĊĠĠĠĠĠĠĠ Ġval Ġwrite Lock Ġ= Ġlocks [ tool Path ] !!. write Lock () ĊĠĠĠĠĠĠĠ Ġwrite Lock . lock () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexecute ( tool Path , Ġarguments ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Lock . unlock () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute ( tool Path : ĠString , Ġarguments : ĠList < String >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcommand Line Ġ= ĠGeneral CommandLine (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexe Path Ġ= Ġtool Path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Parameters ( arguments ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠSimple CommandLine Process Runner . run Command ( command Line , Ġbyte ArrayOf ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( result . exit Code Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRun Build Exception ( result . stderr . trim ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult . stdout ĊĠĠĠ Ġ} Ċ }