package Ġcom . template Ċ Ċ import Ġco . parallel universe . fib ers . Suspend able Ċ import Ġnet . cord a . core . contracts . require That Ċ import Ġnet . cord a . core . flows .* Ċ import Ġnet . cord a . core . identity . C ord a X 5 0 0 Name Ċ import Ġnet . cord a . core . identity . Party Ċ import Ġnet . cord a . core . messaging . C ord a RP CO ps Ċ import Ġnet . cord a . core . messaging . start Flow Ċ import Ġnet . cord a . core . serialization . Serialization Whitelist Ċ import Ġnet . cord a . core . transactions . Signed Transaction Ċ import Ġnet . cord a . core . transactions . Transaction Builder Ċ import Ġnet . cord a . webserver . services . WebServer Plugin Registry Ċ import Ġjava . util . function . Function Ċ import Ġjavax . ws . rs . GET Ċ import Ġjavax . ws . rs . Path Ċ import Ġjavax . ws . rs . Produces Ċ import Ġjavax . ws . rs . core . MediaType Ċ import Ġjavax . ws . rs . core . Response Ċ Ċ // Ġ***************** Ċ // Ġ* ĠAPI ĠEnd points Ġ* Ċ // Ġ***************** Ċ @ Path (" template ") Ċ class ĠTemplate Api ( val Ġrpc Ops : ĠC ord a RP CO ps ) Ġ{ ĊĠĠĠ Ġ// ĠAccess ible Ġat Ġ/ api / template / template Get Endpoint . ĊĠĠĠ Ġ@ GET ĊĠĠĠ Ġ@ Path (" template Get Endpoint ") ĊĠĠĠ Ġ@ Produces ( MediaType . APPLICATION _ JSON ) ĊĠĠĠ Ġfun Ġtemplate Get Endpoint (): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠResponse . ok (" Template ĠGET Ġendpoint . "). build () ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Path (" init iate ") Ċ class ĠInit iate Api ( val Ġrpc Ops : ĠC ord a RP CO ps ) Ġ{ ĊĊĠĠĠ Ġ@ GET ĊĠĠĠ Ġ@ Path (" party A ") ĊĠĠĠ Ġ@ Produces ( MediaType . APPLICATION _ JSON ) ĊĠĠĠ Ġfun ĠParty A Endpoint (): ĠResponse Ġ{ ĊĊĠĠĠĠĠĠĠ Ġrpc Ops . start Flow (:: Init iator _ A ). returnValue . get () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠResponse . ok (" party A ĠInit iator Ġcalled "). build () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ GET ĊĠĠĠ Ġ@ Path (" party B ") ĊĠĠĠ Ġ@ Produces ( MediaType . APPLICATION _ JSON ) ĊĠĠĠ Ġfun ĠParty B Endpoint (): ĠResponse Ġ{ ĊĊĠĠĠĠĠĠĠ Ġrpc Ops . start Flow (:: Init iator _ B ). returnValue . get () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠResponse . ok (" party B ĠInit iator Ġcalled "). build () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ GET ĊĠĠĠ Ġ@ Path (" party A 2 ") ĊĠĠĠ Ġ@ Produces ( MediaType . APPLICATION _ JSON ) ĊĠĠĠ Ġfun ĠParty A 2 Endpoint (): ĠResponse Ġ{ ĊĊĠĠĠĠĠĠĠ Ġrpc Ops . start Flow (:: Init iator _ A 2 ). returnValue . get () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠResponse . ok (" party A ĠInit iator _ A 2 Ġcalled "). build () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ GET ĊĠĠĠ Ġ@ Path (" party B 2 ") ĊĠĠĠ Ġ@ Produces ( MediaType . APPLICATION _ JSON ) ĊĠĠĠ Ġfun ĠParty B 2 Endpoint (): ĠResponse Ġ{ ĊĊĠĠĠĠĠĠĠ Ġrpc Ops . start Flow (:: Init iator _ B 2 ). returnValue . get () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠResponse . ok (" party B ĠInit iator _ B 2 Ġcalled "). build () ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Path (" vault ") Ċ class ĠVault Api ( val Ġrpc Ops : ĠC ord a RP CO ps ) Ġ{ ĊĠĠĠ Ġ// ĠAccess ible Ġat Ġ/ api / template / template Get Endpoint . ĊĠĠĠ Ġ@ GET ĊĠĠĠ Ġ@ Path (" get States ") ĊĠĠĠ Ġ@ Produces ( MediaType . APPLICATION _ JSON ) ĊĠĠĠ Ġfun Ġtemplate Get Endpoint (): ĠResponse Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġstates Ġ= Ġrpc Ops . vault Query ( Template State :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠResponse . ok ( states ). build () ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ // Ġ********* Ċ // Ġ* ĠFlow s Ġ* Ċ // Ġ********* ĊĊ Ċ /** Ċ Ġ* ĠInit i ators Ġfor Ġrespon ders Ġusing Ġflow Ġinheritance Ċ Ġ*/ Ċ Ċ @ Initi ating Flow Ċ @ Start able By RPC Ċ class ĠInit iator _ A : ĠCommon Init iator (" Party A Ġdata ") Ċ Ċ @ Initi ating Flow Ċ @ Start able By RPC Ċ class ĠInit iator _ B : ĠCommon Init iator (" Party B Ġdata ") ĊĊ Ċ /** Ċ Ġ* ĠInit i ators Ġfor Ġrespon ders Ġusing Ġsub flows Ċ Ġ*/ Ċ Ċ @ Initi ating Flow Ċ @ Start able By RPC Ċ class ĠInit iator _ A 2 : ĠCommon Init iator (" Party A 2 Ġdata ") Ċ Ċ @ Initi ating Flow Ċ @ Start able By RPC Ċ class ĠInit iator _ B 2 : ĠCommon Init iator (" Party B 2 Ġdata ") ĊĊ Ċ open Ġclass ĠCommon Init iator ( val Ġdata : ĠString ) Ġ: ĠFlow Logic < Unit >() Ġ{ ĊĠĠĠ Ġ@ Suspend able ĊĠĠĠ Ġoverride Ġfun Ġcall () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠFlow Ġimplementation Ġgoes Ġhere ĊĊĠĠĠĠĠĠĠ Ġlogger . info (" MB : ĠCommon Init iator Ġcalled ") ĊĊĠĠĠĠĠĠĠ Ġval Ġparty CX 5 0 0 Ġ= ĠC ord a X 5 0 0 Name (" Party C "," Par is "," FR ") ĊĠĠĠĠĠĠĠ Ġval Ġme : ĠParty Ġ= Ġservice Hub . my Info . legal Id entities . single () ĊĠĠĠĠĠĠĠ Ġval Ġparty CO r Null : ĠParty ? Ġ= Ġservice Hub . network Map Cache . get Peer By Legal Name ( party CX 5 0 0 ) ĊĊĠĠĠĠĠĠĠ Ġlogger . info (" MB : Ġparty Cor Null Ġ= Ġ$ party CO r Null ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( party CO r Null Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Party C Ġfound ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Party C Ġnot Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ( Flow Exception (" Party C Ġnot ĠFound ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġparty C : ĠParty Ġ= Ġparty CO r Null !! ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĠTemplate State ( data , ĠlistOf ( me , Ġparty C )) ĊĊĠĠĠĠĠĠĠ Ġval Ġnot ary Ġ= Ġservice Hub . network Map Cache . not ary Id entities . first () ĊĠĠĠĠĠĠĠ Ġval Ġtx Ġ= ĠTransaction Builder ( not ary ) ĊĠĠĠĠĠĠĠ Ġtx . add Output State ( state , ĠTemplate Contract . ID ) ĊĠĠĠĠĠĠĠ Ġtx . add Command ( Template Contract . Commands . Action (), Ġme . own ing Key , Ġparty C . own ing Key ) ĊĠĠĠĠĠĠĠ Ġtx . verify ( service Hub ) ĊĊĠĠĠĠĠĠĠ Ġval Ġp tx Ġ= Ġservice Hub . sign Initial Transaction ( tx ) ĊĠĠĠĠĠĠĠ Ġval Ġsession Ġ= Ġinitiate Flow ( party C ) ĊĠĠĠĠĠĠĠ Ġval Ġst x Ġ= Ġsub Flow ( Collect Signatures Flow ( pt x , ĠlistOf ( session ))) ĊĠĠĠĠĠĠĠ Ġval Ġf tx Ġ= Ġsub Flow ( Final ity Flow ( st x )) ĊĊĠĠĠ Ġ} Ċ } ĊĊ Ċ /** Ċ Ġ* ĠRespond ers Ġusing Ġflow Ġinheritance Ċ Ġ*/ ĊĊ Ċ @ Initi ated By ( Init iator _ A :: class ) Ċ class ĠRes pon der _ A ( counter party Session : ĠFlow Session ) Ġ: ĠCommon Responder ( counter party Session ) Ċ Ċ @ Initi ated By ( Init iator _ B :: class ) Ċ class ĠRes pon der _ B ( counter party Session : ĠFlow Session ) Ġ: ĠCommon Responder ( counter party Session ) Ċ Ċ open Ġclass ĠCommon Responder ( val Ġcounter party Session : ĠFlow Session ) Ġ: ĠFlow Logic < Unit >() Ġ{ ĊĠĠĠ Ġ@ Suspend able ĊĠĠĠ Ġoverride Ġfun Ġcall () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġlogger . info (" MB : Ġ Ġ${ service Hub . my Info . legal Id entities . single (). name } ĠRes pon der Ġflow Ġcalled Ġfrom : Ġ${ counter party Session . counter party . name Ġ} ") ĊĊĠĠĠĠĠĠĠ Ġval Ġsigned Transaction Flow Ġ= Ġobject Ġ: ĠSign Transaction Flow ( counter party Session ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcheck Transaction ( st x : ĠSigned Transaction ) Ġ= Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġst x . tx . outputs . single (). data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" This Ġmust Ġbe Ġa ĠTemplate Ġtransaction " Ġusing Ġ( output Ġis ĠTemplate State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsub Flow ( signed Transaction Flow ) ĊĊĠĠĠ Ġ} Ċ } ĊĊ Ċ /** Ċ Ġ* Ġrespon ders Ġusing Ġsub flows Ċ Ġ*/ Ċ Ċ @ Initi ated By ( Init iator _ A 2 :: class ) Ċ class ĠRes pon der _ A 2 ( val Ġcounter party Session : ĠFlow Session ) Ġ: ĠFlow Logic < Unit > (){ ĊĊĠĠĠ Ġ@ Suspend able ĊĠĠĠ Ġoverride Ġfun Ġcall () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġflow Ġ= ĠCommon Responder _ 2 ( counter party Session ) ĊĠĠĠĠĠĠĠ Ġsub Flow ( flow ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Initi ated By ( Init iator _ B 2 :: class ) Ċ class ĠRes pon der _ B 2 ( val Ġcounter party Session : ĠFlow Session ) Ġ: ĠFlow Logic < Unit > (){ ĊĊĠĠĠ Ġ@ Suspend able ĊĠĠĠ Ġoverride Ġfun Ġcall () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġflow Ġ= ĠCommon Responder _ 2 ( counter party Session ) ĊĠĠĠĠĠĠĠ Ġsub Flow ( flow ) ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ open Ġclass ĠCommon Responder _ 2 Ġ( val Ġcounter party Session : ĠFlow Session ) Ġ: ĠFlow Logic < Unit >() Ġ{ ĊĠĠĠ Ġ@ Suspend able ĊĠĠĠ Ġoverride Ġfun Ġcall () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġlogger . info (" MB : Ġ Ġ${ service Hub . my Info . legal Id entities . single (). name } ĠRes pon der Ġflow Ġcalled Ġfrom : Ġ${ counter party Session . counter party . name Ġ} ") ĊĊĠĠĠĠĠĠĠ Ġval Ġsigned Transaction Flow Ġ= Ġobject Ġ: ĠSign Transaction Flow ( counter party Session ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcheck Transaction ( st x : ĠSigned Transaction ) Ġ= Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġst x . tx . outputs . single (). data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" This Ġmust Ġbe Ġa ĠTemplate Ġtransaction " Ġusing Ġ( output Ġis ĠTemplate State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsub Flow ( signed Transaction Flow ) ĊĊĠĠĠ Ġ} Ċ } ĊĊĊ Ċ // Ġ********* ** Ċ // Ġ* ĠPlugins Ġ* Ċ // Ġ********* ** Ċ class ĠTemplate Web Plugin Ġ: ĠWeb Server Plugin Registry Ġ{ ĊĠĠĠ Ġ// ĠA Ġlist Ġof Ġlamb das Ġthat Ġcreate Ġobjects Ġexposing Ġweb ĠJ AX - RS ĠREST ĠAPIs . ĊĠĠĠ Ġoverride Ġval Ġweb Apis : ĠList < Function < C ord a RP CO ps , Ġout ĠAny >> Ġ= ĠlistOf ( Function (:: Template Api ), ĠFunction (:: Init iate Api ), Function (:: Vault Api )) ĊĠĠĠ Ġ// A Ġlist Ġof Ġdirectories Ġin Ġthe Ġresources Ġdirectory Ġthat Ġwill Ġbe Ġserved Ġby ĠJet ty Ġunder Ġ/ web . ĊĠĠĠ Ġ// ĠThis Ġtemplate 's Ġweb Ġfrontend Ġis Ġaccessible Ġat Ġ/ web / template . ĊĠĠĠ Ġoverride Ġval Ġstatic Serve Dirs : ĠMap < String , ĠString > Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġwill Ġserve Ġthe Ġtemplate Web Ġdirectory Ġin Ġresources Ġto Ġ/ web / template ĊĠĠĠĠĠĠĠ Ġ" template " Ġto Ġjava Class . class Loader . getResource (" template Web "). to External Form () ĊĠĠĠ Ġ) Ċ } Ċ Ċ // ĠSerialization Ġwhitelist . Ċ class ĠTemplate Serialization Whitelist Ġ: ĠSerialization Whitelist Ġ{ ĊĠĠĠ Ġoverride Ġval Ġwhitelist : ĠList < Class <* >> Ġ= ĠlistOf ( Template Data :: class . java ) Ċ } Ċ Ċ // ĠThis Ġclass Ġis Ġnot Ġannotated Ġwith Ġ@ C ord a Serializable , Ġso Ġit Ġmust Ġbe Ġadded Ġto Ġthe Ġserialization Ġwhitelist , Ġabove , Ġif Ċ // Ġwe Ġwant Ġto Ġsend Ġit Ġto Ġother Ġnodes Ġwithin Ġa Ġflow . Ċ data Ġclass ĠTemplate Data ( val Ġpayload : ĠString ) Ċ