/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠExp edia , ĠInc Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// 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 . exp edi ag roup . graphql . execution Ċ Ċ import Ġcom . exp edi ag roup . graphql . generator . extensions . get Java Class Ċ import Ġcom . exp edi ag roup . graphql . generator . extensions . getName Ċ import Ġcom . exp edi ag roup . graphql . generator . extensions . getType Of First Argument Ċ import Ġcom . exp edi ag roup . graphql . generator . extensions . is Data Fetching Environment Ċ import Ġcom . exp edi ag roup . graphql . generator . extensions . is GraphQL Context Ċ import Ġcom . exp edi ag roup . graphql . generator . extensions . is List Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . jackson ObjectMapper Ċ import Ġgraphql . schema . Data Fetcher Ċ import Ġgraphql . schema . Data Fetching Environment Ċ import Ġkotlinx . coroutines . Coroutine Start Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . future . future Ċ import Ġjava . lang . reflect . Invocation TargetException Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlin . coroutines . Empty Coroutine Context Ċ import Ġkotlin . reflect . K Function Ċ import Ġkotlin . reflect . K Parameter Ċ import Ġkotlin . reflect . full . call Suspend Ċ import Ġkotlin . reflect . full . value Parameters Ċ Ċ /** Ċ Ġ* ĠSimple ĠData Fetcher Ġthat Ġinvokes Ġtarget Ġfunction Ġon Ġthe Ġgiven Ġobject . Ċ Ġ* Ċ Ġ* Ġ@ param Ġtarget ĠThe Ġtarget Ġobject Ġthat Ġperforms Ġthe Ġdata Ġfetching , Ġif Ġnot Ġspecified Ġthen Ġthis Ġdata Ġfetch er Ġwill Ġattempt Ċ Ġ* ĠĠ Ġto Ġuse Ġsource Ġobject Ġfrom Ġthe Ġenvironment Ċ Ġ* Ġ@ param Ġfn ĠThe ĠKotlin Ġfunction Ġbeing Ġinvoked Ċ Ġ* Ġ@ param ĠobjectMapper ĠJack son ĠObjectMapper Ġthat Ġwill Ġbe Ġused Ġto Ġdeserialize Ġenvironment Ġarguments Ġto Ġthe Ġexpected Ġfunction Ġarguments Ċ Ġ*/ Ċ @ Suppress (" Det ek t . Spread Operator ") Ċ open Ġclass ĠFunction Data Fetcher ( ĊĠĠĠ Ġprivate Ġval Ġtarget : ĠAny ?, ĊĠĠĠ Ġprivate Ġval Ġfn : ĠK Function <* >, ĊĠĠĠ Ġprivate Ġval ĠobjectMapper : ĠObjectMapper Ġ= Ġj ack son ObjectMapper () Ċ ) Ġ: ĠData Fetcher < Any ?> Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInvoke Ġa Ġsuspend Ġfunction Ġor Ġblocking Ġfunction , Ġpassing Ġin Ġthe Ġ[ target ] Ġif Ġnot Ġnull Ġor Ġdefault Ġto Ġusing Ġthe Ġsource Ġfrom Ġthe Ġenvironment . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget ( environment : ĠData Fetching Environment ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= Ġtarget Ġ?: Ġenvironment . getSource < Any ?> () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġinstance ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Values Ġ= Ġget Parameter Values ( fn , Ġenvironment ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fn . is Suspend ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Sus pending Function ( it , Ġparameter Values ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Function ( it , Ġparameter Values ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIterate Ġover Ġall Ġthe Ġfunction Ġparameters Ġand Ġmap Ġthem Ġto Ġthe Ġproper Ġinput Ġvalues Ġfrom Ġthe Ġenvironment ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun Ġget Parameter Values ( fn : ĠK Function <* >, Ġenvironment : ĠData Fetching Environment ): ĠArray < Any ?> Ġ= Ġfn . value Parameters ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġparam Ġ-> Ġmap Parameter To Value ( param , Ġenvironment ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. to Typed Array () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRet re ives Ġthe Ġprovided Ġparameter Ġvalue Ġin Ġthe Ġoperation Ġinput Ġto Ġpass Ġto Ġthe Ġfunction Ġto Ġexecute . ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġparameter Ġis Ġof Ġa Ġspecial Ġtype Ġthen Ġwe Ġdo Ġnot Ġread Ġthe Ġinput Ġand Ġinstead Ġjust Ġpass Ġon Ġthat Ġvalue . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġspecial Ġvalues Ġinclude : ĊĠĠĠĠ Ġ* ĠĠ Ġ- ĠIf Ġthe Ġparameter Ġis Ġmarked Ġas Ġa Ġ[ com . exp edi ag roup . graphql . execution . GraphQL Context ], ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġthen Ġreturn Ġthe Ġenvironment Ġcontext ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠĠ Ġ- ĠThe Ġentire Ġenvironment Ġis Ġreturned Ġif Ġthe Ġparameter Ġis Ġof Ġtype Ġ[ Data Fetching Environment ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun Ġmap Parameter To Value ( param : ĠK Parameter , Ġenvironment : ĠData Fetching Environment ): ĠAny ? Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparam . is GraphQL Context () Ġ-> Ġenvironment . getContext () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparam . is Data Fetching Environment () Ġ-> Ġenvironment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġconvert Parameter Value ( param , Ġenvironment ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġto Ġconvert Ġthe Ġgeneric Ġinput Ġobject Ġto Ġthe Ġparameter Ġclass . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġis Ġcurrently Ġachieved Ġby Ġusing Ġa ĠJack son ĠObjectMapper . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun Ġconvert Parameter Value ( param : ĠK Parameter , Ġenvironment : ĠData Fetching Environment ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġparam . getName () ĊĠĠĠĠĠĠĠ Ġval Ġargument Ġ= Ġenvironment . arguments [ name ] ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( param . is List ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargument Class Ġ= Ġparam . type . getType Of First Argument (). get Java Class () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġj ack son Collection Type Ġ= ĠobjectMapper . type Factory . construct Collection Type ( List :: class . java , Ġargument Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠobjectMapper . convert Value ( argument , Ġj ack son Collection Type ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjava Class Ġ= Ġparam . type . get Java Class () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠobjectMapper . convert Value ( argument , Ġjava Class ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOnce Ġall Ġparameters Ġvalues Ġare Ġproperly Ġconverted , Ġthis Ġfunction Ġwill Ġbe Ġcalled Ġto Ġrun Ġa Ġsuspend able Ġfunction . ĊĠĠĠĠ Ġ* ĠIf Ġyou Ġneed Ġto Ġoverride Ġthe Ġexception Ġhandling Ġyou Ġcan Ġoverride Ġthe Ġentire Ġmethod . ĊĠĠĠĠ Ġ* ĠYou Ġcan Ġalso Ġcall Ġit Ġfrom Ġ[ get ] Ġwith Ġdifferent Ġvalues Ġto Ġoverride Ġthe Ġdefault Ġcoroutine Ġcontext Ġor Ġstart Ġparameter . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun Ġrun Sus pending Function ( ĊĠĠĠĠĠĠĠ Ġinstance : ĠAny , ĊĠĠĠĠĠĠĠ Ġparameter Values : ĠArray < Any ? >, ĊĠĠĠĠĠĠĠ Ġcoroutine Context : ĠCor outine Context Ġ= ĠEmpty Coroutine Context , ĊĠĠĠĠĠĠĠ Ġcoroutine Start : ĠCor outine Start Ġ= ĠCor outine Start . DEFAULT ĊĠĠĠ Ġ): ĠCompletableFuture < Any ?> Ġ= ĠGlobal Scope . future ( context Ġ= Ġcoroutine Context , Ġstart Ġ= Ġcoroutine Start ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfn . call Suspend ( instance , Ġ* parameter Values ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠInvocation TargetException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġexception . cause Ġ?: Ġexception ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOnce Ġall Ġparameters Ġvalues Ġare Ġproperly Ġconverted , Ġthis Ġfunction Ġwill Ġbe Ġcalled Ġto Ġrun Ġa Ġsimple Ġblocking Ġfunction . ĊĠĠĠĠ Ġ* ĠIf Ġyou Ġneed Ġto Ġoverride Ġthe Ġexception Ġhandling Ġyou Ġcan Ġoverride Ġthis Ġmethod . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun Ġrun Blocking Function ( instance : ĠAny , Ġparameter Values : ĠArray < Any ?> ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfn . call ( instance , Ġ* parameter Values ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠInvocation TargetException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġexception . cause Ġ?: Ġexception ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ