/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 2 Ġdz iko ys k Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . repos il ite . plugin . javadoc Ċ Ċ import Ġcom . repos il ite . journal ist . Journal ist Ċ import Ġcom . repos il ite . journal ist . Logger Ċ import Ġcom . repos il ite . maven . Maven Facade Ċ import Ġcom . repos il ite . maven . api . Lookup Request Ċ import Ġcom . repos il ite . maven . api . Version Lookup Request Ċ import Ġcom . repos il ite . plugin . api . Facade Ċ import Ġcom . repos il ite . plugin . javadoc . api . Javadoc Response Ċ import Ġcom . repos il ite . plugin . javadoc . api . Javadoc Page Request Ċ import Ġcom . repos il ite . storage . api . FileType . FILE Ċ import Ġcom . repos il ite . storage . api . Location Ċ import Ġcom . repos il ite . storage . getSimpleName Ċ import Ġcom . repos il ite . token . AccessToken Identifier Ċ import Ġcom . repos il ite . web . http . ErrorResponse Ċ import Ġcom . repos il ite . web . http . error Response Ċ import Ġcom . repos il ite . web . http . not Found Ċ import Ġcom . repos il ite . web . http . not Found Error Ċ import Ġcom . repos il ite . web . http . un authorized Error Ċ import Ġio . jav al in . http . ContentType Ċ import Ġio . jav al in . http . Http Code . BAD _ REQUEST Ċ import Ġio . jav al in . http . Http Code . INTERNAL _ SERVER _ ERROR Ċ import Ġp anda . std . Result Ċ import Ġp anda . std . Result . ok Ċ import Ġp anda . std . as Success Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . InputStream Ċ import Ġjava . io . OutputStream Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . util . jar . Jar File Ċ import Ġkotlin . io . path . output Stream Ċ Ċ class ĠJ avadoc Facade Ġinternal Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġjavadoc Folder : ĠPath , ĊĠĠĠ Ġprivate Ġval Ġmaven Facade : ĠMaven Facade , ĊĠĠĠ Ġprivate Ġval Ġjournal ist : ĠJournal ist Ċ ) Ġ: ĠJournal ist , ĠF acade Ġ{ ĊĊĠĠĠ Ġfun Ġfind Javadoc Page ( request : ĠJ avadoc Page Request ): ĠResult < Javadoc Response , ĠError Response > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( accessToken , Ġrepository , Ġraw G av ) Ġ= Ġrequest ĊĊĠĠĠĠĠĠĠ Ġif Ġ( maven Facade . can Access Resource ( accessToken , Ġrepository , Ġraw G av ). is Err ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġun authorized Error () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġg av Ġ= Ġraw G av ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take If Ġ{ Ġit . contains ("/ latest ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . location Before Last ("/ latest ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġmaven Facade . find Latest ( Version Lookup Request ( accessToken , Ġrepository , Ġit )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . map Ġ{ Ġraw G av . replace (" latest ", Ġit . version ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . orElse Get Ġ{ Ġraw G av Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġraw G av ĊĊĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġjavadoc Folder . resolve ( repository ). resolve ( g av . toString ()) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Files . exists ( target ) Ġ&& Ġ( g av . getExtension () Ġ== Ġ" html " Ġ|| Ġg av . getExtension () Ġ== Ġ" css " Ġ|| Ġg av . getExtension () Ġ== Ġ" js ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcontentType Ġ= ĠContentType . get MimeType By Extension ( g av . getExtension ()) Ġ?: ĠContentType . PLAIN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠFiles . read All Lines ( target ). join ToString ( separator Ġ= Ġ"\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ avadoc Response ( contentType , Ġresponse ). as Success () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( no Such File Exception : ĠNoSuch File Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Found Error (" Resource Ġnot Ġfound !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( g av . contains ("/ resources / ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnot Found Error (" Resources Ġare Ġunavailable Ġbefore Ġextraction ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġjavadoc Jar Ġ= Ġresolve Javadoc Jar ( accessToken , Ġrepository , Ġg av ) Ġ?: Ġreturn Ġerror Response ( BAD _ REQUEST , Ġ" Invalid ĠG AV ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmaven Facade . find Details ( Lookup Request ( accessToken , Ġrepository , Ġjavadoc Jar )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter ({ Ġit . type Ġ=== ĠFILE Ġ}, Ġ{ ĠError Response ( BAD _ REQUEST , Ġ" Invalid Ġrequest ") Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter ({ Ġit . name . endsWith ("- javadoc . jar ") Ġ}, Ġ{ Ġnot Found (" Please Ġdo Ġnot Ġprovide Ġa Ġdirect Ġlink Ġto Ġa Ġnon Ġjavadoc Ġfile ! ĠG AV Ġmust Ġbe Ġpointing Ġto Ġa Ġdirectory Ġor Ġa Ġjavadoc Ġfile !") Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġextract Javadoc Jar ( accessToken , Ġrepository , Ġjavadoc Jar , Ġjavadoc Folder ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠJ avadoc Response ( ContentType . HTML , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Ġ{ Ġlogger . error (" Cannot Ġextract Ġjavadoc : Ġ${ it . message } Ġ(${ it . status }) }") Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConstructs Ġa Ġnew Ġg av Ġfrom Ġthe Ġinput Ġg av , Ġso Ġwe Ġcan Ġhandle Ġpaths Ġthat Ġend Ġwith Ġ/ index . html Ġfor Ġexample . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġresolve Javadoc Jar ( accessToken : ĠAccess Token Identifier ?, Ġrepository : ĠString , Ġg av : ĠLocation ): ĠLocation ? Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg av . endsWith (". jar ") Ġ-> Ġg av ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg av . endsWith ("/ index . html ") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot G av Ġ= Ġg av . location Before Last ("/ index . html ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelements Ġ= Ġroot G av . toString (). split ("/") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( elements . size Ġ>= Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġelements [ elements . size Ġ- Ġ 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġelements [ elements . size Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot G av . resolve ("${ name }-${ version }- javadoc . jar ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġresolve Javadoc Jar ( accessToken , Ġrepository , Ġg av . resolve (" index . html ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieves Ġthe Ġjavadoc Ġjar Ġfile Ġfrom Ġmaven Facade Ġusing Ġa ĠLookup Request . ĊĠĠĠĠ Ġ* ĠThen Ġit Ġwill Ġextract Ġthe Ġfiles Ġfrom Ġthe Ġjar Ġfile , Ġrename Ġindex . html Ġto Ġdoc index . html Ġand Ġgenerate Ġa Ġnew Ġindex . html Ġfile Ġusing Ġthe Ġwrite New Index Ġmethod . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġg av Ġthe Ġdirect Ġg av Ġto Ġthe Ġjavadoc Ġfile ĊĠĠĠĠ Ġ* Ġ@ param Ġjavadoc Folder Ġthe Ġtarget Ġfolder Ġin Ġwhich Ġthe Ġfiles Ġshould Ġbe Ġextracted ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġextract Javadoc Jar ( accessToken : ĠAccess Token Identifier ?, Ġrepository : ĠString , Ġg av : ĠLocation , Ġjavadoc Folder : ĠPath ): ĠResult < String , ĠError Response > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġg av . location Before Last ("/ "). toString () ĊĠĠĠĠĠĠĠ Ġval Ġtarget Folder Ġ= Ġjavadoc Folder . resolve ( repository ). resolve ( path ) ĊĠĠĠĠĠĠĠ Ġval Ġindex File Ġ= Ġtarget Folder . resolve (" index . html ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Files . exists ( index File )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġok ( Files . read All Lines ( index File ). join ToString ( separator Ġ= Ġ"\ n ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠFiles . create Directories ( target Folder ) ĊĠĠĠĠĠĠĠ Ġval Ġtarget Jar Ġ= Ġtarget Folder . resolve (" javadoc . jar ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmaven Facade . find File ( Lookup Request ( accessToken , Ġrepository , Ġg av )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. peek Ġ{ Ġit . copy To And Close ( File OutputStream ( target Jar . toString ())) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġextract Javadoc Archive ( target Jar , Ġtarget Folder ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . move ( index File , Ġtarget Folder . resolve (" doc index . html ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . write ( index File , ĠJ avadoc View . index (). toByteArray ( Charsets . UTF _ 8 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . read All Lines ( index File ). join ToString ( separator Ġ= Ġ"\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġextract Javadoc Archive ( jar FilePath : ĠPath , Ġdestination : ĠPath ): ĠResult < Unit , ĠError Response > Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . isDirectory ( jar FilePath ) Ġ-> Ġerror Response ( BAD _ REQUEST , Ġ" Java Doc Ġjar Ġpath Ġhas Ġto Ġbe Ġa Ġfile !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! Files . isDirectory ( destination ) Ġ-> Ġerror Response ( BAD _ REQUEST , Ġ" Destination Ġmust Ġbe Ġa Ġdirectory !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! jar FilePath . getSimpleName (). contains (" javadoc . jar ") Ġ-> Ġerror Response ( BAD _ REQUEST , Ġ" Invalid Ġjavadoc Ġjar ! ĠName Ġmust Ġcontain : Ġ' javadoc . jar '") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġjar FilePath . to AbsolutePath (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĠJar File ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. use Ġ{ Ġjar File Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( jar File . getEntry (" index . html ") ?. isDirectory Ġ!= Ġfalse ) Ġ{ Ġ// ĠMake Ġsure Ġwe Ġhave Ġan Ġindex . html Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġerror Response ( INTERNAL _ SERVER _ ERROR , Ġ" Invalid Ġjavadoc . jar Ġgiven Ġfor Ġextraction ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjar File . entries (). as Sequence (). forEach Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPaths . get ( destination . toString () Ġ+ Ġ"/" Ġ+ Ġfile . name ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! file . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . parent ?. also Ġ{ Ġparent Ġ-> ĠFiles . create Directories ( parent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjar File . getInputStream ( file ). copy To And Close ( it . output Stream ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. as Success < Unit , ĠError Response >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĠFiles . delete IfExists ( jar FilePath ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠInputStream . copy To And Close ( output : ĠOutputStream ) Ġ= ĊĠĠĠĠĠĠĠ Ġthis . use Ġ{ Ġoutput . use Ġ{ Ġthis . copy To ( output ) Ġ} Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Logger (): ĠLogger Ġ= ĊĠĠĠĠĠĠĠ Ġjournal ist . logger Ċ Ċ }