package Ġnet . cord a . node . internal Ċ Ċ import Ġcom . co da h ale . metrics . Metric Registry Ċ import Ġcom . google . common . collect . Mutable Class To Instance Map Ċ import Ġcom . google . common . util . concurrent . More Executors Ċ import Ġcom . zaxxer . hikari . pool . HikariPool Ċ import Ġnet . cord a . conf idential . Swap Id entities Flow Ċ import Ġnet . cord a . conf idential . Swap Id entities Handler Ċ import Ġnet . cord a . core . C ord a Exception Ċ import Ġnet . cord a . core . concurrent . C ord a Future Ċ import Ġnet . cord a . core . context . Invocation Context Ċ import Ġnet . cord a . core . crypto . new Secure Random Ċ import Ġnet . cord a . core . crypto . sign Ċ import Ġnet . cord a . core . flows . Contract Upgrade Flow Ċ import Ġnet . cord a . core . flows . Final ity Flow Ċ import Ġnet . cord a . core . flows . Flow Logic Ċ import Ġnet . cord a . core . flows . Flow Logic Ref Factory Ċ import Ġnet . cord a . core . flows . Flow Session Ċ import Ġnet . cord a . core . flows . Initi ated By Ċ import Ġnet . cord a . core . flows . Initi ating Flow Ċ import Ġnet . cord a . core . flows . Not ary Change Flow Ċ import Ġnet . cord a . core . flows . Not ary Flow Ċ import Ġnet . cord a . core . flows . Start able By Service Ċ import Ġnet . cord a . core . identity . Abstract Party Ċ 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 . identity . Party And Certificate Ċ import Ġnet . cord a . core . internal . Emoji Ċ import Ġnet . cord a . core . internal . Flow StateMachine Ċ import Ġnet . cord a . core . internal . Visible ForTesting Ċ import Ġnet . cord a . core . internal . concurrent . map Ċ import Ġnet . cord a . core . internal . concurrent . open Future Ċ import Ġnet . cord a . core . internal . not ary . Not ary Service Ċ import Ġnet . cord a . core . internal . unchecked Cast Ċ import Ġnet . cord a . core . messaging . C ord a RP CO ps Ċ import Ġnet . cord a . core . messaging . Flow Handle Ċ import Ġnet . cord a . core . messaging . Flow Handle Impl Ċ import Ġnet . cord a . core . messaging . Flow Progress Handle Ċ import Ġnet . cord a . core . messaging . Flow Progress Handle Impl Ċ import Ġnet . cord a . core . messaging . RP CO ps Ċ import Ġnet . cord a . core . node . App Service Hub Ċ import Ġnet . cord a . core . node . Network Parameters Ċ import Ġnet . cord a . core . node . NodeInfo Ċ import Ġnet . cord a . core . node . Service Hub Ċ import Ġnet . cord a . core . node . Services For Resolution Ċ import Ġnet . cord a . core . node . services . Attachment Storage Ċ import Ġnet . cord a . core . node . services . C ord a Service Ċ import Ġnet . cord a . core . node . services . Identity Service Ċ import Ġnet . cord a . core . node . services . Key Management Service Ċ import Ġnet . cord a . core . node . services . Transaction Verifier Service Ċ import Ġnet . cord a . core . serialization . Serialization Whitelist Ċ import Ġnet . cord a . core . serialization . Serialize As Token Ċ import Ġnet . cord a . core . serialization . Singleton Serialize As Token Ċ import Ġnet . cord a . core . serialization . serialize Ċ import Ġnet . cord a . core . utilities . Network Host And Port Ċ import Ġnet . cord a . core . utilities . days Ċ import Ġnet . cord a . core . utilities . debug Ċ import Ġnet . cord a . core . utilities . get OrThrow Ċ import Ġnet . cord a . core . utilities . minutes Ċ import Ġnet . cord a . node . C ord aC lock Ċ import Ġnet . cord a . node . VersionInfo Ċ import Ġnet . cord a . node . internal . Checkpoint Verifier . verify Check points Compatible Ċ import Ġnet . cord a . node . internal . class loading . require Annotation Ċ import Ġnet . cord a . node . internal . cord app . C ord app ConfigFile Provider Ċ import Ġnet . cord a . node . internal . cord app . C ord app Loader Ċ import Ġnet . cord a . node . internal . cord app . C ord app Provider Impl Ċ import Ġnet . cord a . node . internal . cord app . C ord app Provider Internal Ċ import Ġnet . cord a . node . internal . rpc . proxies . Authenticated Rpc Ops Proxy Ċ import Ġnet . cord a . node . internal . rpc . proxies . Exception Serial ising Rpc Ops Proxy Ċ import Ġnet . cord a . node . internal . security . RPC Security Manager Ċ import Ġnet . cord a . node . services . Contract Upgrade Handler Ċ import Ġnet . cord a . node . services . Final ity Handler Ċ import Ġnet . cord a . node . services . Not ary Change Handler Ċ import Ġnet . cord a . node . services . api . Checkpoint Storage Ċ import Ġnet . cord a . node . services . api . Dummy Audit Service Ċ import Ġnet . cord a . node . services . api . Flow Starter Ċ import Ġnet . cord a . node . services . api . Identity Service Internal Ċ import Ġnet . cord a . node . services . api . Monitoring Service Ċ import Ġnet . cord a . node . services . api . Network Map Cache Base Internal Ċ import Ġnet . cord a . node . services . api . Network Map Cache Internal Ċ import Ġnet . cord a . node . services . api . Node Properties Store Ċ import Ġnet . cord a . node . services . api . Scheduler Service Ċ import Ġnet . cord a . node . services . api . Schema Service Ċ import Ġnet . cord a . node . services . api . Service Hub Internal Ċ import Ġnet . cord a . node . services . api . Started Node Services Ċ import Ġnet . cord a . node . services . api . Vault Service Internal Ċ import Ġnet . cord a . node . services . api . Writable Transaction Storage Ċ import Ġnet . cord a . node . services . config . B FT SM a Rt Configuration Ċ import Ġnet . cord a . node . services . config . Node Configuration Ċ import Ġnet . cord a . node . services . config . Not ary Config Ċ import Ġnet . cord a . node . services . config . configure With Dev SS LC ertificate Ċ import Ġnet . cord a . node . services . config . shell . to Shell Config Ċ import Ġnet . cord a . node . services . config . should Init Crash Shell Ċ import Ġnet . cord a . node . services . events . Node Scheduler Service Ċ import Ġnet . cord a . node . services . events . Scheduled Activity Observer Ċ import Ġnet . cord a . node . services . identity . Persistent Identity Service Ċ import Ġnet . cord a . node . services . keys . Persistent Key Management Service Ċ import Ġnet . cord a . node . services . messaging . Ded up lication Handler Ċ import Ġnet . cord a . node . services . messaging . Messaging Service Ċ import Ġnet . cord a . node . services . network . Network Map Cache Impl Ċ import Ġnet . cord a . node . services . network . Network Map Client Ċ import Ġnet . cord a . node . services . network . Network Map Updater Ċ import Ġnet . cord a . node . services . network . NodeInfo Watcher Ċ import Ġnet . cord a . node . services . network . Persistent Network Map Cache Ċ import Ġnet . cord a . node . services . persistence . Abstract Party Descriptor Ċ import Ġnet . cord a . node . services . persistence . Abstract Party To X 5 0 0 Name AsString Converter Ċ import Ġnet . cord a . node . services . persistence . DB Checkpoint Storage Ċ import Ġnet . cord a . node . services . persistence . DB Transaction Mapping Storage Ċ import Ġnet . cord a . node . services . persistence . DB Transaction Storage Ċ import Ġnet . cord a . node . services . persistence . Node Attachment Service Ċ import Ġnet . cord a . node . services . persistence . Node Properties Persistent Store Ċ import Ġnet . cord a . node . services . schema . Hibernate Observer Ċ import Ġnet . cord a . node . services . schema . Node Schema Service Ċ import Ġnet . cord a . node . services . state machine . External Event Ċ import Ġnet . cord a . node . services . state machine . Flow Logic Ref Factory Impl Ċ import Ġnet . cord a . node . services . state machine . Flow Monitor Ċ import Ġnet . cord a . node . services . state machine . Single Th readed StateMachine Manager Ċ import Ġnet . cord a . node . services . state machine . StateMachine Manager Ċ import Ġnet . cord a . node . services . state machine . StateMachine Manager Internal Ċ import Ġnet . cord a . node . services . state machine . appName Ċ import Ġnet . cord a . node . services . state machine . flow Version And Initi ating Class Ċ import Ġnet . cord a . node . services . transactions . B FT Non Valid ating Not ary Service Ċ import Ġnet . cord a . node . services . transactions . B FT SM a Rt Ċ import Ġnet . cord a . node . services . transactions . Raft Non Valid ating Not ary Service Ċ import Ġnet . cord a . node . services . transactions . Raft Uni queness Provider Ċ import Ġnet . cord a . node . services . transactions . Raft Valid ating Not ary Service Ċ import Ġnet . cord a . node . services . transactions . Simple Not ary Service Ċ import Ġnet . cord a . node . services . transactions . Valid ating Not ary Service Ċ import Ġnet . cord a . node . services . upgrade . Contract Upgrade ServiceImpl Ċ import Ġnet . cord a . node . services . vault . Node Vault Service Ċ import Ġnet . cord a . node . utilities . Affinity Executor Ċ import Ġnet . cord a . node . utilities . JV MA gent Registry Ċ import Ġnet . cord a . node . utilities . Named Thread Factory Ċ import Ġnet . cord a . node . utilities . Node Build Properties Ċ import Ġnet . cord a . node api . internal . Dev Identity Generator Ċ import Ġnet . cord a . node api . internal . NodeInfo And Signed Ċ import Ġnet . cord a . node api . internal . Signed NodeInfo Ċ import Ġnet . cord a . node api . internal . crypto . X 5 0 9 Utilities Ċ import Ġnet . cord a . node api . internal . persistence . C ord a Persistence Ċ import Ġnet . cord a . node api . internal . persistence . Could Not Create DataSource Exception Ċ import Ġnet . cord a . node api . internal . persistence . Database Config Ċ import Ġnet . cord a . node api . internal . persistence . Hibernate Configuration Ċ import Ġnet . cord a . node api . internal . store Legal Identity Ċ import Ġnet . cord a . tools . shell . Interactive Shell Ċ import Ġorg . apache . activ emq . art emis . utils . Re usable Latch Ċ import Ġorg . hibernate . type . descriptor . java . Java TypeDescriptor Registry Ċ import Ġorg . slf 4 j . Logger Ċ import Ġrx . Observable Ċ import Ġrx . Scheduler Ċ import Ġjava . io . IOException Ċ import Ġjava . lang . reflect . Invocation TargetException Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . security . KeyPair Ċ import Ġjava . security . KeyStore Exception Ċ import Ġjava . security . PublicKey Ċ import Ġjava . security . cert . X 5 0 9 Certificate Ċ import Ġjava . sql . Connection Ċ import Ġjava . time . Clock Ċ import Ġjava . time . Duration Ċ import Ġjava . time . format . DateTime ParseException Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġjava . util . concurrent . ExecutorService Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjava . util . concurrent . TimeUnit . SECONDS Ċ import Ġjava . util . concurrent . atomic . Atomic Reference Ċ import Ġkotlin . collections . set Ċ import Ġkotlin . reflect . K Class Ċ import Ġnet . cord a . core . crypto . generate KeyPair Ġas Ġcrypto Generate KeyPair Ċ Ċ /** Ċ Ġ* ĠA Ġbase Ġnode Ġimplementation Ġthat Ġcan Ġbe Ġcustom ised Ġeither Ġfor Ġproduction Ġ( with Ġreal Ġimplementations Ġthat Ġdo Ġreal Ċ Ġ* ĠI / O ), Ġor Ġa Ġmock Ġimplementation Ġsuitable Ġfor Ġunit Ġtest Ġenvironments . Ċ Ġ* Ċ Ġ* ĠMark ed Ġas ĠSingleton Serialize As Token Ġto Ġprevent Ġthe Ġinvisible Ġreference Ġto ĠAbstract Node Ġin Ġthe ĠService Hub Ġaccidentally Ċ Ġ* Ġsweep ing Ġup Ġthe ĠNode Ġinto Ġthe ĠK ry o Ġcheckpoint Ġserialization Ġvia Ġany Ġflows Ġholding Ġa Ġreference Ġto ĠService Hub . Ċ Ġ*/ Ċ // ĠTODO ĠLog Ġwarning Ġif Ġthis Ġnode Ġis Ġa Ġnot ary Ġbut Ġnot Ġone Ġof Ġthe Ġones Ġspecified Ġin Ġthe Ġnetwork Ġparameters , Ġboth Ġfor Ġcore Ġand Ġcustom Ċ Ċ // ĠIn Ġtheory Ġthe ĠNode Info Ġfor Ġthe Ġnode Ġshould Ġbe Ġpassed Ġin , Ġinstead , Ġhowever Ġcurrently Ġthis Ġis Ġconstructed Ġby Ġthe Ċ // ĠAbstract Node . ĠIt Ġshould Ġbe Ġpossible Ġto Ġgenerate Ġthe ĠNode Info Ġoutside Ġof ĠAbstract Node , Ġso Ġit Ġcan Ġbe Ġpassed Ġin . Ċ abstract Ġclass ĠAbstract Node ( val Ġconfiguration : ĠNode Configuration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplatform Clock : ĠC ord aC lock , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprotected Ġval Ġversion Info : ĠVersion Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprotected Ġval Ġc ord app Loader : ĠC ord app Loader , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġbusy Node Latch : ĠRe usable Latch Ġ= ĠRe usable Latch ()) Ġ: ĠSingleton Serialize As Token () Ġ{ ĊĊĠĠĠ Ġprivate Ġclass ĠStarted Node Impl < out ĠN Ġ: ĠAbstract Node >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġinternals : ĠN , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservices : ĠService Hub Internal Impl , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġinfo : ĠNode Info , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġcheckpoint Storage : ĠCheck point Storage , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġs mm : ĠState Machine Manager , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġattachments : ĠNode Attachment Service , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġnetwork : ĠMessaging Service , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġdatabase : ĠC ord a Persistence , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġrpc Ops : ĠC ord a RP CO ps , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflow Starter : ĠFlow Starter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġnot ary Service : ĠNot ary Service ?) Ġ: ĠStarted Node < N > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġservices : ĠStarted Node Services Ġ= Ġobject Ġ: ĠStarted Node Services , ĠService Hub Internal Ġby Ġservices , ĠFlow Starter Ġby Ġflow Starter Ġ{} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġval Ġlog : ĠLogger ĊĊĠĠĠ Ġ// ĠWe Ġwill Ġrun Ġas Ġmuch Ġstuff Ġin Ġthis Ġsingle Ġthread Ġas Ġpossible Ġto Ġkeep Ġthe Ġrisk Ġof Ġthread Ġsafety Ġbugs Ġlow Ġduring Ġthe ĊĠĠĠ Ġ// Ġlow - performance Ġpro tot yp ing Ġperiod . ĊĠĠĠ Ġprotected Ġabstract Ġval Ġserver Thread : ĠAff inity Executor . Service Affinity Executor ĊĊĠĠĠ Ġprivate Ġval Ġc ord app Services Ġ= ĠMutable Class To Instance Map . create < Serialize As Token >() ĊĠĠĠ Ġprivate Ġval Ġflow Factories Ġ= ĠConcurrent HashMap < Class < out ĠFlow Logic <* >>, ĠInit i ated Flow Factory <* >>() ĊĊĠĠĠ Ġprotected Ġval Ġservices : ĠService Hub Internal Ġget () Ġ= Ġ_ services ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġ_ services : ĠService Hub Internal Impl ĊĠĠĠ Ġprotected Ġvar Ġmy Not ary Identity : ĠParty And Certificate ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcheckpoint Storage : ĠCheck point Storage ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtoken izable Services : ĠList < Any > ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġattachments : ĠNode Attachment Service ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġnetwork : ĠMessaging Service ĊĠĠĠ Ġprotected Ġval Ġrun On Stop Ġ= ĠArrayList < () Ġ-> ĠAny ?> () ĊĠĠĠ Ġprivate Ġval Ġ_ node Ready Future Ġ= Ġopen Future < Unit >() ĊĠĠĠ Ġprotected Ġvar Ġnetwork Map Client : ĠNetwork Map Client ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġnetwork Map Updater : ĠNetwork Map Updater ĊĠĠĠ Ġlateinit Ġvar Ġsecurity Manager : ĠRPC Security Manager ĊĊĠĠĠ Ġprivate Ġval Ġshutdown Executor Ġ= ĠExec utors . new Single Thread Executor () ĊĊĠĠĠ Ġ/** ĠComp letes Ġonce Ġthe Ġnode Ġhas Ġsuccessfully Ġregistered Ġwith Ġthe Ġnetwork Ġmap Ġservice ĊĠĠĠĠ Ġ* Ġor Ġhas Ġloaded Ġnetwork Ġmap Ġdata Ġfrom Ġlocal Ġdatabase Ġ*/ ĊĠĠĠ Ġval Ġnode Ready Future : ĠC ord a Future < Unit > Ġget () Ġ= Ġ_ node Ready Future ĊĊĠĠĠ Ġopen Ġval Ġserialization Wh itel ists : ĠList < Serialization Whitelist > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġc ord app Loader . cord apps . flatMap Ġ{ Ġit . serialization Wh itel ists Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠSet Ġto Ġnon - null Ġonce Ġ[ start ] Ġhas Ġbeen Ġsuccessfully Ġcalled . Ġ*/ ĊĠĠĠ Ġopen Ġval Ġstarted Ġget () Ġ= Ġ_ started ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġ_ started : ĠStarted Node < Abstract Node >? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĠThe Ġimplementation Ġof Ġthe Ġ[ C ord a RP CO ps ] Ġinterface Ġused Ġby Ġthis Ġnode . Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġmake RP CO ps ( flow Starter : ĠFlow Starter , Ġs mm : ĠState Machine Manager ): ĠC ord a RP CO ps Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġops : ĠC ord a RP CO ps Ġ= ĠC ord a RP CO ps Impl ( services , Ġs mm , Ġflow Starter , Ġ{ Ġshutdown Executor . submit Ġ{ Ġstop () Ġ} Ġ}) ĊĠĠĠĠĠĠĠ Ġ// ĠM ind Ġthat Ġorder Ġis Ġrelevant Ġhere . ĊĠĠĠĠĠĠĠ Ġval Ġproxies Ġ= ĠlistOf <( C ord a RP CO ps ) Ġ-> ĠC ord a RP CO ps >( :: Authenticated Rpc Ops Proxy , Ġ{ Ġit Ġ-> ĠException Serial ising Rpc Ops Proxy ( it , Ġtrue ) Ġ}) ĊĠĠĠĠĠĠĠ Ġreturn Ġproxies . fold ( ops ) Ġ{ Ġdelegate , Ġdecor ate Ġ-> Ġdecor ate ( delegate ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Certificate () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( configuration . dev Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" The ĠC ord a Ġnode Ġis Ġrunning Ġin Ġdeveloper Ġmode . ĠThis Ġis Ġnot Ġsuitable Ġfor Ġproduction Ġusage .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfiguration . configure With Dev SS LC ertificate () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" The ĠC ord a Ġnode Ġis Ġrunning Ġin Ġproduction Ġmode . ĠIf Ġthis Ġis Ġa Ġdeveloper Ġenvironment Ġyou Ġcan Ġset Ġ' dev Mode = true ' Ġin Ġthe Ġnode . conf Ġfile .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvalidate Ke yst ore () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġgenerate And Save NodeInfo (): ĠNode Info Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( started Ġ== Ġnull ) Ġ{ Ġ" Node Ġhas Ġalready Ġbeen Ġstarted " Ġ} ĊĠĠĠĠĠĠĠ Ġlog . info (" Generating Ġnode Info Ġ... ") ĊĠĠĠĠĠĠĠ Ġinit Certificate () ĊĠĠĠĠĠĠĠ Ġval Ġschema Service Ġ= ĠNode Schema Service ( cord app Loader . cord app Schemas ) ĊĠĠĠĠĠĠĠ Ġval Ġ( identity , Ġidentity KeyPair ) Ġ= Ġobtain Identity ( not ary Config Ġ= Ġnull ) ĊĠĠĠĠĠĠĠ Ġ// ĠWr apped Ġin Ġan Ġatomic Ġreference Ġjust Ġto Ġallow Ġsetting Ġit Ġbefore Ġthe Ġclosure Ġbelow Ġgets Ġinvoked . ĊĠĠĠĠĠĠĠ Ġval Ġidentity Service Ref Ġ= ĠAtomic Reference < Identity Service >() ĊĠĠĠĠĠĠĠ Ġval Ġdatabase Ġ= Ġinitialise Database Persistence ( schema Service , Ġ{ Ġname Ġ-> Ġidentity Service Ref . get (). well Known Party From X 5 0 0 Name ( name ) Ġ}, Ġ{ Ġparty Ġ-> Ġidentity Service Ref . get (). well Known Party From Anonymous ( party ) Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġidentity Service Ġ= Ġmake Identity Service ( identity . certificate , Ġdatabase ) ĊĠĠĠĠĠĠĠ Ġidentity Service Ref . set ( identity Service ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdatabase . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO ĠThe Ġfact Ġthat Ġwe Ġneed Ġto Ġspecify Ġan Ġempty Ġlist Ġof Ġnot aries Ġjust Ġto Ġgenerate Ġour Ġnode Ġinfo Ġlooks ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlike Ġa Ġdesign Ġs mell . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpersistent Network Map Cache Ġ= ĠPersistent Network Map Cache ( database , Ġnot aries Ġ= Ġempty List ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpersistent Network Map Cache . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ(_, Ġnode Info ) Ġ= Ġupdate NodeInfo ( persistent Network Map Cache , Ġnull , Ġidentity , Ġidentity KeyPair ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Network Map Cache () Ġ{ ĊĠĠĠĠĠĠĠ ĠNode . print Basic NodeInfo (" Clear ing Ġnetwork Ġmap Ġcache Ġentries ") ĊĠĠĠĠĠĠĠ Ġlog . info (" Starting Ġclearing Ġof Ġnetwork Ġmap Ġcache Ġentries ...") ĊĠĠĠĠĠĠĠ Ġconfigure Database ( configuration . dataSource Properties , Ġconfiguration . database , Ġ{ Ġnull Ġ}, Ġ{ Ġnull Ġ}). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnetwork Map Cache Ġ= ĠPersistent Network Map Cache ( it , Ġempty List ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Map Cache . clear Network Map Cache () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġstart (): ĠStarted Node < Abstract Node > Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( started Ġ== Ġnull ) Ġ{ Ġ" Node Ġhas Ġalready Ġbeen Ġstarted " Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( configuration . dev Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . setProperty (" co . parallel universe . fib ers . verify Instrumentation ", Ġ" true ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEmoji . render If Supported Ġ{ ĠNode . print Warning (" This Ġnode Ġis Ġrunning Ġin Ġdeveloper Ġmode ! Ġ${ Emoji . developer } ĠThis Ġis Ġnot Ġsafe Ġfor Ġproduction Ġdeployment .") Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog . info (" Node Ġstarting Ġup Ġ... ") ĊĠĠĠĠĠĠĠ Ġinit Certificate () ĊĠĠĠĠĠĠĠ Ġinitialise JV MA g ents () ĊĠĠĠĠĠĠĠ Ġval Ġschema Service Ġ= ĠNode Schema Service ( cord app Loader . cord app Schemas , Ġconfiguration . not ary Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ Ġschema Service . mapped Schemas Warnings (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwarning Ġ= Ġit . to Warning () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn ( warning ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNode . print Warning ( warning ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġ( identity , Ġidentity KeyPair ) Ġ= Ġobtain Identity ( not ary Config Ġ= Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWr apped Ġin Ġan Ġatomic Ġreference Ġjust Ġto Ġallow Ġsetting Ġit Ġbefore Ġthe Ġclosure Ġbelow Ġgets Ġinvoked . ĊĠĠĠĠĠĠĠ Ġval Ġidentity Service Ref Ġ= ĠAtomic Reference < Identity Service >() ĊĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġall Ġof Ġthis Ġin Ġa Ġdatabase Ġtransaction Ġso Ġanything Ġthat Ġmight Ġneed Ġa Ġconnection Ġhas Ġone . ĊĠĠĠĠĠĠĠ Ġval Ġdatabase Ġ= Ġinitialise Database Persistence ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġschema Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġname Ġ-> Ġidentity Service Ref . get (). well Known Party From X 5 0 0 Name ( name ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġparty Ġ-> Ġidentity Service Ref . get (). well Known Party From Anonymous ( party ) Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġidentity Service Ġ= Ġmake Identity Service ( identity . certificate , Ġdatabase ). also ( identity Service Ref :: set ) ĊĠĠĠĠĠĠĠ Ġnetwork Map Client Ġ= Ġconfiguration . network Services ?. let Ġ{ ĠNetwork Map Client ( it . network Map URL , Ġidentity Service . trust Root ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnetwork Parameter es Reader Ġ= ĠNetwork Parameters Reader ( identity Service . trust Root , Ġnetwork Map Client , Ġconfiguration . base Directory ) ĊĠĠĠĠĠĠĠ Ġval Ġnetwork Parameters Ġ= Ġnetwork Parameter es Reader . network Parameters ĊĠĠĠĠĠĠĠ Ġcheck ( network Parameters . minimum Platform Version Ġ<= Ġversion Info . platform Version ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Node 's Ġplatform Ġversion Ġis Ġlower Ġthan Ġnetwork 's Ġrequired Ġminimum Platform Version " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġ( started Impl , Ġscheduler Service ) Ġ= Ġdatabase . transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnetwork Map Cache Ġ= ĠNetwork Map Cache Impl ( Persistent Network Map Cache ( database , Ġnetwork Parameters . not aries ). start (), Ġidentity Service , Ġdatabase ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( key Pairs , Ġnode Info ) Ġ= Ġupdate NodeInfo ( network Map Cache , Ġnetwork Map Client , Ġidentity , Ġidentity KeyPair ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġidentity Service . load Id entities ( node Info . legal Id entities And Certs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmetrics Ġ= ĠMetric Registry () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransaction Storage Ġ= Ġmake Transaction Storage ( database , Ġconfiguration . transaction Cache Size Bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Transaction Ġstorage Ġcreated ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattachments Ġ= ĠNode Attachment Service ( metrics , Ġconfiguration . attachment Content Cache Size Bytes , Ġconfiguration . attachment Cache Bound , Ġdatabase ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Attachment Ġservice Ġcreated ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc ord app Provider Ġ= ĠC ord app Provider Impl ( cord app Loader , ĠC ord app ConfigFile Provider (), Ġattachments , Ġnetwork Parameters . wh itelisted Contract Implement ations ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" C ord app Ġprovider Ġcreated ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservices For Resolution Ġ= ĠServices For Resolution Impl ( identity Service , Ġattachments , Ġc ord app Provider , Ġnetwork Parameters , Ġtransaction Storage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Properties Ġ= ĠNode Properties Persistent Store ( Stub bed Node UniqueId Provider :: value , Ġdatabase ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Services Ġ= Ġmake Services ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Pairs , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġschema Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Storage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservices For Resolution , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidentity Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Map Cache , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Properties , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc ord app Provider , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Parameters ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnot ary Service Ġ= Ġmake Not ary Service ( node Services , Ġdatabase ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs mm Ġ= Ġmake StateMachine Manager ( database ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflow Logic Ref Factory Ġ= ĠFlow Logic Ref Factory Impl ( cord app Loader . app ClassLoader ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflow Starter Ġ= ĠFlow Starter Impl ( sm m , Ġflow Logic Ref Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc ord a Services Ġ= Ġinstall C ord a Services ( flow Starter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscheduler Service Ġ= ĠNode Scheduler Service ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplatform Clock , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Starter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservices For Resolution , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun finished Schedules Ġ= Ġbusy Node Latch , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Logic Ref Factory Ġ= Ġflow Logic Ref Factory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdr aining Mode Poll Period Ġ= Ġconfiguration . dr aining Mode Poll Period , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Properties Ġ= Ġnode Properties ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Stop Ġ+= Ġ{ Ġscheduler Service . join () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken izable Services Ġ= Ġnode Services Ġ+ Ġc ord a Services Ġ+ Ġscheduler Service ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Check points Compatible ( checkpoint Storage , Ġc ord app Provider . cord apps , Ġversion Info . platform Version , Ġ_ services , Ġtoken izable Services ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠCheck point In compatible Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( configuration . dev Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNode . print Warning ( e . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( server Thread Ġas ? ĠExecutor Service )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Stop Ġ+= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġwait Ġhere , Ġeven Ġthough Ġany Ġin - flight Ġmessages Ġshould Ġhave Ġbeen Ġdr ained Ġaway Ġbecause Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġserver Ġthread Ġcan Ġpotentially Ġhave Ġother Ġnon - messaging Ġtasks Ġscheduled Ġonto Ġit . ĠThe Ġtimeout Ġvalue Ġis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġarbitrary Ġand Ġmight Ġbe Ġin appro priate . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMore Executors . shutdown And Await Termination ( it , Ġ 5 0 , ĠSE CON DS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmake Vault Observer s ( scheduler Service , Ġdatabase . hibernate Config , Ġschema Service , Ġflow Logic Ref Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrpc Ops Ġ= Ġmake RP CO ps ( flow Starter , Ġs mm ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Messaging Service ( rpc Ops ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstall Core Flows () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister C ord app Flows ( sm m ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ services . rpc Flows Ġ+= Ġc ord app Loader . cord apps . flatMap Ġ{ Ġit . rpc Flows Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Shell () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Started Node Impl ( this @ Abstract Node , Ġ_ services , Ġnode Info , Ġcheckpoint Storage , Ġs mm , Ġattachments , Ġnetwork , Ġdatabase , Ġrpc Ops , Ġflow Starter , Ġnot ary Service ), Ġscheduler Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnetwork Map Updater Ġ= ĠNetwork Map Updater ( services . network Map Cache , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNode Info Watcher ( configuration . base Directory , Ġget Rx Io Scheduler (), ĠDuration . of Millis ( configuration . additional NodeInfo Polling Frequency M sec )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Map Client , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Parameter es Reader . hash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservices . my Info . serialize (). hash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfiguration . base Directory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfiguration . extra Network Map Keys ) ĊĠĠĠĠĠĠĠ Ġrun On Stop Ġ+= Ġnetwork Map Updater :: close ĊĊĠĠĠĠĠĠĠ Ġnetwork Map Updater . subscribe To Network Map () ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġsuccessfully Ġloaded Ġnetwork Ġdata Ġfrom Ġdatabase , Ġwe Ġset Ġthis Ġfuture Ġto ĠUnit . ĊĠĠĠĠĠĠĠ Ġ_ node Ready Future . capture Later ( services . network Map Cache . node Ready . map Ġ{ ĠUnit Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġstarted Impl . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs mm . start ( token izable Services ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSh ut Ġdown Ġthe ĠS MM Ġso Ġno ĠF ib ers Ġare Ġscheduled . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Stop Ġ+= Ġ{ Ġs mm . stop ( accept able Live Fi ber Count On Stop ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( sm m Ġas ? ĠState Machine Manager Internal )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflow Monitor Ġ= ĠFlow Monitor ( sm m :: snapshot , Ġconfiguration . flow Monitor Period Millis , Ġconfiguration . flow Monitor Sus pension Logging Threshold Millis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Stop Ġ+= Ġ{ Ġflow Monitor . stop () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Monitor . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscheduler Service . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ started Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠShould Ġbe Ġ[ rx . schedul ers . Schedulers . io ] Ġfor Ġproduction , ĊĠĠĠĠ Ġ* Ġor Ġ[ rx . internal . schedul ers . Cached Thread Scheduler ] Ġ( with Ġshutdown Ġregistered Ġwith Ġ[ run On Stop ]) Ġfor Ġshared - JVM Ġtesting . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġget Rx Io Scheduler (): ĠScheduler ĊĊĠĠĠ Ġopen Ġfun Ġstart Shell () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( configuration . should Init Crash Shell ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshell Configuration Ġ= Ġconfiguration . to Shell Config () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshell Configuration . ssh Host Key Directory ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Binding ĠShell ĠSSH D Ġserver Ġon Ġport Ġ$ it .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInteractive Shell . start Shell Internal ( shell Configuration , Ġc ord app Loader . app ClassLoader ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate NodeInfo ( network Map Cache : ĠNetwork Map Cache Base Internal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Map Client : ĠNetwork Map Client ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidentity : ĠParty And Certificate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidentity KeyPair : ĠKey Pair ): ĠPair < Set < KeyPair >, ĠNode Info > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Pairs Ġ= Ġmutable Set Of ( identity KeyPair ) ĊĊĠĠĠĠĠĠĠ Ġmy Not ary Identity Ġ= Ġconfiguration . not ary ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Cluster Config ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( not ary Identity , Ġnot ary Identity KeyPair ) Ġ= Ġobtain Identity ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Pairs Ġ+= Ġnot ary Identity KeyPair ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot ary Identity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġcase Ġof Ġa Ġsingle Ġnot ary Ġservice Ġmy Not ary Identity Ġwill Ġbe Ġthe Ġnode 's Ġsingle Ġidentity . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidentity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpotential NodeInfo Ġ= ĠNode Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Addresses (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( identity , Ġmy Not ary Identity ). filter NotNull (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion Info . platform Version , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserial Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnode Info From Db Ġ= Ġget Previous NodeInfo If Present ( network Map Cache , Ġidentity ) ĊĊĊĠĠĠĠĠĠĠ Ġval Ġnode Info Ġ= Ġif Ġ( potential NodeInfo Ġ== Ġnode Info From Db ?. copy ( serial Ġ= Ġ 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġnode Ġinfo Ġhasn 't Ġchanged . ĠWe Ġuse Ġthe Ġone Ġfrom Ġthe Ġdatabase Ġto Ġpreserve Ġthe Ġserial . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Node - info Ġhasn 't Ġchanged ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Info From Db ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Node - info Ġhas Ġchanged Ġso Ġsubmitting Ġupdate . ĠOld Ġnode - info Ġwas Ġ$ node Info From Db ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewNode Info Ġ= Ġpotential NodeInfo . copy ( serial Ġ= Ġplatform Clock . millis ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Map Cache . add Node ( new NodeInfo ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" New Ġnode - info : Ġ$ new NodeInfo ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠnewNode Info ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnode Info And Signed Ġ= ĠNode Info And Signed ( node Info ) Ġ{ ĠpublicKey , Ġserial ised Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠprivateKey Ġ= Ġkey Pairs . single Ġ{ Ġit . public Ġ== ĠpublicKey Ġ}. private ĊĠĠĠĠĠĠĠĠĠĠĠ ĠprivateKey . sign ( serial ised . bytes ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWrite Ġthe Ġnode - info Ġfile Ġeven Ġif Ġnothing 's Ġchanged , Ġjust Ġin Ġcase Ġthe Ġfile Ġhas Ġbeen Ġdeleted . ĊĠĠĠĠĠĠĠ ĠNode Info Watcher . save ToFile ( configuration . base Directory , Ġnode Info And Signed ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAlways Ġre publish Ġon Ġstartup , Ġit 's Ġtreated Ġby Ġnetwork Ġmap Ġserver Ġas Ġa Ġheartbeat . ĊĠĠĠĠĠĠĠ Ġif Ġ( network Map Client Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Publish NodeInfo Async ( node Info And Signed . signed , Ġnetwork Map Client ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( key Pairs , Ġnode Info ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Previous NodeInfo If Present ( network Map Cache : ĠNetwork Map Cache Base Internal , Ġidentity : ĠParty And Certificate ): ĠNode Info ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Infos From Db Ġ= Ġnetwork Map Cache . get Nodes By Legal Name ( identity . name ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( node Infos From Db . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġnode Infos From Db [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Found Ġmore Ġthan Ġone Ġnode Ġregistration Ġwith Ġour Ġlegal Ġname , Ġthis Ġis Ġonly Ġexpected Ġif Ġour Ġkey pair Ġhas Ġbeen Ġregenerated ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Infos From Db [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠPublish Ġnode Ġinfo Ġon Ġstartup Ġand Ġstart Ġtask Ġthat Ġsends Ġevery Ġday Ġa Ġheartbeat Ġ- Ġre pub lishes Ġnode Ġinfo . ĊĠĠĠ Ġprivate Ġfun Ġtry Publish NodeInfo Async ( signed NodeInfo : ĠSigned NodeInfo , Ġnetwork Map Client : ĠNetwork Map Client ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠBy Ġdefault Ġheartbeat Ġinterval Ġshould Ġbe Ġset Ġto Ġ 1 Ġday , Ġbut Ġfor Ġtesting Ġwe Ġmay Ġchange Ġit . ĊĠĠĠĠĠĠĠ Ġval Ġre publish Property Ġ= ĠSystem . getProperty (" net . cord a . node . internal . node info . publish . interval ") ĊĠĠĠĠĠĠĠ Ġval Ġheartbeat Interval Ġ= Ġif Ġ( re publish Property Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDuration . parse ( re publish Property ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠDateTime ParseException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 . days ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 . days ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġexecutor Ġ= ĠExec utors . new Single Thread Scheduled Executor ( Named Thread Factory (" Network ĠMap ĠUp dater ", ĠExec utors . default Thread Factory ())) ĊĠĠĠĠĠĠĠ Ġexecutor . submit ( object Ġ: ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġre publish Interval Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Map Client . publish ( signed NodeInfo ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheartbeat Interval ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Error Ġencountered Ġwhile Ġpublishing Ġnode Ġinfo , Ġwill Ġretry Ġagain ", Ġt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠExp onent ial Ġbackoff ? ĠIt Ġshould Ġreach Ġmax Ġinterval Ġof Ġevent H orizon / 2 . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 . minutes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . schedule ( this , Ġre publish Interval . to Minutes (), ĠTimeUnit . MIN UTES ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġmy Addresses (): ĠList < Network Host And Port > ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġmake StateMachine Manager ( database : ĠC ord a Persistence ): ĠState Machine Manager Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle Th readed StateMachine Manager ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservices , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheckpoint Storage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver Thread , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Secure Random (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbusy Node Latch , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc ord app Loader . app ClassLoader ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠService Instantiation Exception ( cause : ĠThrowable ?) Ġ: ĠC ord a Exception (" Service ĠInstanti ation ĠError ", Ġcause ) ĊĊĠĠĠ Ġprivate Ġfun Ġinstall C ord a Services ( flow Starter : ĠFlow Starter ): ĠList < Serialize As Token > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġloaded Services Ġ= Ġc ord app Loader . cord apps . flatMap Ġ{ Ġit . services Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfilter Services To Install ( loaded Services ). map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstall C ord a Service ( flow Starter , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch Method Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error ("${ it . name }, Ġas Ġa ĠC ord a Ġservice , Ġmust Ġhave Ġa Ġconstructor Ġwith Ġa Ġsingle Ġparameter Ġof Ġtype Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠService Hub :: class . java . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠService Instantiation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" C ord a Ġservice Ġ${ it . name } Ġfailed Ġto Ġinstantiate ", Ġe . cause ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Unable Ġto Ġinstall ĠC ord a Ġservice Ġ${ it . name }", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfilter Services To Install ( loaded Services : ĠList < Class < out ĠSerialize As Token >> ): ĠList < Class < out ĠSerialize As Token >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcustom Not ary Service List Ġ= Ġloaded Services . filter Ġ{ Ġis Not ary Service ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( custom Not ary Service List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( configuration . not ary ?. custom Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( custom Not ary Service List . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" At tempting Ġto Ġinstall Ġmore Ġthan Ġone Ġnot ary Ġservice : Ġ${ custom Not ary Service List . join ToString () }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġreturn Ġloaded Services Ġ- Ġcustom Not ary Service List ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġloaded Services ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġ[ service Class ] Ġis Ġa Ġnot ary Ġservice , Ġit Ġwill Ġonly Ġbe Ġenable Ġif Ġthe Ġ" custom " Ġflag Ġis Ġset Ġin ĊĠĠĠĠ Ġ* Ġthe Ġnot ary Ġconfiguration . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Not ary Service ( service Class : ĠClass <* >) Ġ= ĠNot ary Service :: class . java . isAssignableFrom ( service Class ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġcustom izes Ġthe ĠService Hub Ġfor Ġeach ĠC ord a Service Ġthat Ġis Ġiniti ating Ġflows ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġclass ĠApp Service Hub Impl < T Ġ: ĠSerialize As Token >( private Ġval Ġservice Hub : ĠService Hub , Ġprivate Ġval Ġflow Starter : ĠFlow Starter ) Ġ: ĠApp Service Hub , ĠService Hub Ġby Ġservice Hub Ġ{ ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġservice Instance : ĠT ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< T > Ġstart Tracked Flow ( flow : ĠFlow Logic < T >): ĠFlow Progress Handle < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Machine Ġ= Ġstart Flow Checked ( flow ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFlow Progress Handle Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġstate Machine . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnValue Ġ= Ġstate Machine . result Future , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ= Ġstate Machine . logic . track ()?. updates Ġ?: ĠObservable . empty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< T > Ġstart Flow ( flow : ĠFlow Logic < T >): ĠFlow Handle < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Machine Ġ= Ġstart Flow Checked ( flow ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFlow Handle Impl ( id Ġ= Ġstate Machine . id , ĠreturnValue Ġ= Ġstate Machine . result Future ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġ< T > Ġstart Flow Checked ( flow : ĠFlow Logic < T >): ĠFlow StateMachine < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlogic Type Ġ= Ġflow . java Class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( logic Type . is Annotation Present ( Start able By Service :: class . java )) Ġ{ Ġ"${ logic Type . name } Ġwas Ġnot Ġdesigned Ġfor Ġstarting Ġby Ġa ĠC ord a Service " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġcheck Ġservice Ġpermissions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġswitch Ġfrom Ġmy Info . legal Id entities [ 0 ]. name Ġto Ġcurrent Ġnode 's Ġidentity Ġas Ġsoon Ġas Ġavailable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠInvocation Context . service ( service Instance . java Class . name , Ġmy Info . legal Id entities [ 0 ]. name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġflow Starter . start Flow ( flow , Ġcontext ). get OrThrow () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠApp Service Hub Impl <* >) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġservice Hub Ġ== Ġother . service Hub ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġflow Starter Ġ== Ġother . flow Starter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġservice Instance Ġ== Ġother . service Instance ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= ĠObjects . hash ( service Hub , Ġflow Starter , Ġservice Instance ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T Ġ: ĠSerialize As Token > Ġinstall C ord a Service ( flow Starter : ĠFlow Starter , Ġservice Class : ĠClass < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġservice Class . require Annotation < C ord a Service >() ĊĠĠĠĠĠĠĠ Ġval Ġservice Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Context Ġ= ĠApp Service Hub Impl < T >( services , Ġflow Starter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isNot ary Service ( service Class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( my Not ary Identity Ġ!= Ġnull ) Ġ{ Ġ" Trying Ġto Ġinstall Ġa Ġnot ary Ġservice Ġbut Ġno Ġnot ary Ġidentity Ġspecified " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= Ġservice Class . getDeclared Constructor ( App Service Hub :: class . java , ĠPublicKey :: class . java ). apply Ġ{ Ġis Accessible Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Context . service Instance Ġ= Ġconstructor . newInstance ( service Context , Ġmy Not ary Identity !!. own ing Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Context . service Instance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextended Service Constructor Ġ= Ġservice Class . getDeclared Constructor ( App Service Hub :: class . java ). apply Ġ{ Ġis Accessible Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Context . service Instance Ġ= Ġextended Service Constructor . newInstance ( service Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Context . service Instance ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠNoSuch Method Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= Ġservice Class . getDeclared Constructor ( Service Hub :: class . java ). apply Ġ{ Ġis Accessible Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn ("${ service Class . name } Ġis Ġusing Ġlegacy ĠC ord a Service Ġconstructor Ġwith ĠService Hub Ġparameter . ĠUpgrade Ġto Ġan ĠApp Service Hub Ġparameter Ġto Ġenable Ġupdated ĠAPI Ġfeatures .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor . newInstance ( services ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInvocation TargetException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠService Instantiation Exception ( e . cause ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġc ord app Services . put Instance ( service Class , Ġservice ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( service Ġis ĠNot ary Service ) Ġhandle Custom Not ary Service ( service ) ĊĊĠĠĠĠĠĠĠ Ġlog . info (" Installed Ġ${ service Class . name } ĠC ord a Ġservice ") ĊĠĠĠĠĠĠĠ Ġreturn Ġservice ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Custom Not ary Service ( service : ĠNot ary Service ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun On Stop Ġ+= Ġservice :: stop ĊĠĠĠĠĠĠĠ Ġservice . start () ĊĠĠĠĠĠĠĠ Ġinstall Core Flow ( Not ary Flow . Client :: class , Ġservice :: create Service Flow ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġregister C ord app Flows ( sm m : ĠState Machine Manager ) Ġ{ ĊĠĠĠĠĠĠĠ Ġc ord app Loader . cord apps . flatMap Ġ{ Ġit . initi ated Flows Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister Initi ated Flow Internal ( sm m , Ġit , Ġtrack Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch Method Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error ("${ it . name }, Ġas Ġan Ġinitiated Ġflow , Ġmust Ġhave Ġa Ġconstructor Ġwith Ġa Ġsingle Ġparameter Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" of Ġtype Ġ${ Party :: class . java . name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Unable Ġto Ġregister Ġinitiated Ġflow Ġ${ it . name }", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġ< T Ġ: ĠFlow Logic <* >> Ġregister Initi ated Flow ( sm m : ĠState Machine Manager , Ġinitiated Flow Class : ĠClass < T >): ĠObservable < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġregister Initi ated Flow Internal ( sm m , Ġinitiated Flow Class , Ġtrack Ġ= Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO Ġremove Ġonce Ġnot Ġneeded ĊĠĠĠ Ġprivate Ġfun Ġdeprecated Flow Constructor Message ( flow Class : ĠClass < *> ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Installing Ġflow Ġfactory Ġfor Ġ$ flow Class Ġaccepting Ġa Ġ${ Party :: class . java . simple Name }, Ġwhich Ġis Ġdeprecated . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" It Ġshould Ġaccept Ġa Ġ${ Flow Session :: class . java . simple Name } Ġinstead " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< F Ġ: ĠFlow Logic <* >> Ġregister Initi ated Flow Internal ( sm m : ĠState Machine Manager , Ġinitiated Flow : ĠClass < F >, Ġtrack : ĠBoolean ): ĠObservable < F > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconstructors Ġ= Ġinitiated Flow . declared Construct ors . associate By Ġ{ Ġit . parameter Types . toList () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġflow Session Ctor Ġ= Ġconstructors [ listOf ( Flow Session :: class . java )] ?. apply Ġ{ Ġis Accessible Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġctor : Ġ( Flow Session ) Ġ-> ĠF Ġ= Ġif Ġ( flow Session Ctor Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTry Ġto Ġfallback Ġto Ġa ĠParty Ġconstructor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparty Ctor Ġ= Ġconstructors [ listOf ( Party :: class . java )] ?. apply Ġ{ Ġis Accessible Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( party Ctor Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ("$ initi ated Flow Ġmust Ġhave Ġa Ġconstructor Ġaccepting Ġa Ġ${ Flow Session :: class . java . name }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn ( deprecated Flow Constructor Message ( initi ated Flow )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġflow Session : ĠFlow Session Ġ-> Ġunchecked Cast ( party Ctor . newInstance ( flow Session . counter party )) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġflow Session : ĠFlow Session Ġ-> Ġunchecked Cast ( flow Session Ctor . newInstance ( flow Session )) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġiniti ating Flow Ġ= Ġinitiated Flow . require Annotation < Initi ated By >(). value . java ĊĠĠĠĠĠĠĠ Ġval Ġ( version , Ġclass With Annotation ) Ġ= Ġiniti ating Flow . flow Version And Initi ating Class ĊĠĠĠĠĠĠĠ Ġrequire ( class With Annotation Ġ== Ġiniti ating Flow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Initi ated By :: class . java . name } Ġmust Ġpoint Ġto Ġ${ class With Annotation . name } Ġand Ġnot Ġ${ initi ating Flow . name }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġflow Factory Ġ= ĠInit i ated Flow Factory . Cor D app ( version , Ġinitiated Flow . appName , Ġctor ) ĊĠĠĠĠĠĠĠ Ġval Ġobservable Ġ= Ġinternal Register Flow Factory ( sm m , Ġiniti ating Flow , Ġflow Factory , Ġinitiated Flow , Ġtrack ) ĊĠĠĠĠĠĠĠ Ġlog . info (" Registered Ġ${ initi ating Flow . name } Ġto Ġinitiate Ġ${ initi ated Flow . name } Ġ( version Ġ$ version )") ĊĠĠĠĠĠĠĠ Ġreturn Ġobservable ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġ< F Ġ: ĠFlow Logic <* >> Ġinternal Register Flow Factory ( sm m : ĠState Machine Manager , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiniti ating Flow Class : ĠClass < out ĠFlow Logic <* >>, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Factory : ĠInit i ated Flow Factory < F >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitiated Flow Class : ĠClass < F >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrack : ĠBoolean ): ĠObservable < F > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġobservable Ġ= Ġif Ġ( track ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs mm . changes . filter Ġ{ Ġit Ġis ĠState Machine Manager . Change . Add Ġ}. map Ġ{ Ġit . logic Ġ}. of Type ( initi ated Flow Class ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . empty () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġflow Factories [ initi ating Flow Class ] Ġ= Ġflow Factory ĊĠĠĠĠĠĠĠ Ġreturn Ġobservable ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInstall s Ġa Ġflow Ġthat 's Ġcore Ġto Ġthe ĠC ord a Ġplatform . ĠUn like ĠCor D app Ġflows Ġwhich Ġare Ġversion ed Ġindividually Ġusing ĊĠĠĠĠ Ġ* Ġ[ Initi ating Flow . version ], Ġcore Ġflows Ġhave Ġthe Ġsame Ġversion Ġas Ġthe Ġnode 's Ġplatform Ġversion . ĠTo Ġc ater Ġfor Ġbackwards ĊĠĠĠĠ Ġ* Ġcompatibility Ġ[ flow Factory ] Ġprovides Ġa Ġsecond Ġparameter Ġwhich Ġis Ġthe Ġplatform Ġversion Ġof Ġthe Ġiniti ating Ġparty . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġfun Ġinstall Core Flow ( client Flow Class : ĠK Class < out ĠFlow Logic <* >>, Ġflow Factory : Ġ( Flow Session ) Ġ-> ĠFlow Logic <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( client Flow Class . java . flow Version And Initi ating Class . first Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Initi ating Flow :: class . java . name }. version Ġnot Ġapplicable Ġfor Ġcore Ġflows ; Ġtheir Ġversion Ġis Ġthe Ġnode 's Ġplatform Ġversion " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġflow Factories [ client Flow Class . java ] Ġ= ĠInit i ated Flow Factory . Core ( flow Factory ) ĊĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" Installed Ġcore Ġflow Ġ${ client Flow Class . java . name }" Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġinstall Core Flows () Ġ{ ĊĠĠĠĠĠĠĠ Ġinstall Core Flow ( Final ity Flow :: class , Ġ:: Final ity Handler ) ĊĠĠĠĠĠĠĠ Ġinstall Core Flow ( Not ary Change Flow :: class , Ġ:: Not ary Change Handler ) ĊĠĠĠĠĠĠĠ Ġinstall Core Flow ( Contract Upgrade Flow . Init iate :: class , Ġ:: Contract Upgrade Handler ) ĊĠĠĠĠĠĠĠ Ġinstall Core Flow ( Swap Id entities Flow :: class , Ġ:: Swap Id entities Handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuilds Ġnode Ġinternal , Ġadvert ised , Ġand Ġplugin Ġservices . ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġlist Ġof Ġtoken izable Ġservices Ġto Ġbe Ġadded Ġto Ġthe Ġserial isation Ġcontext . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġmake Services ( key Pairs : ĠSet < KeyPair >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġschema Service : ĠSchema Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Storage : ĠWrit able Transaction Storage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics : ĠMetric Registry , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservices For Resolution : ĠServices For Resolution , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase : ĠC ord a Persistence , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Info : ĠNode Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidentity Service : ĠIdentity Service Internal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Map Cache : ĠNetwork Map Cache Internal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Properties : ĠNode Properties Store , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc ord app Provider : ĠC ord app Provider Internal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Parameters : ĠNetwork Parameters ): ĠMutable List < Any > Ġ{ ĊĠĠĠĠĠĠĠ Ġcheckpoint Storage Ġ= ĠDB Checkpoint Storage () ĊĊĊĠĠĠĠĠĠĠ Ġval Ġkey Management Service Ġ= Ġmake Key Management Service ( identity Service , Ġkey Pairs , Ġdatabase ) ĊĠĠĠĠĠĠĠ Ġ_ services Ġ= ĠService Hub Internal Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidentity Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Management Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġschema Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Storage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMonitoring Service ( metrics ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc ord app Provider , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Map Cache , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Properties , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Parameters , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservices For Resolution ) ĊĊĠĠĠĠĠĠĠ Ġnetwork Ġ= Ġmake Messaging Service ( database , Ġnode Info , Ġnode Properties , Ġnetwork Parameters ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmutable ListOf ( attachments , Ġnetwork , Ġservices . vault Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservices . key Management Service , Ġservices . identity Service , Ġplatform Clock , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservices . audit Service , Ġservices . monitoring Service , Ġservices . network Map Cache , Ġservices . schema Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservices . transaction Verifier Service , Ġservices . validated Transactions , Ġservices . contract Upgrade Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservices , Ġc ord app Provider , Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġmake Transaction Storage ( database : ĠC ord a Persistence , Ġtransaction Cache Size Bytes : ĠLong ): ĠWrit able Transaction Storage Ġ= ĠDB Transaction Storage ( transaction Cache Size Bytes , Ġdatabase ) ĊĠĠĠ Ġprivate Ġfun Ġmake Vault Observer s ( scheduler Service : ĠScheduler Service , Ġhi bernate Config : ĠHibernate Configuration , Ġschema Service : ĠSchema Service , Ġflow Logic Ref Factory : ĠFlow Logic Ref Factory ) Ġ{ ĊĠĠĠĠĠĠĠ ĠScheduled Activity Observer . install ( services . vault Service , Ġscheduler Service , Ġflow Logic Ref Factory ) ĊĠĠĠĠĠĠĠ ĠHibernate Observer . install ( services . vault Service . raw Updates , Ġhi bernate Config , Ġschema Service ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġprotected Ġopen Ġfun Ġacceptable Live Fi ber Count On Stop (): ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Ke yst ore () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontain Correct Keys Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġwill Ġthrow ĠIOException Ġif Ġkey Ġfile Ġnot Ġfound Ġor ĠKey Store Exception Ġif Ġkeystore Ġpassword Ġis Ġincorrect . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġssl Ke yst ore Ġ= Ġconfiguration . load Ssl KeyStore () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġident ities Ke yst ore Ġ= Ġconfiguration . load Node KeyStore () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠX 5 0 9 Utilities . C ORD A _ CLIENT _ TLS Ġin Ġssl Ke yst ore Ġ&& ĠX 5 0 9 Utilities . C ORD A _ CLIENT _ CA Ġin Ġident ities Ke yst ore ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠKey Store Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Certificate Ġkey Ġstore Ġfound Ġbut Ġkey Ġstore Ġpassword Ġdoes Ġnot Ġmatch Ġconfiguration .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" IO Ġexception Ġwhile Ġtrying Ġto Ġvalidate Ġkeystore ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( contain Correct Keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Identity Ġcertificate Ġnot Ġfound . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Please Ġeither Ġcopy Ġyour Ġexisting Ġidentity Ġkey Ġand Ġcertificate Ġfrom Ġanother Ġnode , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" or Ġif Ġyou Ġdon 't Ġhave Ġone Ġyet , Ġfill Ġout Ġthe Ġconfig Ġfile Ġand Ġrun Ġc ord a . jar Ġ-- initial - registration . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Read Ġmore Ġat : Ġhttps :// docs . cord a . net / permission ing . html " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġall Ġcert Ġpath Ġchain Ġto Ġthe Ġtrusted Ġroot ĊĠĠĠĠĠĠĠ Ġval Ġssl Cert Chain Root Ġ= Ġconfiguration . load Ssl KeyStore (). get Certificate Chain ( X 5 0 9 Utilities . C ORD A _ CLIENT _ TLS ). last () ĊĠĠĠĠĠĠĠ Ġval Ġnode Ca Cert Chain Root Ġ= Ġconfiguration . load Node KeyStore (). get Certificate Chain ( X 5 0 9 Utilities . C ORD A _ CLIENT _ CA ). last () ĊĠĠĠĠĠĠĠ Ġval Ġtrust Root Ġ= Ġconfiguration . load Trust Store (). get Certificate ( X 5 0 9 Utilities . C ORD A _ ROOT _ CA ) ĊĊĠĠĠĠĠĠĠ Ġrequire ( ssl Cert Chain Root Ġ== Ġtrust Root ) Ġ{ Ġ" TLS Ġcertificate Ġmust Ġchain Ġto Ġthe Ġtrusted Ġroot ." Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( node Ca Cert Chain Root Ġ== Ġtrust Root ) Ġ{ Ġ" Client ĠCA Ġcertificate Ġmust Ġchain Ġto Ġthe Ġtrusted Ġroot ." Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠSpecific Ġclass Ġso Ġthat ĠMock Node Ġcan Ġcatch Ġit . ĊĠĠĠ Ġclass ĠDatabase ConfigurationException ( msg : ĠString ) Ġ: ĠC ord a Exception ( msg ) ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġinitialise Database Persistence ( schema Service : ĠSchema Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwell Known Party From X 5 0 0 Name : Ġ( C ord a X 5 0 0 Name ) Ġ-> ĠParty ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwell Known Party From Anonymous : Ġ( Abstract Party ) Ġ-> ĠParty ?): ĠC ord a Persistence Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprops Ġ= Ġconfiguration . dataSource Properties ĊĠĠĠĠĠĠĠ Ġif Ġ( props . isEmpty ) Ġthrow ĠDatabase ConfigurationException (" There Ġmust Ġbe Ġa Ġdatabase Ġconfigured .") ĊĠĠĠĠĠĠĠ Ġval Ġdatabase Ġ= Ġconfigure Database ( props , Ġconfiguration . database , Ġwell Known Party From X 5 0 0 Name , Ġwell Known Party From Anonymous , Ġschema Service ) ĊĠĠĠĠĠĠĠ Ġ// ĠNow Ġlog Ġthe Ġvendor Ġstring Ġas Ġthis Ġwill Ġalso Ġcause Ġa Ġconnection Ġto Ġbe Ġtested Ġeager ly . ĊĠĠĠĠĠĠĠ Ġlog Vendor String ( database , Ġlog ) ĊĠĠĠĠĠĠĠ Ġrun On Stop Ġ+= Ġdatabase :: close ĊĠĠĠĠĠĠĠ Ġreturn Ġdatabase ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmake Not ary Service ( token izable Services : ĠMutable List < Any >, Ġdatabase : ĠC ord a Persistence ): ĠNot ary Service ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconfiguration . not ary ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmake Core Not ary Service ( it , Ġdatabase ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken izable Services . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Stop Ġ+= Ġit :: stop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstall Core Flow ( Not ary Flow . Client :: class , Ġit :: create Service Flow ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Running Ġcore Ġnot ary : Ġ${ it . java Class . name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġcheck Network Map IsInitialized () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! services . network Map Cache . load DB Success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠThere Ġshould Ġbe Ġa Ġconsistent Ġapproach Ġto Ġconfiguration Ġerror Ġexceptions . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNetwork Map Cache Empty Exception () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġmake Key Management Service ( identity Service : ĠIdentity Service , Ġkey Pairs : ĠSet < KeyPair >, Ġdatabase : ĠC ord a Persistence ): ĠKey Management Service Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPersistent Key Management Service ( identity Service , Ġkey Pairs , Ġdatabase ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmake Core Not ary Service ( not ary Config : ĠNot ary Config , Ġdatabase : ĠC ord a Persistence ): ĠNot ary Service Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnot ary Key Ġ= Ġmy Not ary Identity ?. own ing Key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" No Ġnot ary Ġidentity Ġinitialized Ġwhen Ġcreating Ġa Ġnot ary Ġservice ") ĊĠĠĠĠĠĠĠ Ġreturn Ġnot ary Config . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġra ft Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuni queness Provider Ġ= ĠR aft Uni queness Provider ( configuration , Ġdatabase , Ġservices . clock , Ġservices . monitoring Service . metrics , Ġra ft ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( valid ating ) Ġ:: Raft Valid ating Not ary Service Ġelse Ġ:: Raft Non Valid ating Not ary Service )( services , Ġnot ary Key , Ġuni queness Provider ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb ft SM a Rt Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( valid ating ) Ġthrow ĠIllegalArgumentException (" Valid ating ĠB FT SM a Rt Ġnot ary Ġnot Ġsupported ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB FT Non Valid ating Not ary Service ( services , Ġnot ary Key , Ġb ft SM a Rt , Ġmake B FT Cluster ( not ary Key , Ġb ft SM a Rt )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ( if Ġ( valid ating ) Ġ:: Valid ating Not ary Service Ġelse Ġ:: Simple Not ary Service )( services , Ġnot ary Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġmake B FT Cluster ( not ary Key : ĠPublicKey , Ġb ft SM a Rt Config : ĠB FT SM a Rt Configuration ): ĠB FT SM a Rt . Cluster Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠB FT SM a Rt . Cluster Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġwait Until All Replicas Have Initialized () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" A ĠB FT Ġreplica Ġmay Ġstill Ġbe Ġinitializing , Ġin Ġwhich Ġcase Ġthe Ġupcoming Ġconsensus Ġchange Ġmay Ġcause Ġit Ġto Ġspin .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmake Identity Service ( identity Cert : ĠX 5 0 9 Certificate , Ġdatabase : ĠC ord a Persistence ): ĠPersistent Identity Service Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtrust Root Ġ= Ġconfiguration . load Trust Store (). get Certificate ( X 5 0 9 Utilities . C ORD A _ ROOT _ CA ) ĊĠĠĠĠĠĠĠ Ġval Ġnode Ca Ġ= Ġconfiguration . load Node KeyStore (). get Certificate ( X 5 0 9 Utilities . C ORD A _ CLIENT _ CA ) ĊĠĠĠĠĠĠĠ Ġreturn ĠPersistent Identity Service ( trust Root , Ġdatabase , ĠlistOf ( identity Cert , Ġnode Ca )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġmake Transaction Verifier Service (): ĠTransaction Verifier Service ĊĊĠĠĠ Ġopen Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠWe Ġneed Ġa Ġgood Ġway Ġof Ġhandling Ġ" nice Ġto Ġhave " Ġshutdown Ġevents , Ġespecially Ġthose Ġthat Ġdeal Ġwith Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġnetwork , Ġincluding Ġun sub scri bing Ġfrom Ġupdates Ġfrom Ġremote Ġservices . ĠPo ss ibly Ġsome Ġsort Ġof Ġparameter Ġto Ġstop () ĊĠĠĠĠĠĠĠ Ġ// Ġto Ġindicate Ġ" Please Ġshut Ġdown Ġgrace fully " Ġvs Ġ" Shut Ġdown Ġnow ". ĊĠĠĠĠĠĠĠ Ġ// ĠMean while , Ġwe Ġlet Ġthe Ġremote Ġservice Ġsend Ġus Ġupdates Ġuntil Ġthe Ġacknowled gment Ġbuffer Ġoverflow s Ġand Ġit ĊĠĠĠĠĠĠĠ Ġ// Ġun sub scri bes Ġus Ġfor c ibly , Ġrather Ġthan Ġblocking Ġthe Ġshutdown Ġprocess . ĊĊĠĠĠĠĠĠĠ Ġ// ĠRun Ġshutdown Ġhooks Ġin Ġopposite Ġorder Ġto Ġstarting ĊĠĠĠĠĠĠĠ Ġfor Ġ( to Run Ġin Ġrun On Stop . reversed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Run () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun On Stop . clear () ĊĠĠĠĠĠĠĠ Ġshutdown Executor . shutdown () ĊĠĠĠĠĠĠĠ Ġ_ started Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġmake Messaging Service ( database : ĠC ord a Persistence , Ġinfo : ĠNode Info , Ġnode Properties : ĠNode Properties Store , Ġnetwork Parameters : ĠNetwork Parameters ): ĠMessaging Service ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġstart Messaging Service ( rpc Ops : ĠRP CO ps ) ĊĊĠĠĠ Ġprivate Ġfun Ġobtain Identity ( not ary Config : ĠNot ary Config ?): ĠPair < Party And Certificate , ĠKey Pair > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Store Ġ= Ġconfiguration . load Node KeyStore () ĊĊĠĠĠĠĠĠĠ Ġval Ġ( id , Ġsingle Name ) Ġ= Ġif Ġ( not ary Config Ġ== Ġnull Ġ|| Ġ! not ary Config . is Cluster Config ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNode 's Ġmain Ġidentity Ġor Ġif Ġit 's Ġa Ġsingle Ġnode Ġnot ary ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Dev Identity Generator . NODE _ IDENTITY _ ALIAS _ PREFIX , Ġconfiguration . my Legal Name ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġnode Ġis Ġpart Ġof Ġa Ġdistributed Ġnot ary Ġwhose Ġidentity Ġmust Ġalready Ġbe Ġgenerated Ġbefore hand . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Dev Identity Generator . DISTRIB UT ED _ NOT ARY _ ALIAS _ PREFIX , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠIntegr ate Ġwith ĠKey Ġmanagement Ġservice ? ĊĠĠĠĠĠĠĠ Ġval ĠprivateKey Alias Ġ= Ġ"$ id - private - key " ĊĊĠĠĠĠĠĠĠ Ġif Ġ( privateKey Alias Ġ! in Ġkey Store ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Name Ġ?: Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unable Ġto Ġfind Ġin Ġthe Ġkey Ġstore Ġthe Ġidentity Ġof Ġthe Ġdistributed Ġnot ary Ġthe Ġnode Ġis Ġpart Ġof ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info ("$ privateKey Alias Ġnot Ġfound Ġin Ġkey Ġstore Ġ${ configuration . node Ke yst ore }, Ġgenerating Ġfresh Ġkey !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO ĠThis Ġcheck Ġshouldn 't Ġbe Ġneeded ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( single Name Ġ== Ġconfiguration . my Legal Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Store . store Legal Identity ( privateKey Alias , Ġgenerate KeyPair ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġ( x 5 0 9 Cert , Ġkey Pair ) Ġ= Ġkey Store . get Certificate And KeyPair ( privateKey Alias ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠUse Ġconfiguration Ġto Ġindicate Ġcomposite Ġkey Ġshould Ġbe Ġused Ġinstead Ġof Ġpublic Ġkey Ġfor Ġthe Ġidentity . ĊĠĠĠĠĠĠĠ Ġval Ġcomposite Key Alias Ġ= Ġ"$ id - composite - key " ĊĠĠĠĠĠĠĠ Ġval Ġcertificates Ġ= Ġif Ġ( composite Key Alias Ġin Ġkey Store ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUse Ġcomposite Ġkey Ġinstead Ġif Ġit Ġexists ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcertificate Ġ= Ġkey Store . get Certificate ( composite Key Alias ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġhave Ġto Ġcreate Ġthe Ġcertificate Ġchain Ġfor Ġthe Ġcomposite Ġkey Ġmanually , Ġthis Ġis Ġbecause Ġwe Ġdon 't Ġhave Ġa Ġkeystore ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġprovider Ġthat Ġunderstand Ġcomposite Key - privateKey Ġcombo . ĠThe Ġcert Ġchain Ġis Ġcreated Ġusing Ġthe Ġcomposite Ġkey Ġcertificate Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġtail Ġof Ġthe Ġprivate Ġkey Ġcertificates , Ġas Ġthey Ġare Ġboth Ġsigned Ġby Ġthe Ġsame Ġcertificate Ġchain . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( certificate ) Ġ+ Ġkey Store . get Certificate Chain ( privateKey Alias ). drop ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Store . get Certificate Chain ( privateKey Alias ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( it [ 0 ] Ġ== Ġx 5 0 9 Cert ) Ġ{ Ġ" Certificates Ġfrom Ġkey Ġstore Ġdo Ġnot Ġline Ġup !" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsubject Ġ= ĠC ord a X 5 0 0 Name . build ( certificates [ 0 ]. subject X 5 0 0 Principal ) ĊĠĠĠĠĠĠĠ Ġif Ġ( single Name Ġ!= Ġnull Ġ&& Ġsubject Ġ!= Ġsingle Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠConfiguration Exception (" The Ġname Ġ'$ single Name ' Ġfor Ġ$ id Ġdoesn 't Ġmatch Ġwhat 's Ġin Ġthe Ġkey Ġstore : Ġ$ subject ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( not ary Config Ġ!= Ġnull Ġ&& Ġnot ary Config . is Cluster Config Ġ&& Ġnot ary Config . service Legal Name Ġ!= Ġnull Ġ&& Ġsubject Ġ!= Ġnot ary Config . service Legal Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNote Ġthat Ġwe 're Ġnot Ġchecking Ġif Ġ` not ary Config . service Legal Name ` Ġis Ġnot Ġpresent Ġfor Ġbackwards Ġcompatibility . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠConfiguration Exception (" The Ġname Ġof Ġthe Ġnot ary Ġservice Ġ'${ not ary Config . service Legal Name }' Ġfor Ġ$ id Ġdoesn 't Ġmatch Ġwhat 's Ġin Ġthe Ġkey Ġstore : Ġ$ subject . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" You Ġmight Ġneed Ġto Ġadjust Ġthe Ġconfiguration Ġof Ġ` not ary . service Legal Name `. ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcert Path Ġ= ĠX 5 0 9 Utilities . build Cert Path ( certificates ) ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( Party And Certificate ( cert Path ), Ġkey Pair ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġgenerate KeyPair () Ġ= Ġcrypto Generate KeyPair () ĊĠĠĠ Ġprotected Ġopen Ġfun Ġmake Vault Service ( key Management Service : ĠKey Management Service , Ġservices : ĠServices For Resolution , Ġhi bernate Config : ĠHibernate Configuration , Ġdatabase : ĠC ord a Persistence ): ĠVault Service Internal Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠNode Vault Service ( platform Clock , Ġkey Management Service , Ġservices , Ġhi bernate Config , Ġdatabase ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠLoad Ġconfigured ĠJVM Ġagents Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinitialise JV MA g ents () Ġ{ ĊĠĠĠĠĠĠĠ Ġconfiguration . j mx Monitoring Http Port ?. let Ġ{ Ġport Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire NotNull ( Node Build Properties . JO LO K IA _ AGENT _ VERSION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"' jo lok ia Agent Version ' Ġmissing Ġfrom Ġbuild Ġproperties " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Starting ĠJo lok ia Ġagent Ġon ĠHTTP Ġport : Ġ$ port ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlib Dir Ġ= ĠPaths . get ( configuration . base Directory . toString (), Ġ" drivers ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjar FilePath Ġ= ĠJ V MA gent Registry . resolve Agent Jar ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" jo lok ia - jvm -${ Node Build Properties . JO LO K IA _ AGENT _ VERSION }- agent . jar ", Ġlib Dir ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠError (" Unable Ġto Ġlocate Ġagent Ġjar Ġfile ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Agent Ġjar Ġfile : Ġ$ jar FilePath ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJ V MA gent Registry . attach (" jo lok ia ", Ġ" port =$ port ", Ġjar FilePath ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠService Hub Internal Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġidentity Service : ĠIdentity Service , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPlace Ġthe Ġlong Ġterm Ġidentity Ġkey Ġin Ġthe ĠK MS . ĠEvent ually , Ġthis Ġis Ġlikely Ġgoing Ġto Ġbe Ġseparated Ġagain Ġbecause ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe ĠK MS Ġis Ġmeant Ġfor Ġderived Ġtemporary Ġkeys Ġused Ġin Ġtransactions , Ġand Ġwe 're Ġnot Ġsupposed Ġto Ġsign Ġthings Ġwith ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġidentity Ġkey . ĠBut Ġthe Ġinfrastructure Ġto Ġmake Ġthat Ġeasy Ġisn 't Ġhere Ġyet . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġkey Management Service : ĠKey Management Service , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġschema Service : ĠSchema Service , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġvalidated Transactions : ĠWrit able Transaction Storage , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġmonitoring Service : ĠMonitoring Service , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġc ord app Provider : ĠC ord app Provider Internal , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġdatabase : ĠC ord a Persistence , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġmy Info : ĠNode Info , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġnetwork Map Cache : ĠNetwork Map Cache Internal , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġnode Properties : ĠNode Properties Store , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġnetwork Parameters : ĠNetwork Parameters , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġservices For Resolution : ĠServices For Resolution ĊĠĠĠ Ġ) Ġ: ĠSingleton Serialize As Token (), ĠService Hub Internal , ĠServices For Resolution Ġby Ġservices For Resolution Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġrpc Flows Ġ= ĠArrayList < Class < out ĠFlow Logic <* >> >() ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġstate Machine Re corded Transaction Mapping Ġ= ĠDB Transaction Mapping Storage ( database ) ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġaudit Service Ġ= ĠDummy Audit Service () ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġtransaction Verifier Service Ġby Ġlazy Ġ{ Ġmake Transaction Verifier Service () Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġvault Service Ġby Ġlazy Ġ{ Ġmake Vault Service ( key Management Service , Ġservices For Resolution , Ġdatabase . hibernate Config , Ġdatabase ) Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġcontract Upgrade Service Ġby Ġlazy Ġ{ ĠContract Upgrade ServiceImpl () Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġattachments : ĠAttachment Storage Ġget () Ġ= Ġthis @ Abstract Node . attachments ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġnetwork Service : ĠMessaging Service Ġget () Ġ= Ġnetwork ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġclock : ĠClock Ġget () Ġ= Ġplatform Clock ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġconfiguration : ĠNode Configuration Ġget () Ġ= Ġthis @ Abstract Node . configuration ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġnetwork Map Updater : ĠNetwork Map Updater Ġget () Ġ= Ġthis @ Abstract Node . network Map Updater ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠSerialize As Token > Ġc ord a Service ( type : ĠClass < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( type . is Annotation Present ( C ord a Service :: class . java )) Ġ{ Ġ"${ type . name } Ġis Ġnot Ġa ĠC ord a Ġservice " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġc ord app Services . getInstance ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" C ord a Ġservice Ġ${ type . name } Ġdoes Ġnot Ġexist ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Flow Factory ( initi ating Flow Class : ĠClass < out ĠFlow Logic <* >> ): ĠInit i ated Flow Factory < *> ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġflow Factories [ initi ating Flow Class ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġjdbc Session (): ĠConnection Ġ= Ġdatabase . create Session () ĊĊĠĠĠĠĠĠĠ Ġ// Ġallows Ġservices Ġto Ġregister Ġhandlers Ġto Ġbe Ġin formed Ġwhen Ġthe Ġnode Ġstop Ġmethod Ġis Ġcalled ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġregister Unload Handler ( run On Stop : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Abstract Node . run On Stop Ġ+= Ġrun On Stop ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Visible ForTesting Ċ internal Ġfun Ġlog Vendor String ( database : ĠC ord a Persistence , Ġlog : ĠLogger ) Ġ{ ĊĠĠĠ Ġdatabase . transaction Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" Connected Ġto Ġ${ connection . metaData . database ProductName } Ġdatabase .") ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠFlow Starter Impl ( private Ġval Ġs mm : ĠState Machine Manager , Ġprivate Ġval Ġflow Logic Ref Factory : ĠFlow Logic Ref Factory ) Ġ: ĠFlow Starter Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġstart Flow ( event : ĠExternal Event . External Start Flow Event < T >): ĠC ord a Future < Flow StateMachine < T >> Ġ{ ĊĠĠĠĠĠĠĠ Ġs mm . deliver External Event ( event ) ĊĠĠĠĠĠĠĠ Ġreturn Ġevent . future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġstart Flow ( logic : ĠFlow Logic < T >, Ġcontext : ĠInvocation Context ): ĠC ord a Future < Flow StateMachine < T >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Flow Event Ġ= Ġobject Ġ: ĠExternal Event . External Start Flow Event < T >, ĠD ed up lication Handler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinside Database Transaction () Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter Database Transaction () Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġexternal Cause : ĠExternal Event ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġde dup lication Handler : ĠD ed up lication Handler ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġflow Logic : ĠFlow Logic < T > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġlogic ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġcontext : ĠInvocation Context ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġcontext ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġwire Up Future ( flow Future : ĠC ord a Future < Flow StateMachine < T >>) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ future . capture Later ( flow Future ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġ_ future Ġ= Ġopen Future < Flow StateMachine < T >>() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġfuture : ĠC ord a Future < Flow StateMachine < T >> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ future ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġstart Flow ( start Flow Event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġinvoke Flow Async ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogic Type : ĠClass < out ĠFlow Logic < T >>, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠInvocation Context , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar arg Ġargs : ĠAny ?): ĠC ord a Future < Flow StateMachine < T >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlogic Ref Ġ= Ġflow Logic Ref Factory . create For RPC ( logic Type , Ġ* args ) ĊĠĠĠĠĠĠĠ Ġval Ġlogic : ĠFlow Logic < T > Ġ= Ġunchecked Cast ( flow Logic Ref Factory . to Flow Logic ( logic Ref )) ĊĠĠĠĠĠĠĠ Ġreturn Ġstart Flow ( logic , Ġcontext ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠConfiguration Exception ( message : ĠString ) Ġ: ĠC ord a Exception ( message ) Ċ Ċ /** Ċ Ġ* ĠThrow n Ġwhen Ġa Ġnode Ġis Ġabout Ġto Ġstart Ġand Ġits Ġnetwork Ġmap Ġcache Ġdoesn 't Ġcontain Ġany Ġnode . Ċ Ġ*/ Ċ internal Ġclass ĠNetwork Map Cache Empty Exception Ġ: ĠException () Ċ Ċ /** Ċ Ġ* ĠCreates Ġthe Ġconnection Ġpool Ġto Ġthe Ġdatabase . Ċ Ġ* Ċ Ġ*@ throws Ġ[ Could Not Create DataSource Exception ] Ċ Ġ*/ Ċ fun Ġconfigure Database ( hikari Properties : ĠProperties , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase Config : ĠDatabase Config , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwell Known Party From X 5 0 0 Name : Ġ( C ord a X 5 0 0 Name ) Ġ-> ĠParty ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwell Known Party From Anonymous : Ġ( Abstract Party ) Ġ-> ĠParty ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġschema Service : ĠSchema Service Ġ= ĠNode Schema Service ()): ĠC ord a Persistence Ġ{ ĊĠĠĠ Ġ// ĠRegister Ġthe ĠAbstract Party Descriptor Ġso ĠHibernate Ġdoesn 't Ġwarn Ġwhen Ġencounter ing ĠAbstract Party . ĠUnfortunately ĊĠĠĠ Ġ// ĠHibernate Ġwar ns Ġabout Ġnot Ġbeing Ġable Ġto Ġfind Ġa Ġdescriptor Ġif Ġwe Ġdon 't Ġprovide Ġone , Ġbut Ġwon 't Ġuse Ġit Ġby Ġdefault ĊĠĠĠ Ġ// Ġso Ġwe Ġend Ġup Ġproviding Ġboth Ġdescriptor Ġand Ġconverter . ĠWe Ġshould Ġre - exam ine Ġthis Ġin Ġlater Ġversions Ġto Ġsee Ġif ĊĠĠĠ Ġ// Ġeither ĠHibernate Ġcan Ġbe Ġconv inc ed Ġto Ġstop Ġwarning , Ġuse Ġthe Ġdescriptor Ġby Ġdefault , Ġor Ġsomething Ġelse . ĊĠĠĠ ĠJava TypeDescriptor Registry . INSTANCE . add Descriptor ( Abstract Party Descriptor ( well Known Party From X 5 0 0 Name , Ġwell Known Party From Anonymous )) ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠdataSource Ġ= ĠDataSource Factory . create DataSource ( hikari Properties ) ĊĠĠĠĠĠĠĠ Ġval Ġattribute Converters Ġ= ĠlistOf ( Abstract Party To X 5 0 0 Name AsString Converter ( well Known Party From X 5 0 0 Name , Ġwell Known Party From Anonymous )) ĊĠĠĠĠĠĠĠ Ġreturn ĠC ord a Persistence ( dataSource , Ġdatabase Config , Ġschema Service . schema Options . keys , Ġattribute Converters ) ĊĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex Ġis ĠH ikari Pool . Pool Initialization Exception Ġ-> Ġthrow ĠCould Not Create DataSource Exception (" Could Ġnot Ġconnect Ġto Ġthe Ġdatabase . ĠPlease Ġcheck Ġyour ĠJDBC Ġconnection ĠURL , Ġor Ġthe Ġconnectivity Ġto Ġthe Ġdatabase .", Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex . cause Ġis ĠClass NotFoundException Ġ-> Ġthrow ĠCould Not Create DataSource Exception (" Could Ġnot Ġfind Ġthe Ġdatabase Ġdriver Ġclass . ĠPlease Ġadd Ġit Ġto Ġthe Ġ' drivers ' Ġfolder . ĠSee : Ġhttps :// docs . cord a . net / cord a - configuration - file . html ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠCould Not Create DataSource Exception (" Could Ġnot Ġcreate Ġthe ĠDataSource : Ġ${ ex . message }", Ġex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ