package Ġio . kf leet . car . service . domain Ċ Ċ import Ġio . kf leet . car . service . processor . Car And Event Ċ import Ġio . kf leet . domain . events . Geo Position Factory Ċ import Ġio . kf leet . domain . events . car . Car Dere gister ed Event Ċ import Ġio . kf leet . domain . events . car . Car Registered Event Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . apache . avro . specific . Specific Record Ċ import Ġorg . apache . kafka . streams . KeyValue Ċ import Ġorg . springframework . stereotype . Component Ċ Ċ private Ġval Ġlog Ġ= ĠKotlin Logging . logger Ġ{} ĊĊ Ċ @ Component Ċ class ĠCar Processor Ġ{ ĊĊĠĠĠ Ġfun Ġprocess Event ( car And Event : ĠCar And Event ): ĠList < KeyValue < String , ĠSpecific Record ? >> Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" process ĠCar Ġand ĠEvent : Ġ$ car And Event " Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( val Ġevent Ġ= Ġcar And Event . car Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCar Registered Event Ġ-> Ġregister Car ( event , Ġcar And Event . car ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCar Dere gister ed Event Ġ-> Ġdere gister Car ( event , Ġcar And Event . car ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠRuntimeException (" unsupported Ġevent : Ġ${ event :: class }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġregister Car ( event : ĠCar Registered Event , Ġexisting Car : ĠCar ?): ĠList < KeyValue < String , ĠSpecific Record ? >> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( existing Car Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġthere Ġis Ġno Ġcar Ġyet Ġpresent Ġ- Ġcreate Ġone ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcar Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġevent . get Car Id () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠCar State . FREE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Of Charge Ġ= Ġ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgeo Position Ġ= ĠGeo Position Factory . create Random Car Location (). to Car Location () Ġ// ĠFIXME Ġinitialize Ġwith Ġproper Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. as KeyValue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġif Ġthe Ġcar Ġstate Ġis Ġout _ of _ pool Ġmark Ġit Ġas Ġfree ĊĠĠĠĠĠĠĠ Ġif Ġ( existing Car . getState () Ġ== ĠCar State . OUT _ OF _ POOL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexisting Car . setState ( Car State . FREE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( existing Car . as KeyValue ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdere gister Car ( event : ĠCar Dere gister ed Event , Ġexisting Car : ĠCar ?): ĠList < KeyValue < String , ĠSpecific Record ? >> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( existing Car Ġ!= Ġnull Ġ&& Ġexisting Car . getState () Ġ!= ĠCar State . OUT _ OF _ POOL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexisting Car . setState ( Car State . OUT _ OF _ POOL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( existing Car . as KeyValue ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf () ĊĠĠĠ Ġ} Ċ } Ċ