package Ġorg . jetbrains . intellij Ċ Ċ import Ġorg . jetbrains . intellij . parameters . FileInfo Runner Parameters Ċ import Ġorg . jetbrains . intellij . parameters . Ide a Runner Parameters Ċ import Ġorg . jetbrains . intellij . parameters . Ins pe ctions Runner Parameters Ċ import Ġjava . io . File Ċ import Ġjava . lang . IllegalStateException Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠProxy Runner ( jar : ĠFile , Ġidea Home Directory : ĠFile , Ġprivate Ġval Ġlogger : ĠLogger ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġconnection : ĠConnection . Master ĊĠĠĠ Ġprivate Ġval Ġprocess : ĠProcess ĊĊĠĠĠ Ġconstructor ( jar : ĠFile , Ġidea Home Directory : ĠFile , Ġlogger : Ġ( Logger Level , ĠString ) Ġ-> ĠUnit ) Ġ: Ġthis ( jar , Ġidea Home Directory , ĠLogger ( null , Ġlogger )) ĊĊĠĠĠ Ġprivate Ġfun Ġwait Outcome (): ĠRunner Outcome Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġoutcome : ĠRunner Outcome ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġwhile Ġ( outcome Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutcome Ġ= Ġread Outcome () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġoutcome ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwait Outcome ( timeout : ĠLong ): ĠRunner Outcome ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( System . currentTimeMillis () Ġ- ĠstartTime Ġ< Ġtimeout ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! connection . ready ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . yield () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutcome Ġ= Ġread Outcome () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( outcome Ġ!= Ġnull ) Ġreturn Ġoutcome ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Outcome (): ĠRunner Outcome ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( type , Ġdata ) Ġ= Ġconnection . read () ĊĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConnection . Type . Slave Out . ERROR Ġ-> Ġlogger . error ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConnection . Type . Slave Out . WARNING Ġ-> Ġlogger . warn ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConnection . Type . Slave Out . INFO Ġ-> Ġlogger . info ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConnection . Type . Slave Out . VALUE Ġ-> Ġreturn Ġdata . load Outcome () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġprintln ( data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrun ( parameters : ĠIde a Runner Parameters < FileInfo Runner Parameters < Ins pe ctions Runner Parameters >> ): ĠRunner Outcome Ġ{ ĊĠĠĠĠĠĠĠ Ġconnection . write ( Connection . Type . Master Out . COMMAND , ĠCommand . RUN . toString ()) ĊĠĠĠĠĠĠĠ Ġconnection . write ( Connection . Type . Master Out . VALUE , Ġparameters . toJson ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġwait Outcome () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfinalize () Ġ{ ĊĠĠĠĠĠĠĠ Ġconnection . write ( Connection . Type . Master Out . COMMAND , ĠCommand . FINAL IZE . toString ()) ĊĠĠĠĠĠĠĠ Ġval Ġoutcome Ġby Ġlazy Ġ{ Ġwait Outcome ( TIMEOUT ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġexited Ġby Ġlazy Ġ{ Ġprocess . waitFor ( TIMEOUT , ĠTimeUnit . MILLISECONDS ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( outcome Ġ== Ġnull Ġ|| Ġ! exit ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Process Ġfinal ization Ġtimeout ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess . destroy For c ibly () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠFile . classpath : ĠList < File > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġlist Files Ġ{ Ġ_, Ġname Ġ-> Ġname . endsWith (" jar ") Ġ&& Ġ" xml rpc " Ġ! in Ġname Ġ} ?. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Files Ġnot Ġfound Ġin Ġdirectory Ġ$ this ") ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Ide aClass path ( idea Directory : ĠFile ): ĠList < File > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidea Libraries Ġ= ĠFile ( idea Directory , Ġ" lib ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġidea Libraries . classpath ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġseparator Ġ= ĠSystem . getProperty (" path . separator ") ĊĠĠĠĠĠĠĠ Ġval Ġjava Home Path : ĠString ? Ġ= ĠSystem . getenv (" JAVA _ HOME ") Ġ?: ĠSystem . getProperty (" java . home ") ĊĠĠĠĠĠĠĠ Ġval Ġtools Ġ= Ġif Ġ( java Home Path Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Both ĠJAVA _ HOME Ġ& Ġjava . home Ġaren 't Ġset ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjava Home Ġ= ĠFile ( java Home Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtools Variants Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠJAVA _ HOME Ġpoints Ġto ĠJDK Ġroot ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( java Home , Ġ"/ lib / tools . jar "). canonical File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠJAVA _ HOME Ġpoints Ġto ĠJDK / jre ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( java Home , Ġ"../ lib / tools . jar "). canonical File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtools Ġ= Ġtools Variants . first OrNull Ġ{ Ġit . exists () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tools Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ("$ tools Variants Ġnot Ġfound , Ġcheck Ġyour ĠJAVA _ HOME =$ java Home Path ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtools ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġidea Classpath Ġ= Ġget Ide aClass path ( idea Home Directory ) ĊĠĠĠĠĠĠĠ Ġlogger . info (" Ide a Ġclasspath : Ġ$ idea Classpath ") ĊĠĠĠĠĠĠĠ Ġval Ġclasspath Ġ= Ġ( listOf NotNull ( jar , Ġtools ) Ġ+ Ġidea Classpath ). join ToString ( separator ) Ġ{ Ġit . absolute Path Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= ĠlistOf (" java ", Ġ"- cp ", Ġclasspath , Ġ" org . jetbrains . idea . ins pe ctions . Proxy Runner Impl ") ĊĠĠĠĠĠĠĠ Ġprocess Ġ= ĠProcess Builder ( command ). redirect Error Stream ( true ). start () ĊĠĠĠĠĠĠĠ Ġlogger . info (" Process Ġstarted : Ġ${ command . join ToString (" Ġ" )} ") ĊĠĠĠĠĠĠĠ Ġconnection Ġ= ĠConnection . Master ( process . output Stream , Ġprocess . inputStream ) ĊĠĠĠ Ġ} Ċ }