package Ġlang . tax i . packages Ċ Ċ import Ġlang . tax i . packages . utils . log Ċ import Ġnet . ling ala . zip 4 j . core . Zip File Ċ import Ġorg . apache . commons . io . FileUtils Ċ import Ġorg . apache . commons . io . IO Utils Ċ import Ġorg . apache . http . Http Entity Ċ import Ġorg . apache . http . HttpHeaders Ċ import Ġorg . apache . http . client . methods . HttpGet Ċ import Ġorg . apache . http . client . methods . RequestBuilder Ċ import Ġorg . apache . http . entity . ContentType Ċ import Ġorg . apache . http . impl . client . HttpClient Builder Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . nio . file . Path Ċ Ċ class ĠPackage Downloader Factory ( private Ġval Ġimporter Config : ĠImport er Config ) Ġ{ ĊĠĠ Ġfun Ġcreate ( project Config : ĠT axi Package Project ): ĠPackage Downloader Ġ= ĠPackage Downloader ( importer Config , Ġproject Config ) Ċ } Ċ Ċ class ĠPackage Downloader ( val Ġconfig : ĠImport er Config , Ġval Ġproject Config : ĠT axi Package Project ) Ġ{ ĊĠĠ Ġfun Ġdownload ( identifier : ĠPackage Identifier ): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġvar Ġdownloaded Ġ= Ġfalse ĊĠĠĠĠĠ Ġproject Config . repositories ĊĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġrepository Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! downloaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdownloaded Ġ= Ġattempt Download ( repository , Ġidentifier , Ġconfig . local Cache ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġdownloaded ĊĠĠ Ġ} ĊĊĠĠ Ġprivate Ġfun Ġattempt Download ( repository : ĠRepository , Ġidentifier : ĠPackage Identifier , Ġlocal Cache : ĠPath ): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġval Ġclient Ġ= ĠHttpClient Builder . create (). build () ĊĠĠĠĠĠ Ġval Ġname Ġ= Ġidentifier . name ĊĠĠĠĠĠ Ġval Ġurl Ġ= Ġ"${ repository . url }/ schemas /${ name . organisation }/${ name . name }/ releases /${ identifier . version }/ content " ĊĠĠĠĠĠ Ġlog (). info (" At tempting Ġto Ġdownload Ġ${ identifier . id } Ġfrom Ġ$ url ") ĊĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest Builder . get ( url ) ĊĠĠĠĠĠĠĠĠ Ġ. add Header ( HttpHeaders . CONTENT _ TYPE , ĠContentType . APPLICATION _ OCT ET _ STREAM . mime Type ) ĊĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠ Ġval Ġresponse Ġ= Ġclient . execute ( request ) ĊĠĠĠĠĠ Ġreturn Ġif Ġ( response . status Line . statusCode Ġin Ġ 2 0 0 .. 2 9 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠ Ġsave And Un zip ( response . entity , Ġlocal Cache , Ġidentifier ) ĊĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠ Ġlog (). info (" Couldn 't Ġdownload Ġfrom Ġ$ url Ġ- Ġgot Ġ${ response . status Line }") ĊĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġprivate Ġfun Ġsave And Un zip ( entity : ĠHttp Entity , Ġlocal Cache : ĠPath , Ġidentifier : ĠPackage Identifier ) Ġ{ ĊĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile . create TempFile ( identifier . id , Ġ". zip ") ĊĊĠĠĠĠĠ ĠFileOutputStream ( file ). use Ġ{ Ġfile Stream Ġ-> ĊĠĠĠĠĠĠĠĠ ĠIO Utils . copy ( entity . content , Ġfile Stream ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġlog (). info (" Downloaded Ġ${ identifier . id } Ġto Ġtemp Ġlocation Ġ${ file . canonical Path }") ĊĠĠĠĠĠ Ġval Ġpath Ġ= Ġidentifier . local Folder ( local Cache ). to File () ĊĠĠĠĠĠ ĠFileUtils . force Mk dir ( path ) ĊĠĠĠĠĠ ĠZip File ( file ). extract All ( path . canonical Path ) ĊĠĠĠĠĠ Ġlog (). info (" Extract ed Ġ${ identifier . id } Ġto Ġ${ path . canonical Path }") ĊĠĠ Ġ} Ċ Ċ } Ċ