package Ġno . nav . su . se . bak over . service . rev ur der ing Ċ Ċ import Ġarrow . core . Either Ċ import Ġarrow . core . get Or Handle Ċ import Ġarrow . core . left Ċ import Ġarrow . core . right Ċ import Ġno . nav . su . se . bak over . common . Tid sp unkt Ċ import Ġno . nav . su . se . bak over . common . log Ċ import Ġno . nav . su . se . bak over . common . peri ode . Per i ode Ċ import Ġno . nav . su . se . bak over . database . rev ur der ing . Rev ur der ing Repo Ċ import Ġno . nav . su . se . bak over . database . ved tak . V ed tak Repo Ċ import Ġno . nav . su . se . bak over . domain . Nav Ident B ru ker Ċ import Ġno . nav . su . se . bak over . domain . be handling . At test ering Ċ import Ġno . nav . su . se . bak over . domain . op pd rag . U tb et aling Ċ import Ġno . nav . su . se . bak over . domain . rev ur der ing . G jen op pta Yt else Rev ur der ing Ċ import Ġno . nav . su . se . bak over . domain . ved tak . G jel den de V ed t aks data Ċ import Ġno . nav . su . se . bak over . domain . ved tak . V ed tak Ċ import Ġno . nav . su . se . bak over . domain . ved tak . V ed tak S om K an Rev ur der es Ċ import Ġno . nav . su . se . bak over . domain . ved tak . lag T ids lin je Ċ import Ġno . nav . su . se . bak over . service . sak . S ak Service Ċ import Ġno . nav . su . se . bak over . service . ut bet aling . U tb et aling Service Ċ import Ġno . nav . su . se . bak over . service . ved tak . V ed tak Service Ċ import Ġjava . time . Clock Ċ import Ġjava . time . LocalDate Ċ import Ġjava . util . UUID Ċ Ċ class ĠG jen op pt ak Av Yt else Service ( ĊĠĠĠ Ġprivate Ġval Ġut bet aling Service : ĠU tb et aling Service , ĊĠĠĠ Ġprivate Ġval Ġrev ur der ing Repo : ĠRev ur der ing Repo , ĊĠĠĠ Ġprivate Ġval Ġclock : ĠClock , ĊĠĠĠ Ġprivate Ġval Ġved tak Repo : ĠV ed tak Repo , ĊĠĠĠ Ġprivate Ġval Ġved tak Service : ĠV ed tak Service , ĊĠĠĠ Ġprivate Ġval Ġs ak Service : ĠS ak Service , Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġg jen op pta Yt else ( request : ĠG jen op pta Yt else Request ): ĠEither < K un ne Ik ke G jen op pta Yt else , ĠG jen op pta Yt else Rev ur der ing . Sim ul ert G jen op pt ak Av Yt else > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsist eV ed tak Ġ= Ġved tak Repo . h ent For S ak Id ( request . sak Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < V ed tak S om K an Rev ur der es >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. lag T ids lin je ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġper i ode Ġ= ĠPer i ode . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf ra Og Med Ġ= ĠLocalDate . MIN , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtil Og Med Ġ= ĠLocalDate . MAX , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclock Ġ= Ġclock , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). t ids lin je . last OrNull ()?. original t V ed tak Ġ?: Ġreturn ĠK un ne Ik ke G jen op pta Yt else . F ant In gen V ed tak . left () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( s iste V ed tak Ġ! is ĠV ed tak . End ring IY t else . St ans Av Yt else ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠK un ne Ik ke G jen op pta Yt else . S iste V ed tak Er Ik ke St ans . left () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsim ul ert Rev ur der ing Ġ= Ġwhen Ġ( request ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠG jen op pta Yt else Request . Opp dater Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Ġ= Ġrev ur der ing Repo . h ent ( request . rev ur der ing Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠK un ne Ik ke G jen op pta Yt else . F ant Ik ke Rev ur der ing . left () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg jel den de V ed t aks data : ĠG jel den de V ed t aks data Ġ= Ġkop ier G jel den de V ed t aks data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs ak Id Ġ= Ġrequest . sak Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf ra Og Med Ġ= Ġsist eV ed tak . peri ode . f ra Og Med , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). get Or Handle Ġ{ Ġreturn Ġit . left () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsim uler ing Ġ= Ġsim uler ( request ). get Or Handle Ġ{ Ġreturn Ġit . left () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( update ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠG jen op pta Yt else Rev ur der ing . Sim ul ert G jen op pt ak Av Yt else Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG jen op pta Yt else Rev ur der ing . Sim ul ert G jen op pt ak Av Yt else ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġupdate . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopp rett et Ġ= Ġupdate . op prett et , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġper i ode Ġ= Ġg jel den de V ed t aks data . peri ode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg run nl ags data Ġ= Ġg jel den de V ed t aks data . gr un nl ags data , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv ilk Ã¥r sv ur der inger Ġ= Ġg jel den de V ed t aks data . v ilk Ã¥r sv ur der inger , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtil Rev ur der ing Ġ= Ġg jel den de V ed t aks data . gj el den de V ed tak P Ã¥ D ato ( s iste V ed tak . peri ode . f ra Og Med ) !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs aks be handler Ġ= Ġrequest . s aks be handler , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsim uler ing Ġ= Ġsim uler ing . sim uler ing , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrev ur der ings Ã¥ rs ak Ġ= Ġrequest . rev ur der ings Ã¥ rs ak , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĠK un ne Ik ke G jen op pta Yt else . U gy ld ig Type For Opp dater ing ( update :: class ). left () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠG jen op pta Yt else Request . Opp rett Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sak Service . h ent S ak ( request . sak Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Or Handle Ġ{ Ġreturn ĠK un ne Ik ke G jen op pta Yt else . F ant Ik ke S ak . left () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. har Ã ħ pen Rev ur der ing For G jen op pt ak Av Yt else () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġreturn ĠK un ne Ik ke G jen op pta Yt else . S ak Har Ã ħ pen Rev ur der ing For G jen op pt ak Av Yt else . left () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg jel den de V ed t aks data : ĠG jel den de V ed t aks data Ġ= Ġkop ier G jel den de V ed t aks data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs ak Id Ġ= Ġrequest . sak Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf ra Og Med Ġ= Ġsist eV ed tak . peri ode . f ra Og Med , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). get Or Handle Ġ{ Ġreturn Ġit . left () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsim uler ing Ġ= Ġsim uler ( request ). get Or Handle Ġ{ Ġreturn Ġit . left () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG jen op pta Yt else Rev ur der ing . Sim ul ert G jen op pt ak Av Yt else ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= ĠUUID . randomUUID (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopp rett et Ġ= ĠT id sp unkt . now ( clock ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġper i ode Ġ= Ġg jel den de V ed t aks data . peri ode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg run nl ags data Ġ= Ġg jel den de V ed t aks data . gr un nl ags data , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv ilk Ã¥r sv ur der inger Ġ= Ġg jel den de V ed t aks data . v ilk Ã¥r sv ur der inger , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtil Rev ur der ing Ġ= Ġg jel den de V ed t aks data . gj el den de V ed tak P Ã¥ D ato ( s iste V ed tak . peri ode . f ra Og Med ) !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs aks be handler Ġ= Ġrequest . s aks be handler , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsim uler ing Ġ= Ġsim uler ing . sim uler ing , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrev ur der ings Ã¥ rs ak Ġ= Ġrequest . rev ur der ings Ã¥ rs ak , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrev ur der ing Repo . lag re ( sim ul ert Rev ur der ing ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsim ul ert Rev ur der ing . right () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ iver k set t G jen op pt ak Av Yt else ( ĊĠĠĠĠĠĠĠ Ġrev ur der ing Id : ĠUUID , ĊĠĠĠĠĠĠĠ Ġat test ant : ĠNav Ident B ru ker . At test ant , ĊĠĠĠ Ġ): ĠEither < K un ne Ik ke I ver k set te G jen op pt ak Av Yt else , ĠG jen op pta Yt else Rev ur der ing . I ver ks att G jen op pt ak Av Yt else > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrev ur der ing Ġ= Ġrev ur der ing Repo . h ent ( rev ur der ing Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠK un ne Ik ke I ver k set te G jen op pt ak Av Yt else . F ant Ik ke Rev ur der ing . left () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( rev ur der ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠG jen op pta Yt else Rev ur der ing . Sim ul ert G jen op pt ak Av Yt else Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ iver ks att Rev ur der ing Ġ= Ġrev ur der ing . iver k set t ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAt test ering . I ver ks att ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat test ant , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT id sp unkt . now ( clock ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). get Or Handle Ġ{ Ġreturn ĠK un ne Ik ke I ver k set te G jen op pt ak Av Yt else . Sim uler ing In di ker er Fe il ut bet aling . left () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġst ans U tb et aling Ġ= Ġut bet aling Service . g jen op pta U tb et al inger ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs ak Id Ġ= Ġ iver ks att Rev ur der ing . sak Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat test ant Ġ= Ġ iver ks att Rev ur der ing . at test ering er . h ent S iste At test ering (). at test ant , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsim uler ing Ġ= Ġrev ur der ing . sim uler ing , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). get Or Handle Ġ{ Ġreturn ĠK un ne Ik ke I ver k set te G jen op pt ak Av Yt else . K un ne Ik ke U tb et ale ( it ). left () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġved tak Ġ= ĠV ed tak . from ( iver ks att Rev ur der ing , Ġst ans U tb et aling . id , Ġclock ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrev ur der ing Repo . lag re ( iver ks att Rev ur der ing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġved tak Repo . lag re ( ved tak ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ iver ks att Rev ur der ing . right () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠK un ne Ik ke I ver k set te G jen op pt ak Av Yt else . U gy ld ig Til stand ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf akt isk Til stand Ġ= Ġrev ur der ing :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). left () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġkop ier G jel den de V ed t aks data ( ĊĠĠĠĠĠĠĠ Ġs ak Id : ĠUUID , ĊĠĠĠĠĠĠĠ Ġf ra Og Med : ĠLocalDate , ĊĠĠĠ Ġ): ĠEither < K un ne Ik ke G jen op pta Yt else , ĠG jel den de V ed t aks data > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġved tak Service . kop ier G jel den de V ed t aks data ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs ak Id Ġ= Ġs ak Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf ra Og Med Ġ= Ġf ra Og Med , ĊĠĠĠĠĠĠĠ Ġ). get Or Handle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" K un ne Ġik ke Ġopp ret te Ġrev ur der ing Ġfor Ġg jen op pt ak Ġav Ġy t else , ĠÃ¥ rs ak : Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠK un ne Ik ke G jen op pta Yt else . K un ne Ik ke Opp ret te Rev ur der ing . left () ĊĠĠĠĠĠĠĠ Ġ}. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . t ids lin je For V ed tak Er Sam men h eng ende ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" K un ne Ġik ke Ġopp ret te Ġrev ur der ing Ġfor Ġg jen op pt ak Ġav Ġy t else , ĠÃ¥ rs ak : Ġt ids lin je Ġer Ġik ke Ġsam men h eng ende .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠK un ne Ik ke G jen op pta Yt else . K un ne Ik ke Opp ret te Rev ur der ing . left () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. right () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsim uler ( request : ĠG jen op pta Yt else Request ): ĠEither < K un ne Ik ke G jen op pta Yt else , ĠU tb et aling . Sim ul ert U tb et aling > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġut bet aling Service . sim uler G jen op pt ak ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs ak Id Ġ= Ġrequest . sak Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs aks be handler Ġ= Ġrequest . s aks be handler , ĊĠĠĠĠĠĠĠ Ġ). get Or Handle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" K un ne Ġik ke Ġopp ret te Ġrev ur der ing Ġfor Ġg jen op pt ak Ġav Ġy t else , ĠÃ¥ rs ak : Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠK un ne Ik ke G jen op pta Yt else . K un ne Ik ke Sim ul ere ( it ). left () ĊĠĠĠĠĠĠĠ Ġ}. right () ĊĠĠĠ Ġ} Ċ } Ċ