/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠJon as ĠGr Ã¶n berg Ċ Ġ* ĠLicensed Ġunder ĠMIT : Ġhttps :// github . com / j og ro / k raft ver k / blob / master / LICENSE Ċ Ġ*/ Ċ Ċ package Ġio . k raft ver k . core . managed Ċ Ċ import Ġio . k raft ver k . core . binding . Binding Ċ import Ġio . k raft ver k . core . binding . delegate Ċ import Ġio . k raft ver k . core . common . Bean Processor Ċ import Ġio . k raft ver k . core . common . Value Processor Ċ import Ġio . k raft ver k . core . internal . container . bean Providers Ċ import Ġio . k raft ver k . core . internal . container . start Ċ import Ġio . k raft ver k . core . internal . container . stop Ċ import Ġio . k raft ver k . core . internal . container . value Providers Ċ import Ġio . k raft ver k . core . internal . logging . create Logger Ċ import Ġio . k raft ver k . core . internal . misc . Basic State Ċ import Ġio . k raft ver k . core . internal . misc . apply As Ċ import Ġio . k raft ver k . core . internal . misc . apply When Ċ import Ġio . k raft ver k . core . internal . module . Module Factory Ċ import Ġio . k raft ver k . core . module . Module Ċ import Ġio . k raft ver k . core . provider . Bean Provider Ċ import Ġio . k raft ver k . core . provider . Value Provider Ċ import Ġio . k raft ver k . core . provider . get Ċ import Ġkotlin . properties . ReadOnly Property Ċ import Ġkotlin . reflect . K Property Ċ Ċ /** Ċ Ġ* ĠProvides Ġaccess Ġto Ġand Ġmanages Ġbean Ġand Ġvalue Ġinstances Ġin Ġa Ġspecified Ċ Ġ* Ġimplementation Ġ[ M ] Ġof Ġ[ Module ]. Ċ Ġ* Ċ Ġ* ĠGiven Ġa Ġmodule : Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġclass ĠApp Module Ġ: ĠModule () Ġ{ Ċ Ġ* ĠĠĠĠ Ġval Ġusername Ġby Ġstring () ĠĠ Ġ// < -- ĠValue Ġbinding Ċ Ġ* ĠĠĠĠ Ġval Ġsome Service Ġby Ġbean Ġ{ Ġ Ġ// < -- ĠBean Ġbinding Ċ Ġ* ĠĠĠĠĠĠĠĠ ĠSome Service ( Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ Ġusername () Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ) Ċ Ġ* ĠĠĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* ĠCall Ġthe Ġmanage Ġfactory Ġfunction Ġto Ġcreate Ġa Ġ[ Managed ] Ġinstance Ġof Ġthe Ġmodule . Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġval Ġapp Ġby ĠK raft ver k . manage Ġ{ ĠApp Module () Ġ} Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ class ĠManaged < M Ġ: ĠModule > Ġinternal Ġconstructor ( module Factory : ĠModule Factory < M >) Ġ{ ĊĊĠĠĠ Ġinternal Ġval Ġlogger Ġ= Ġcreate Logger Ġ{ Ġ} ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġinternal Ġvar Ġstate : ĠState < M > Ġ= ĊĠĠĠĠĠĠĠ ĠState . Configurable ( module Factory ) ĊĊĠĠĠ Ġinternal Ġsealed Ġclass ĠState < out ĠM Ġ: ĠModule > Ġ: ĊĠĠĠĠĠĠĠ ĠBasic State Ġ{ ĊĊĠĠĠĠĠĠĠ Ġclass ĠConfigur able < M Ġ: ĠModule >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodule Factory : ĠModule Factory < M > ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠState < M >() ĊĊĠĠĠĠĠĠĠ Ġclass ĠRunning < M Ġ: ĠModule >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodule : ĠM ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠState < M >() ĊĊĠĠĠĠĠĠĠ Ġobject ĠDestroy ing Ġ: ĠState < Nothing >() ĊĊĠĠĠĠĠĠĠ Ġobject ĠDestroy ed Ġ: ĠState < Nothing >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġ[ start ] Ġfunction Ġis Ġby Ġdefault Ġnon - lazy , Ġmeaning Ġthat : ĊĠĠĠĠ Ġ* Ġ 1 ) ĠAll Ġvalue Ġbindings Ġdeclared Ġin Ġthe Ġ[ Module ] Ġare Ġeager ly Ġlooked Ġup Ġusing Ġthe ĠEnvironment Ġthat ĊĠĠĠĠ Ġ* Ġwas Ġspecified Ġat Ġthe Ġtime Ġthe Ġmanaged Ġinstance Ġwas Ġcreated . ĠShould Ġany Ġvalue Ġbe Ġmissing Ġan Ġexception Ġis Ġthrown . ĊĠĠĠĠ Ġ* Ġ 2 ) ĠAll ĠBean Ġbindings Ġare Ġeager ly Ġinstantiated . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠCall Ġthe Ġ[ Managed . stop ] Ġmethod Ġto Ġdestroy Ġthe Ġ[ Managed ] Ġinstance . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstart ( lazy : ĠBoolean Ġ= Ġfalse , Ġblock : ĠM . () Ġ-> ĠUnit Ġ= Ġ{} ): ĠManaged < M > Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Starting Ġmanaged Ġmodule " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstart Ms Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġstate . apply As < State . Configurable < M >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Factory . configure ( block ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodule Ġ= Ġmodule Factory . create Module ( lazy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠState . Running ( module ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠRuntime . get Runtime (). add Shutdown Hook ( Thread Ġ{ Ġstop () Ġ}) ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Started Ġmanaged Ġmodule Ġin Ġ${ System . currentTimeMillis () Ġ- Ġstart Ms } ms " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġconfigure ( block : ĠM . () Ġ-> ĠUnit ): ĠManaged < M > Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . apply As < State . Configurable < M >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Factory . configure ( block ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Processor ( processor : ĠBean Processor ): ĠManaged < M > Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . apply As < State . Configurable < M >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Factory . add Processor ( processor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Processor ( processor : ĠValue Processor ): ĠManaged < M > Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . apply As < State . Configurable < M >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Factory . add Processor ( processor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieves Ġall Ġ[ Bean Provider ] s . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġbean Providers : ĠList < Bean Provider <* >> Ġget () Ġ= Ġmodule . container . bean Providers ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieves Ġall Ġ[ Value Provider ] s . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġvalue Providers : ĠList < Value Provider <* >> Ġget () Ġ= Ġmodule . container . value Providers ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEx traction Ġof Ġinstance Ġ[ T ] Ġfrom Ġthe Ġspecified Ġ[ Binding ] Ġin Ġ[ Module ] ĠM . ĊĠĠĠĠ Ġ* Ġ``` kotlin ĊĠĠĠĠ Ġ* Ġval Ġsome Service Ġ= Ġapp Ġ{ Ġsome Service Ġ} ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoperator Ġfun Ġ< T Ġ: ĠAny > Ġinvoke ( binding : ĠM . () Ġ-> ĠBinding < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . apply As < State . Running < M >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmodule . binding (). delegate . provider . get () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLazy Ġextraction Ġof Ġinstance Ġ[ T ] Ġfrom Ġthe Ġspecified Ġ[ Binding ] Ġin Ġ[ Module ] ĠM . ĊĠĠĠĠ Ġ* Ġ``` kotlin ĊĠĠĠĠ Ġ* Ġval Ġsome Service Ġby Ġapp . get Ġ{ Ġsome Service Ġ} ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġget ( binding : ĠM . () Ġ-> ĠBinding < T >) Ġ= ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠReadOnly Property < Any ?, ĠT > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property < *> ): ĠT Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinvoke ( binding ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSto ps Ġthis Ġinstance . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . apply When < State . Running <* >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Stopping Ġmanaged Ġmodule " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠState . Destroy ing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodule . container . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠState . Destroyed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Stopped Ġmanaged Ġmodule " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġval Ġmodule : ĠM ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . apply As < State . Running < M >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmodule ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġcompanion Ġobject Ċ } Ċ