/* Ċ Ġ* ĠCopyright Ġ 2 0 0 0 - 2 0 1 9 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . r . r interop Ċ Ċ import Ġcom . google . gson .* Ċ import Ġcom . google . protobuf . GeneratedMessageV 3 Ċ import Ġcom . intellij . util . containers . Container Util Ċ import Ġio . grpc . MethodDescriptor Ċ import Ġjava . lang . reflect . Type Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ Ċ class ĠR Interop Grpc Logger ( private Ġval Ġmax Messages : ĠInt ? Ġ= Ġnull ) Ġ{ ĊĠ Ġval Ġmessages Ġ= ĠArray Deque < Message >() ĊĠ Ġprivate Ġval Ġcommand Messages Ġ= ĠContainer Util . create Concurrent Int Object Map < Command Message >() ĊĠ Ġprivate Ġval Ġstub Messages Ġ= ĠContainer Util . create Concurrent Int Object Map < Pair < ByteArray , ĠString >>() ĊĠ Ġprivate Ġval Ġstub Message Enumerator : ĠAtomicInteger Ġ= ĠAtomicInteger ( 0 ) ĊĊĠ Ġfun Ġnext Stub Number (): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġstub Message Enumerator . get And Increment () ĊĠ Ġ} ĊĊĠ Ġfun Ġ< T Request Ġ: ĠGenerated Message V 3 , ĠT Response Ġ: ĠGenerated Message V 3 > ĊĠĠĠ Ġon Execute Request Async ( number : ĠInt , Ġmethod Descriptor : ĠMethod Descriptor < T Request , ĠT Response >, Ġrequest : ĠT Request ) Ġ{ ĊĠĠĠ Ġcommand Messages . put ( number , ĠCommand Message ( method Descriptor . full MethodName . let Ġ{ Ġit . substring ( it . indexOf ('/') Ġ+ Ġ 1 ) Ġ}, Ġrequest . toByteArray ())) ĊĠ Ġ} ĊĊĠ Ġfun Ġon Execute Request Finish ( number : ĠInt ) Ġ{ ĊĠĠĠ Ġadd Message ( command Messages . remove ( number )) ĊĠ Ġ} ĊĊĠ Ġfun Ġon Output Available ( number : ĠInt , Ġvalue : ĠCommand Output ) Ġ{ ĊĊĠĠĠ Ġcommand Messages . get ( number )?. apply Ġ{ ĊĠĠĠĠĠ Ġwhen Ġ( value . type ) Ġ{ ĊĠĠĠĠĠĠĠ ĠCommand Output . Type . STDOUT Ġ-> Ġstdout . append ( value . text . toString Utf 8 ()) ĊĠĠĠĠĠĠĠ ĠCommand Output . Type . STD ERR Ġ-> Ġstderr . append ( value . text . toString Utf 8 ()) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Cannot Ġbe Ġreach ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġon Stub Message Request ( number : ĠInt , Ġmessage : ĠGenerated Message V 3 , ĠmethodName : ĠString ) Ġ{ ĊĠĠĠ Ġstub Messages . put ( number , ĠPair ( message . toByteArray (), ĠmethodName )) ĊĠ Ġ} ĊĊĠ Ġfun Ġon Stub Message Response ( number : ĠInt , Ġmessage : ĠGenerated Message V 3 ?) Ġ{ ĊĠĠĠ Ġval Ġ( bytes , ĠmethodName ) Ġ= Ġstub Messages . remove ( number ) ĊĠĠĠ Ġadd Message ( Stub Message ( methodName , Ġbytes , Ġmessage ?. toByteArray ())) ĊĠ Ġ} ĊĊĠ Ġ@ Synchron ized ĊĠ Ġprivate Ġfun Ġadd Message ( it : ĠMessage ) Ġ{ ĊĠĠĠ Ġmessages . add Last ( it ) ĊĠĠĠ Ġif Ġ( max Messages Ġ!= Ġnull Ġ&& Ġmessages . size Ġ> Ġmax Messages ) Ġ{ ĊĠĠĠĠĠ Ġmessages . remove First () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġinterface ĠMessage Ġ{ ĊĠĠĠ Ġval ĠmethodName : ĠString ĊĠĠĠ Ġval Ġrequest : ĠByteArray ĊĠ Ġ} ĊĊĠ Ġclass ĠCommand Message ( override Ġval ĠmethodName : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġrequest : ĠByteArray ) Ġ: ĠMessage Ġ{ ĊĠĠĠ Ġval Ġstdout : ĠStringBuffer Ġ= ĠStringBuffer () ĊĠĠĠ Ġval Ġstderr : ĠStringBuffer Ġ= ĠStringBuffer () ĊĠ Ġ} ĊĊĠ Ġclass ĠStub Message ( override Ġval ĠmethodName : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġrequest : ĠByteArray , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse : ĠByteArray ?) Ġ: ĠMessage ĊĊĠ Ġfun ĠtoJson ( with Pending : ĠBoolean Ġ= Ġfalse ): ĠString Ġ{ ĊĠĠĠ Ġval Ġgson Builder Ġ= ĠGson Builder (). register Type Adapter ( ByteArray :: class . java , Ġobject Ġ: ĠJsonSerializer < ByteArray > Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( p 0 : ĠByteArray ?, Ġp 1 : ĠType ?, Ġp 2 : ĠJson Serialization Context ?): ĠJson Element Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠJson Primitive ( Base 6 4 . get Encoder (). encode ToString ( p 0 )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}). set Pretty Print ing (). create () ĊĠĠĠ Ġreturn Ġif Ġ( with Pending ) Ġ{ ĊĠĠĠĠĠ Ġgson Builder . toJson ( map Of < String , ĠAny >( ĊĠĠĠĠĠĠĠ Ġ" messages " Ġto Ġmessages , ĊĠĠĠĠĠĠĠ Ġ" pending " Ġto Ġstub Messages . values (). map Ġ{ ĠStub Message ( it . second , Ġit . first , Ġnull ) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. plus ( command Messages . values ()). toList () ĊĠĠĠĠĠ Ġ)) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġgson Builder . toJson ( messages ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }