/* Ċ Ġ* ĠCopyright Ġ 2 0 1 5 - 2 0 1 6 ĠJ avier ĠD ÃŃ az - Can o ĠMart ÃŃn - Al bo Ġ( jav ier dia z can om @ gmail . com ) Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ Ċ @ file : Suppress (" UN CHECK ED _ CAST ") Ċ Ċ package Ġcom . j dia z can o . cfg 4 k . providers Ċ Ċ import Ġcom . j dia z can o . cfg 4 k . bind ers . Proxy Binder Ċ import Ġcom . j dia z can o . cfg 4 k . core . Config Object Ċ import Ġcom . j dia z can o . cfg 4 k . reload str ategies . Reload Strategy Ċ import Ġcom . j dia z can o . cfg 4 k . utils . Setting NotFound Ċ import Ġjava . lang . reflect . Type Ċ Ċ class ĠOverride Config Provider ( ĊĠĠĠĠĠĠĠ Ġprivate Ġvar arg Ġval Ġproviders : ĠConfig Provider , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġreload Strategy : ĠRe load Strategy ? Ġ= Ġnull Ċ ) Ġ: ĠConfig Provider Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġbinder Ġ= ĠProxy Binder () ĊĠĠĠ Ġprivate Ġval Ġlisteners Ġ= Ġmutable ListOf < () Ġ-> ĠUnit >() ĊĠĠĠ Ġprivate Ġval Ġerror Reload Listeners Ġ= Ġmutable ListOf <( Exception ) Ġ-> ĠUnit >() ĊĠĠĠ Ġprivate Ġval Ġcached Providers Ġ= Ġmutable Map Of < String , ĠConfig Provider >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġreload Strategy ?. register ( this ) ĊĊĠĠĠĠĠĠĠ Ġadd Reload Listener Ġ{ Ġcached Providers . clear () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload ( name : ĠString ): ĠConfig Object ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( name Ġin Ġcached Providers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcached Providers [ name ] !!. load ( name ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( provider Ġin Ġproviders ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( provider . contains ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Providers [ name ] Ġ= Ġprovider ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġprovider . load ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠAny > Ġget ( name : ĠString , Ġtype : ĠType , Ġdefault : ĠT ?): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( name Ġin Ġcached Providers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcached Providers [ name ] !!. get ( name , Ġtype , Ġdefault ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( provider Ġin Ġproviders ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( provider . contains ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Providers [ name ] Ġ= Ġprovider ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġprovider . get ( name , Ġtype , Ġdefault ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( default Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdefault ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSetting NotFound ( name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġget OrNull ( name : ĠString , Ġtype : ĠType , Ġdefault : ĠT ?): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( name Ġin Ġcached Providers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcached Providers [ name ] !!. get OrNull ( name , Ġtype , Ġdefault ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( provider Ġin Ġproviders ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( provider . contains ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Providers [ name ] Ġ= Ġprovider ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġprovider . get OrNull ( name , Ġtype , Ġdefault ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdefault ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcontains ( name : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġproviders . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . contains ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreload () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproviders . forEach Ġ{ Ġit . reload () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ Ġit () Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Reload Listeners . forEach Ġ{ Ġit ( e ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcancel Reload (): ĠUnit ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreload Strategy ?. dere gister ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Reload Listener ( listener : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners . add ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Reload Error Listener ( listener : Ġ( Exception ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġerror Reload Listeners . add ( listener ) ĊĠĠĠ Ġ} Ċ Ċ }