/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠD ones ky , ĠLLC Ċ Ġ* Ċ Ġ* Ġ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 Ġk db i . impl . reflect Ċ Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Property Ċ import Ġkotlin . reflect . full . member Properties Ċ import Ġkotlin . reflect . full . super classes Ċ Ċ internal Ġclass ĠObject Helper Ġprivate Ġconstructor ( private Ġval Ġclazz : ĠK Class <* >) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġproperty Cache Ġ= ĠConcurrent HashMap < String , ĠK Property <* >>() ĊĊĠĠĠ Ġprivate Ġfun Ġfind Property ( clazz : ĠK Class <* >, Ġname : ĠString ): ĠK Property < *> ? Ġ= ĊĠĠĠĠĠĠĠ Ġclazz . super classes . let Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi . forEach Ġ{ Ġiface Ġ-> Ġfind Property ( iface , Ġname )?. let Ġ{ Ġreturn Ġit Ġ} Ġ}; Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġclazz . member Properties . first OrNull Ġ{ Ġit . name Ġ== Ġname Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Property ( name : ĠString ): ĠK Property < *> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġproperty Cache [ name ]?. let Ġ{ Ġreturn Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġfind Property ( clazz , Ġname )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Cache [ name ] Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetObject And Property (` object `: ĠAny , Ġpath : ĠList < String >): ĠPair < Any ?, ĠK Property < *> ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult : ĠAny ? ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Map Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Obj : ĠAny ? Ġ= Ġ` object ` ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Property : ĠK Property < *> ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġpath . forEach Ġ{ Ġname Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Property Ġ= Ġcurrent Map . find Property ( name ) Ġ?: Ġthrow ĠIllegalArgumentException (" Cannot Ġfind Ġpath : Ġ$ path Ġon Ġ$ ` object ` ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġcurrent Obj ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Property !!. call ( current Obj ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Map Ġ= ĠObject Helper [ current Property !!. returnType . classifier Ġas ĠK Class <* >] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Obj Ġ= Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Obj Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( current Obj , Ġcurrent Property ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġbean Map Cache Ġ= ĠConcurrent HashMap < K Class <* >, ĠObject Helper >() ĊĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġget ( clazz : ĠK Class < *> ): ĠObject Helper Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbean Ġ= Ġbean Map Cache [ clazz ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bean Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbean Ġ= ĠObject Helper ( clazz ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbean Map Cache [ clazz ] Ġ= Ġbean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbean ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ