/** Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠRo yal ĠBank Ġof ĠS co tl and Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġio . blue bank . bra id . cord app . echo . flows Ċ Ċ import Ġco . parallel universe . fib ers . Suspend able Ċ import Ġcom . google . common . collect . ImmutableList Ċ import Ġio . blue bank . bra id . cord app . echo . contracts . Echo Contract Ċ import Ġio . blue bank . bra id . cord app . echo . states . Echo State Ċ import Ġio . swagger . v 3 . o as . annotations . Operation Ċ import Ġio . swagger . v 3 . o as . annotations . Parameter Ċ import Ġio . swagger . v 3 . o as . annotations . media . Schema Ċ import Ġnet . cord a . core . contracts . Command Ċ import Ġnet . cord a . core . contracts . State And Ref Ċ import Ġnet . cord a . core . contracts . Unique Identifier Ċ import Ġnet . cord a . core . flows .* Ċ import Ġnet . cord a . core . identity . Party Ċ import Ġnet . cord a . core . node . services . Vault Ċ import Ġnet . cord a . core . node . services . query By Ċ import Ġnet . cord a . core . node . services . vault . Query Criteria Ċ import Ġnet . cord a . core . transactions . Signed Transaction Ċ import Ġnet . cord a . core . transactions . Transaction Builder Ċ import Ġnet . cord a . core . utilities . Progress Tracker Ċ Ċ /** Ċ Ġ* ĠI 'm Ġnot Ġsure Ġhow Ġto Ġchoose Ġthe Ġreturn - type Ġfor Ġa Ġtop - level Ġ( parent ) Ġflow Ġlike ĠInit iator Ċ Ġ* ĠI Ġthink Ġit Ġcould Ġbe ĠUnit , Ġand Ġthat Ġits Ġtype Ġis Ġchosen Ġonly Ġto Ġmake Ġit Ġpossible Ġto Ġunit - test Ġthe Ġflow ?! Ċ Ġ*/ Ċ Ċ // Ġthis Ġiniti ates Ġan Ġecho Ġ-- Ġtransaction Ġis Ġsigned Ġby Ġthe Ġsender Ġonly Ċ object ĠEcho Send Ġ{ ĊĊĠ Ġ@ Initi ating Flow ĊĠ Ġ@ Start able By RPC ĊĠ Ġclass ĠInit iator ( ĊĠĠĠ Ġ@ Schema ( description Ġ= Ġ" The Ġmessage Ġto Ġbe Ġecho ed ") ĊĠĠĠ Ġprivate Ġval Ġmessage : ĠString , ĊĠĠĠ Ġ@ Schema ( description Ġ= Ġ" The Ġcounter - party Ġwhich Ġwill Ġrespond Ġwith Ġan Ġecho ") ĊĠĠĠ Ġprivate Ġval Ġresponder : ĠParty ĊĠ Ġ) Ġ: ĠFlow Logic < Echo State >() Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġprogress Tracker Ġ= ĠProgress Tracker () ĊĊĠĠĠ Ġ@ Operation ( ĊĠĠĠĠĠ Ġsummary Ġ= Ġ" Init iate Ġan Ġecho ", ĊĠĠĠĠĠ Ġdescription Ġ= Ġ" Send Ġa Ġmessage Ġto Ġa Ġresponder , Ġwhich Ġwill Ġecho Ġit Ġin Ġa Ġsubsequent Ġflow " ĊĠĠĠ Ġ) ĊĠĠĠ Ġ@ Suspend able ĊĠĠĠ Ġoverride Ġfun Ġcall (): ĠEcho State Ġ{ ĊĠĠĠĠĠ Ġval Ġnot ary Ġ= Ġservice Hub . network Map Cache . not ary Id entities [ 0 ] Ġ// Ġsemi - random Ġnot ary ĊĠĠĠĠĠ Ġval Ġoutput State Ġ= ĠEcho State ( message , Ġour Identity , Ġresponder ) ĊĠĠĠĠĠ Ġ// Ġsending Ġonly Ġneeds Ġone Ġsignature ĊĠĠĠĠĠ Ġval Ġcommand Ġ= ĠCommand ( Echo Contract . Commands . Send (), Ġour Identity . own ing Key ) ĊĠĠĠĠĠ Ġval Ġtx Builder Ġ= ĠTransaction Builder ( not ary Ġ= Ġnot ary ) ĊĠĠĠĠĠĠĠ Ġ. add Output State ( output State , ĠEcho Contract . ID ) ĊĠĠĠĠĠĠĠ Ġ. add Command ( command ) ĊĠĠĠĠĠ Ġtx Builder . verify ( service Hub ) ĊĠĠĠĠĠ Ġval Ġsigned Tx : ĠSigned Transaction Ġ= Ġservice Hub . sign Initial Transaction ( tx Builder ) ĊĠĠĠĠĠ Ġval Ġother Party Session Ġ= Ġinitiate Flow ( responder ) ĊĠĠĠĠĠ Ġsub Flow ( Final ity Flow ( signed Tx , Ġother Party Session )) ĊĠĠĠĠĠ Ġreturn Ġoutput State ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Initi ated By ( Init iator :: class ) ĊĠ Ġclass ĠRes pon der ( private Ġval Ġother Party Session : ĠFlow Session ) Ġ: ĠFlow Logic < Unit >() Ġ{ ĊĊĠĠĠ Ġ@ Suspend able ĊĠĠĠ Ġoverride Ġfun Ġcall () Ġ{ ĊĠĠĠĠĠ Ġsub Flow ( Receive Final ity Flow ( other Party Session )) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ // Ġthis Ġecho es Ġa Ġresponse Ġ-- Ġtransaction Ġis Ġsigned Ġby Ġboth Ġparties Ċ object ĠEcho Respond Ġ{ ĊĊĠ Ġ@ Initi ating Flow ĊĠ Ġ@ Start able By RPC ĊĠ Ġclass ĠInit iator ( ĊĠĠĠ Ġ@ Parameter ( description Ġ= Ġ" The Ġinitiated ĠEcho State Ġinstance Ġto Ġbe Ġecho ed ") ĊĠĠĠ Ġprivate Ġval Ġlinear Id : ĠUnique Identifier , ĊĠĠĠ Ġ@ Parameter ( description Ġ= Ġ" The Ġpayload Ġecho ed Ġwith Ġthe Ġmessage Ġback Ġto Ġthe Ġinit iator ") ĊĠĠĠ Ġprivate Ġval ĠnumberOf E ch os : ĠInt ĊĠ Ġ) Ġ: ĠFlow Logic < Unit >() Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġprogress Tracker Ġ= ĠProgress Tracker () ĊĊĠĠĠ Ġ@ Suspend able ĊĠĠĠ Ġoverride Ġfun Ġcall () Ġ{ ĊĊĠĠĠĠĠ Ġval Ġinput State And Ref : ĠState And Ref < Echo State > Ġ= ĠgetMessage By Linear Id ( linear Id ) ĊĠĠĠĠĠ Ġval Ġinput State : ĠEcho State Ġ= Ġinput State And Ref . state . data ĊĠĠĠĠĠ Ġval Ġoutput State Ġ= Ġinput State . with Echo es ( numberOf E ch os ) Ġ// Ġcreate Ġoutput Ġfrom Ġinput ĊĠĠĠĠĠ Ġval Ġnot ary Ġ= Ġinput State And Ref . state . not ary Ġ// Ġreuse Ġoriginal Ġnot ary ĊĠĠĠĠĠ Ġ// Ġfor Ġthe Ġsake Ġof Ġexperiment ing Ġwith Ġdifferent Ġflows , ĊĠĠĠĠĠ Ġ// ĠEcho Contract . verify Ġspecifies Ġthat Ġthe ĠRespond Ġcommand Ġrequires Ġboth Ġsignatures ĊĠĠĠĠĠ Ġval Ġcommand Ġ= ĠCommand ( ĊĠĠĠĠĠĠĠ ĠEcho Contract . Commands . Respond (), ĊĠĠĠĠĠĠĠ Ġinput State . participants . map Ġ{ Ġit . own ing Key Ġ}) ĊĠĠĠĠĠ Ġval Ġtx Builder Ġ= ĠTransaction Builder ( not ary Ġ= Ġnot ary ) ĊĠĠĠĠĠĠĠ Ġ. add Input State ( input State And Ref ) ĊĠĠĠĠĠĠĠ Ġ. add Output State ( output State , ĠEcho Contract . ID ) ĊĠĠĠĠĠĠĠ Ġ. add Command ( command ) ĊĠĠĠĠĠ Ġtx Builder . verify ( service Hub ) ĊĠĠĠĠĠ Ġ// Ġtodo Ġnot Ġsure Ġwhy Ġ 2 nd Ġparameter Ġto Ġsign Initial Transaction Ġneed Ġbe Ġspecified ĊĠĠĠĠĠ Ġval Ġmy Signature Ġ= Ġinput State . responder . own ing Key ĊĠĠĠĠĠ Ġval Ġpartially Signed Tx Ġ= Ġservice Hub . sign Initial Transaction ( tx Builder , Ġmy Signature ) ĊĠĠĠĠĠ Ġ// Ġget Ġ 2 nd Ġsignature , Ġfrom Ġthe Ġoriginal Ġsender ĊĠĠĠĠĠ Ġval Ġother Party Session Ġ= Ġinitiate Flow ( output State . sender ) ĊĠĠĠĠĠ Ġval Ġfully Signed Tx Ġ= Ġsub Flow ( ĊĠĠĠĠĠĠĠ ĠCollect Signatures Flow ( ĊĠĠĠĠĠĠĠĠĠ Ġpartially Signed Tx , ĊĠĠĠĠĠĠĠĠĠ Ġset Of ( other Party Session ), ĊĠĠĠĠĠĠĠĠĠ ĠlistOf ( my Signature ) ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġprogress Tracker ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġsub Flow ( Final ity Flow ( fully Signed Tx , Ġother Party Session )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetMessage By Linear Id ( linear Id : ĠUnique Identifier ): ĠState And Ref < Echo State > Ġ{ ĊĠĠĠĠĠ Ġval Ġquery Criteria Ġ= ĠQuery Criteria . Linear State Query Criteria ( ĊĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠ ĠImmutableList . of ( linear Id ), ĊĠĠĠĠĠĠĠ ĠVault . State Status . UN CON SU MED , Ġnull ĊĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠ Ġreturn Ġservice Hub . vault Service . query By < Echo State >( query Criteria ). states . single OrNull () ĊĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠFlow Exception (" Echo State Ġwith Ġid Ġ$ linear Id Ġnot Ġfound .") ĊĠĠĠ Ġ} ĊĊĠ Ġ} ĊĊĠ Ġ@ Initi ated By ( Init iator :: class ) ĊĠ Ġclass ĠRes pon der ( private Ġval Ġother Party Session : ĠFlow Session ) Ġ: ĊĠĠĠ ĠFlow Logic < Signed Transaction >() Ġ{ ĊĊĠĠĠ Ġ@ Suspend able ĊĠĠĠ Ġoverride Ġfun Ġcall (): ĠSigned Transaction Ġ{ ĊĠĠĠĠĠ Ġval Ġst x Ġ= Ġsub Flow ( object Ġ: ĠSign Transaction Flow ( other Party Session ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcheck Transaction ( st x : ĠSigned Transaction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthe Ġtransaction Ġis Ġsigned Ġapart Ġfrom Ġour Ġown Ġkey Ġand Ġthe Ġnot ary ĊĠĠĠĠĠĠĠĠĠ Ġst x . verify Signatures Except ( our Identity . own ing Key , Ġst x . tx . not ary !!. own ing Key ) ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthe Ġtransaction Ġdata Ġis Ġcorrectly Ġformed ĊĠĠĠĠĠĠĠĠĠ Ġval Ġl tx Ġ= Ġst x . to Ledger Transaction ( service Hub , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠ Ġl tx . verify () ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠConfirm Ġthat Ġthis Ġis Ġthe Ġexpected Ġtype Ġof Ġtransaction ĊĠĠĠĠĠĠĠĠĠ Ġrequire ( l tx . commands . single (). value Ġis ĠEcho Contract . Commands . Respond ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Transaction Ġmust Ġrepresent Ġan Ġecho Ġresponse " ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthe Ġcontext Ġdependent Ġparts Ġof Ġthe Ġtransaction Ġas Ġthe ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠContract Ġverify Ġmethod Ġmust Ġnot Ġuse Ġservice Hub Ġqueries . ĊĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġl tx . out Ref < Echo State >( 0 ) ĊĠĠĠĠĠĠĠĠĠ Ġrequire ( service Hub . my Info . is Legal Identity ( state . state . data . sender )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Proposal Ġnot Ġone Ġof Ġour Ġoriginal Ġecho Ġsends " ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġrequire ( state . state . data . responder Ġ== Ġother Party Session . counter party ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Proposal Ġnot Ġfor Ġsent Ġfrom Ġcorrect Ġsource " ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠ Ġreturn Ġsub Flow ( Receive Final ity Flow ( other Party Session , Ġst x . id )) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }