package Ġorg . living doc . repositories . rest Ċ Ċ import Ġio . ktor . client . HttpClient Ċ import Ġio . ktor . client . call . receive Ċ import Ġio . ktor . client . features . Client RequestException Ċ import Ġio . ktor . client . request . get Ċ import Ġio . ktor . client . response . HttpResponse Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . living doc . repositories . Document Ċ import Ġorg . living doc . repositories . Document Repository Ċ import Ġorg . living doc . repositories . cache . Cache Helper Ċ import Ġorg . living doc . repositories . cache . Invalid Cache Policy Exception Ċ import Ġorg . living doc . repositories . format . Document Format Manager Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Ċ import Ġjava . nio . file . Paths Ċ Ċ /** Ċ Ġ* ĠThis Ġimplementation Ġof Ġa ĠDocument Repository Ġuses Ġa Ġremote ĠHTTP Ġserver Ġto Ġget Ġthe ĠDocuments Ġfrom . Ċ Ġ* ĠThe Ġremote Ġhost Ġcan Ġbe Ġconfigured Ġin Ġthe Ġliving doc . yml Ġconfig Ġsection Ġof Ġthe Ġrepository . ĠUse Ġbase URL Ġto Ġset Ġthe Ġbase Ċ Ġ* Ġurl Ġof Ġthe Ġremote Ġhost Ġthat Ġhosts Ġthe ĠDocuments . ĠAs Ġdefault Ġthe Ġserver Ġon Ġport Ġ 8 0 Ġon Ġthe Ġlocalhost Ġis Ġused Ġas ĠREST Ċ Ġ* ĠRepository . Ċ Ġ*/ Ċ class ĠREST Repository ( ĊĠĠĠ Ġprivate Ġval Ġname : ĠString , ĊĠĠĠ Ġprivate Ġval Ġconfig : ĠREST Repository Config , ĊĠĠĠ Ġprivate Ġval Ġclient : ĠHttpClient Ġ= ĠHttpClient () Ċ ) Ġ: ĠDocument Repository Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlog : ĠLogger Ġ= ĠLoggerFactory . getLogger ( REST Repository :: class . java ) ĊĊĠĠĠ Ġoverride Ġfun Ġget Document ( document Identifier : ĠString ): ĠDocument Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( config . cache Config . cache Policy ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCache Helper . CACHE _ ALWAYS Ġ-> Ġhandle Cache Always ( document Identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCache Helper . CACHE _ ON CE Ġ-> Ġhandle Cache Once ( document Identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCache Helper . NO _ CACHE Ġ-> Ġhandle No Cache ( document Identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠInvalid Cache Policy Exception ( config . cache Config . cache Policy ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Cache Always ( document Identifier : ĠString ): ĠDocument Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Cache Helper . has Active Network ( config . base URL )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget From Request And Cache ( document Identifier ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġget From Cache ( document Identifier ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Cache Once ( document Identifier : ĠString ): ĠDocument Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Cache Helper . is Cached ( Paths . get ( config . cache Config . path , Ġdocument Identifier ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget From Cache ( document Identifier ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġget From Request And Cache ( document Identifier ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle No Cache ( document Identifier : ĠString ): ĠDocument Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠDocument Format Manager . get Format (" html "). parse ( getRequest ( document Identifier )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget From Request And Cache ( document Identifier : ĠString ): ĠDocument Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġget Request ( document Identifier ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCache Helper . cache InputStream ( request , ĠPaths . get ( config . cache Config . path , Ġdocument Identifier )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠREST Document NotFoundException ( e , Ġdocument Identifier , Ġconfig . base URL ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġget From Cache ( document Identifier ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Request ( document Identifier : ĠString ): ĠInputStream Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Get ĠDocument Ġfrom Ġurl Ġ{}", Ġconfig . base URL Ġ+ Ġdocument Identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . get < HttpResponse >( config . base URL Ġ+ Ġdocument Identifier ). receive < InputStream >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠREST Document NotFoundException ( e , Ġdocument Identifier , Ġconfig . base URL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClient RequestException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠREST Document NotFoundException ( e , Ġdocument Identifier , Ġconfig . base URL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget From Cache ( document Identifier : ĠString ): ĠDocument Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug (" Get ĠDocument Ġfrom Ġcache Ġ{}", Ġdocument Identifier ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument Stream Ġ= ĠCache Helper . getCache InputStream ( Paths . get ( config . cache Config . path , Ġdocument Identifier )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDocument Format Manager . get Format (" html "). parse ( document Stream ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠREST Document NotFoundException ( e , Ġdocument Identifier , Ġconfig . base URL ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ