package Ġcom . supply chain . baf Ċ Ċ import Ġco . parallel universe . fib ers . Suspend able Ċ import Ġcom . supply chain . bcc . contract states . Container State Ċ import Ġcom . supply chain . bcc . contract states . Supply Chain Contract Ċ import Ġnet . cord a . core . flows .* Ċ import Ġnet . cord a . core . identity . Party Ċ import Ġnet . cord a . core . node . services . query By Ċ import Ġnet . cord a . core . node . services . vault . DEFAULT _ PAGE _ NUM Ċ import Ġnet . cord a . core . node . services . vault . DEFAULT _ PAGE _ SIZE Ċ import Ġnet . cord a . core . node . services . vault . Page Specification Ċ 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 Ċ import Ġnet . cord a . core . identity . C ord a X 5 0 0 Name Ċ import Ġjava . sql . Timestamp Ċ import Ġjava . util .* Ċ Ċ / ******************************************************** **** Ċ Ġ* ĠDefinition Ġof Ġflow Ġto ĠCreate Ġa ĠProduct State Ġand Ġresponder Ċ Ġ* Ġ@ returns Ġsomething Ċ Ġ********************************************************* ***/ Ċ Ċ @ Initi ating Flow Ċ @ Start able By RPC Ċ class ĠCreate Container Ġ( val Ġrequest : ĠCreate Container Request ) Ġ: ĠFlow Logic < UUID >() Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġobject ĠGET TING _ COUNTER PAR TIES : ĠProgress Tracker . Step (" Gather ing Ġthe Ġcounter part ies .") ĊĠĠĠĠĠĠĠ Ġobject ĠBUILD _ TRANSACTION Ġ: ĠProgress Tracker . Step (" Building Ġthe Ġtransaction .") ĊĠĠĠĠĠĠĠ Ġobject ĠVERIFY _ TRANSACTION Ġ: ĠProgress Tracker . Step (" Verify ing Ġthe Ġtransaction .") ĊĠĠĠĠĠĠĠ Ġobject ĠSIGN _ TRANSACTION Ġ: ĠProgress Tracker . Step (" I Ġsign Ġthe Ġtransaction .") ĊĠĠĠĠĠĠĠ Ġobject ĠCOL LECT _ COUNTER PAR TY _ SIG Ġ: ĠProgress Tracker . Step (" The Ġcounter party Ġsigns Ġthe Ġtransaction .") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġchild Progress Tracker () Ġ= ĠCollect Signatures Flow . tracker () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġobject ĠFIN ALI SE _ TRANSACTION Ġ: ĠProgress Tracker . Step (" Ob t aining Ġnot ary Ġsignature Ġand Ġrecording Ġtransaction .") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġchild Progress Tracker () Ġ= ĠFinal ity Flow . tracker () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġtracker () Ġ= ĠProgress Tracker ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGET TING _ COUNTER PAR TIES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBUILD _ TRANSACTION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVERIFY _ TRANSACTION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSIGN _ TRANSACTION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCOL LECT _ COUNTER PAR TY _ SIG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFIN ALI SE _ TRANSACTION ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġprogress Tracker Ġ= Ġtracker () ĊĊĠĠĠ Ġ@ Suspend able ĊĠĠĠ Ġoverride Ġfun Ġcall (): UUID Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġparticipants Ġlist Ġfor Ġparties Ġin Ġthe Ġchain Ġof Ġcust od ian ship ĊĠĠĠĠĠĠĠ Ġprogress Tracker . current Step Ġ= ĠGET TING _ COUNTER PAR TIES ĊĊĠĠĠĠĠĠĠ Ġval Ġparticipants : ĠMutable List < Party > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġrequest . counter part ies . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparty Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparticipants . add ( Party Lookup ( party Name )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġflow Sessions Ġ= Ġparticipants . map Ġ{ Ġinitiate Flow ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Add Ġyourself Ġto Ġparticipants ĊĠĠĠĠĠĠĠ Ġparticipants . add ( our Identity ) ĊĠĠĠĠĠĠĠ Ġval Ġtimestamp Ġ= ĠTimestamp ( System . currentTimeMillis ()). time ĊĊĠĠĠĠĠĠĠ Ġ// Create Ġtransaction ĊĠĠĠĠĠĠĠ Ġprogress Tracker . current Step Ġ= ĠBUILD _ TRANSACTION ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĠContainer State ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . misc , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġour Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . tracking ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparticipants Ġ= Ġparticipants ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġnot ary Ġ= Ġservice Hub . network Map Cache . get Not ary ( C ord a X 5 0 0 Name . parse (" O = Not ary ĠService , OU = Not ary , L = L ondon , C = GB ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Not ary Ġnot Ġfound Ġon Ġnetwork ") ĠĠĠĠĊĠĠĠĠĠĠĠ Ġval Ġtx Builder Ġ= ĠTransaction Builder ( not ary ) ĠĠĠĠĠĠĠĠ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Output State ( output , ĠSup ply Chain Contract . ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Command ( Supply Chain Contract . Commands . Create Container (), Ġparticipants . map Ġ{ Ġit . own ing Key Ġ}) ĊĊĠĠĠĠĠĠĠ Ġprogress Tracker . current Step Ġ= ĠVERIFY _ TRANSACTION ĊĊĠĠĠĠĠĠĠ Ġvar Ġtemp States Ġ= Ġmutable ListOf < Container State >() ĊĠĠĠĠĠĠĠ Ġvar Ġpage Number Ġ= ĠDEFAULT _ PAGE _ NUM ĊĊĠĠĠĠĠĠĠ Ġdo { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpage Spec Ġ= ĠPage Specification ( pageNumber Ġ= Ġpage Number , ĠpageSize Ġ= ĠDEFAULT _ PAGE _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġraw Results Ġ= Ġservice Hub . vault Service . query By < Container State >( Query Criteria . Vault Query Criteria (), page Spec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresults Ġ= Ġraw Results . states . map Ġ{ it . state . data } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp States . addAll ( results ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage Number ++ ĊĠĠĠĠĠĠĠ Ġ} while (( page Spec . pageSize Ġ* Ġ( pageNumber Ġ- 1 )) Ġ<= Ġraw Results . total States Available ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġstates Ġ= Ġtemp States . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . tracking ID Ġ== Ġrequest . tracking ID ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif ( states . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Container Ġwith ĠTracking ĠID Ġ${ request . tracking ID } Ġalready Ġexists .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtx Builder . verify ( service Hub ) ĊĊĠĠĠĠĠĠĠ Ġ// progress Tracker . current Step Ġ= ĠClaim Track able . Companion . SIGN _ TRANSACTION ĊĠĠĠĠĠĠĠ Ġval Ġtx Ġ= Ġservice Hub . sign Initial Transaction ( tx Builder ) ĊĊĠĠĠĠĠĠĠ Ġ// progress Tracker . current Step Ġ= ĠClaim Track able . Companion . COLLECT _ COUNTER PAR TY _ SIG ĊĠĠĠĠĠĠĠ Ġval Ġst x Ġ= Ġsub Flow ( Collect Signatures Flow ( tx , Ġflow Sessions )) ĊĊĠĠĠĠĠĠĠ Ġ// progress Tracker . current Step Ġ= ĠFIN ALI SE _ TRANSACTION ĊĠĠĠĠĠĠĠ Ġthis . sub Flow ( Final ity Flow ( st x , Ġflow Sessions )) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġoutput . tracking ID ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠParty Lookup ( name : String ): Party { ĊĠĠĠĠĠĠĠ Ġreturn Ġ( service Hub . identity Service . part ies FromName ( name , Ġtrue ). single OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" No Ġexact Ġmatch Ġfound Ġfor Ġname : Ġ$ name .")) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ @ Initi ated By ( Create Container :: class ) Ċ open Ġclass ĠCreate Container Responder ( val Ġcounter party Session : ĠFlow Session ) Ġ: ĠFlow Logic < Signed Transaction >() Ġ{ ĊĊĠĠĠ Ġ@ Suspend able ĊĠĠĠ Ġoverride Ġfun Ġcall () Ġ: ĠSigned Transaction Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsign Transaction Flow Ġ= Ġobject Ġ: ĠSign Transaction Flow ( counter party Session ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suspend able ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcheck Transaction ( st x : ĠSigned Transaction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( st x . inputs . size Ġ== Ġ 0 ) Ġ{ Ġ" There Ġshould Ġbe Ġno Ġinputs Ġfor Ġthis Ġtransaction " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( st x . tx . output States . size Ġ== Ġ 1 ) Ġ{ Ġ" There Ġshould Ġbe Ġone Ġoutputs Ġfor Ġthis Ġtransaction " Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// val Ġoutput Ġ= Ġst x . tx . outputs OfType < Track able State >(). single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// require ( output . status Ġ== ĠProduct State . Status . Pro posed ) Ġ{ Ġ" Accepted Local Data Ġstatus Ġshould Ġbe Ġ' Pro posed '" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtx Id Ġ= Ġsub Flow ( sign Transaction Flow ). id ĊĠĠĠĠĠĠĠ Ġreturn Ġsub Flow ( Receive Final ity Flow ( counter party Session , Ġexpected Tx Id Ġ= Ġtx Id )) ĊĠĠĠ Ġ} Ċ } ĊĊĊĊ