package Ġclear net . blocks Ċ Ċ import Ġclear net .* Ċ import Ġclear net . error . Clear Network Exception Ċ import Ġclear net . error . Conversion Exception Ċ import Ġclear net . error . Network Exception Ċ import Ġclear net . interfaces . I Body Validator Ċ import Ġclear net . interfaces . I Invocation Block Ċ import Ġclear net . interfaces . I Serializer Ċ import Ġclear net . interfaces . Conversion Strategy . Smart Converter Ċ import Ġclear net . interfaces . Header Observer Ċ import Ġorg . json . JSONArray Ċ import Ġorg . json . JSONException Ċ import Ġorg . json . JSONObject Ċ import Ġjava . io . IOException Ċ import Ġjava . util . NoSuch ElementException Ċ Ċ class ĠGet From Net Block ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġvalidator : ĠI Body Validator , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġconverter : ĠI Serializer Ċ ) Ġ: ĠI Invocation Block Ġ{ ĊĠĠĠ Ġoverride Ġval Ġinvocation BlockType Ġ= ĠInvocation BlockType . GET _ FROM _ NET ĊĠĠĠ Ġoverride Ġval Ġqueue Algorithm Ġ= ĠI Invocation Block . Queue Algorithm . TIME _ THRESHOLD ĊĠĠĠ Ġprivate Ġval Ġheaders Observer Ġ= ĠSimple Headers Observer () ĊĊĠĠĠ Ġfun Ġget Headers Observer (): ĠHeader Observer Ġ= Ġheaders Observer ĊĊĠĠĠ Ġoverride Ġfun Ġon Queue Cons umed ( promises : ĠList < Core Task . Promise >) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpromises . isEmpty () Ġ-> Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpromises . size Ġ== Ġ 1 Ġ-> Ġobtain From Net ( promises [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Executors ( promises ) Ġ-> Ġgroup By Batch Size ( promises ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrunning Tasks Ġ= ĠArrayList < Core Task . Promise >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpromises . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . task Ref . post Params . request Executor Ġ=== Ġpromises [ 0 ]. task Ref . post Params . request Executor ) Ġrunning Tasks . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġit . set Next Index ( Invocation BlockType . GET _ FROM _ NET ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( running Tasks . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobtain From Net ( running Tasks [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup By Batch Size ( running Tasks ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Executors ( promises : ĠList < Core Task . Promise >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( 1 Ġuntil Ġpromises . size ). none Ġ{ Ġpromises [ it Ġ- Ġ 1 ]. task Ref . post Params . request Executor Ġ!== Ġpromises [ it ]. task Ref . post Params . request Executor Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobtain From Net ( promise : ĠCore Task . Promise ) Ġ= Ġwith ( promise . task Ref . post Params ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse String : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġif Ġ( httpRequest Type Ġ== Ġ" POST ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Executor . execute Post ( promise . task Ref . request Key , Ġheaders , Ġrequest Params ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Executor . execute Get ( request Params , Ġheaders ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheaders Observer . propagate Headers ( request Type Identifier , Ġresult . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse String Ġ= Ġresult . first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNetwork Exception ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstring Result Ġ= ĠSmart Converter . getString Result OrThrow ( converter , Ġresponse String , Ġconversion Strategy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġconverter . deserialize ( string Result , Ġresult Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidator . validate ( result ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . set Result ( result , Ġstring Result , Ġinvocation BlockType ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClear Network Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . setError ( e , Ġinvocation BlockType ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgroup By Batch Size ( promises : ĠList < Core Task . Promise >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexecuting List Ġ= Ġmutable ListOf < Core Task . Promise >() ĊĠĠĠĠĠĠĠ Ġvar Ġmax Ġ= Ġpromises [ 0 ]. task Ref . post Params . max Batch Size ĊĊĠĠĠĠĠĠĠ Ġpromises . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exec uting List . size Ġ< Ġmax Ġ&& Ġit . task Ref . post Params . max Batch Size Ġ> Ġexecuting List . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecuting List Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . task Ref . post Params . max Batch Size Ġ< Ġmax ) Ġmax Ġ= Ġit . task Ref . post Params . max Batch Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Next Index ( Invocation BlockType . GET _ FROM _ NET ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtrim And Execute On Single Executor ( exec uting List ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtrim And Execute On Single Executor ( promises : ĠList < Core Task . Promise >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmax Batch Size Ġ= Ġpromises [ 0 ]. task Ref . post Params . max Batch Size ĊĠĠĠĠĠĠĠ Ġif Ġ( promises . size Ġ> Ġmax Batch Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrunning List Ġ= Ġpromises . sub List ( 0 , Ġmax Batch Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoverflow List Ġ= Ġpromises . sub List ( max Batch Size , Ġpromises . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverflow List . forEach Ġ{ Ġit . set Next Index ( Invocation BlockType . GET _ FROM _ NET ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Sequence On Single Executor ( running List ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Sequence On Single Executor ( promises ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute Sequence On Single Executor ( promises : ĠList < Core Task . Promise >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( promises . size Ġ== Ġ 1 ) Ġ{ Ġ// Ġin Ġcase Ġof Ġmax Batch Size Ġ== Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobtain From Net ( promises [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtasks To Work Ġ= Ġpromises . to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconflict ed Headers Tasks Ġ= Ġmutable ListOf < Core Task . Promise >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcombined Headers Ġ= Ġcombine Headers ( promises , Ġconflict ed Headers Tasks ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconflict ed Headers Tasks . forEach Ġ{ Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Next Index ( Invocation BlockType . GET _ FROM _ NET ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtasks To Work . removeAll ( conflict ed Headers Tasks ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse With Headers Ġ= Ġtasks To Work [ 0 ]. task Ref . post Params . request Executor . execute Post ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Batch String ( tasks To Work ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcombined Headers , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of (" application Method " Ġto Ġcombine Rpc Methods ( promises )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġresponse With Headers . first ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtasks To Work . forEach Ġ{ Ġheaders Observer . propagate Headers ( it . task Ref . getRequest Identifier (), Ġresponse With Headers . second ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNetwork Exception ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Request Response List ( tasks To Work , Ġresult ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstring Result Ġ= ĠSmart Converter . getString Result OrThrow ( converter , Ġit . second , Ġit . first . task Ref . post Params . conversion Strategy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconverted Result Ġ= Ġconverter . deserialize ( string Result , Ġit . first . task Ref . post Params . result Type ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidator . validate ( converted Result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . first . set Result ( converted Result , Ġstring Result , Ġinvocation BlockType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClear Network Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . first . setError ( e , Ġinvocation BlockType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClear Network Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpromises . forEach Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . setError ( e , Ġinvocation BlockType ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcombine Headers ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpromises : ĠList < Core Task . Promise >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconflict ed Headers Tasks : ĠMutable List < Core Task . Promise > ĊĠĠĠ Ġ): ĠMap < String , ĠString > Ġ= Ġmutable Map Of < String , ĠString >(). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġpromises . forEach Ġ{ Ġpromise Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . task Ref . post Params . headers . entries . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . key Ġin Ġkeys Ġ&& Ġthis [ it . key ] Ġ!= Ġit . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconflict ed Headers Tasks . add ( promise ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ it . key ] Ġ= Ġit . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Deprecated ("") ĊĠĠĠ Ġ// Ġtodo Ġmove Ġthis Ġlogic Ġto ĠPost Ġparams ĊĠĠĠ Ġ// ĠIt 's Ġdifficult Ġbecause Ġit Ġuses Ġstrange Ġprotocol Ġwith Ġcomma Ġinstead Ġof ĠHTTP Ġparams Ġarray ĊĠĠĠ Ġprivate Ġfun Ġcombine Rpc Methods ( promises : ĠList < Core Task . Promise >) Ġ= Ġpromises . join ToString (",") Ġ{ Ġit . task Ref . getRequest Identifier () Ġ} ĊĊĠĠĠ Ġ@ Throws ( Conversion Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġcreate Batch String ( promises : ĠList < Core Task . Promise >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconverter . serialize ( promises . map Ġ{ Ġit . task Ref . post Params . request Body Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Conversion Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġget Request Response List ( promises : ĠList < Core Task . Promise >, Ġsource : ĠString ): ĠList < Pair < Core Task . Promise , ĠJSONObject >> Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Ġ= ĠJSONArray ( source ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( 0 Ġuntil Ġarray . length ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġarray . getJSONObject ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġget Task Promise ById ( promises , Ġit . getLong (" id ")) Ġto Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠJSON Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠConversion Exception (" Incorrect Ġbatch Ġresponse : Ġ$ source ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Conversion Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġget Task Promise ById ( promises : ĠList < Core Task . Promise >, Ġid : ĠLong ): ĠCore Task . Promise Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpromises . first Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtodo Ġremove Ġmanual Ġcasting ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . task Ref . post Params . request Body Ġas ĠRPC Request ). id Ġ== Ġid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch ElementException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠConversion Exception (" Responses Ġids Ġnot Ġcomp arable Ġwith Ġrequests Ġids ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }