package Ġorg . jetbrains . ktor . host Ċ Ċ import Ġorg . jetbrains . ktor . application .* Ċ import Ġorg . jetbrains . ktor . config .* Ċ import Ġorg . jetbrains . ktor . logging .* Ċ import Ġorg . jetbrains . ktor . util .* Ċ import Ġjava . io .* Ċ import Ġjava . lang . reflect .* Ċ import Ġjava . net .* Ċ import Ġjava . nio . file .* Ċ import Ġjava . nio . file . Standard Watch Event Kinds .* Ċ import Ġjava . nio . file . attribute .* Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent .* Ċ import Ġjava . util . concurrent . locks .* Ċ import Ġkotlin . concurrent .* Ċ import Ġkotlin . reflect .* Ċ import Ġkotlin . reflect . full .* Ċ import Ġkotlin . reflect . jvm .* Ċ Ċ /** Ċ Ġ* ĠImplements Ġ[ Application Host Environment ] Ġby Ġloading Ġan Ġ[ Application ] Ġfrom Ġa Ġfolder Ġor Ġjar . Ċ Ġ* Ċ Ġ* ĠWhen Ġ[ reload Packages ] Ġis Ġ` true `, Ġit Ġw atches Ġchanges Ġin Ġfolder / jar Ġand Ġimplements Ġhot Ġre loading Ċ Ġ*/ Ċ class ĠApplication Host Environment Re loading ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġclass Loader : ĠClassLoader , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġlog : ĠApplication Log , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġconfig : ĠApplication Config , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġconnector s : ĠList < Host Connector Config >, ĊĠĠĠĠĠĠĠ Ġval Ġmodules : ĠList < Application . () Ġ-> ĠUnit >, ĊĠĠĠĠĠĠĠ Ġval Ġreload Packages : ĠList < String > Ġ= Ġempty List () Ċ ) ĊĠĠĠ Ġ: ĠApplication Host Environment Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġ_ application Instance : ĠApplication ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġapplication Instance Lock Ġ= ĠRe entrant ReadWrite Lock () ĊĠĠĠ Ġprivate Ġvar Ġpackage Watch Keys Ġ= Ġempty List < Watch Key >() ĊĊĠĠĠ Ġprivate Ġval Ġwatch Patterns : ĠList < String > Ġ= Ġ( config . property OrNull (" ktor . deployment . watch ") ?. getList () Ġ?: ĠlistOf ()) Ġ+ Ġreload Packages ĊĊĠĠĠ Ġprivate Ġval Ġmodule Function Names : ĠList < String >? Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfig Modules Ġ= Ġconfig . property OrNull (" ktor . application . modules ") ?. getList () ĊĠĠĠĠĠĠĠ Ġif Ġ( watch Patterns . isEmpty ()) Ġconfig Modules ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġun linked Modules Ġ= Ġmodules . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfn Ġ= Ġ( it Ġas ? ĠK Function <* >) ?. java Method Ġ?: Ġthrow ĠRuntimeException (" Module Ġfunction Ġprovided Ġas Ġlambda Ġcannot Ġbe Ġun linked Ġfor Ġreload ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= Ġfn . decl aring Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġfn . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ clazz . name }. $ name " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config Modules Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun linked Modules ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Modules Ġ+ Ġun linked Modules ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġwatcher Ġby Ġlazy Ġ{ ĠFileSystem s . getDefault (). new Watch Service () Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġmonitor Ġ= ĠApplication Monitor () ĊĊĠĠĠ Ġ@ Suppress (" UN NE C ESS ARY _ NOT _ NULL _ ASSERT ION ") ĊĠĠĠ Ġoverride Ġval Ġapplication : ĠApplication ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcurrent Application () ĊĊĊĠĠĠ Ġprivate Ġfun Ġcurrent Application (): ĠApplication Ġ= Ġapplication Instance Lock . read Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( watch Patterns . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchanges Ġ= Ġpackage Watch Keys . flatMap Ġ{ Ġit . poll Events () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( changes . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Changes Ġin Ġapplication Ġdetected .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġchanges . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmore Changes Ġ= Ġpackage Watch Keys . flatMap Ġ{ Ġit . poll Events () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( more Changes . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Waiting Ġfor Ġmore Ġchanges .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ+= Ġmore Changes . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Changes Ġto Ġ$ count Ġfiles Ġcaused Ġapplication Ġrestart .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanges . take ( 5 ). forEach Ġ{ Ġlog . debug (" ... Ġ Ġ${ it . context () }") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Instance Lock . write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestroy Application () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ application Instance Ġ= Ġcreate Application () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ_ application Instance Ġ?: Ġthrow ĠIllegalStateException (" Application Host Environment Ġwas Ġnot Ġstarted ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠClassLoader . all URLs (): ĠList < URL > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparent Urls Ġ= Ġparent ?. all URLs () Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġis ĠURL ClassLoader ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurls Ġ= Ġur Ls . filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" ClassLoader Ġ$ this : Ġ$ urls ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġurls Ġ+ Ġparent Urls ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġparent Urls ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Application (): ĠApplication Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclass Loader Ġ= Ġcreate ClassLoader () ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Thread Ġ= ĠThread . currentThread () ĊĠĠĠĠĠĠĠ Ġval Ġold Thread ClassLoader Ġ= Ġcurrent Thread . context ClassLoader ĊĠĠĠĠĠĠĠ Ġcurrent Thread . context ClassLoader Ġ= Ġclass Loader ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinstantiate And Configure Application ( class Loader ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Thread . context ClassLoader Ġ= Ġold Thread ClassLoader ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate ClassLoader (): ĠClassLoader Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbase ClassLoader Ġ= Ġclass Loader ĊĠĠĠĠĠĠĠ Ġif Ġ( watch Patterns . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbase ClassLoader ĊĊĠĠĠĠĠĠĠ Ġval Ġall Urls Ġ= Ġbase ClassLoader . all URLs () ĊĠĠĠĠĠĠĠ Ġval Ġwatch Patterns Ġ= Ġwatch Patterns ĊĠĠĠĠĠĠĠ Ġif Ġ( watch Patterns . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warning (" No Ġk tor . deployment . watch Ġpatterns Ġspecified , Ġhot Ġreload Ġis Ġdisabled ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbase ClassLoader ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġshouldn 't Ġwatch ĠURL Ġfor Ġk tor - core Ġclasses , Ġeven Ġif Ġthey Ġmatch Ġpatterns , ĊĠĠĠĠĠĠĠ Ġ// Ġbecause Ġotherwise Ġit Ġloads Ġtwo ĠApplication Environment Ġ( and Ġother ) Ġtypes Ġwhich Ġdo Ġnot Ġmatch ĊĠĠĠĠĠĠĠ Ġval Ġcore Url Ġ= ĠApplication Environment :: class . java . protection Domain . code Source . location ĊĊĠĠĠĠĠĠĠ Ġval Ġwatch Urls Ġ= Ġall Urls . filter Ġ{ Ġurl Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ!= Ġcore Url Ġ&& Ġwatch Patterns . any Ġ{ Ġpattern Ġ-> Ġurl . toString (). contains ( pattern ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( watch Urls . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warning (" No Ġk tor . deployment . watch Ġpatterns Ġmatch Ġclasspath Ġentries , Ġhot Ġreload Ġis Ġdisabled ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbase ClassLoader ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwatch Urls ( watch Urls ) ĊĠĠĠĠĠĠĠ Ġreturn ĠOver riding ClassLoader ( watch Urls , Ġbase ClassLoader ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsafe R ise Event ( event : ĠEvent < Application >, Ġapplication : ĠApplication ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent ( application ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" One Ġor Ġmore Ġof Ġthe Ġhandlers Ġthrown Ġan Ġexception ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdestroy Application () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Application Ġ= Ġ_ application Instance ĊĠĠĠĠĠĠĠ Ġif Ġ( current Application Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsafe R ise Event ( monitor . application Stopping , Ġcurrent Application ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Application . dispose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Failed Ġto Ġdestroy Ġapplication Ġinstance .", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsafe R ise Event ( monitor . application Stopped , Ġcurrent Application ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ_ application Instance Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġpackage Watch Keys . forEach Ġ{ Ġit . cancel () Ġ} ĊĠĠĠĠĠĠĠ Ġpackage Watch Keys Ġ= Ġmutable ListOf () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwatch Urls ( urls : ĠList < URL >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpaths Ġ= ĠHashSet < Path >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( url Ġin Ġurls ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġurl . path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( path Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfolder Ġ= ĠFile ( URL Decoder . decode ( path , Ġ" utf - 8 ")). to Path () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvisitor Ġ= Ġobject Ġ: ĠSimple File Visitor < Path >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġpre Visit Directory ( dir : ĠPath , Ġattrs : ĠBasic File Attributes ): ĠFile Visit Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaths . add ( dir ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFile Visit Result . CONTINUE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit File ( file : ĠPath , Ġattrs : ĠBasic File Attributes ): ĠFile Visit Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Ġ= Ġfile . parent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dir Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaths . add ( dir ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFile Visit Result . CONTINUE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . walk File Tree ( folder , Ġvisitor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpaths . forEach Ġ{ Ġpath Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Watch ing Ġ$ path Ġfor Ġchanges .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmodifiers Ġ= Ġget _ com _ sun _ nio _ file _ Sensitivity Watch Event Modifier _ HIGH ()?. let Ġ{ ĠarrayOf ( it ) Ġ} Ġ?: Ġempty Array () ĊĠĠĠĠĠĠĠ Ġpackage Watch Keys Ġ= Ġpaths . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . register ( watcher , ĠarrayOf ( ENTRY _ CREATE , ĠEN TRY _ DELETE , ĠEN TRY _ MO DIFY ), Ġ* modifiers ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġapplication Instance Lock . write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ application Instance Ġ= Ġcreate Application () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġapplication Instance Lock . write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestroy Application () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( watch Patterns . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwatcher . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinstantiate And Configure Application ( class Loader : ĠClassLoader ): ĠApplication Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapplication Ġ= ĠApplication ( this ) ĊĠĠĠĠĠĠĠ Ġsafe R ise Event ( monitor . application Starting , Ġapplication ) ĊĊĠĠĠĠĠĠĠ Ġmodule Function Names ?. forEach Ġ{ Ġfq Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Module Function ( class Loader , Ġfq Name , Ġapplication ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( watch Patterns . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodules . forEach Ġ{ Ġit ( application ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsafe R ise Event ( monitor . application Started , Ġapplication ) ĊĠĠĠĠĠĠĠ Ġreturn Ġapplication ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute Module Function ( class Loader : ĠClassLoader , Ġfq Name : ĠString , Ġapplication : ĠApplication ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfq Name . lastIndexOf Any (". # ". toCharArray ()). let Ġ{ Ġidx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( idx Ġ== Ġ- 1 ) Ġreturn @ let ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠclassName Ġ= Ġfq Name . substring ( 0 , Ġidx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Name Ġ= Ġfq Name . substring ( idx Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= Ġclass Loader . load Class OrNull ( className ) Ġ?: Ġreturn @ let ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatic Functions Ġ= Ġclazz . methods ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . name Ġ== Ġfunction Name Ġ&& ĠModifier . is Static ( it . modifiers ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġit . kotlin Function Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatic Functions . best Function ()?. let Ġ{ Ġmodule Function Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Function With Injection ( null , Ġmodule Function , Ġapplication ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Function 1 :: class . java . isAssignableFrom ( clazz )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= Ġclazz . declared Construct ors . single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( constructor . parameter Count Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Module Ġfunction Ġwith Ġcaptured Ġvariables Ġcannot Ġbe Ġinstantiated Ġ'$ fq Name '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor . is Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Ġ= Ġconstructor . newInstance () Ġas ĠFunction 1 < Application , ĠUnit > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction ( application ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġk class Ġ= Ġclazz . kotlin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= Ġcreate Module Container ( k class , Ġapplication ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġk class . functions . filter Ġ{ Ġit . name Ġ== Ġfunction Name Ġ}. best Function ()?. let Ġ{ Ġmodule Function Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Function With Injection ( instance , Ġmodule Function , Ġapplication ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthrow ĠClass NotFoundException (" Module Ġfunction Ġcannot Ġbe Ġfound Ġfor Ġthe Ġfully Ġqualified Ġname Ġ'$ fq Name '") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Module Container ( application Entry Class : ĠK Class <* >, Ġapplication : ĠApplication ): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġobject Instance Ġ= Ġapplication Entry Class . object Instance ĊĠĠĠĠĠĠĠ Ġif Ġ( object Instance Ġ!= Ġnull ) Ġreturn Ġobject Instance ĊĊĠĠĠĠĠĠĠ Ġval Ġconstructors Ġ= Ġapplication Entry Class . construct ors . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . parameters . all Ġ{ Ġp Ġ-> Ġp . is Optional Ġ|| Ġis Application Environment ( p ) Ġ|| Ġis Application ( p ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= Ġconstructors . best Function () Ġ?: Ġthrow ĠRuntimeException (" There Ġare Ġno Ġapplicable Ġconstructors Ġfound Ġin Ġclass Ġ$ application Entry Class ") ĊĠĠĠĠĠĠĠ Ġreturn Ġcall Function With Injection ( null , Ġconstructor , Ġapplication ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< R > ĠList < K Function < R >> . best Function (): ĠK Function < R >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsorted With ( compare By ({ Ġit . parameters . count Ġ{ Ġ! it . is Optional Ġ} Ġ}, Ġ{ Ġit . parameters . size Ġ})). last OrNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< R > Ġcall Function With Injection ( instance : ĠAny ?, Ġentry Point : ĠK Function < R >, Ġapplication : ĠApplication ): ĠR Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġentry Point . call By ( entry Point . parameters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . is Optional Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. associate By ({ Ġit Ġ}, Ġ{ Ġp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" IMP LICIT _ CAST _ TO _ ANY ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . kind Ġ== ĠK Parameter . Kind . INSTANCE Ġ-> Ġinstance ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Application Environment ( p ) Ġ-> Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Application ( p ) Ġ-> Ġapplication ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠRuntimeException (" Parameter Ġtype Ġ${ p . type } Ġof Ġparameter Ġ${ p . name } Ġis Ġnot Ġsupported ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ})) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠClassLoader . load Class OrNull ( name : ĠString ): ĠClass < *> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġload Class ( name ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClass NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget _ com _ sun _ nio _ file _ Sensitivity Watch Event Modifier _ HIGH (): ĠWatch Event . Modifier ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= ĠClass . forName (" com . sun . nio . file . Sensitivity Watch Event Modifier ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf Ġ= Ġc . getField (" HIGH ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġf . get ( c ) Ġas ? ĠWatch Event . Modifier ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġis Parameter OfType ( p : ĠK Parameter , Ġtype : ĠClass <* >) Ġ= Ġ( p . type . java Type Ġas ? ĠClass <* >) ?. let Ġ{ Ġtype . isAssignableFrom ( it ) Ġ} Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġis Application Environment ( p : ĠK Parameter ) Ġ= Ġis Parameter OfType ( p , ĠApplication Environment Class Instance ) ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġis Application ( p : ĠK Parameter ) Ġ= Ġis Parameter OfType ( p , ĠApplication Class Instance ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠApplication Environment Class Instance Ġ= ĠApplication Environment :: class . java ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠApplication Class Instance Ġ= ĠApplication :: class . java ĊĠĠĠ Ġ} Ċ } Ċ