package Ġxyz . sr cl ab . grpc . spring . boot . client . intercept ors Ċ Ċ import Ġio . grpc .* Ċ import Ġxyz . sr cl ab . grpc . spring . boot . context . Grpc Context Ċ Ċ /** Ċ Ġ* ĠProvides Ġa Ġs ke let al Ġimplementation Ġof Ġ[ Client Interceptor ]. ĠExecute Ġorder Ġ( assume Ġthere Ġare Ġt we Ġintercept ors ): Ċ Ġ* Ċ Ġ* Ġ* Ġintercept 1 Ġ-> Ġintercept 2 Ġ-> Ċ Ġ* Ġ* Ġsend Headers 1 Ġ-> Ġsend Headers 2 Ġ-> Ċ Ġ* Ġ* ĠsendMessage 1 Ġ-> ĠsendMessage 2 Ġ-> Ċ Ġ* Ġ* Ġon Headers 1 Ġ-> Ġon Headers 2 Ġ-> Ċ Ġ* Ġ* Ġon Message 1 Ġ-> Ġon Message 2 Ġ-> Ċ Ġ* Ġ* ĠonClose 2 Ġ-> ĠonClose 1 Ċ Ġ* Ċ Ġ* ĠBecause Ġof Ġthe Ġconfused Ġexecution Ġorder , Ġ[ Simple Client Interceptor ] Ġis Ġrecommended Ġto Ġused . Ċ Ġ* ĠAll Ġbean Ġof Ġ[ Simple Client Interceptor ] Ġwill Ġbe Ġadded Ġin Ġone Ġ[ Abstract Client Interceptor ] Ġinstance Ġof Ġwhich Ġorder Ġis Ġ 0 Ċ Ġ* Ġfor Ġtarget Ġclient , Ġand Ġall Ġcallbacks Ġin Ġnatural Ġorder Ġ( interceptor 1 Ġ-> Ġinterceptor 2 ). Ċ Ġ* Ċ Ġ* ĠIt Ġis Ġrecommended Ġthat Ġusing Ġ[ Grpc Context ] Ġinstead Ġof Ġusing Ġ[ Context ] Ġdirectly . Ċ Ġ* Ċ Ġ* Ġ@ see ĠGr pc Context Ċ Ġ* Ġ@ see ĠSimple Client Interceptor Ċ Ġ*/ Ċ abstract Ġclass ĠAbstract Client Interceptor Ġ: ĠClient Interceptor Ġ{ ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġ< Req T Ġ: ĠAny , ĠResp T Ġ: ĠAny > Ġintercept ( ĊĠĠĠĠĠĠĠ Ġmethod : ĠMethod Descriptor < Req T , ĠResp T >, ĊĠĠĠĠĠĠĠ Ġcall Options : ĠCall Options , ĊĠĠĠĠĠĠĠ Ġcontext : ĠGr pc Context , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġ< Req T Ġ: ĠAny , ĠResp T Ġ: ĠAny > Ġsend Headers ( ĊĠĠĠĠĠĠĠ Ġsent Header : ĠMetadata , ĊĠĠĠĠĠĠĠ Ġmethod : ĠMethod Descriptor < Req T , ĠResp T >, ĊĠĠĠĠĠĠĠ Ġcall Options : ĠCall Options , ĊĠĠĠĠĠĠĠ Ġcontext : ĠGr pc Context , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġ< Req T Ġ: ĠAny , ĠResp T Ġ: ĠAny > ĠsendMessage ( ĊĠĠĠĠĠĠĠ Ġsent Message : ĠReq T , ĊĠĠĠĠĠĠĠ Ġmethod : ĠMethod Descriptor < Req T , ĠResp T >, ĊĠĠĠĠĠĠĠ Ġcall Options : ĠCall Options , ĊĠĠĠĠĠĠĠ Ġcontext : ĠGr pc Context , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġ< Req T Ġ: ĠAny , ĠResp T Ġ: ĠAny > Ġon Ready ( ĊĠĠĠĠĠĠĠ Ġmethod : ĠMethod Descriptor < Req T , ĠResp T >, ĊĠĠĠĠĠĠĠ Ġcall Options : ĠCall Options , ĊĠĠĠĠĠĠĠ Ġcontext : ĠGr pc Context , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġ< Req T Ġ: ĠAny , ĠResp T Ġ: ĠAny > Ġon Headers ( ĊĠĠĠĠĠĠĠ Ġheaders : ĠMetadata , ĊĠĠĠĠĠĠĠ Ġmethod : ĠMethod Descriptor < Req T , ĠResp T >, ĊĠĠĠĠĠĠĠ Ġcall Options : ĠCall Options , ĊĠĠĠĠĠĠĠ Ġcontext : ĠGr pc Context , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġ< Req T Ġ: ĠAny , ĠResp T Ġ: ĠAny > Ġon Message ( ĊĠĠĠĠĠĠĠ Ġmessage : ĠResp T , ĊĠĠĠĠĠĠĠ Ġmethod : ĠMethod Descriptor < Req T , ĠResp T >, ĊĠĠĠĠĠĠĠ Ġcall Options : ĠCall Options , ĊĠĠĠĠĠĠĠ Ġcontext : ĠGr pc Context , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġ< Req T Ġ: ĠAny , ĠResp T Ġ: ĠAny > ĠonClose ( ĊĠĠĠĠĠĠĠ Ġstatus : ĠStatus , ĊĠĠĠĠĠĠĠ Ġtrail ers : ĠMetadata , ĊĠĠĠĠĠĠĠ Ġmethod : ĠMethod Descriptor < Req T , ĠResp T >, ĊĠĠĠĠĠĠĠ Ġcall Options : ĠCall Options , ĊĠĠĠĠĠĠĠ Ġcontext : ĠGr pc Context , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< Req T Ġ: ĠAny , ĠResp T Ġ: ĠAny > Ġintercept Call ( ĊĠĠĠĠĠĠĠ Ġmethod : ĠMethod Descriptor < Req T , ĠResp T >, ĊĠĠĠĠĠĠĠ Ġcall Options : ĠCall Options , ĊĠĠĠĠĠĠĠ Ġnext : ĠChannel ĊĠĠĠ Ġ): ĠClient Call < Req T , ĠResp T > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġgrpc Context Ġ= ĠGr pc Context . current () ĊĠĠĠĠĠĠĠ Ġintercept ( method , Ġcall Options , Ġgrpc Context ) ĊĊĠĠĠĠĠĠĠ Ġclass ĠContext ual ized Client Call Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate : ĠClient Call . Listener < Resp T >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġraw Context : ĠContext ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠForward ing Client Call Listener . Simple Forwarding Client Call Listener < Resp T >( delegate ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Ready () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Ġ= Ġraw Context . attach () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Ready () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Abstract Client Interceptor . on Ready ( method , Ġcall Options , Ġgrpc Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraw Context . detach ( previous ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Headers ( headers : ĠMetadata ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Ġ= Ġraw Context . attach () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Headers ( headers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Abstract Client Interceptor . on Headers ( headers , Ġmethod , Ġcall Options , Ġgrpc Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraw Context . detach ( previous ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Message ( message : ĠResp T ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Ġ= Ġraw Context . attach () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Message ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Abstract Client Interceptor . on Message ( message , Ġmethod , Ġcall Options , Ġgrpc Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraw Context . detach ( previous ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonClose ( status : ĠStatus , Ġtrail ers : ĠMetadata ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Ġ= Ġraw Context . attach () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Abstract Client Interceptor . onClose ( status , Ġtrail ers , Ġmethod , Ġcall Options , Ġgrpc Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . onClose ( status , Ġtrail ers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraw Context . detach ( previous ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġraw Context Ġ= Ġgrpc Context . raw Context ĊĠĠĠĠĠĠĠ Ġval Ġprevious Ġ= Ġraw Context . attach () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelegate Call Ġ= Ġnext . new Call ( method , Ġcall Options ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠForward ing Client Call . Simple Forwarding Client Call < Req T , ĠResp T >( delegate Call ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstart ( response Listener : ĠListener < Resp T >, Ġheaders : ĠMetadata ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelegate Listener Ġ= ĠContext ual ized Client Call Listener ( response Listener , Ġraw Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Abstract Client Interceptor . send Headers ( headers , Ġmethod , Ġcall Options , Ġgrpc Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . start ( delegate Listener , Ġheaders ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠsendMessage ( message : ĠReq T ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Abstract Client Interceptor . sendMessage ( message , Ġmethod , Ġcall Options , Ġgrpc Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . sendMessage ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġraw Context . detach ( previous ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }