package Ġtech . k zen . auto . server . service . compile Ċ Ċ import Ġtech . k zen . auto . server . objects . report . service . Report Work Pool Ċ import Ġtech . k zen . auto . server . util . Work Utils Ċ import Ġjava . net . URL ClassLoader Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Path Ċ import Ġjava . time . LocalDateTime ĊĊ Ċ class ĠCached Kotlin Compiler ( ĊĠĠĠ Ġprivate Ġval Ġkotlin Compiler : ĠKotlin Compiler , ĊĠĠĠ Ġwork Utils : ĠWork Utils Ċ ) Ġ{ ĊĠĠĠ Ġ// ---------------------------------------------------------------- ------------------------------------------------ - ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġcode Cache Dir Ġ= Ġ" code - cache " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġsource Dir Ġ= Ġ" src " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġbuild Dir Ġ= Ġ" build " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġsource Extension Ġ= Ġ". kt " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġerror File Ġ= Ġ" err . txt " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġsuccess File Ġ= Ġ" success . txt " ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ---------------------------------------------------------------- ------------------------------------------------ - ĊĠĠĠ Ġprivate Ġval Ġcache Dir Ġ= Ġwork Utils . resolve ( code Cache Dir ) ĊĊĊĠĠĠ Ġ// ---------------------------------------------------------------- ------------------------------------------------ - ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠFiles . create Directories ( cacheDir ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ---------------------------------------------------------------- ------------------------------------------------ - ĊĠĠĠ Ġprivate Ġfun Ġerror File ( code Dir : ĠPath ): ĠPath Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcode Dir . resolve ( error File ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġwrite Error File ( code Dir : ĠPath , ĠerrorMessage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠFiles . write ( error File ( code Dir ), ĠerrorMessage . toByteArray ()) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġread Error File ( code Dir : ĠPath ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror File Ġ= Ġerror File ( code Dir ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! ĠFiles . exists ( error File )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠFiles . readString ( error File , ĠChar sets . UTF _ 8 ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ---------------------------------------------------------------- ------------------------------------------------ - ĊĠĠĠ Ġprivate Ġfun Ġsuccess File ( code Dir : ĠPath ): ĠPath Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcode Dir . resolve ( success File ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġwrite Success File ( code Dir : ĠPath ) Ġ{ ĊĠĠĠĠĠĠĠ ĠFiles . write ( success File ( code Dir ), Ġ"${ LocalDateTime . now ()} ". toByteArray ()) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġhas Success ( code Dir : ĠPath ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFiles . exists ( success File ( code Dir )) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ---------------------------------------------------------------- ------------------------------------------------ - ĊĠĠĠ Ġfun Ġtry Load ( ĊĠĠĠĠĠĠĠ Ġkotlin Code : ĠKotlin Code , ĊĠĠĠĠĠĠĠ Ġclass Loader : ĠClassLoader ĊĠĠĠ Ġ): ĠClass < out ĠAny >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsignature Ġ= Ġkotlin Code . signature () ĊĠĠĠĠĠĠĠ Ġval Ġcode Dir Ġ= Ġcache Dir . resolve ( signature ) ĊĠĠĠĠĠĠĠ Ġval Ġclass Dir Ġ= Ġcode Dir . resolve ( build Dir ) ĊĠĠĠĠĠĠĠ Ġval Ġclass Url Ġ= Ġclass Dir . to Uri (). to URL () ĊĊĠĠĠĠĠĠĠ Ġval Ġsource ClassLoader Ġ= ĠURL ClassLoader ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" code _$ signature ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( class Url ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Loader ) ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" Lift Return Or Assignment ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsource ClassLoader . load Class ( kotlin Code . fully Qualified Main Class ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠClass NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ---------------------------------------------------------------- ------------------------------------------------ - ĊĠĠĠ Ġfun Ġtry Compile ( ĊĠĠĠĠĠĠĠ Ġkotlin Code : ĠKotlin Code , ĊĠĠĠĠĠĠĠ Ġclass Loader : ĠClassLoader ĊĠĠĠ Ġ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Dir Ġ= Ġcache Dir . resolve ( kotlin Code . signature ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġpreviously Compiled Ġ= ĠFiles . exists ( code Dir ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! Ġpreviously Compiled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Compile New ( kotlin Code , Ġcode Dir , Ġclass Loader ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġprevious Error Ġ= Ġread Error File ( code Dir ) ĊĠĠĠĠĠĠĠ Ġif Ġ( previous Error Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġprevious Error ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( has Success ( code Dir )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠReport Work Pool . delete Dir ( code Dir ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Compile New ( kotlin Code , Ġcode Dir , Ġclass Loader ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġtry Compile New ( ĊĠĠĠĠĠĠĠ Ġkotlin Code : ĠKotlin Code , ĊĠĠĠĠĠĠĠ Ġcode Dir : ĠPath , ĊĠĠĠĠĠĠĠ Ġclass Loader : ĠClassLoader ĊĠĠĠ Ġ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode File Ġ= Ġcode Dir . resolve ( source Dir ). resolve ( kotlin Code . main ClassName Ġ+ Ġsource Extension ) ĊĠĠĠĠĠĠĠ ĠFiles . create Directories ( code File . parent ) ĊĠĠĠĠĠĠĠ ĠFiles . write ( code File , Ġkotlin Code . file Source Code . toByteArray ()) Ċ Ċ // ĠĠĠĠĠĠĠ Ġval Ġclass Loader Ġ= Ġobject : ĠClassLoader () Ġ{} ĊĠĠĠĠĠĠĠ Ġval ĠerrorMessage Ġ= Ġkotlin Compiler . try Compile Module ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin Code . main ClassName , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( code File ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcode Dir . resolve ( build Dir ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Loader ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( errorMessage Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Success File ( code Dir ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Error File ( code Dir , ĠerrorMessage ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠerrorMessage ĊĠĠĠ Ġ} Ċ }