package Ġgu dd . internal Ċ Ċ import Ġgu dd . Gu dd Dependency Ċ import Ġorg . js oup . J soup Ċ import Ġorg . js oup . nodes . Document Ċ import Ġjava . io . File Ċ import Ġjava . net . URL Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ Ċ private Ġconst Ġval Ġgithub BaseUrl Ġ= Ġ" https :// github . com " Ċ private Ġconst Ġval ĠAS SETS _ HEADER Ġ= Ġ" Assets " Ċ Ċ private Ġdata Ġclass ĠResource ( ĊĠĠĠ Ġval Ġhref : ĠString , ĊĠĠĠ Ġval Ġname : ĠString , Ċ ) Ċ Ċ internal Ġclass ĠGithub Dependency Downloader Ġ{ ĊĠĠĠ Ġfun Ġdownload ( dependency : ĠGu dd Dependency , Ġtarget : ĠFile ): ĠCompletableFuture < Unit > Ġ= ĠCompletableFuture . run Async Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Target Ġ= Ġcompute Target Directory ( target , Ġdependency ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also ( File :: mkdir s ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= ĠJ soup . connect ( parse Dependency To Url ( dependency )). get () ĊĠĠĠĠĠĠĠ Ġval Ġresources Ġ= Ġextract Dependency Urls From ( document ) ĊĊĠĠĠĠĠĠĠ Ġdownload Resources Into ( project Target , Ġresources ) ĊĠĠĠ Ġ}. then Apply Ġ{ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompute Target Directory ( target : ĠFile , Ġdependency : ĠGu dd Dependency ) Ġ= Ġtarget ĊĠĠĠĠĠĠĠ Ġ. resolve ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdependency . groupId . split ('.') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus ( dependency . artifactId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus ( dependency . version ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ("/") ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġparse Dependency To Url ( dep : ĠGu dd Dependency ) Ġ= ĊĠĠĠĠĠĠĠ Ġ"$ github BaseUrl /${ dep . author }/${ dep . projectName }/ packages /${ dep . projectId }? version =${ dep . version }" ĊĊĠĠĠ Ġprivate Ġfun Ġextract Dependency Urls From ( document : ĠDocument ) Ġ= Ġdocument ĊĠĠĠĠĠĠĠ Ġ. getElementsBy Tag (" h 4 ") ĊĠĠĠĠĠĠĠ Ġ. first Ġ{ Ġit . has Text () Ġ&& Ġit . own Text () Ġ== ĠAS SETS _ HEADER Ġ} ĊĠĠĠĠĠĠĠ Ġ. nextElement Sibling () ĊĠĠĠĠĠĠĠ Ġ. getElementsBy Tag (" a ") ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠResource ( it . attr (" href "), Ġit . text ()) Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdownload Resources Into ( project Target : ĠFile , Ġresources : ĠList < Resource >) Ġ{ ĊĠĠĠĠĠĠĠ Ġresources . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġproject Target . resolve ( it . name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . createNew File () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠURL ( it . href ). open Stream (). transfer To ( file . output Stream ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }