package Ġcom . art f able . gradle . npm . repository Ċ Ċ import Ġcom . fasterxml . jackson . databind . JsonNode Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġorg . gradle . api . Task Ċ import Ġorg . gradle . api . logging . Logger Ċ import Ġjava . net . URL Ċ Ċ /** Ċ Ġ* Ġ@ author Ġart f able Ċ Ġ* Ġ 1 4 . 0 5 . 1 8 Ċ Ġ*/ Ċ class ĠDependency Resolver ( private Ġval ĠobjectMapper : ĠObjectMapper , Ġprivate Ġval Ġlogger : ĠLogger , Ġprivate Ġval Ġrepository : ĠString ) Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġresolved Versions : ĠMutable Map < String , ĠVersion > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġothers : ĠMutable Map < String , ĠMap < String , ĠList < Interval >>> ĊĠĠĠ Ġprivate Ġval Ġcache Nodes : ĠMutable Map < String , ĠJsonNode > Ġ= ĠHashMap () ĊĊĠĠĠ Ġfun Ġresolve Dependencies ( dependencies : ĠMutable Map < String , ĠList < Interval >>, Ġexclude s : ĠSet < String >): ĠMap < String , ĠString > Ġ{ ĊĠĠĠĠĠĠĠ Ġresolved Versions Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ Ġothers Ġ= Ġmutable Map Of ( Pair ("* MAIN *", Ġdependencies )) ĊĠĠĠĠĠĠĠ Ġprocess Dependencies ( dependencies , Ġexclude s ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresolved Versions . map Values Ġ{ Ġ( name , Ġversion ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . lifecycle (" [$ name ] Ġresolved Ġto Ġversion Ġ[ ${ version . version Str }] ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Nodes [ name ]?. get (" versions ") ?. get ( version . version Str )?. get (" dist ") ?. get (" tar ball ") ?. text Value (). or Empty () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Dependencies ( dependencies : ĠMap < String , ĠList < Interval >>, Ġexclude s : ĠSet < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchild Dependencies : ĠMutable Set < String > Ġ= ĠHashSet () ĊĠĠĠĠĠĠĠ Ġdependencies . forEach Ġ{ Ġ( name , Ġintervals ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolved Versions [ name ]?. let Ġ{ Ġversion Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intervals . any Ġ{ Ġit . match ( version ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Delete Ġdependencies Ġfor Ġ[$ name ] Ġversion Ġ[ ${ version . version Str }] ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolved Versions . remove ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġothers . remove ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmetadata Ġ= Ġget Dependency Metadata ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġversions Node : ĠJsonNode ? Ġ= Ġmetadata [" versions "] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġversions Node Ġ?: Ġthrow ĠIllegalArgumentException (" No Ġversions Ġfor Ġ[$ name ] Ġdependency !") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( version Str Ġin Ġversions Node . field Names (). as Sequence (). as Iterable (). reversed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġversion Ġ= ĠVersion ( version Str ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intervals . any Ġ{ Ġit . match ( version ) Ġ} Ġ&& Ġmatch All Dependencies ( name , Ġversion )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolved Versions [ name ] Ġ= Ġversion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Dependency Node : ĠJsonNode ? Ġ= Ġversions Node [ version Str ]?. get (" dependencies ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġde ced ent Dependencies : ĠMutable Map < String , ĠList < Interval >> Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Dependency Node ?. fields ()?. forEach Ġ{ Ġ( de ced ent Name , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! exclude s . contains ( de ced ent Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġde ced ent Dependencies [ de ced ent Name ] Ġ= Ġparse Version ( value . text Value ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Dependencies . add ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġothers [ name ] Ġ= Ġde ced ent Dependencies ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! resolved Versions . containsKey ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Can 't Ġresolve Ġversion Ġfor Ġ[$ name ]; Ġrequired Ġ${ dependencies [ name ]} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Pre limin arily Ġversion Ġfor Ġ[$ name ] Ġresolved Ġas Ġ[ ${ resolved Versions [ name ]?. version Str }] ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġchild Dependencies . forEach Ġ{ Ġname Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġothers [ name ] Ġ?: Ġthrow ĠIllegalStateException (" Lost Ġdependencies Ġfor Ġ[$ name ]; ĠResolved Ġversion Ġwas Ġ[ ${ resolved Versions [ name ]?. version Str }], Ġrequired Ġ${ dependencies [ name ]} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Dependencies ( others [ name ] !! , Ġexclude s ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmatch All Dependencies ( name : ĠString , Ġversion : ĠVersion ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ(( _, Ġdependencies ) Ġin Ġothers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies [ name ]?. none Ġ{ Ġit . match ( version ) Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Dependency Metadata ( name : ĠString ): ĠJsonNode Ġ{ ĊĠĠĠĠĠĠĠ Ġcache Nodes [ name ]?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlogger . lifecycle (" Loading Ġmetadata Ġfor Ġ[$ name ] ...") ĊĠĠĠĠĠĠĠ Ġ// Ġcan 't Ġuse ĠURL Encoder Ġas Ġsymbols Ġother Ġthan Ġ'/' Ġshouldn 't Ġbe Ġencoded ĊĠĠĠĠĠĠĠ Ġval Ġmetadata Ġ= ĠobjectMapper . read Tree ( URL ( repository Ġ+ Ġname . replace ("/", Ġ"% 2 F ")). open Stream ()) ĊĠĠĠĠĠĠĠ Ġcache Nodes [ name ] Ġ= Ġmetadata ĊĠĠĠĠĠĠĠ Ġreturn Ġmetadata ĊĠĠĠ Ġ} Ċ }