package Ġnet . bnb 1 . commons . beans Ċ Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġnet . bnb 1 . commons . event . EventBus Ċ import Ġnet . bnb 1 . commons . event . EventListener Ċ import Ġnet . bnb 1 . commons . lifecycle . Lifecycle Component Ċ import Ġnet . bnb 1 . commons . lifecycle . Lifecycle Exception Ċ import Ġnet . bnb 1 . commons . lifecycle . Lifecycle Support Ċ import Ġnet . bnb 1 . commons . logging . Logger Ċ import Ġnet . bnb 1 . commons . tasks . Task Definition Ċ import Ġnet . bnb 1 . commons . tasks . Task Scheduler Ċ import Ġjava . util . concurrent . Count DownLatch Ċ Ċ /** Ċ Ġ* ĠUsed Ġto Ġsimplify Ġapplication Ġsetup . Ċ Ġ*/ Ċ class ĠApplication Context ( val Ġbean Container : ĠBean Container ) Ġ: ĠLifecycle Component Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġsupport Ġ= ĠLifecycle Support ( this ) ĊĠĠĠ Ġprivate Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĊĠĠĠ Ġoverride Ġval Ġrunning Ġby Ġsupport ĊĊĠĠĠ Ġoverride Ġfun Ġname (): ĠString Ġ= Ġ" Application Ġcontext " ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStarts Ġthe Ġapplication Ġcontext . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠPub lishes Ġ[ Ready Event ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġstart () Ġ= Ġsupport . start Ġ{ ĊĠĠĠĠĠĠĠ Ġbean Container . start () ĊĠĠĠĠĠĠĠ Ġif Ġ( bean Container . has ( EventBus :: class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbean Container [ EventBus :: class ]. publish ( Ready Event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( bean Container . has ( Task Scheduler :: class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbean Container [ Task Scheduler :: class ]. start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSto ps Ġthe Ġapplication Ġcontext . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠPub lishes Ġ[ Shutdown Event ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġstop () Ġ= Ġsupport . stop Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( bean Container . has ( Task Scheduler :: class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbean Container [ Task Scheduler :: class ]. stop () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( bean Container . has ( EventBus :: class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbean Container [ EventBus :: class ]. publish ( Shutdown Event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbean Container . all (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠLifecycle Component Ġ&& Ġit . running ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġactive Ġprofile . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġprofile : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġbean Container . active Profile ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġlogger . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThrows Ġan Ġ[ Exception ] Ġif Ġno Ġ[ Logger ] Ġbean Ġwas Ġregistered . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġlogger : ĠLogger ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbean Container . await ( Logger :: class ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInv okes Ġ[ run nable ] Ġif Ġ[ profile ] Ġmatches Ġthe Ġactive Ġprofile Ġor Ġis Ġ` null `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġexec ( profile : ĠString ? Ġ= Ġnull , Ġrunnable : ĠRunnable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbean Container . exec ( profile , Ġrunnable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegisters Ġsingleton Ġif Ġ[ profile ] Ġmatches Ġthe Ġactive Ġprofile Ġor Ġis Ġ` null `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġregistering Ġa Ġ[ Lifecycle Component ], Ġ[ auto Start ] Ġcan Ġbe Ġset Ġto Ġstart Ġthe Ġcomponent Ġon Ġcreation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġsingle ( ĊĠĠĠĠĠĠĠ Ġprofile : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġoverride : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġauto Start : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġno inline Ġsupplier : Ġsuspend Ġ() Ġ-> ĠT ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbean Container . single ( T :: class , Ġprofile , Ġoverride ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbean Ġ= Ġsupplier () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( auto Start Ġ&& Ġ( bean Ġis ĠLifecycle Component )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbean . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbean ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠW aits Ġuntil Ġbean Ġof Ġtype Ġ[ T ] Ġis Ġcreated Ġand Ġreturns Ġthe Ġinstance . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThrows Ġan Ġ[ Exception ] Ġif Ġno Ġbean Ġof Ġtype Ġis Ġregistered . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġawait (): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbean Container . await ( T :: class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġbean Ġof Ġtype Ġ[ T ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThrows Ġan Ġ[ Exception ] Ġif Ġno Ġbean Ġof Ġtype Ġis Ġregistered Ġor Ġcontext Ġis Ġnot Ġrunning . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġget (): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbean Container [ T :: class ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSub scri bes Ġ[ listener ] Ġfor Ġan Ġspecific Ġevent Ġof Ġtype Ġ[ T ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThrows Ġan Ġ[ Exception ] Ġif Ġno Ġ[ EventBus ] Ġbean Ġwas Ġregistered . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġevent ( listener : ĠEvent Listener < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġbean Container . await ( EventBus :: class ). subscribe ( T :: class , Ġlistener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠS chedules Ġa Ġ[ action ] Ġfor Ġexecution . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThrows Ġan Ġ[ Exception ] Ġif Ġno Ġ[ Task Scheduler ] Ġbean Ġwas Ġregistered . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġschedule ( delay : ĠLong , Ġperiod : ĠLong , Ġaction : ĠRunnable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbean Container . await ( Task Scheduler :: class ). add ( Task Definition ( delay , Ġperiod , Ġaction )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBlocks Ġuntil Ġ[ stop ] Ġis Ġcalled . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġblock () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! running ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠLifecycle Exception (" Container Ġnot Ġstarted ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġl atch . await () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġand Ġstarts Ġa Ġnew Ġ[ ApplicationContext ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġstart ( initialize : Ġsuspend ĠApplication Context . () Ġ-> ĠUnit ): ĠApplication Context Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbean Container Ġ= ĠBean Container (" Application Ġcontext ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapplication Context Ġ= ĠApplication Context ( bean Container ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġinitialize ( application Context ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġapplication Context ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreates Ġand Ġstarts Ġa Ġnew Ġ[ ApplicationContext ]. Ċ Ġ*/ Ċ fun Ġstart ( initialize : Ġsuspend ĠApplication Context . () Ġ-> ĠUnit ): ĠApplication Context Ġ= ĠApplication Context . start Ġ{ ĊĠĠĠ Ġinitialize ( this ) Ċ } Ċ Ċ /** Ċ Ġ* ĠNot ifies Ġthe Ġstart Ġof Ġan Ġ[ ApplicationContext ]. Ċ Ġ*/ Ċ object ĠReady Event Ċ Ċ /** Ċ Ġ* ĠNot ifies Ġthe Ġshutdown Ġof Ġan Ġ[ ApplicationContext ]. Ċ Ġ*/ Ċ object ĠShutdown Event Ċ