package Ġcom . ja ffa . rpc . lib . common Ċ Ċ import Ġcom . ja ffa . rpc . lib . entities . Callback Container Ċ import Ġcom . ja ffa . rpc . lib . entities . Command Ċ import Ġcom . ja ffa . rpc . lib . entities . Exception Holder Ċ import Ġcom . ja ffa . rpc . lib . exception . J aff a Rpc ExecutionException Ċ import Ġcom . ja ffa . rpc . lib . exception . J aff a Rpc System Exception Ċ import Ġcom . ja ffa . rpc . lib . serialization . Serializer Ċ import Ġcom . ja ffa . rpc . lib . ui . Admin Server Ċ import Ġcom . ja ffa . rpc . lib . zookeeper . Utils Ċ import Ġorg . apache . commons . lang 3 . Array Utils Ċ import Ġorg . apache . commons . lang 3 . Class Utils Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . context . ApplicationContext Ċ import Ġjava . io . PrintWriter Ċ import Ġjava . io . String Writer Ċ import Ġjava . lang . reflect . Invocation TargetException Ċ import Ġjava . lang . reflect . Method Ċ Ċ object ĠRequest Invocation Helper Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Request Invocation Helper :: class . java ) ĊĊĠĠĠ Ġval Ġwrapped Services : ĠMutable Map < Class <* >, ĠAny > Ġ= ĠHashMap () ĊĠĠĠ Ġlateinit Ġvar Ġcontext : ĠApplication Context ĊĊĠĠĠ Ġ@ Throws ( Class NotFoundException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġget Target Service ( command : ĠCommand ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwrapped Services [ Class . forName ( Utils . getService Interface Name From Client ( command . service Class ))] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Class NotFoundException :: class , ĠNoSuch Method Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġget Target Method ( command : ĠCommand ): ĠMethod ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwrapped Service Ġ= Ġget Target Service ( command ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Array Utils . isNotEmpty ( command . method Args )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Arg Classes : ĠArray < Class < *> ?> Ġ= ĠarrayOf Null s ( command . method Args . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġcommand . method Args . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Arg Classes [ i ] Ġ= ĠClass . forName ( command . method Args [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrapped Service ?. java Class ?. getMethod ( command . methodName , Ġ* method Arg Classes ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrapped Service ?. java Class ?. getMethod ( command . methodName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġinvoke ( command : ĠCommand ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult : ĠAny ? ĊĠĠĠĠĠĠĠ Ġval Ġtarget Service : ĠAny ? ĊĠĠĠĠĠĠĠ Ġval Ġtarget Method : ĠMethod ? ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Service Ġ= Ġget Target Service ( command ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Method Ġ= Ġget Target Method ( command ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠJ aff a Rpc ExecutionException ( exception ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRequest Context Helper . set MetaData ( command ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġif Ġ( Array Utils . isNotEmpty ( command . method Args )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Method ?. invoke ( target Service , Ġ* command . args ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Method ?. invoke ( target Service ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( target Method ?. returnType Ġ== ĠVoid . TYPE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVoid . TYPE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . cause ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRequest Context Helper . remove MetaData () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Result ( result : ĠAny ?): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( result Ġis ĠThrowable Ġ&& ĠSerializer . is K ry o ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠException Holder ( String Writer (). also Ġ{ Ġresult . printStackTrace ( PrintWriter ( it )) Ġ}. toString ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprimitive To Wrapper ( cl z : ĠClass < *> ): ĠClass < *> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( cl z Ġ== ĠVoid . TYPE ) ĠVoid :: class . java Ġelse ĠClass Utils . primitive To Wrapper ( cl z ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Class NotFoundException :: class , ĠNoSuch Method Exception :: class ) ĊĠĠĠ Ġfun Ġconstruct Callback Container ( command : ĠCommand , Ġres : ĠAny ?): ĠCallback Container Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcallback Container Ġ= ĠCallback Container () ĊĠĠĠĠĠĠĠ Ġwith ( callback Container ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġcommand . callback Key ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Ġ= Ġcommand . callback Class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġget Result ( res ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Target Method ( command )?. let Ġ{ Ġresult Class Ġ= Ġprimitive To Wrapper ( it . returnType ). name Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcallback Container ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClass NotFoundException :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNoSuch Method Exception :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIllegal AccessException :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInvocation TargetException :: class ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġprocess Callback Container ( callback Container : ĠCallback Container ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġcallback Container . key ĊĠĠĠĠĠĠĠ Ġval Ġcommand : ĠCommand ? Ġ= ĠFinal ization Helper . events To Consume . remove ( callback Container . key ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( command Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallback Class Ġ= ĠClass . forName ( callback Container . listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Back Bean Ġ= Ġcontext . getBean ( callback Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠonError Method Ġ= Ġcallback Class . getMethod (" onError ", ĠString :: class . java , ĠThrowable :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcallback Container . result ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Clazz Ġ= ĠClass . forName ( callback Container . result Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġis ĠException Holder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Method . invoke ( call Back Bean , Ġkey , ĠJ aff a Rpc ExecutionException ( result . stack Trace )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( result Ġis ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Serializer . is K ry o ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Method . invoke ( call Back Bean , Ġkey , ĠJ aff a Rpc ExecutionException ( result )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠJ aff a Rpc System Exception (" The Ġsame Ġserialization Ġprotocol Ġmust Ġbe Ġenabled Ġcluster - wide ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġcallback Class . getMethod (" on Success ", ĠString :: class . java , Ġresult Clazz ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Clazz Ġ== ĠVoid :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . invoke ( call Back Bean , Ġkey , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġmethod . invoke ( call Back Bean , Ġkey , Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAdmin Server . add Metric ( command ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Response Ġwith ĠID Ġ{} Ġalready Ġexpired ", Ġcallback Container . key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }