package Ġio . data wire . loom . proto . data Ċ Ċ import Ġcom . amazonaws . services . s 3 . model . List Objects V 2 Request Ċ import Ġio . data wire . loom . proto . aws . Aws Provider Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġkotlin . reflect . K Class ĊĊ Ċ class ĠAws S 3 Dao < T : ĠAny >( ĊĠĠĠ Ġprivate Ġval Ġaws : ĠAws Provider , ĊĠĠĠ Ġprivate Ġval Ġdao Type : ĠK Class < T >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ prefix : ĠString ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġbucket Ġ= Ġaws . state Storage Bucket Name ĊĠĠĠ Ġprivate Ġval Ġprefix Ġ= Ġ_ prefix . toLowerCase () ĊĠĠĠ Ġprivate Ġval Ġs 3 ĠĠĠĠ Ġ= Ġaws . state Storage Client ĊĊĠĠĠ Ġprivate Ġval Ġcache Ġ= ĠConcurrent HashMap < String , ĠT >() ĊĊĠĠĠ Ġfun Ġdelete ( key : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġobject Key Ġ= Ġcreate Object Key ( key ) ĊĠĠĠĠĠĠĠ Ġs 3 . delete Object ( bucket , Ġobject Key ) ĊĠĠĠĠĠĠĠ Ġcache . remove ( object Key ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget ( key : ĠString ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġobject Key Ġ= Ġcreate Object Key ( key ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcache [ object Key ] Ġ?: ĠgetObject AsString OrNull ( object Key )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġfrom Json ( it , Ġdao Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache . put If Absent ( object Key , Ġmodel ) Ġ?: Ġmodel ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġput ( key : ĠString , Ġmodel : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġobject Key Ġ= Ġcreate Object Key ( key ) ĊĠĠĠĠĠĠĠ Ġs 3 . put Object ( bucket , Ġobject Key , ĠtoJson ( model )) ĊĠĠĠĠĠĠĠ Ġcache [ object Key ] Ġ= Ġmodel ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlist Items ( prefix : ĠString ? Ġ= Ġnull ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠList Objects V 2 Request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Bucket Name ( bucket ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Prefix ( prefix ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġs 3 . list Objects V 2 ( list ). object Sum maries . map Ġ{ Ġit . key . replace ( prefix Ġ?: Ġ"", Ġ"") Ġ}. filter Not Ġ{ Ġit . endsWith (". tf state ") Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Object Key ( key : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ prefix /$ key " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetObject AsString OrNull ( key : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs 3 . getObject AsString ( bucket , Ġkey ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( any : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }