package Ġorg . living doc . repositories . con fluence Ċ Ċ import Ġcom . atlassian . con fluence . api . model . Expansion Ċ import Ġcom . atlassian . con fluence . api . model . Exp ans ions Ċ import Ġcom . atlassian . con fluence . api . model . content . Content Ċ import Ġcom . atlassian . con fluence . api . model . content . Content Representation Ċ import Ġcom . atlassian . con fluence . api . model . content . id . Content Id Ċ import Ġcom . atlassian . con fluence . rest . client . Remote Content Service Ċ import Ġcom . atlassian . con fluence . rest . client . Remote Content ServiceImpl Ċ import Ġcom . atlassian . con fluence . rest . client . RestClient Factory Ċ import Ġcom . atlassian . con fluence . rest . client . authentication . Authenticated Web Resource Provider Ċ import Ġcom . google . common . util . concurrent . More Executors Ċ 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 . Html Format Ċ import Ġjava . io . ByteArray InputStream Ċ import Ġjava . io . InputStream Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . util . concurrent . ExecutionException Ċ Ċ /** Ċ Ġ* ĠThis Ġimplementation Ġof Ġa ĠDocument Repository Ġuses Ġa ĠCon fluence Ġserver Ġto Ġget Ġthe ĠDocuments Ġfrom . Ċ Ġ* ĠThe Ġremote ĠCon fluence Ġserver Ġcan Ġbe Ġconfigured Ġin Ġthe Ġliving doc . yml Ġconfig Ġsection Ġof Ġthe Ġrepository . Ċ Ġ*/ Ċ class ĠCon fluence Repository ( ĊĠĠĠ Ġprivate Ġval Ġname : ĠString , ĊĠĠĠ Ġprivate Ġval Ġconfig : ĠCon fluence Repository Config Ċ ) Ġ: ĠDocument Repository Ġ{ ĊĠĠĠ Ġprivate Ġval Ġclient : ĠRemote Content Service ĊĠĠĠ Ġprivate Ġval Ġversioning Separator Ġ= Ġ'@ ' ĊĊĠĠĠ Ġdata Ġclass ĠCon fluence Identifier ( val Ġdocument Id : ĠString , Ġval Ġdocument Version : ĠInt ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġauthenticated Web Resource Provider Ġ= ĠAuth enticated Web Resource Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRest Client Factory . new Client (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . base URL , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . path ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġauthenticated Web Resource Provider . set Auth Context ( config . username , Ġconfig . password . toCharArray ()) ĊĠĠĠĠĠĠĠ Ġclient Ġ= ĠRemote Content ServiceImpl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauthenticated Web Resource Provider , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMore Executors . new Direct ExecutorService () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġa Ġcon fluence Ġpage Ġas ĠDocument . ĠThis Ġmethod Ġuses Ġthe Ġxml Ġrepresentation Ġof Ġthe Ġcon fluence Ġpage . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdocument Identifier Ġthe ĠDocument ID Ġof Ġthe Ġcon fluence Ġpage ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ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 ĠgetContent 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 ĠgetContent And Cache ( document Identifier ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle No Cache ( document Identifier : ĠString ): ĠDocument Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= ĠgetContent ( document Identifier ) ĊĠĠĠĠĠĠĠ Ġval Ġcontent Value Ġ= ĠgetContent Value ( content ) ĊĠĠĠĠĠĠĠ Ġreturn Ġparse Content Value ( content Value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReads Ġthe ĠDocument Id Ġand Ġthe ĠPage ĠVersion Ġfrom Ġan Ġdocument Identifier Ġand Ġreturns Ġit . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdocument Identifier ĠThe Ġraw ĠDocument Identifier Ġcontaining ĠID Ġand ĠVersion ĊĠĠĠĠ Ġ* Ġ@ return ĠA ĠPair Ġcontaining Ġthe ĠCon fluence ĠPage ĠID Ġand Ġthe ĠPage ĠVersion ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Document Id And Version ( document Identifier : ĠString ): ĠCon fluence Identifier Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdoc Params Ġ= Ġdocument Identifier . split ( version ing Separator ) ĊĠĠĠĠĠĠĠ Ġval Ġdoc Id Ġ= Ġdoc Params [ 0 ] ĊĠĠĠĠĠĠĠ Ġif Ġ( doc Params . size Ġ!= Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCon fluence Document NotFoundException ( doc Params . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdoc Version Ġ= Ġdoc Params [ 1 ]. toInt () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠCon fluence Identifier ( doc Id , Ġdoc Version ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetContent And Cache ( document Identifier : ĠString ): ĠDocument Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= ĠgetContent ( document Identifier ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Stream Ġ= ĠgetContent Value ( content ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCache Helper . cache InputStream ( content Stream , ĠPaths . get ( config . cache Config . path , Ġdocument Identifier )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCon fluence Document NotFoundException ( e , Ġdocument Identifier , Ġconfig . base URL ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġget From Cache ( document Identifier ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetContent ( document Identifier : ĠString ): ĠContent Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpage Ġ= Ġclient . find ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExp ansion ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContent . Exp ans ions . BODY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExp ans ions ( Expansion (" storage ", ĠExp ans ions ( Expansion (" content ")) )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Fetcher Ġ= Ġif Ġ( document Identifier . contains ( version ing Separator )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc Params Ġ= Ġget Document Id And Version ( document Identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage . with Id And Version ( Content Id . valueOf ( doc Params . document Id ), Ġdoc Params . document Version ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage . with Id ( Content Id . valueOf ( document Identifier )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Fetcher . fetch Completion Stage () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Comp letableFuture (). get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. orElse Throw Ġ{ ĠCon fluence Document NotFoundException ( document Identifier , Ġconfig . base URL ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠExecution Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCon fluence Document NotFoundException ( e , Ġdocument Identifier , Ġconfig . base URL ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetContent Value ( content : ĠContent ): ĠByteArrayInputStream Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġcontent . body [ Content Representation . STORAGE ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" Content Ġmust Ġcontain Ġthe Ġstorage Ġrepresentation ") ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġbody . value ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue . byte InputStream ( StandardCharsets . UTF _ 8 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget From Cache ( document Identifier : ĠString ): ĠDocument Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcache InputStream Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCache Helper . getCache InputStream ( Paths . get ( config . cache Config . path , Ġdocument Identifier )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġparse Content Value ( cache InputStream ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCon fluence Document NotFoundException ( e , Ġdocument Identifier , Ġconfig . base URL ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠParses Ġthe Ġ[ content Value ] Ġreturned Ġby Ġthe Ġcon fluence Ġclient Ġlibrary Ġinto Ġa ĠDocument Ġof ĠL iving Doc ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġparse Content Value ( content Value : ĠInputStream ): ĠDocument Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠHtml Format (). parse ( content Value ) ĊĠĠĠ Ġ} Ċ } Ċ