package Ġorg . max ur . m serv . frame . domain Ċ Ċ import Ġorg . max ur . m serv . core . command . Event Ċ import Ġorg . max ur . m serv . frame . event . Micro service Failed Event Ċ import Ġorg . max ur . m serv . frame . kotlin . Locator Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Function Ċ import Ġkotlin . reflect . K Parameter Ċ import Ġkotlin . reflect . K Type Ċ import Ġkotlin . reflect . full . is Subclass Of Ċ Ċ /** ĠThe ĠBase ĠService Ġ*/ Ċ abstract Ġclass ĠBase Service ( ĊĠĠĠ Ġ/** ĠThe ĠService ĠLoc ator Ġ*/ ĊĠĠĠ Ġval Ġlocator : ĠLoc ator ) Ġ{ ĊĠĠĠ Ġ/** ĠThe Ġhook Ġon Ġstart Ġ*/ ĊĠĠĠ Ġvar Ġafter Start : ĠMutable List < K Function < Any >> Ġ= ĠArrayList () ĊĠĠĠ Ġ/** ĠThe Ġhook Ġon Ġstop Ġ*/ ĊĠĠĠ Ġvar Ġbefore Stop : ĠMutable List < K Function < Any >> Ġ= ĠArrayList () ĊĠĠĠ Ġ/** ĠThe Ġhook Ġon Ġerror Ġ*/ ĊĠĠĠ Ġvar ĠonError : ĠMutable List < K Function < Any >> Ġ= ĠArrayList () ĊĊĠĠĠ Ġprotected Ġvar Ġstate : ĠBase Service . State Ġ= ĠBase Service . State . STOP PED ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** ĠThe Ġservice Ġname Ġ*/ ĊĠĠĠ Ġabstract Ġvar Ġname : ĠString ĊĊĠĠĠ Ġ/** ĠStart Ġthis ĠService Ġ*/ ĊĠĠĠ Ġfun Ġstart () Ġ= Ġstate . start ( this ) ĊĊĠĠĠ Ġ/** ĠIm mediate ly Ġsh uts Ġdown Ġthis ĠService . Ġ*/ ĊĠĠĠ Ġfun Ġstop () Ġ= Ġstate . stop ( this ) ĊĊĠĠĠ Ġ/** ĠShutdown Ġthis Ġservice . Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġshutdown (): ĠList < Event > ĊĊĠĠĠ Ġ/** ĠLaunch Ġthis Ġservice . Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġlaunch (): ĠList < Event > ĊĊĠĠĠ Ġ/** ĠRepresent ĠState Ġof Ġmicro - service Ġ*/ ĊĠĠĠ Ġenum Ġclass ĠState Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĠRunning Ġapplication Ġ*/ ĊĠĠĠĠĠĠĠ ĠSTART ED Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** Ġ{@ inheritDoc } Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstart ( service : ĠBase Service ) Ġ= Ġempty List < Event >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** Ġ{@ inheritDoc } Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstop ( service : ĠBase Service ) Ġ= Ġshutdown ( service ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ/** ĠStop Ġapplication Ġ*/ ĊĠĠĠĠĠĠĠ ĠSTOP PED Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** Ġ{@ inheritDoc } Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstart ( service : ĠBase Service ) Ġ= Ġlaunch ( service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** Ġ{@ inheritDoc } Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstop ( service : ĠBase Service ) Ġ= Ġempty List < Event >() ĊĠĠĠĠĠĠĠ Ġ}; ĊĊĠĠĠĠĠĠĠ Ġ/** ĠStart ĠService Ġ*/ ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġstart ( service : ĠBase Service ): ĠList < Event > ĊĊĠĠĠĠĠĠĠ Ġ/** ĠStop ĠService Ġ*/ ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġstop ( service : ĠBase Service ): ĠList < Event > ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġshutdown ( service : ĠBase Service ): ĠList < Event > Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . before Stop . forEach Ġ{ Ġcall ( it , Ġservice ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevents Ġ= Ġservice . shutdown () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . state Ġ= ĠSTOP PED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Error ( service , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġlaunch ( service : ĠBase Service ): ĠList < Event > Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevents Ġ= Ġservice . launch () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . state Ġ= ĠSTART ED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . after Start . forEach Ġ{ Ġcall ( it , Ġservice ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Error ( service , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġhandle Error ( service : ĠBase Service , Ġerror : ĠException ): ĠList < Event > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( service . onError . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . onError . forEach Ġ{ Ġcall ( it , Ġservice , Ġerror ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( Micro service Failed Event ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcall ( func : ĠK Function < Any >, Ġvar arg Ġvalues : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġfunc . parameters . map Ġ{ Ġmatch ( it , Ġ* values ) Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunc . call (* args ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġmatch ( param : ĠK Parameter , Ġvar arg Ġvalues : ĠAny ): ĠAny ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . first OrNull Ġ{ Ġis Applicable ( param , Ġit ) Ġ} Ġ?: ĠLoc ator . bean ( param ) ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġis Applicable ( type : ĠK Type , Ġclazz : ĠK Class < out ĠAny >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclazz . is Subclass Of ( type . classifier Ġas ĠK Class < Any >) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġis Applicable ( param : ĠK Parameter , Ġvalue : ĠAny ) Ġ= Ġis Applicable ( param . type , Ġvalue :: class ) ĊĠĠĠ Ġ} Ċ }