package Ġcom . hell er . CQ RS Ċ Ċ // import Ġcom . hell er . CQ RS . Event S ourcing Repository . Companion . apply Event Ċ import Ġjava . lang . IllegalArgumentException Ċ import Ġkotlin . reflect . K Class Ċ Ċ class ĠIn Proc EventBus Ġ: ĠEvent Bus Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġsubscribers : ĠMap < K Class < out ĠEvent >, ĠMutable List <( Event ) Ġ-> ĠUnit >> Ġ= Ġmap Of () ĊĊĠĠĠ Ġoverride Ġfun Ġ< E Ġ: ĠEvent > Ġdispatch ( event : ĠE ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġevt Type Ġ= Ġevent . java Class . kotlin ĊĊĠĠĠĠĠĠĠ Ġval Ġcontains Key Ġ= Ġsubscribers . containsKey ( evt Type ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! containsKey ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġsubscribers . get ( evt Type ) !!. forEach Ġ{ Ġit . invoke ( event ) Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< E Ġ: ĠEvent > Ġsubscribe ( evt Type : ĠK Class < E >, Ġhandler : Ġ( E ) Ġ-> ĠUnit ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcontains Key Ġ= Ġsubscribers . containsKey ( evt Type ) ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġhandler Ġas Ġ( Event ) Ġ-> ĠUnit ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġevt Type Ġas ĠK Class < Event > ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! containsKey ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribers Ġ= Ġsubscribers . plus ( Pair ( evt Type , Ġmutable ListOf ( handler ))) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribers [ evt Type ] !!. add ( handler ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠIn Proc Command Bus Ġ: ĠCommand Bus Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġhandlers : ĠMap < K Class < out ĠCommand >, Ġ( Command ) Ġ-> ĠCommand . Result > Ġ= Ġmap Of () ĊĊĠĠĠ Ġoverride Ġfun Ġfire And For get ( cmd : ĠCommand ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO (" not Ġimplemented ") Ġ// To Ġchange Ġbody Ġof Ġcreated Ġfunctions Ġuse ĠFile Ġ| ĠSettings Ġ| ĠFile ĠTemplates . ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< C Ġ: ĠCommand . With Result < R >, ĠR Ġ: ĠCommand . Result > Ġask ( cmd : ĠC ): ĠR Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcmd Type Ġ= Ġcmd . java Class . kotlin ĊĊĠĠĠĠĠĠĠ Ġval Ġcontains Handler Ġ= Ġhandlers . containsKey ( cmd Type ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! contains Handler ) Ġthrow ĠIllegalArgumentException () ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġreturn Ġhandlers [ cmd Type ] !!. invoke ( cmd ) Ġas ĠR ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< C Ġ: ĠCommand . Cre ational < E >, ĠE Ġ: ĠEvent > Ġsubscribe Cre ational ( cmd Type : ĠK Class < C >, Ġhandler : Ġ( C ) Ġ-> ĠCommand . Cre ational . Result ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcontains Handler Ġ= Ġhandlers . containsKey ( cmd Type ) ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġcmd Type Ġas ĠK Class < Command > ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġhandler Ġas Ġ( Command ) Ġ-> ĠCommand . Result ĊĊĠĠĠĠĠĠĠ Ġif Ġ( contains Handler ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandlers Ġ= Ġhandlers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. minus ( cmd Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus ( Pair < K Class < Command >, Ġ( Command ) Ġ-> ĠCommand . Result >( cmd Type , Ġhandler )) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandlers Ġ= Ġhandlers . plus ( Pair < K Class < Command >, Ġ( Command ) Ġ-> ĠCommand . Result >( cmd Type , Ġhandler )) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< C Ġ: ĠCommand . With Aggregate Id < R >, ĠR Ġ: ĠCommand . Result > Ġsubscribe ( cmd Type : ĠK Class < C >, Ġhandler : Ġ( C ) Ġ-> ĠR ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcontains Handler Ġ= Ġhandlers . containsKey ( cmd Type ) ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġhandler Ġas Ġ( Command ) Ġ-> ĠCommand . Result ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġcmd Type Ġas ĠK Class < Command > ĊĊĠĠĠĠĠĠĠ Ġif Ġ( contains Handler ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandlers Ġ= Ġhandlers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. minus ( cmd Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus ( Pair < K Class < Command >, Ġ( Command ) Ġ-> ĠCommand . Result >( cmd Type , Ġhandler )) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandlers Ġ= Ġhandlers . plus ( Pair < K Class < Command >, Ġ( Command ) Ġ-> ĠCommand . Result >( cmd Type , Ġhandler )) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊ Ċ } Ċ Ċ class ĠIn Proc Event S ourcing Repository Ġ: ĠEvent S ourcing Repository Ġ{ ĊĊĠĠĠ Ġdata Ġclass ĠAggregate Identity ( val Ġaggregate Type : ĠK Class < out ĠAggregate >, Ġval Ġid : ĠString ) ĊĊĊĠĠĠ Ġprivate Ġvar Ġevents Store : ĠMap < Aggregate Identity , ĠList < Persistent Event < out ĠAggregate , Ġout ĠEvent >>> Ġ= Ġmap Of () ĊĊĠĠĠ Ġoverride Ġfun Ġ< A Ġ: ĠAggregate , ĠE Ġ: ĠEvent > Ġpersist ( p Evt : ĠPersistent Event < A , ĠE >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġidentity Ġ= ĠAggregate Identity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaggregate Type Ġ= Ġp Evt . aggregate Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġp Evt . aggregate Id ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! events Store . containsKey ( identity )) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ_ events Ġ= ĠlistOf ( p Evt ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents Store Ġ= Ġevents Store . plus ( Pair ( identity , Ġ_ events )) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ_ events Ġ= Ġevents Store [ identity ] !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ events . last (). sequence Ġ== Ġp Evt . sequence ){ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" concurrent Ġaccess Ġto Ġ${ p Evt . aggregate Type } Ġ${ p Evt . aggregate Id }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents Store Ġ= Ġevents Store . minus ( identity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus ( Pair ( identity , Ġ_ events . plus ( p Evt ))) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< A Ġ: ĠAggregate > Ġload ( aggregate Type : ĠK Class < A >, Ġid : ĠString ): ĠA ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġidentity Ġ= ĠAggregate Identity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaggregate Type Ġ= Ġaggregate Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġid ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! events Store . containsKey ( identity )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= Ġaggregate Type . java . declared Construct ors . first Ġ{ Ġit . parameters . isEmpty () Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġaggregate Ġ= Ġconstructor . newInstance () Ġas ĠA ĊĊĠĠĠĠĠĠĠ Ġval Ġlast Sequence Id Ġ= Ġaggregate Type . java . getDeclared Field (" last Sequence Id ") ĊĊĠĠĠĠĠĠĠ Ġevents Store [ identity ] !!. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEvent S ourcing Repository . apply Event ( it . event , Ġaggregate ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Sequence Id . set ( aggregate , Ġit . sequence ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġaggregate ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< A Ġ: ĠAggregate > ĠgetLast Event Sequence Id ( aggregate Type : ĠK Class < A >, Ġid : ĠString ): ĠInt Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġidentity Ġ= ĠAggregate Identity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaggregate Type Ġ= Ġaggregate Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġid ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif ( events Store . containsKey ( identity )){ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġevents Store [ identity ] !!. size ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġreturn Ġ 0 ĊĠĠĠ Ġ} Ċ Ċ } Ċ