package Ġcom . odd in . od ds feed sdk . cache . entity Ċ Ċ import Ġcom . google . common . cache . Cache Ċ import Ġcom . google . common . cache . Cache Builder Ċ import Ġcom . google . inject . Inject Ċ import Ġcom . odd in . od ds feed sdk . api . ApiClient Ċ import Ġcom . odd in . od ds feed sdk . api . entities . sport event . Fixture Ċ import Ġcom . odd in . od ds feed sdk . api . entities . sport event . Tv Channel Ċ import Ġcom . odd in . od ds feed sdk . api . entities . sport event . Tv Channel Impl Ċ import Ġcom . odd in . od ds feed sdk . cache . Localized Item Ċ import Ġcom . odd in . od ds feed sdk . config . Exception Handling Strategy Ċ import Ġcom . odd in . od ds feed sdk . exceptions . Item NotFoundException Ċ import Ġcom . odd in . od ds feed sdk . schema . utils . URN Ċ import Ġcom . odd in . od ds feed sdk . utils . Utils Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ interface ĠFix ture Cache Ġ: ĠCache Loader < Localized Fixture > Ġ{ ĊĠĠĠ Ġfun Ġget Fixture ( id : ĠU RN , Ġlocale : ĠLocale ): ĠLocal ized Fixture ? Ċ } Ċ Ċ class ĠFix ture Cache Impl Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval ĠapiClient : ĠApi Client Ċ ) Ġ: ĠFix ture Cache Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlock Ġ= ĠAny () ĊĠĠĠ Ġprivate Ġval Ġinternal Cache Ġ= ĠCache Builder ĊĠĠĠĠĠĠĠ Ġ. newBuilder () ĊĠĠĠĠĠĠĠ Ġ. expire After Write ( 1 2 L , ĠTimeUnit . HOUR S ) ĊĠĠĠĠĠĠĠ Ġ. build < URN , ĠLocal ized Fixture >() ĊĊĠĠĠ Ġoverride Ġfun Ġclear Cache Item ( id : ĠU RN ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Cache . invalidate ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Fixture ( id : ĠU RN , Ġlocale : ĠLocale ): ĠLocal ized Fixture ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġinternal Cache . get If Present ( id ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( item Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload And Cache Item ( id , Ġlocale ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġinternal Cache . get If Present ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Lock (): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlock ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Cache (): ĠCache < URN , ĠLocal ized Fixture > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinternal Cache ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload And Cache Item ( id : ĠU RN , Ġlocales : ĠList < Locale >) Ġ{ ĊĠĠĠĠĠĠĠ Ġlocales . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload And Cache Item ( id , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Supported URN Type (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload And Cache Item ( id : ĠU RN , Ġlocale : ĠLocale ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠapiClient . fetch Fixture ( id , Ġlocale ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run Blocking ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfixture Ġ= ĠLocal ized Fixture ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . parse Date ( data . startTime ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConcurrent HashMap ( data . extra Info . info . map Ġ{ Ġit . key Ġto Ġit . value Ġ}. toMap ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . tv Channels ?. tv Channel ?. map Ġ{ ĠT v Channel Impl ( it . name , Ġit . stream Url ) Ġ} Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Cache . put ( id , Ġfixture ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ data Ġclass ĠLocal ized Fixture ( ĊĠĠĠ Ġval ĠstartTime : ĠDate ?, ĊĠĠĠ Ġval Ġextra Info : ĠConcurrent HashMap < String , ĠString >, ĊĠĠĠ Ġval Ġtv Channels : ĠList < Tv Channel > Ċ ) Ġ: ĠLocal ized Item Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġloaded Locales : ĠSet < Locale > Ġ= Ġempty Set () Ċ } Ċ Ċ class ĠFix ture Impl ( ĊĠĠĠ Ġval Ġid : ĠU RN , ĊĠĠĠ Ġprivate Ġval Ġfixture Cache : ĠFix ture Cache , ĊĠĠĠ Ġprivate Ġval Ġexception Handling Strategy : ĠException Handling Strategy , ĊĠĠĠ Ġprivate Ġval Ġlocales : ĠSet < Locale > Ċ ) Ġ: ĠFix ture Ġ{ ĊĊĠĠĠ Ġoverride Ġval ĠstartTime : ĠDate ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfetch Fixture ()?. startTime ĊĊĠĠĠ Ġoverride Ġval Ġextra Info : ĠMap < String , ĠString >? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfetch Fixture ()?. extra Info ĊĊĠĠĠ Ġoverride Ġval Ġtv Channels : ĠList < Tv Channel >? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfetch Fixture ()?. tv Channels ĊĊĠĠĠ Ġprivate Ġfun Ġfetch Fixture (): ĠLocal ized Fixture ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġfixture Cache . get Fixture ( id , Ġlocales . first ()) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( item Ġ== Ġnull Ġ&& Ġexception Handling Strategy Ġ== ĠException Handling Strategy . THROW ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠItem NotFoundException (" Comp et itor Ġ$ id Ġnot Ġfound ", Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }