package Ġorg . w eef ic . cache . web Ċ Ċ import Ġorg . w eef ic . cache . Cache Ċ import Ġorg . w eef ic . cache . File Cache Provider Ċ import Ġorg . w eef ic . cache . sha 1 Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . Request Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . ByteArray InputStream Ċ import Ġjava . io . Closeable Ċ import Ġjava . io . InputStream Ċ import Ġjava . net . URL Ċ import Ġjava . util . concurrent . Executors Ċ Ċ class ĠWeb Cache Provider ( val Ġfile Cache : ĠFile Cache Provider ?) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠLOG Ġ= ĠLoggerFactory . getLogger (" web - provider ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcaches Ġ= Ġmutable Map Of < String , ĠWeb Cache >() ĊĠĠĠ Ġprivate Ġval Ġexecutor Ġ= ĠExec utors . new Cached ThreadPool () ĊĊĠĠĠ Ġ@ Throws ( Web Exception :: class ) ĊĠĠĠ Ġfun Ġload ( url : ĠURL ): ĠCache Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġidentifier Ġ= Ġurl . path . sha 1 ĊĠĠĠĠĠĠĠ ĠLOG . info ("[ {}] ĠFind Ġcache Ġ: Ġ{}", Ġidentifier , Ġurl ) ĊĠĠĠĠĠĠĠ Ġ// Ġ å°Ŀè¯ķ ä»İ æĸĩä»¶ åĬłè½½ ĊĠĠĠĠĠĠĠ Ġthis . file Cache ?. load ( identifier )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info ("[ {}] ĠLoad Ġfrom Ġfile Ġcache ", Ġidentifier ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġä»İ åĨħåŃĺ è¯»åıĸ ĊĠĠĠĠĠĠĠ Ġsynchronized ( this . cache s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . cache s [ identifier ] ĊĠĠĠĠĠĠĠ Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info ("[ {}] ĠLoad Ġfrom Ġmemory Ġcache ", Ġidentifier ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit . getCache () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġä»İ ç½ĳç»ľ è¯·æ±Ĥ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . web Load ( url , Ġidentifier ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Throws ĊĠĠĠ Ġprivate Ġfun Ġweb Load ( url : ĠURL , Ġidentifier : ĠString ): ĠCache Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ åħĪ åĲĳ ç½ĳç»ľ åıĳéĢģ è¯·æ±Ĥ ĊĠĠĠĠĠĠĠ Ġval ĠhttpClient Ġ= ĠOk HttpClient . Builder (). build () ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder (). url ( url ). build () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠhttpClient . new Call ( request ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġè¯·æ±Ĥ è¿ĶåĽŀ 2 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . code () Ġ== Ġ 2 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġresponse . body () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( body Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġæ ² ¡ æľī åĨħå®¹ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCache ( identifier , ĠByteArrayInputStream ( ByteArray ( 0 )), Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Size Ġ= Ġbody . content Length () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstream Ġ= Ġbody . byte Stream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( this . cache s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġweb Cache Ġ= Ġthis . cache s [ identifier ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( web Cache Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Cache Ġ= ĠWeb Cache ( identifier , Ġcontent Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . cache s [ identifier ] Ġ= Ġweb Cache ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . async Load Content ( identifier , Ġweb Cache , Ġstream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . close Quiet ly ( stream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġweb Cache . getCache () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġè¯·æ±Ĥ è¿ĶåĽŀ åħ¶ä»ĸ åĢ¼ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠWeb Exception ( response . code ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠWeb Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġ Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . warn ( null , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ç½ĳç»ľ å¼Ĥå¸¸ , ĠæĬ Ľ åĩº 5 0 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠWeb Exception ( 5 0 3 , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġasync Load Content ( identifier : ĠString , Ġweb Cache : ĠWeb Cache , Ġstream : ĠInputStream ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . executor . submit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info ("[ {}] ĠStart Ġload ", Ġidentifier ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteArray ( 1 0 2 4 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġread Ġ= Ġstream . read ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( read Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Cache . append ( buffer , Ġread ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info ("[ {}] ĠCache Ġloaded ", Ġidentifier ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åħ¨éĥ¨ åĨħå®¹ å·² è¯»åıĸ , Ġ å°Ŀè¯ķ ç¼ĵåŃĺ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . file Cache ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . store ( identifier , ĠByteArrayInputStream ( web Cache . data )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ å·²ç»ı åŃĺåĤ¨ åĪ° æĸĩä»¶ , Ġä»İ åĨħåŃĺ ç§»éĻ¤ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( this . cache s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . cache s . remove ( identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . warn ("[ {}] ĠWeb Ġexception ", Ġidentifier , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ç½ĳç»ľ å¼Ĥå¸¸ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( this . cache s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . cache s . remove ( identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Cache . finish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . close Quiet ly ( stream ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclose Quiet ly ( stream : ĠClose able ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream . close () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }