package Ġnet . cord a . node . services . state machine Ċ Ċ import Ġnet . cord a . core . crypto . new Secure Random Ċ import Ġnet . cord a . core . flows . Flow Exception Ċ import Ġnet . cord a . core . flows . Ho spital ize Flow Exception Ċ import Ġnet . cord a . core . flows . Not ary Error Ċ import Ġnet . cord a . core . flows . Not ary Exception Ċ import Ġnet . cord a . core . flows . Receive Final ity Flow Ċ import Ġnet . cord a . core . flows . Receive Transaction Flow Ċ import Ġnet . cord a . core . flows . StateMachine Run Id Ċ import Ġnet . cord a . core . flows . Unexpected Flow End Exception Ċ import Ġnet . cord a . core . identity . Party Ċ import Ġnet . cord a . core . internal . Declared Field Ċ import Ġnet . cord a . core . internal . Thread Box Ċ import Ġnet . cord a . core . internal . Timed Flow Ċ import Ġnet . cord a . core . internal . Visible ForTesting Ċ import Ġnet . cord a . core . internal . buffer Until Sub scribed Ċ import Ġnet . cord a . core . messaging . Data Feed Ċ import Ġnet . cord a . core . utilities . context Logger Ċ import Ġnet . cord a . core . utilities . debug Ċ import Ġnet . cord a . core . utilities . minutes Ċ import Ġnet . cord a . core . utilities . seconds Ċ import Ġnet . cord a . node . services . Final ity Handler Ċ import Ġorg . hibernate . exception . Constraint Violation Exception Ċ import Ġrx . subjects . Publish Subject Ċ import Ġjava . io . Closeable Ċ import Ġjava . sql . SQLException Ċ import Ġjava . sql . SQL Transient Connection Exception Ċ import Ġjava . time . Clock Ċ import Ġjava . time . Duration Ċ import Ġjava . time . Instant Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġjavax . persistence . Persistence Exception Ċ import Ġkotlin . concurrent . timer Task Ċ import Ġkotlin . math . pow Ċ Ċ /** Ċ Ġ* ĠThis Ġhospital Ġconsult s Ġ" staff " Ġto Ġsee Ġif Ġthey Ġcan Ġautomatically Ġdiag nose Ġand Ġtreat Ġflows . Ċ Ġ*/ Ċ class ĠStaff ed Flow Ho spital ( private Ġval Ġflow Messaging : ĠFlow Messaging , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġclock : ĠClock , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġour Sender UUID : ĠString ) Ġ: ĠClose able Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġ= Ġcontext Logger () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġstaff Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDead lock N ur se , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDuplicate Insert Special ist , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDoctor Timeout , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFinal ity Doctor , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTrans ient Connection Card io log ist , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase En doc r ino log ist , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTransition Error General Pract itioner , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSed ation N ur se , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNot ary Doctor ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠĠĠĠĠ Ġval Ġon Flow Ke pt For Over night Observation Ġ= Ġmutable ListOf <( id : ĠState Machine Run Id , Ġby : ĠList < String >) Ġ-> ĠUnit >() ĊĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠĠĠĠĠ Ġval Ġon Flow Dis char ged Ġ= Ġmutable ListOf <( id : ĠState Machine Run Id , Ġby : ĠList < String >) Ġ-> ĠUnit >() ĊĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠĠĠĠĠ Ġval Ġon Flow Ad mitted Ġ= Ġmutable ListOf <( id : ĠState Machine Run Id ) Ġ-> ĠUnit >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġhospital Job Timer Ġ= ĠTimer (" Flow Ho spital Job Timer ", Ġtrue ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRegister Ġa Ġtask Ġto Ġlog Ġ( at Ġintervals ) Ġflows Ġthat Ġare Ġkept Ġin Ġhospital Ġfor Ġover night Ġobservation . ĊĠĠĠĠĠĠĠ Ġhospital Job Timer . schedule At Fixed Rate ( timer Task Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutex . locked Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flows In Ho spital . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġpatients Ġwhose Ġlast Ġrecord Ġin Ġtheir Ġmedical Ġrecords Ġis ĠOut come . OVER N IGHT _ OB SERV ATION . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpatients Under Over night Observation Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflows In Ho spital . filter Ġ{ Ġflow Pat ients [ it . key ]?. records ?. last ()?. outcome Ġ== ĠOut come . OVER N IGHT _ OB SERV ATION Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pat ients Under Over night Observation . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" There Ġare Ġ${ pat ients Under Over night Observation . count ()} Ġflows Ġkept Ġfor Ġover night Ġobservation . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Affected Ġflow Ġids : Ġ${ pat ients Under Over night Observation . map Ġ{ Ġit . key . uuid . toString () Ġ}. join ToString () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( t reat able Session In its . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" There Ġare Ġ${ t reat able Session In its . count ()} Ġerr one ous Ġsession Ġiniti ations Ġkept Ġfor Ġover night Ġobservation . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Err one ous Ġsession Ġinit iation Ġids : Ġ${ t reat able Session In its . map Ġ{ Ġit . key . toString () Ġ}. join ToString () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġ 1 . minutes . to Millis (), Ġ 1 . minutes . to Millis ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRepresents Ġthe Ġflows Ġthat Ġhave Ġbeen Ġad mitted Ġto Ġthe Ġhospital Ġfor Ġtreatment . ĊĠĠĠĠ Ġ* ĠFlow s Ġshould Ġbe Ġremoved Ġfrom Ġ[ flows In Ho spital ] Ġwhen Ġthey Ġhave Ġcompleted Ġa Ġsuccessful Ġtransition . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġflows In Ho spital Ġ= ĠConcurrent HashMap < StateMachine Run Id , ĠFlow Fi ber >() ĊĊĠĠĠ Ġprivate Ġval Ġmutex Ġ= ĠThread Box ( object Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠContains Ġmedical Ġhistory Ġof Ġevery Ġflow Ġ( a Ġpatient ) Ġthat Ġhas Ġentered Ġthe Ġhospital . ĠA Ġflow Ġcan Ġleave Ġthe Ġhospital , ĊĠĠĠĠĠĠĠĠ Ġ* Ġbut Ġtheir Ġmedical Ġhistory Ġwill Ġbe Ġretained . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠFlow s Ġshould Ġbe Ġremoved Ġfrom Ġ[ flow Pat ients ] Ġwhen Ġthey Ġhave Ġcompleted Ġsuccessfully . ĠUp on Ġsuccessful Ġcompletion , ĊĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġmedical Ġhistory Ġof Ġa Ġflow Ġis Ġno Ġlonger Ġrelevant Ġas Ġthat Ġflow Ġhas Ġbeen Ġcompletely Ġremoved Ġfrom Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* Ġstate machine . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġflow Pat ients Ġ= ĠHashMap < StateMachine Run Id , ĠFlow Medical History >() ĊĠĠĠĠĠĠĠ Ġval Ġtreat able Session In its Ġ= ĠHashMap < StateMachine Run Id , ĠInternal Session Init Record >() ĊĠĠĠĠĠĠĠ Ġval Ġrecords Publisher Ġ= ĠPublish Subject . create < Medical Record >() ĊĠĠĠ Ġ}) ĊĠĠĠ Ġprivate Ġval Ġsecure Random Ġ= Ġnew Secure Random () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġnode Ġwas Ġunable Ġto Ġinitiate Ġthe Ġ[ Initial Session Message ] Ġfrom Ġ[ sender ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsession Init Er rored ( session Message : ĠInitial Session Message , Ġsender : ĠParty , Ġevent : ĠExternal Event . External Message Event , Ġerror : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġevent . flow Id ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġclock . instant () ĊĠĠĠĠĠĠĠ Ġval Ġoutcome Ġ= Ġif Ġ( error Ġis ĠSession Reject Exception . Unknown Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġprobably Ġdon 't Ġhave Ġthe ĠCor D app Ġinstalled Ġso Ġlet 's Ġpause Ġthe Ġmessage Ġin Ġthe Ġhop es Ġthat Ġthe ĠCor D app Ġis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinstalled Ġon Ġrestart , Ġat Ġwhich Ġpoint Ġthe Ġmessage Ġwill Ġbe Ġable Ġproceed Ġas Ġnormal . ĠIf Ġnot Ġthen Ġit Ġwill Ġneed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġbe Ġdropped Ġmanually . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOut come . OVER N IGHT _ OB SERV ATION ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOut come . UNT RE AT ABLE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrecord Ġ= Ġsession Message . run Ġ{ ĠMedical Record . Session Init ( id , Ġtime , Ġoutcome , Ġinit iator Flow ClassName , Ġflow Version , ĠappName , Ġsender , Ġerror ) Ġ} ĊĠĠĠĠĠĠĠ Ġmutex . locked Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( outcome Ġ!= ĠOut come . UNT RE AT ABLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtreat able Session In its [ id ] Ġ= ĠInternal Session Init Record ( session Message , Ġevent , Ġrecord ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn ("$ sender Ġhas Ġsent Ġa Ġflow Ġrequest Ġfor Ġan Ġunknown Ġflow Ġ${ session Message . init iator Flow ClassName }. ĠInstall Ġthe Ġmissing Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cor D app Ġthis Ġflow Ġbelongs Ġto Ġand Ġrestart .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" If Ġyou Ġknow Ġit 's Ġsafe Ġto Ġignore Ġthis Ġflow Ġrequest Ġthen Ġit Ġcan Ġbe Ġdeleted Ġper manently Ġusing Ġthe Ġkill Flow ĠRPC Ġand Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" the ĠUUID Ġ$ id Ġ( from Ġthe Ġnode Ġshell Ġyou Ġcan Ġrun Ġ' flow Ġkill Ġ$ id '). ĠBE ĠV ERY ĠCA UT IOUS ĠOF ĠTHIS ĠSE COND ĠAP PRO ACH ĠAS ĠTHE Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" REQUEST ĠMAY ĠCON TAIN ĠA ĠNOT ARI SED ĠTRAN SACTION ĠTH AT ĠNE ED S ĠTO ĠBE ĠRE COR DED ĠIN ĠYOUR ĠVA ULT .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecords Publisher . onNext ( record ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( outcome Ġ== ĠOut come . UNT RE AT ABLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Back Error ( error , Ġsession Message , Ġsender , Ġevent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Back Error ( error : ĠThrowable , Ġsession Message : ĠInitial Session Message , Ġsender : ĠParty , Ġevent : ĠExternal Event . External Message Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġ( error Ġas ? ĠSession Reject Exception )?. message Ġ?: Ġ" Unable Ġto Ġestablish Ġsession " ĊĠĠĠĠĠĠĠ Ġval Ġpayload Ġ= ĠReject Session Message ( message , Ġsecure Random . next Long ()) ĊĠĠĠĠĠĠĠ Ġval Ġreply Error Ġ= ĠExisting Session Message ( session Message . init iator SessionId , Ġpayload ) ĊĊĠĠĠĠĠĠĠ Ġlog . info (" Sending Ġsession Ġinit iation Ġerror Ġback Ġto Ġ$ sender ", Ġerror ) ĊĊĠĠĠĠĠĠĠ Ġflow Messaging . send Session Message ( sender , Ġreply Error , ĠSender Ded up lication Id ( Ded up lication Id . create Random ( secure Random ), Ġour Sender UUID )) ĊĠĠĠĠĠĠĠ Ġevent . ded up lication Handler . after Database Transaction () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDrop Ġthe Ġerro red Ġsession - init Ġmessage Ġwith Ġthe Ġgiven ĠID Ġ([ Medical Record . Session Init . id ]). ĠThis Ġwill Ġcause Ġthe Ġnode ĊĠĠĠĠ Ġ* Ġto Ġsend Ġback Ġthe Ġrelevant Ġsession Ġerror Ġto Ġthe Ġinit iator Ġparty Ġand Ġacknowledge Ġits Ġreceipt Ġfrom Ġthe Ġmessage Ġbroker ĊĠĠĠĠ Ġ* Ġso Ġthat Ġit Ġnever Ġgets Ġre deliver ed . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdrop Session Init ( id : ĠState Machine Run Id ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( session Message , Ġevent , Ġpublic Record ) Ġ= Ġmutex . locked Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtreat able Session In its . remove ( id ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog . info (" Er rored Ġsession - init Ġper manently Ġdropped : Ġ$ public Record ") ĊĠĠĠĠĠĠĠ Ġsend Back Error ( public Record . error , Ġsession Message , Ġpublic Record . sender , Ġevent ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFor ces Ġthe Ġflow Ġto Ġbe Ġkept Ġin Ġfor Ġover night Ġobservation Ġby Ġthe Ġhospital . ĠA Ġflow Ġmust Ġalready Ġexist Ġinside Ġthe Ġhospital ĊĠĠĠĠ Ġ* Ġand Ġhave Ġexisting Ġmedical Ġrecords Ġfor Ġit Ġto Ġbe Ġmoved Ġto Ġover night Ġobservation . ĠIf Ġit Ġdoes Ġnot Ġmeet Ġthese Ġcriteria Ġthen ĊĠĠĠĠ Ġ* Ġan Ġ[ IllegalArgumentException ] Ġwill Ġbe Ġthrown . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġid ĠThe Ġ[ StateMachine Run Id ] Ġof Ġthe Ġflow Ġthat Ġyou Ġare Ġtrying Ġto Ġforce Ġinto Ġobservation ĊĠĠĠĠ Ġ* Ġ@ param Ġerrors ĠThe Ġerrors Ġto Ġinclude Ġin Ġthe Ġnew Ġmedical Ġrecord ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġforce Into Over night Observation ( id : ĠState Machine Run Id , Ġerrors : ĠList < Throwable >) Ġ{ ĊĠĠĠĠĠĠĠ Ġmutex . locked Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġa Ġflow Ġdoes Ġnot Ġmeet Ġthe Ġcriteria Ġbelow , Ġthen Ġit Ġhas Ġmoved Ġinto Ġan Ġinvalid Ġstate Ġor Ġthe Ġfunction Ġis Ġbeing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcalled Ġfrom Ġan Ġincorrect Ġlocation . ĠThe Ġassertions Ġbelow Ġshould Ġerror Ġout Ġthe Ġflow Ġif Ġthey Ġare Ġnot Ġtrue . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire NotNull ( flows In Ho spital [ id ]) Ġ{ Ġ" Flow Ġmust Ġalready Ġbe Ġin Ġthe Ġhospital Ġbefore Ġforcing Ġinto Ġover night Ġobservation " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhistory Ġ= Ġrequire NotNull ( flow Pat ients [ id ]) Ġ{ Ġ" Flow Ġmust Ġalready Ġhave Ġhistory Ġbefore Ġforcing Ġinto Ġover night Ġobservation " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUse Ġthe Ġlast Ġstaff Ġmember Ġthat Ġlast Ġdis char ged Ġthe Ġflow Ġas Ġthe Ġcurrent Ġstaff Ġmember ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecord Ġ= Ġhistory . records . last (). copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ= Ġclock . instant (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerrors Ġ= Ġerrors , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutcome Ġ= ĠOut come . OVER N IGHT _ OB SERV ATION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Flow Ke pt For Over night Observation . forEach Ġ{ Ġhook Ġ-> Ġhook . invoke ( id , Ġrecord . by . map Ġ{ Ġit . toString () Ġ}) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhistory . records Ġ+= Ġrecord ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecords Publisher . onNext ( record ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequest Ġtreatment Ġfor Ġthe Ġ[ flow Fi ber ]. ĠA Ġflow Ġcan Ġonly Ġbe Ġadded Ġto Ġthe Ġhospital Ġif Ġthey Ġare Ġnot Ġalready Ġbeing ĊĠĠĠĠ Ġ* Ġtreated . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrequest T reatment ( flow Fi ber : ĠFlow Fi ber , Ġcurrent State : ĠState Machine State , Ġerrors : ĠList < Throwable >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠOnly Ġtreat Ġflows Ġthat Ġare Ġnot Ġalready Ġin Ġthe Ġhospital ĊĠĠĠĠĠĠĠ Ġif Ġ(! currentState . is Removed Ġ&& Ġflows In Ho spital . put If Absent ( flow Fi ber . id , Ġflow Fi ber ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadmit ( flow Fi ber , Ġcurrent State , Ġerrors ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Complex Method ") ĊĠĠĠ Ġprivate Ġfun Ġadmit ( flow Fi ber : ĠFlow Fi ber , Ġcurrent State : ĠState Machine State , Ġerrors : ĠList < Throwable >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġclock . instant () ĊĠĠĠĠĠĠĠ Ġlog . info (" Flow Ġ${ flow Fi ber . id } Ġad mitted Ġto Ġhospital Ġin Ġstate Ġ$ currentState ") ĊĠĠĠĠĠĠĠ Ġon Flow Ad mitted . forEach Ġ{ Ġit . invoke ( flow Fi ber . id ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġ( event , Ġback Off For Ch ron ic Condition ) Ġ= Ġmutex . locked Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmedical History Ġ= Ġflow Pat ients . compute If Absent ( flow Fi ber . id ) Ġ{ ĠFlow Medical History () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreport Ġ= Ġconsult Staff ( flow Fi ber , Ġcurrent State , Ġerrors , Ġmedical History ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( outcome , Ġevent , Ġback Off For Ch ron ic Condition ) Ġ= Ġwhen Ġ( report . di agnosis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDi agnosis . DIS CHAR GE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġback Off Ġ= Ġcalculate Back Off For Ch ron ic Condition ( report , Ġmedical History , Ġcurrent State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Flow Ġerror Ġdis char ged Ġfrom Ġhospital Ġ( delay Ġ${ back Off . seconds } s ) Ġby Ġ${ report . by } Ġ( error Ġwas Ġ${ report . error . message }) ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Flow Dis char ged . forEach Ġ{ Ġhook Ġ-> Ġhook . invoke ( flow Fi ber . id , Ġreport . by . map { it . toString () }) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTrip le ( Outcome . DIS CHAR GE , ĠEvent . Retry Flow From Safe Point , Ġback Off ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDi agnosis . OVER N IGHT _ OB SERV ATION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Flow Ġerror Ġkept Ġfor Ġover night Ġobservation Ġby Ġ${ report . by } Ġ( error Ġwas Ġ${ report . error . message }) ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġdon 't Ġschedule Ġa Ġnext Ġevent Ġfor Ġthe Ġflow Ġ- Ġit Ġwill Ġautomatically Ġretry Ġfrom Ġits Ġcheckpoint Ġon Ġnode Ġrestart ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Flow Ke pt For Over night Observation . forEach Ġ{ Ġhook Ġ-> Ġhook . invoke ( flow Fi ber . id , Ġreport . by . map { it . toString () }) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTrip le ( Outcome . OVER N IGHT _ OB SERV ATION , ĠEvent . Over night Observation , Ġ 0 . seconds ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDi agnosis . NOT _ MY _ SPECIAL TY , ĠDi agnosis . TERMIN AL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNone Ġof Ġthe Ġstaff Ġcare Ġfor Ġthese Ġerrors , Ġor Ġsomeone Ġdecided Ġit Ġis Ġa Ġterminal Ġcondition , Ġso Ġwe Ġlet Ġthem Ġpropagate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Flow Ġerror Ġallowed Ġto Ġpropagate ", Ġreport . error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTrip le ( Outcome . UNT RE AT ABLE , ĠEvent . Start Error Propagation , Ġ 0 . seconds ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnumberOf Sus p ends Ġ= Ġcurrent State . checkpoint . checkpoint State . numberOf Sus p ends ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecord Ġ= ĠMedical Record . Flow ( time , Ġflow Fi ber . id , ĠnumberOf Sus p ends , Ġerrors , Ġreport . by , Ġoutcome ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedical History . records Ġ+= Ġrecord ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecords Publisher . onNext ( record ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( event , Ġback Off For Ch ron ic Condition ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( back Off For Ch ron ic Condition . is Zero ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflow Fi ber . schedule Event ( event ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhospital Job Timer . schedule ( timer Task Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Fi ber . schedule Event ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġback Off For Ch ron ic Condition . to Millis ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Back Off For Ch ron ic Condition ( report : ĠConsult ation Report , Ġmedical History : ĠFlow Medical History , Ġcurrent State : ĠState Machine State ): ĠDuration Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreport . by . first OrNull Ġ{ Ġit Ġis ĠCh ron ic Ġ} ?. let Ġ{ Ġch ron ic Staff Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmedical History . times Dis char ged For The Same Thing ( chron ic Staff , Ġcurrent State ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . seconds ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Of ( 1 0 , Ġ( 1 0 Ġ+ Ġ( Math . random ()) Ġ* Ġ( 1 0 Ġ* Ġ 1 . 5 . pow ( it )) Ġ/ Ġ 2 ). toInt ()). seconds ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġ 0 . seconds ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconsult Staff ( flow Fi ber : ĠFlow Fi ber , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent State : ĠState Machine State , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerrors : ĠList < Throwable >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedical History : ĠFlow Medical History ): ĠConsult ation Report Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġerrors ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Indexed Ġ{ Ġindex , Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠR ely Ġon Ġthe Ġlogging Ġcontext Ġto Ġprint Ġdetails Ġof Ġthe Ġflow ĠID . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Error Ġ${ index Ġ+ Ġ 1 } Ġof Ġ${ errors . size } :", Ġerror ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdiag no ses : ĠMap < Di agnosis , ĠList < Staff >> Ġ= Ġstaff . groupBy Ġ{ Ġit . consult ( flow Fi ber , Ġcurrent State , Ġerror , Ġmedical History ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe 're Ġonly Ġinterested Ġin Ġthe Ġhighest Ġpriority Ġdi agnosis Ġfor Ġthe Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( di agnosis , Ġby ) Ġ= Ġdiag no ses . entries . min By Ġ{ Ġit . key Ġ} !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConsult ation Report ( error , Ġdi agnosis , Ġby ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAnd Ġwe 're Ġonly Ġinterested Ġin Ġthe Ġerror Ġwith Ġthe Ġhighest Ġpriority Ġdi agnosis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. min By Ġ{ Ġit . di agnosis Ġ} !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠConsult ation Report ( val Ġerror : ĠThrowable , Ġval Ġdi agnosis : ĠDi agnosis , Ġval Ġby : ĠList < Staff >) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġthe Ġflow 's Ġmedical Ġhistory Ġfrom Ġthe Ġhospital . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove Medical History ( flow Id : ĠState Machine Run Id ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmutex . locked Ġ{ Ġflow Pat ients . remove ( flow Id ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġthe Ġflow Ġfrom Ġthe Ġhospital Ġas Ġit Ġis Ġnot Ġcurrently Ġbeing Ġtreated . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġleave ( id : ĠState Machine Run Id ) Ġ{ ĊĠĠĠĠĠĠĠ Ġflows In Ho spital . remove ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO ĠMedical Record Ġsub types Ġcan Ġexpose Ġthe ĠStaff Ġclass , Ġsomething Ġwhich Ġwe Ġprobably Ġdon 't Ġwant Ġwhen Ġw iring Ġthis Ġmethod Ġto ĠRPC ĊĠĠĠ Ġ/** ĠReturns Ġa Ġstream Ġof Ġmedical Ġrecords Ġas Ġflows Ġpass Ġthrough Ġthe Ġhospital . Ġ*/ ĊĠĠĠ Ġfun Ġtrack (): ĠData Feed < List < Medical Record >, ĠMedical Record > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmutex . locked Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsnapshot Ġ= Ġ( flow Pat ients . values . flatMap Ġ{ Ġit . records Ġ} Ġ+ Ġtreat able Session In its . values . map Ġ{ Ġit . public Record Ġ}). sorted By Ġ{ Ġit . time Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData Feed ( snapshot , Ġrecords Publisher . buffer Until Sub scribed ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġcontains ( flow Id : ĠState Machine Run Id ) Ġ= Ġmutex . locked Ġ{ Ġflow Id Ġin Ġflow Pat ients Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġhospital Job Timer . cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠFlow Medical History Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġrecords : ĠMutable List < Medical Record . Flow > Ġ= Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠ Ġfun Ġnot Dis char ged For The Same Thing More Than ( max : ĠInt , Ġby : ĠStaff , Ġcurrent State : ĠState Machine State ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtimes Dis char ged For The Same Thing ( by , Ġcurrent State ) Ġ<= Ġmax ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġtimes Dis char ged For The Same Thing ( by : ĠStaff , Ġcurrent State : ĠState Machine State ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Ad mitt ance Suspend Count Ġ= Ġcurrent State . checkpoint . checkpoint State . numberOf Sus p ends ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrecords . count Ġ{ Ġit . outcome Ġ== ĠOut come . DIS CHAR GE Ġ&& Ġby Ġin Ġit . by Ġ&& Ġit . suspend Count Ġ== Ġlast Ad mitt ance Suspend Count Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ"${ this . java Class . simple Name }( records Ġ= Ġ$ records )" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠInternal Session Init Record ( val Ġsession Message : ĠInitial Session Message , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent : ĠExternal Event . External Message Event , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpublic Record : ĠMedical Record . Session Init ) ĊĊĠĠĠ Ġsealed Ġclass ĠMedical Record Ġ{ ĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġtime : ĠInstant ĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġoutcome : ĠOut come ĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġerrors : ĠList < Throwable > ĊĊĠĠĠĠĠĠĠ Ġ/** ĠMedical Ġrecord Ġfor Ġa Ġflow Ġthat Ġhas Ġerro red . Ġ*/ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠFlow ( override Ġval Ġtime : ĠInstant , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflow Id : ĠState Machine Run Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuspend Count : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġerrors : ĠList < Throwable >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġby : ĠList < Staff >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġoutcome : ĠOut come ) Ġ: ĠMedical Record () ĊĊĠĠĠĠĠĠĠ Ġ/** ĠMedical Ġrecord Ġfor Ġa Ġsession Ġinit iation Ġthat Ġwas Ġun successful . Ġ*/ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠSession Init ( val Ġid : ĠState Machine Run Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġtime : ĠInstant , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġoutcome : ĠOut come , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinit iator Flow ClassName : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflow Version : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠappName : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsender : ĠParty , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror : ĠThrowable ) Ġ: ĠMedical Record () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġerrors : ĠList < Throwable > Ġget () Ġ= ĠlistOf ( error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠOut come Ġ{ ĠDIS CHAR GE , ĠOVER N IGHT _ OB SERV ATION , ĠU NT RE AT ABLE Ġ} ĊĊĠĠĠ Ġ/** ĠThe Ġorder Ġof Ġthe Ġenum Ġvalues Ġare Ġin Ġpriority Ġorder . Ġ*/ ĊĠĠĠ Ġenum Ġclass ĠDi agnosis Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĠThe Ġflow Ġshould Ġnot Ġsee Ġother Ġstaff Ġmembers Ġ*/ ĊĠĠĠĠĠĠĠ ĠTER MIN AL , ĊĠĠĠĠĠĠĠ Ġ/** ĠRetry Ġfrom Ġlast Ġsafe Ġpoint . Ġ*/ ĊĠĠĠĠĠĠĠ ĠDIS CHAR GE , ĊĠĠĠĠĠĠĠ Ġ/** ĠPark Ġand Ġawait Ġinter vention . Ġ*/ ĊĠĠĠĠĠĠĠ ĠOVER N IGHT _ OB SERV ATION , ĊĠĠĠĠĠĠĠ Ġ/** ĠPlease Ġtry Ġanother Ġmember Ġof Ġstaff . Ġ*/ ĊĠĠĠĠĠĠĠ ĠNOT _ MY _ SPECIAL TY ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠStaff Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġconsult ( flow Fi ber : ĠFlow Fi ber , Ġcurrent State : ĠState Machine State , Ġnew Error : ĠThrowable , Ġhistory : ĠFlow Medical History ): ĠDi agnosis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠCh ron ic ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSQL ĠDead lock Ġdetection . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġobject ĠDead lock N ur se Ġ: ĠStaff , ĠCh ron ic Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġconsult ( flow Fi ber : ĠFlow Fi ber , Ġcurrent State : ĠState Machine State , Ġnew Error : ĠThrowable , Ġhistory : ĠFlow Medical History ): ĠDi agnosis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( mentions Dead lock ( new Error )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDi agnosis . DIS CHAR GE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDi agnosis . NOT _ MY _ SPECIAL TY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġmentions Dead lock ( exception : ĠThrowable ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexception . mentions Throwable ( SQLException :: class . java , Ġ" dead lock ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPrimary Ġkey Ġviolation Ġdetection Ġfor Ġduplicate Ġinserts . Ġ ĠWill Ġdetect Ġother Ġconstraint Ġviolations Ġtoo . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġobject ĠDuplicate Insert Special ist Ġ: ĠStaff Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġconsult ( flow Fi ber : ĠFlow Fi ber , Ġcurrent State : ĠState Machine State , Ġnew Error : ĠThrowable , Ġhistory : ĠFlow Medical History ): ĠDi agnosis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( new Error . mentions Throwable ( Constraint Violation Exception :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġhistory . not Dis char ged For The Same Thing More Than ( 2 , Ġthis , Ġcurrent State )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDi agnosis . DIS CHAR GE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDi agnosis . NOT _ MY _ SPECIAL TY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe starts Ġ[ Timed Flow ], Ġkeeping Ġtrack Ġof Ġthe Ġnumber Ġof Ġretries Ġand Ġmaking Ġsure Ġit Ġdoes Ġnot ĊĠĠĠĠ Ġ* Ġexceed Ġthe Ġlimit Ġspecified Ġby Ġthe Ġ[ Flow TimeoutException ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġobject ĠDoctor Timeout Ġ: ĠStaff Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġconsult ( flow Fi ber : ĠFlow Fi ber , Ġcurrent State : ĠState Machine State , Ġnew Error : ĠThrowable , Ġhistory : ĠFlow Medical History ): ĠDi agnosis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Error Ġis ĠFlow TimeoutException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDi agnosis . DIS CHAR GE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDi agnosis . NOT _ MY _ SPECIAL TY ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠFinal ity Doctor Ġ: ĠStaff Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġconsult ( flow Fi ber : ĠFlow Fi ber , Ġcurrent State : ĠState Machine State , Ġnew Error : ĠThrowable , Ġhistory : ĠFlow Medical History ): ĠDi agnosis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( currentState . flow Logic Ġis ĠFinal ity Handler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Flow Ġ${ flow Fi ber . id } Ġfailed Ġto Ġbe Ġfinal ised . ĠManual Ġinter vention Ġmay Ġbe Ġrequired Ġbefore Ġretry ing Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" the Ġflow Ġby Ġre - starting Ġthe Ġnode . ĠState Ġmachine Ġstate : Ġ$ currentState ", Ġnew Error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDi agnosis . OVER N IGHT _ OB SERV ATION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( is From Receive Final ity Flow ( new Error )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isError Propag ated From Counter party ( new Error ) Ġ&& Ġis Error Thrown During Receive Final ity ( new Error )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno Ġneed Ġto Ġkeep Ġaround Ġthe Ġflow , Ġsince Ġnot ar isation Ġhas Ġalready Ġfailed Ġat Ġthe Ġcounter party . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDi agnosis . NOT _ MY _ SPECIAL TY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Flow Ġ${ flow Fi ber . id } Ġfailed Ġto Ġbe Ġfinal ised . ĠManual Ġinter vention Ġmay Ġbe Ġrequired Ġbefore Ġretry ing Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" the Ġflow Ġby Ġre - starting Ġthe Ġnode . ĠState Ġmachine Ġstate : Ġ$ currentState ", Ġnew Error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDi agnosis . OVER N IGHT _ OB SERV ATION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDi agnosis . NOT _ MY _ SPECIAL TY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġis From Receive Final ity Flow ( throwable : ĠThrowable ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthrowable . stack Trace . any Ġ{ Ġit . className Ġ== ĠReceive Final ity Flow :: class . java . name Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġis Error Propag ated From Counter party ( error : ĠThrowable ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUnexpected Flow End Exception Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpeer Ġ= ĠDecl ared Field < Party ? >( Unexpected Flow End Exception :: class . java , Ġ" peer ", Ġerror ). value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpeer Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFlow Exception Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpeer Ġ= ĠDecl ared Field < Party ? >( Flow Exception :: class . java , Ġ" peer ", Ġerror ). value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpeer Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġmethod Ġwill Ġreturn Ġtrue Ġif Ġ[ Receive Transaction Flow ] Ġis Ġat Ġthe Ġtop Ġof Ġthe Ġstack Ġduring Ġthe Ġerror . ĊĠĠĠĠĠĠĠĠ Ġ* ĠAs Ġa Ġresult , Ġif Ġthe Ġfailure Ġhappened Ġduring Ġa Ġsub - flow Ġinvoked Ġfrom Ġ[ Receive Transaction Flow ], Ġthe Ġmethod Ġwill Ġreturn Ġfalse . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġis Ġbecause Ġin Ġthe Ġlatter Ġcase , Ġthe Ġtransaction Ġmight Ġhave Ġalready Ġbeen Ġfinal ised Ġand Ġdeleting Ġthe Ġflow ĊĠĠĠĠĠĠĠĠ Ġ* Ġwould Ġintroduce Ġrisk Ġfor Ġin consistency Ġbetween Ġnodes . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġis Error Thrown During Receive Final ity ( error : ĠThrowable ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstripped Stack trace Ġ= Ġerror . stack Trace ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit ?. className ?. contains (" counter - flow Ġexception Ġfrom Ġpeer ") Ġ?: Ġfalse Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit ?. className ?. startsWith (" net . cord a . node . services . state machine .") Ġ?: Ġfalse Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstripped Stack trace . isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġstripped Stack trace . first (). className . startsWith ( Receive Transaction Flow :: class . qualified Name !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ[ SQL Transient Connection Exception ] Ġdetection Ġthat Ġar ise Ġfrom Ġfailing Ġto Ġconnect Ġthe Ġunderlying Ġdatabase / datasource ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġobject ĠTrans ient Connection Card io log ist Ġ: ĠStaff Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġconsult ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Fi ber : ĠFlow Fi ber , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent State : ĠState Machine State , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Error : ĠThrowable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhistory : ĠFlow Medical History ĊĠĠĠĠĠĠĠ Ġ): ĠDi agnosis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( mentions Transient Connection ( new Error )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( history . not Dis char ged For The Same Thing More Than ( 2 , Ġthis , Ġcurrent State )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDi agnosis . DIS CHAR GE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDi agnosis . OVER N IGHT _ OB SERV ATION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDi agnosis . NOT _ MY _ SPECIAL TY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġmentions Transient Connection ( exception : ĠThrowable ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexception . mentions Throwable ( SQL Transient Connection Exception :: class . java , Ġ" connection Ġis Ġnot Ġavailable ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHo spital ise Ġany Ġdatabase Ġ( SQL Ġand ĠPersistence ) Ġexception Ġthat Ġwasn 't Ġhandled Ġotherwise , Ġunless Ġon Ġthe Ġconfigurable Ġwhitelist ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġretry Ġdecisions Ġfrom Ġother Ġspecial ists Ġwill Ġnot Ġbe Ġaffected Ġas Ġretries Ġtake Ġprecedence Ġover Ġhospital isation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġobject ĠDatabase En doc r ino log ist Ġ: ĠStaff Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġconsult ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Fi ber : ĠFlow Fi ber , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent State : ĠState Machine State , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Error : ĠThrowable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhistory : ĠFlow Medical History ĊĠĠĠĠĠĠĠ Ġ): ĠDi agnosis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(( new Error Ġis ĠSQLException Ġ|| Ġnew Error Ġis ĠPersistence Exception ) Ġ&& Ġ! custom Conditions . any Ġ{ Ġit ( new Error ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDi agnosis . OVER N IGHT _ OB SERV ATION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDi agnosis . NOT _ MY _ SPECIAL TY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠĠĠĠĠ Ġval Ġcustom Conditions Ġ= Ġmutable Set Of <( t : ĠThrowable ) Ġ-> ĠBoolean >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandles Ġexceptions Ġfrom Ġinternal Ġstate Ġtransitions Ġthat Ġare Ġnot Ġde alt Ġwith Ġby Ġthe Ġrest Ġof Ġthe Ġstaff . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ[ InterruptedException ] s Ġare Ġdiag no sed Ġas Ġ[ Di agnosis . TERMIN AL ] Ġso Ġthey Ġare Ġnever Ġretried ĊĠĠĠĠ Ġ* Ġ( can Ġoccur Ġwhen Ġa Ġflow Ġis Ġkilled Ġ- Ġ` kill Flow `). ĊĠĠĠĠ Ġ* Ġ[ AsyncOperation Transition Exception ] s Ġa res Ġignored Ġas Ġthe Ġerror Ġis Ġlikely Ġto Ġhave Ġorigin ated Ġin Ġuser Ġasync Ġcode Ġrather Ġthan Ġinside ĊĠĠĠĠ Ġ* Ġof Ġa Ġtransition . ĊĠĠĠĠ Ġ* ĠAll Ġother Ġexceptions Ġare Ġretried Ġa Ġmaximum Ġof Ġ 3 Ġtimes Ġbefore Ġbeing Ġkept Ġin Ġfor Ġobservation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġobject ĠTransition Error General Pract itioner Ġ: ĠStaff Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġconsult ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflow Fi ber : ĠFlow Fi ber , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent State : ĠState Machine State , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Error : ĠThrowable , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhistory : ĠFlow Medical History ĊĠĠĠĠĠĠĠ Ġ): ĠDi agnosis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( new Error . mentions Throwable ( State Transition Exception :: class . java )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Error . mentions Throwable ( InterruptedException :: class . java ) Ġ-> ĠDi agnosis . TERMIN AL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Error . mentions Throwable ( AsyncOperation Transition Exception :: class . java ) Ġ-> ĠDi agnosis . NOT _ MY _ SPECIAL TY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhistory . not Dis char ged For The Same Thing More Than ( 2 , Ġthis , Ġcurrent State ) Ġ-> ĠDi agnosis . DIS CHAR GE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠDi agnosis . OVER N IGHT _ OB SERV ATION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDi agnosis . NOT _ MY _ SPECIAL TY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġlog Di agnosis ( it , Ġnew Error , Ġflow Fi ber , Ġhistory ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġlog Di agnosis ( di agnosis : ĠDi agnosis , Ġnew Error : ĠThrowable , Ġflow Fi ber : ĠFlow Fi ber , Ġhistory : ĠFlow Medical History ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( di agnosis Ġ!= ĠDi agnosis . NOT _ MY _ SPECIAL TY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFlow Ġ${ flow Fi ber . id } Ġgiven Ġ$ di agnosis Ġdi agnosis Ġdue Ġto Ġa Ġtransition Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- ĠException : Ġ${ new Error . message } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- ĠHistory : Ġ$ history ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ ( new Error Ġas ? ĠState Transition Exception )?. transition Action ?. let Ġ{ Ġ"- ĠAction : Ġ$ it " Ġ}} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ ( new Error Ġas ? ĠState Transition Exception )?. transition Event ?. let Ġ{ Ġ"- ĠEvent : Ġ$ it " Ġ}} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠKeep s Ġthe Ġflow Ġin Ġfor Ġover night Ġobservation Ġif Ġ[ Ho spital ize Flow Exception ] Ġis Ġreceived . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġobject ĠSed ation N ur se Ġ: ĠStaff Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġconsult ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflow Fi ber : ĠFlow Fi ber , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent State : ĠState Machine State , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Error : ĠThrowable , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhistory : ĠFlow Medical History ĊĠĠĠĠĠĠĠ Ġ): ĠDi agnosis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( new Error . mentions Throwable ( Ho spital ize Flow Exception :: class . java )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDi agnosis . OVER N IGHT _ OB SERV ATION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDi agnosis . NOT _ MY _ SPECIAL TY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetry Ġnot ar isation Ġif Ġthe Ġflow Ġerrors Ġwith Ġa Ġ[ Not ary Error . General ]. ĠNot ary Ġflows Ġare Ġide mpot ent Ġand Ġonly Ġsuccess Ġor Ġconflict ĊĠĠĠĠ Ġ* Ġresponses Ġshould Ġbe Ġreturned Ġto Ġthe Ġclient . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġobject ĠNot ary Doctor Ġ: ĠStaff , ĠCh ron ic Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġconsult ( flow Fi ber : ĠFlow Fi ber , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent State : ĠState Machine State , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Error : ĠThrowable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhistory : ĠFlow Medical History ): ĠDi agnosis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Error Ġis ĠNot ary Exception Ġ&& Ġnew Error . error Ġis ĠNot ary Error . General ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDi agnosis . DIS CHAR GE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDi agnosis . NOT _ MY _ SPECIAL TY ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġ< T Ġ: ĠThrowable > ĠThrowable ?. mentions Throwable ( exception Type : ĠClass < T >, ĠerrorMessage : ĠString ? Ġ= Ġnull ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( this Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġcontains Message Ġ= Ġif Ġ( errorMessage Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmessage ?. toLowerCase ()?. contains ( errorMessage ) Ġ?: Ġfalse ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġ( exception Type . isAssignableFrom ( this :: class . java ) Ġ&& Ġcontains Message ) Ġ|| Ġcause . mentions Throwable ( exception Type , ĠerrorMessage ) Ċ } ĊĊ