/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 6 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠLicensed Ġ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 Ġorg . jetbrains . kotlin . daemon . client Ċ Ċ import Ġcom . intellij . openapi . Disposable Ċ import Ġcom . intellij . openapi . util . Dis poser Ċ import Ġorg . jetbrains . kotlin . cli . common . repl .* Ċ import Ġorg . jetbrains . kotlin . daemon . common . Compile Service Ċ import Ġorg . jetbrains . kotlin . daemon . common . Remote Operations Tracer Ċ import Ġorg . jetbrains . kotlin . daemon . common . SOCKET _ ANY _ FREE _ PORT Ċ import Ġjava . io . File Ċ import Ġjava . io . InputStream Ċ import Ġjava . io . OutputStream Ċ Ċ // ĠTODO : Ġreduce Ġnumber Ġof Ġports Ġused Ġthen ĠSOCKET _ ANY _ FREE _ PORT Ġis Ġpassed Ġ( same Ġproblem Ġwith Ġother Ġcalls ) Ċ Ċ open Ġclass ĠKotlin Remote Repl Client Base ( ĊĠĠĠĠĠĠĠ Ġdis posable : ĠDis posable , ĊĠĠĠĠĠĠĠ Ġprotected Ġval Ġcompile Service : ĠCompile Service , ĊĠĠĠĠĠĠĠ Ġclient Alive Flag File : ĠFile ?, ĊĠĠĠĠĠĠĠ Ġtarget Platform : ĠCompile Service . Target Platform , ĊĠĠĠĠĠĠĠ Ġtemplate Classpath : ĠList < File >, ĊĠĠĠĠĠĠĠ Ġtemplate ClassName : ĠString , ĊĠĠĠĠĠĠĠ Ġscript Args : ĠArray < Any ?> ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġscript Args Types : ĠArray < Class <* >> ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġcompiler Messages OutputStream : ĠOutputStream Ġ= ĠSystem . err , ĊĠĠĠĠĠĠĠ Ġeval OutputStream : ĠOutputStream ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġeval Error Stream : ĠOutputStream ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġeval InputStream : ĠInputStream ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġport : ĠInt Ġ= ĠSOCKET _ ANY _ FREE _ PORT , ĊĠĠĠĠĠĠĠ Ġoperations Tracer : ĠRemote Operations Tracer ? Ġ= Ġnull Ċ ) Ġ: ĠRe pl Checker Ġ{ ĊĊĠĠĠ Ġval ĠsessionId Ġ= Ġcompile Service . lease Repl Session ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Alive Flag File ?. absolute Path , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Platform , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCompiler Callback Services Facade Server ( port Ġ= Ġport ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate Classpath , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate ClassName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscript Args , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscript Args Types , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRemote OutputStream Server ( compiler Messages OutputStream , Ġport ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeval OutputStream ?. let Ġ{ ĠRemote OutputStream Server ( it , Ġport ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeval Error Stream ?. let Ġ{ ĠRemote OutputStream Server ( it , Ġport ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeval InputStream ?. let Ġ{ ĠRemote InputStream Server ( it , Ġport ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperations Tracer ĊĠĠĠ Ġ). get () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠDis poser . register ( dis posable , ĠDis posable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompile Service . release Repl Session ( sessionId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( ex : Ġjava . rmi . Remote Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġassuming Ġthat Ġcommunication Ġfailed Ġand Ġdaemon Ġmost Ġlikely Ġis Ġalready Ġdown ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcheck ( code Line : ĠRe pl Code Line , Ġhistory : ĠList < Repl Code Line >): ĠRe pl Check Result Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcompile Service . remote Repl Line Check ( sessionId , Ġcode Line , Ġhistory ). get () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠKotlin Remote Repl Compiler ( ĊĠĠĠĠĠĠĠ Ġdis posable : ĠDis posable , ĊĠĠĠĠĠĠĠ Ġcompile Service : ĠCompile Service , ĊĠĠĠĠĠĠĠ Ġclient Alive Flag File : ĠFile ?, ĊĠĠĠĠĠĠĠ Ġtarget Platform : ĠCompile Service . Target Platform , ĊĠĠĠĠĠĠĠ Ġtemplate Classpath : ĠList < File >, ĊĠĠĠĠĠĠĠ Ġtemplate ClassName : ĠString , ĊĠĠĠĠĠĠĠ Ġcompiler Messages OutputStream : ĠOutputStream , ĊĠĠĠĠĠĠĠ Ġport : ĠInt Ġ= ĠSOCKET _ ANY _ FREE _ PORT , ĊĠĠĠĠĠĠĠ Ġoperations Tracer : ĠRemote Operations Tracer ? Ġ= Ġnull Ċ ) Ġ: ĠKotlin Remote Repl Client Base ( ĊĠĠĠĠĠĠĠ Ġdis posable Ġ= Ġdis posable , ĊĠĠĠĠĠĠĠ Ġcompile Service Ġ= Ġcompile Service , ĊĠĠĠĠĠĠĠ Ġclient Alive Flag File Ġ= Ġclient Alive Flag File , ĊĠĠĠĠĠĠĠ Ġtarget Platform Ġ= Ġtarget Platform , ĊĠĠĠĠĠĠĠ Ġtemplate Classpath Ġ= Ġtemplate Classpath , ĊĠĠĠĠĠĠĠ Ġtemplate ClassName Ġ= Ġtemplate ClassName , ĊĠĠĠĠĠĠĠ Ġcompiler Messages OutputStream Ġ= Ġcompiler Messages OutputStream , ĊĠĠĠĠĠĠĠ Ġeval OutputStream Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġeval Error Stream Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġeval InputStream Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġport Ġ= Ġport , ĊĠĠĠĠĠĠĠ Ġoperations Tracer Ġ= Ġoperations Tracer Ċ ), ĠRe pl Compiler Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġcompile ( code Line : ĠRe pl Code Line , Ġhistory : ĠList < Repl Code Line >): ĠRe pl Compile Result Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcompile Service . remote Repl Line Compile ( sessionId , Ġcode Line , Ġhistory ). get () ĊĠĠĠ Ġ} Ċ } Ċ Ċ // ĠTODO : Ġconsider Ġremoving Ġdaemon Ġeval Ġcompletely Ġ- Ġit Ġis Ġnot Ġrequired Ġnow Ġand Ġhas Ġquestion able Ġsecurity . ĠThis Ġwill Ġsimplify Ġdaemon Ġinterface Ġas Ġwell Ċ class ĠKotlin Remote Repl Evaluator ( ĊĠĠĠĠĠĠĠ Ġdis posable : ĠDis posable , ĊĠĠĠĠĠĠĠ Ġcompile Service : ĠCompile Service , ĊĠĠĠĠĠĠĠ Ġclient Alive Flag File : ĠFile ?, ĊĠĠĠĠĠĠĠ Ġtarget Platform : ĠCompile Service . Target Platform , ĊĠĠĠĠĠĠĠ Ġtemplate Classpath : ĠList < File >, ĊĠĠĠĠĠĠĠ Ġtemplate ClassName : ĠString , ĊĠĠĠĠĠĠĠ Ġscript Args : ĠArray < Any ?> ?, ĊĠĠĠĠĠĠĠ Ġscript Args Types : ĠArray < Class <* >> ?, ĊĠĠĠĠĠĠĠ Ġcompiler Messages OutputStream : ĠOutputStream , ĊĠĠĠĠĠĠĠ Ġeval OutputStream : ĠOutputStream ?, ĊĠĠĠĠĠĠĠ Ġeval Error Stream : ĠOutputStream ?, ĊĠĠĠĠĠĠĠ Ġeval InputStream : ĠInputStream ?, ĊĠĠĠĠĠĠĠ Ġport : ĠInt Ġ= ĠSOCKET _ ANY _ FREE _ PORT , ĊĠĠĠĠĠĠĠ Ġoperations Tracer : ĠRemote Operations Tracer ? Ġ= Ġnull Ċ ) Ġ: ĠKotlin Remote Repl Client Base ( ĊĠĠĠĠĠĠĠ Ġdis posable Ġ= Ġdis posable , ĊĠĠĠĠĠĠĠ Ġcompile Service Ġ= Ġcompile Service , ĊĠĠĠĠĠĠĠ Ġclient Alive Flag File Ġ= Ġclient Alive Flag File , ĊĠĠĠĠĠĠĠ Ġtarget Platform Ġ= Ġtarget Platform , ĊĠĠĠĠĠĠĠ Ġtemplate Classpath Ġ= Ġtemplate Classpath , ĊĠĠĠĠĠĠĠ Ġtemplate ClassName Ġ= Ġtemplate ClassName , ĊĠĠĠĠĠĠĠ Ġscript Args Ġ= Ġscript Args , ĊĠĠĠĠĠĠĠ Ġscript Args Types Ġ= Ġscript Args Types , ĊĠĠĠĠĠĠĠ Ġcompiler Messages OutputStream Ġ= Ġcompiler Messages OutputStream , ĊĠĠĠĠĠĠĠ Ġeval OutputStream Ġ= Ġeval OutputStream , ĊĠĠĠĠĠĠĠ Ġeval Error Stream Ġ= Ġeval Error Stream , ĊĠĠĠĠĠĠĠ Ġeval InputStream Ġ= Ġeval InputStream , ĊĠĠĠĠĠĠĠ Ġport Ġ= Ġport , ĊĠĠĠĠĠĠĠ Ġoperations Tracer Ġ= Ġoperations Tracer Ċ ), ĠRe pl Evaluator Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġlast Evalu ated Script : ĠClass With Instance ? Ġ= Ġnull Ġ// Ġnot Ġimplemented , Ġno Ġneed Ġso Ġfar ĊĊĠĠĠ Ġ// ĠTODO : Ġinvoke Wrapper Ġis Ġignored Ġhere , Ġand Ġin Ġthe Ġdaemon Ġthe Ġsession Ġwrapper Ġis Ġused Ġinstead ; ĠSo Ġconsider Ġto Ġmake Ġit Ġper Ġcall Ġ( avoid Ġperformance Ġpen alt ies Ġthough ) ĊĠĠĠ Ġoverride Ġfun Ġeval ( code Line : ĠRe pl Code Line , Ġhistory : ĠList < Repl Code Line >, Ġinvoke Wrapper : ĠInvoke Wrapper ?): ĠRe pl Eval Result Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcompile Service . remote Repl Line Eval ( sessionId , Ġcode Line , Ġhistory ). get () ĊĠĠĠ Ġ} Ċ } Ċ