package Ġio . acon ite . client Ċ Ċ import Ġio . acon ite . Request Ċ import Ġio . acon ite . serializers . Cookie Ċ import Ġio . acon ite . serializers . Cookie String Serializer Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġjava . util . concurrent . atomic . Atomic Reference Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . full . create Type Ċ Ċ interface ĠService < out ĠT : ĠAny > Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġor Ġcreate Ġclient Ġproxy Ġfor Ġspecified Ġ[ address ]. ĊĠĠĠĠ Ġ* Ġ@ param [ address ] Ġaddress Ġin Ġformat : Ġhttp :// localhost : 8 0 8 0 ĊĠĠĠĠ Ġ* Ġ@ return Ġclient Ġproxy ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoperator Ġfun Ġget ( address : ĠString ): ĠT ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMerge Ġ[ cookie ] Ġwith Ġinternal Ġcookie Ġmap . ĊĠĠĠĠ Ġ* ĠAll Ġsubsequent Ġrequests Ġwill Ġcontain Ġthis Ġcookie . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Cookie ( cookie : ĠCookie ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠClear s Ġinternal Ġcookie Ġmap . ĊĠĠĠĠ Ġ* ĠAll Ġsubsequent Ġrequests Ġwill Ġcontain Ġno Ġcookie . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclear Cookie () Ċ } Ċ Ċ internal Ġclass ĠService Impl < out ĠT : ĠAny >( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmodule : ĠModule Proxy , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġiface : ĠK Class < T > Ċ ) Ġ: ĠService < T > Ġ{ ĊĠĠĠ Ġprivate Ġval Ġproxies Ġ= ĠConcurrent HashMap < String , ĠT >() ĊĠĠĠ Ġprivate Ġval Ġcookie Ġ= ĠAtomic Reference ( empty Map < String , ĠString >()) ĊĠĠĠ Ġprivate Ġval Ġcookie Serializer Ġ= ĠCookie String Serializer . create ( this :: get , ĠCookie :: class . create Type ()) !! ĊĊĠĠĠ Ġoverride Ġfun Ġget ( address : ĠString ): ĠT Ġ= Ġproxies . compute If Absent ( address ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġtodo : Ġcheck Ġaddress Ġformat ĊĊĠĠĠĠĠĠĠ Ġval Ġheaders Ġ= Ġcookie . get (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isNotEmpty ()) Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cookie " Ġto Ġcookie Serializer . serialize ( Cookie ( it )) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġelse Ġempty Map () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheaders Ġ= Ġheaders ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠKotlin Proxy Factory . create ( iface ) Ġ{ Ġfn , Ġargs Ġ-> Ġmodule . invoke ( fn , Ġaddress , Ġrequest , Ġargs ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Cookie ( cookie : ĠCookie ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . cookie . get AndUpdate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ+ Ġcookie . data ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclear Cookie () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . cookie . set ( empty Map ()) ĊĠĠĠ Ġ} Ċ }