package Ġnet . cord a . bank . api Ċ Ċ import Ġnet . cord a . bank . api . Bank Of C ord a WebApi . Issue Request Params Ċ import Ġnet . cord a . client . rpc . C ord a RPC Client Ċ import Ġnet . cord a . client . rpc . C ord a RPC Client Configuration Ċ import Ġnet . cord a . client . rpc . C ord a RPC Connection Ċ import Ġnet . cord a . client . rpc . RPC Exception Ċ import Ġnet . cord a . core . messaging . StateMachine Update Ċ import Ġnet . cord a . core . messaging . start Flow Ċ import Ġnet . cord a . core . transactions . Signed Transaction Ċ import Ġnet . cord a . core . utilities .* Ċ import Ġnet . cord a . finance . flows . Cash Issue And Payment Flow Ċ import Ġnet . cord a . testing . http . Http Api Ċ import Ġorg . apache . activ emq . art emis . api . core . Active MQ Security Exception Ċ import Ġrx . Subscription Ċ import Ġjava . util . concurrent . atomic . Atomic Reference Ċ Ċ /** Ċ Ġ* ĠInterface Ġfor Ġcommunic ating Ġwith ĠBank Ġof ĠC ord a Ġnode Ċ Ġ*/ Ċ object ĠBank Of C ord a Client Api Ġ{ ĊĠĠĠ Ġconst Ġval ĠB OC _ RPC _ USER Ġ= Ġ" bank User " ĊĠĠĠ Ġconst Ġval ĠB OC _ RPC _ PWD Ġ= Ġ" test " ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= Ġlogger For < Bank Of C ord a Client Api >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHTTP ĠAPI ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ// ĠTODO : Ġsecurity Ġcontrols Ġrequired ĊĠĠĠ Ġfun Ġrequest Web Issue ( web Address : ĠNetwork Host And Port , Ġparams : ĠIssue Request Params ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapi Ġ= ĠHttp Api . from Host And Port ( web Address , Ġ" api / bank ") ĊĠĠĠĠĠĠĠ Ġapi . post Json (" issue - asset - request ", Ġparams ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRPC ĠAPI ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġpayment Ġtransaction Ġ( following Ġsuccessful Ġiss u ance Ġof Ġcash Ġto Ġself ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrequest RPC Issue ( rpc Address : ĠNetwork Host And Port , Ġparams : ĠIssue Request Params ): ĠSigned Transaction Ġ= Ġrequest RPC Issue HA ( listOf ( rpc Address ), Ġparams ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRPC ĠAPI ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġcash Ġissue Ġtransaction . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrequest RPC Issue HA ( available Rpc Servers : ĠList < Network Host And Port >, Ġparams : ĠIssue Request Params ): ĠSigned Transaction Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= Ġperform Rpc Re connect ( available Rpc Servers , ĠB OC _ RPC _ USER , ĠB OC _ RPC _ PWD ) ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġpriv ileged Ġsecurity Ġcontrols Ġrequired ĊĠĠĠĠĠĠĠ Ġclient . use Ġ{ Ġconnection Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrpc Ġ= Ġconnection . proxy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrpc . wait Until Network Ready (). get OrThrow () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠResolve Ġparties Ġvia ĠRPC ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġissue To Party Ġ= Ġrpc . well Known Party From X 5 0 0 Name ( params . issue To Party Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Unable Ġto Ġlocate Ġ${ params . issue To Party Name } Ġin ĠNetwork ĠMap ĠService ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnot ary Legal Identity Ġ= Ġrpc . not ary Id entities (). first OrNull Ġ{ Ġit . name Ġ== Ġparams . not ary Name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Couldn 't Ġlocate Ġnot ary Ġ${ params . not ary Name } Ġin ĠNetwork Map Cache ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanonymous Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġissuer Bank Party Ref Ġ= ĠO pa que Bytes . of ( params . issuer Bank Party Ref . to Byte ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info ("${ rpc . node Info ()} Ġiss uing Ġ${ params . amount } Ġto Ġtransfer Ġto Ġ$ issue To Party Ġ... ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrpc . start Flow (:: Cash Issue And Payment Flow , Ġparams . amount , Ġissuer Bank Party Ref , Ġissue To Party , Ġanonymous , Ġnot ary Legal Identity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returnValue . get OrThrow (). st x ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠDOC START Ġrpc Client Connection Recovery ĊĠĠĠ Ġfun Ġperform Rpc Re connect ( node Host And Ports : ĠList < Network Host And Port >, Ġusername : ĠString , Ġpassword : ĠString ): ĠC ord a RPC Connection Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġestablish Connection With Retry ( node Host And Ports , Ġusername , Ġpassword ) ĊĠĠĠĠĠĠĠ Ġval Ġproxy Ġ= Ġconnection . proxy ĊĊĠĠĠĠĠĠĠ Ġval Ġ( state Machine Infos , Ġstate Machine Updates Raw ) Ġ= Ġproxy . state Machines Feed () ĊĊĠĠĠĠĠĠĠ Ġval Ġretry able StateMachine Updates Subscription : ĠAtomic Reference < Subscription ?> Ġ= ĠAtomic Reference ( null ) ĊĠĠĠĠĠĠĠ Ġval Ġsubscription : ĠSubscription Ġ= Ġstate Machine Updates Raw ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start With ( state Machine Infos . map Ġ{ ĠState Machine Update . Added ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġ/* ĠClient Ġcode Ġhere Ġ*/ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTermin ate Ġsubscription Ġsuch Ġthat Ġnothing Ġgets Ġpast Ġthis Ġpoint Ġto Ġdownstream ĠObservable s . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretry able StateMachine Updates Subscription . get ()?. unsubscribe () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt Ġis Ġgood Ġidea Ġto Ġclose Ġconnection Ġto Ġproperly Ġmark Ġthe Ġend Ġof Ġit . ĠDuring Ġre - connect Ġwe Ġwill Ġcreate Ġa Ġnew ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġclient Ġand Ġa Ġnew Ġconnection , Ġso Ġno Ġgoing Ġback Ġto Ġthis Ġone . ĠAlso Ġthe Ġserver Ġmight Ġbe Ġdown , Ġso Ġwe Ġare ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġforce Ġclosing Ġthe Ġconnection Ġto Ġavoid Ġpropagation Ġof Ġnotification Ġto Ġthe Ġserver Ġside . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . force Close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPerform Ġre - connect . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperform Rpc Re connect ( node Host And Ports , Ġusername , Ġpassword ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġretry able StateMachine Updates Subscription . set ( subscription ) ĊĠĠĠĠĠĠĠ Ġreturn Ġconnection ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠDOC END Ġrpc Client Connection Recovery ĊĊĠĠĠ Ġ// ĠDOC START Ġrpc Client Connection With Retry ĊĠĠĠ Ġprivate Ġfun Ġestablish Connection With Retry ( node Host And Ports : ĠList < Network Host And Port >, Ġusername : ĠString , Ġpassword : ĠString ): ĠC ord a RPC Connection Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġretry Interval Ġ= Ġ 5 . seconds ĊĠĠĠĠĠĠĠ Ġvar Ġconnection : ĠC ord a RPC Connection ? ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Connecting Ġto : Ġ$ node Host And Ports ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠC ord a RPC Client ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Host And Ports , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC ord a RPC Client Configuration ( connection Max Retry Interval Ġ= Ġretry Interval ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ_ connection Ġ= Ġclient . start ( username , Ġpassword ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġconnection Ġis Ġtruly Ġoperational Ġbefore Ġreturning Ġit . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Info Ġ= Ġ_ connection . proxy . node Info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( node Info . legal Id entities And Certs . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ connection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( sec Ex : ĠActive MQ Security Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠH app ens Ġwhen Ġincorrect Ġcredentials Ġprovided Ġ- Ġno Ġpoint Ġretry ing Ġconnection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Security Ġexception Ġupon Ġattempt Ġto Ġestablish Ġconnection : Ġ" Ġ+ Ġsec Ex . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġsec Ex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠRPC Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Exception Ġupon Ġattempt Ġto Ġestablish Ġconnection : Ġ" Ġ+ Ġex . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĠĠĠ Ġ// Ġforce Ġretry Ġafter Ġsleep ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCould Ġnot Ġconnect Ġthis Ġtime Ġround Ġ- Ġpause Ġbefore Ġgiving Ġanother Ġtry . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( retry Interval . to Millis ()) ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( connection Ġ== Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġlogger . info (" Connection Ġsuccessfully Ġestablished Ġwith : Ġ${ connection . proxy . node Info () }") ĊĠĠĠĠĠĠĠ Ġreturn Ġconnection ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠDOC END Ġrpc Client Connection With Retry Ċ } Ċ