package Ġcom . example . work time administration . job handlers Ċ Ċ import Ġcom . example . work time administration . model . aggreg ates . Aggregate State Ċ import Ġcom . example . work time administration . model . employee . Employee Ċ import Ġcom . example . work time administration . model . project . Project Ċ import Ġcom . example . work time administration . model . project . Project Sync Ċ import Ġcom . example . work time administration . repositories . employee . Employee Repository Ċ import Ġcom . example . work time administration . repositories . project . Project Repository Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . readValue Ċ import Ġio . z ee be . client . api . response . Activated Job Ċ import Ġio . z ee be . client . api . worker . Job Client Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġorg . springframework . transaction . Unexpected Rollback Exception Ċ import Ġorg . springframework . transaction . annotation . Transactional Ċ Ċ /** Ċ Ġ* ĠThis Ġclass Ġcontains Ġthe Ġfunctions Ġused Ġby Ġthe ĠZ ee be ĠJob Handlers Ġto Ġexecute Ġlogic Ġwhen Ġa Ġjob Ġis Ġreceived . Ċ Ġ* ĠThe Ġfunctions Ġare Ġstored Ġin Ġvariables , Ġso Ġthey Ġcan Ġbe Ġpassed Ġto Ġthe Ġhandlers . Ċ Ġ* Ċ Ġ* ĠA Ġsingleton Ġinstance Ġof Ġthis Ġclass Ġis Ġcreated Ġwhen Ġthe Ġapplication Ġcontext Ġis Ġinitialized . Ċ Ġ* ĠThis Ġway Ġa Ġrepository Ġand Ġthe ĠObjectMapper Ġ( used Ġfor ĠJSON ĠDeserial ization ) Ġcan Ġbe Ġinjected Ġinto Ġthe Ġclass Ġto Ġuse Ġthem Ġin Ġthese Ġfunctions . Ċ Ġ* Ċ Ġ*/ Ċ @ Component Ċ class ĠProject Job Handlers ( ĊĠĠĠĠĠĠĠ Ġval Ġproject Sync Transaction Service : ĠProject Sync Transaction Service , ĊĠĠĠĠĠĠĠ Ġval Ġmapper : ĠObjectMapper Ċ ) Ġ{ ĊĊĠĠĠ Ġval Ġsynchronize Projects : Ġ( Job Client , ĠActivated Job ) Ġ-> ĠUnit Ġ= Ġ{ Ġjob Client , Ġjob Ġ-> ĊĠĠĠĠĠĠĠ Ġprintln (" EXECUT ING ĠSY NC ĠJOB ") ĊĠĠĠĠĠĠĠ Ġval Ġproject Dto Ġ= Ġmapper . readValue < Project Sync >( job . variables As Map [" project "] Ġas ĠString ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Sync Transaction Service . handle Synchronization ( project Dto ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmap Of (" work time Project Sync ed " Ġto Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Client . new Complete Command ( job . key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. variables ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. send () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmap Of (" work time Project Sync ed " Ġto Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Client . new Complete Command ( job . key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. variables ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. send () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġactivate Project : Ġ( Job Client , ĠActivated Job ) Ġ-> ĠUnit Ġ= Ġ{ Ġjob Client : ĠJob Client , Ġjob : ĠActivated Job Ġ-> ĊĠĠĠĠĠĠĠ Ġprintln (" EXECUT ING ĠACT IV ATION ĠJOB ") ĊĠĠĠĠĠĠĠ Ġval ĠprojectId Ġ= Ġmapper . readValue < Project Sync >( job . variables As Map [" project "] Ġas ĠString ). id ĊĠĠĠĠĠĠĠ Ġproject Sync Transaction Service . handle Activation ( projectId ) ĊĠĠĠĠĠĠĠ Ġjob Client . new Complete Command ( job . key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. send () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcomp ens ate Project : Ġ( Job Client , ĠActivated Job ) Ġ-> ĠUnit Ġ= Ġ{ Ġjob Client : ĠJob Client , Ġjob : ĠActivated Job Ġ-> ĊĠĠĠĠĠĠĠ Ġprintln (" EXECUT ING ĠCOMP ENS ATION ĠJOB ") ĊĠĠĠĠĠĠĠ Ġval Ġvariables Ġ= Ġjob . variables As Map ĊĠĠĠĠĠĠĠ Ġval ĠprojectId Ġ= Ġmapper . readValue < Project Sync >( job . variables As Map [" project "] Ġas ĠString ). id ĊĠĠĠĠĠĠĠ Ġif Ġ( variables . containsKey (" comp ensation Project ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Sync Transaction Service . handle Comp ensation ( projectId , Ġmapper . readValue < Project Sync >( job . variables As Map [" comp ensation Project "] Ġas ĠString )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Sync Transaction Service . handle Comp ensation ( projectId , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġjob Client . new Complete Command ( job . key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. send () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join () ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ @ Service Ċ class ĠProject Sync Transaction Service ( ĊĠĠĠĠĠĠĠ Ġval Ġproject Repository : ĠProject Repository , ĊĠĠĠĠĠĠĠ Ġval Ġemployee Repository : ĠEmployee Repository Ċ ): ĠSync Service < Project Sync > Ġ{ ĊĊĠĠĠ Ġ@ Transactional ĊĠĠĠ Ġ@ Throws ( Unexpected Rollback Exception :: class , ĠException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġhandle Synchronization ( project Dto : ĠProject Sync ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRetrieve Ġand Ġupdate Ġthe Ġemployee Ġor Ġcreate Ġit Ġif Ġit Ġdoesn 't Ġexist ĊĠĠĠĠĠĠĠ Ġproject Repository . findBy ProjectId ( project Dto . id ). map Ġ{ Ġproject Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject . endDate Ġ= Ġproject Dto . endDate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject . description Ġ= Ġproject Dto . description ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject . project ed EndDate Ġ= Ġproject Dto . project ed EndDate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject . deleted Ġ= Ġproject Dto . deleted ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject . state Ġ= Ġproject Dto . state ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġemployees Ġto Ġproject Ġif Ġnecessary ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Dto . employees . filter Ġ{ id Ġ-> Ġ Ġ! project . employees . map Ġ{ Ġit . employee Id Ġ}. contains ( id ) Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . employees . add ( employee Repository . findBy Employee Id And Deleted False ( it ). orElse Throw ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġemployees Ġfrom Ġproject Ġif Ġnecessary ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject . employees . map Ġ{ Ġit . employee Id Ġ}. filter Ġ{ id Ġ-> Ġ Ġ! project Dto . employees . map Ġ{ Ġit Ġ}. contains ( id ) Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . employees . remove If Ġ{ t : ĠEmployee Ġ-> Ġt . employee Id Ġ== Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Repository . save ( project ) ĊĠĠĠĠĠĠĠ Ġ}. orElse Get Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġemployees Ġ= Ġemployee Repository . findAll By Employee Id In ( project Dto . employees . toList ()). to Mutable Set () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwork time Project Ġ= ĠProject ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Dto . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Dto . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Dto . description , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Dto . startDate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Dto . project ed EndDate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Dto . endDate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemployees . to Mutable Set (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Dto . deleted , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Dto . state ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Repository . save ( work time Project ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Transactional ĊĠĠĠ Ġ@ Throws ( Unexpected Rollback Exception :: class , ĠException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġhandle Activation ( projectId : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġproject Repository . findBy ProjectId ( projectId ). orElse Throw () ĊĠĠĠĠĠĠĠ Ġproject . state Ġ= ĠAggregate State . ACTIVE ĊĠĠĠĠĠĠĠ Ġproject Repository . save ( project ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Transactional ĊĠĠĠ Ġ@ Throws ( Unexpected Rollback Exception :: class , ĠException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġhandle Comp ensation ( projectId : ĠLong , Ġcomp ensation Project : ĠProject Sync ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( comp ensation Project Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Repository . findBy ProjectId ( projectId ). if Present Ġ{ Ġproject Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . endDate Ġ= Ġcomp ensation Project . endDate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . description Ġ= Ġcomp ensation Project . description ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . project ed EndDate Ġ= Ġcomp ensation Project . project ed EndDate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . deleted Ġ= Ġcomp ensation Project . deleted ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġemployees Ġto Ġproject Ġif Ġnecessary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomp ensation Project . employees . filter Ġ{ id Ġ-> Ġ Ġ! project . employees . map Ġ{ Ġit . employee Id Ġ}. contains ( id ) Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . employees . add ( employee Repository . findBy Employee Id ( it ). orElse Throw ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġemployees Ġfrom Ġproject Ġif Ġnecessary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . employees . map Ġ{ Ġit . employee Id Ġ}. filter Ġ{ id Ġ-> Ġ Ġ! comp ensation Project . employees . map Ġ{ Ġit Ġ}. contains ( id ) Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . employees . remove If Ġ{ t : ĠEmployee Ġ-> Ġt . employee Id Ġ== Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . state Ġ= ĠAggregate State . ACTIVE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Repository . save ( project ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Repository . findById ( projectId ). if Present Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Repository . delete By ProjectId ( projectId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊ Ċ }