/** Ċ Ġ* ĠCopyright Ġ 2 0 2 0 Ġ- Ġ 2 0 2 2 ĠEP AM ĠSystems Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . ep am . drill . admin . endpoints Ċ Ċ import Ġcom . ep am . drill . admin . agent .* Ċ import Ġcom . ep am . drill . admin . plugins .* Ċ import Ġcom . ep am . drill . plugin . api .* Ċ import Ġcom . ep am . drill . plugin . api . end .* Ċ import Ġcom . ep am . d sm .* Ċ import Ġkotlinx . atomic fu .* Ċ import Ġkotlinx . collections . immutable .* Ċ import Ġmu .* Ċ import Ġjava . io .* Ċ import Ġjava . lang . reflect .* Ċ Ċ class ĠAgent ( info : ĠAgent Info ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ info Ġ= Ġatomic ( info ) ĊĊĠĠĠ Ġprivate Ġval Ġ_ instance Map Ġ= Ġatomic ( ĊĠĠĠĠĠĠĠ Ġpersistent HashMap Of < String , ĠAdmin Plugin Part <* >>() ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġvar Ġinfo : ĠAgent Info ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ info . value ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ= Ġ_ info . update Ġ{ Ġvalue Ġ} ĊĊĠĠĠ Ġval Ġplugins Ġget () Ġ= Ġ_ instance Map . value . values ĊĊĠĠĠ Ġfun Ġupdate ( ĊĠĠĠĠĠĠĠ Ġupdater : Ġ( Agent Info ) Ġ-> ĠAgent Info , ĊĠĠĠ Ġ): ĠAgent Info Ġ= Ġ_ info . update AndGet ( updater ) ĊĊĠĠĠ Ġoperator Ġfun Ġget ( plugin Id : ĠString ): ĠAdmin Plugin Part < *> ? Ġ= Ġ_ instance Map . value [ plugin Id ] ĊĊĠĠĠ Ġfun Ġget ( ĊĠĠĠĠĠĠĠ Ġplugin Id : ĠString , ĊĠĠĠĠĠĠĠ Ġupdater : ĠAgent . () Ġ-> ĠAdmin Plugin Part <* >, ĊĠĠĠ Ġ): ĠAdmin Plugin Part < *> Ġ= Ġget ( plugin Id ) Ġ?: Ġ_ instance Map . update AndGet Ġ{ ĊĠĠĠĠĠĠĠ Ġit . take If Ġ{ Ġplugin Id Ġin Ġit Ġ} Ġ?: Ġit . put ( plugin Id , Ġupdater ()) ĊĠĠĠ Ġ}. getValue ( plugin Id ) ĊĊĠĠĠ Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġplugins . forEach Ġ{ Ġplugin Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ Ġ( plugin Ġas ? ĠClose able )?. close () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠPlugin . create Instance ( ĊĠĠĠ Ġagent Info : ĠAgent Info , ĊĠĠĠ Ġdata : ĠAdmin Data , ĊĠĠĠ Ġsender : ĠSender , ĊĠĠĠ Ġstore : ĠStore Client , Ċ ): ĠAdmin Plugin Part < *> Ġ{ ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġval Ġconstructor Ġ= Ġplugin Class . construct ors . run Ġ{ ĊĠĠĠĠĠĠĠ Ġfirst () Ġas ĠConstructor < out ĠAdmin Plugin Part <* >> ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġclass To Arg : Ġ( Class <* >) Ġ-> ĠAny Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString :: class . java Ġ-> Ġplugin Bean . id ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommon Agent Info :: class . java Ġ-> Ġagent Info . to Common Info () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAdmin Data :: class . java Ġ-> Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSender :: class . java Ġ-> Ġsender ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStore Client :: class . java Ġ-> Ġstore ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror ("${ plugin Class . name }: Ġunsupported Ġconstructor Ġparameter Ġtype Ġ$ it .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġargs : ĠArray < Any > Ġ= Ġconstructor . parameter Types . map ( class To Arg ). to Typed Array () ĊĠĠĠ Ġreturn Ġconstructor . newInstance (* args ) Ċ } Ċ Ċ internal Ġsuspend Ġfun ĠAgent . apply Packages Changes () Ġ{ ĊĠĠĠ Ġfor Ġ( plugin Id Ġin Ġinfo . plugins ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis [ plugin Id ]?. apply Packages Changes () ĊĠĠĠ Ġ} Ċ } Ċ