/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 1 ĠSquare , ĠInc . Ċ Ġ* Ċ Ġ* Ġ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 Ġapp . cash . license e Ċ Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . artifacts . component . Component Identifier Ċ import Ġorg . gradle . api . artifacts . component . Module Component Identifier Ċ import Ġorg . gradle . api . artifacts . component . Project Component Identifier Ċ import Ġorg . gradle . api . artifacts . result . Resolved Component Result Ċ import Ġorg . gradle . api . artifacts . result . Resolved Dependency Result Ċ import Ġorg . gradle . api . logging . Logger Ċ import Ġorg . w 3 c . dom . Node Ċ import Ġorg . w 3 c . dom . NodeList Ċ import Ġjava . io . Serializable Ċ import Ġjavax . xml . parsers . Document BuilderFactory Ċ Ċ internal Ġdata Ġclass ĠDependency Config ( ĊĠ Ġval Ġignored Group Ids : ĠMap < String , ĠIgnore d Data >, ĊĠ Ġval Ġignored Coordinates : ĠMap < String , ĠMap < String , ĠIgnore d Data >>, Ċ ) Ġ: ĠSerializable Ċ Ċ internal Ġdata Ġclass ĠIgnore d Data ( ĊĠ Ġval Ġreason : ĠString ?, ĊĠ Ġval Ġtrans itive : ĠBoolean , Ċ ) Ġ: ĠSerializable Ċ Ċ internal Ġfun Ġload Dependency Coordinates ( ĊĠ Ġlogger : ĠLogger , ĊĠ Ġroot : ĠResolved Component Result , ĊĠ Ġconfig : ĠDependency Config , Ċ ): ĠDependency Resolution Result Ġ{ ĊĠ Ġval Ġwarnings Ġ= Ġmutable ListOf < String >() ĊĊĠ Ġval Ġunused Group Ids Ġ= Ġconfig . ignored Group Ids . keys . to Mutable Set () ĊĠ Ġval Ġunused Coordinates Ġ= Ġmutable Set Of < Pair < String , ĠString >>() ĊĠ Ġfor Ġ(( groupId , Ġartifacts ) Ġin Ġconfig . ignored Coordinates ) Ġ{ ĊĠĠĠ Ġval Ġredundant Ġ= ĠgroupId Ġin Ġconfig . ignored Group Ids ĊĠĠĠ Ġfor Ġ( artifactId Ġin Ġartifacts . keys ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( red undant ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwarnings Ġ+= Ġ" Ignore Ġfor Ġ$ groupId :$ artifactId Ġis Ġredundant Ġas Ġ$ groupId Ġis Ġalso Ġignored " ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġunused Coordinates Ġ+= ĠgroupId Ġto Ġartifact Id ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġval Ġcoordinates Ġ= Ġmutable Set Of < Dependency Coordinates >() ĊĠ Ġload Dependency Coordinates ( logger , Ġroot , Ġconfig , Ġunused Group Ids , Ġunused Coordinates , Ġcoordinates , Ġmutable Set Of (), Ġdepth Ġ= Ġ 1 ) ĊĊĠ Ġfor Ġ( unused GroupId Ġin Ġunused Group Ids ) Ġ{ ĊĠĠĠ Ġwarnings Ġ+= Ġ" Dependency Ġignore Ġfor Ġ$ unused GroupId Ġis Ġunused " ĊĠ Ġ} ĊĠ Ġfor Ġ(( groupId , Ġartifact Id ) Ġin Ġunused Coordinates ) Ġ{ ĊĠĠĠ Ġwarnings Ġ+= Ġ" Dependency Ġignore Ġfor Ġ$ groupId :$ artifactId Ġis Ġunused " ĊĠ Ġ} ĊĊĠ Ġreturn ĠDependency Resolution Result ( coordinates , Ġwarnings ) Ċ } Ċ Ċ internal Ġdata Ġclass ĠDependency Resolution Result ( ĊĠ Ġval Ġcoordinates : ĠSet < Dependency Coordinates >, ĊĠ Ġval Ġconfig Warnings : ĠList < String >, Ċ ) Ċ Ċ private Ġfun Ġload Dependency Coordinates ( ĊĠ Ġlogger : ĠLogger , ĊĠ Ġroot : ĠResolved Component Result , ĊĠ Ġconfig : ĠDependency Config , ĊĠ Ġunused Group Ids : ĠMutable Set < String >, ĊĠ Ġunused Coordinates : ĠMutable Set < Pair < String , ĠString >>, ĊĠ Ġdestination : ĠMutable Set < Dependency Coordinates >, ĊĠ Ġseen : ĠMutable Set < Component Identifier >, ĊĠ Ġdepth : ĠInt , Ċ ) Ġ{ ĊĠ Ġval Ġid Ġ= Ġroot . id ĊĊĠ Ġvar Ġprocess Trans itive Dependencies Ġ= Ġtrue ĊĠ Ġvar Ġignore Suffix : ĠString ? Ġ= Ġnull ĊĠ Ġwhen Ġ( id ) Ġ{ ĊĠĠĠ Ġis ĠProject Component Identifier Ġ-> Ġ{ ĊĠĠĠĠĠ Ġ// ĠLocal Ġdependency , Ġdo Ġnothing . ĊĠĠĠĠĠ Ġignore Suffix Ġ= Ġ" Ġignoring Ġbecause Ġproject Ġdependency " ĊĠĠĠ Ġ} ĊĠĠĠ Ġis ĠModule Component Identifier Ġ-> Ġ{ ĊĠĠĠĠĠ Ġif Ġ( id . group Ġ== Ġ"" Ġ&& Ġid . version Ġ== Ġ"") Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAss uming Ġflat - dir Ġrepository Ġdependency , Ġdo Ġnothing . ĊĠĠĠĠĠĠĠ Ġignore Suffix Ġ= Ġ" Ġignoring Ġbecause Ġflat - dir Ġrepository Ġartifact Ġhas Ġno Ġmetadata " ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġignored Data Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠ Ġ?: Ġconfig . ignored Group Ids [ id . group ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . also Ġ{ Ġunused Group Ids Ġ-= Ġid . group Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ?: Ġconfig . ignored Coordinates [ id . group ]?. get ( id . module ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . also Ġ{ Ġunused Coordinates Ġ-= Ġid . group Ġto Ġid . module Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( ignored Data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġignore Suffix Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Ġignoring ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ignored Data . trans itive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Ġ[ trans itive = true ]") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ignored Data . reason Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Ġbecause Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( ignored Data . reason ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġprocess Trans itive Dependencies Ġ= Ġ! ignored Data . trans itive ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġdestination Ġ+= ĠDependency Coordinates ( id . group , Ġid . module , Ġid . version ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ-> Ġerror (" Unknown Ġdependency Ġ${ id :: class . java }: Ġ$ id ") ĊĠ Ġ} ĊĊĠ Ġif Ġ( logger . is Info Enabled ) Ġ{ ĊĠĠĠ Ġlogger . info ( ĊĠĠĠĠĠ Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠ Ġrepeat ( depth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġappend (" Ġ Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġappend ( id ) ĊĠĠĠĠĠĠĠ Ġif Ġ( ignore Suffix Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġappend ( ignore Suffix ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġif Ġ( process Trans itive Dependencies ) Ġ{ ĊĠĠĠ Ġfor Ġ( dependency Ġin Ġroot . dependencies ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( dependency Ġis ĠResolved Dependency Result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġselected Ġ= Ġdependency . selected ĊĠĠĠĠĠĠĠ Ġif Ġ( seen . add ( selected . id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġload Dependency Coordinates ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger , Ġselected , Ġconfig , Ġunused Group Ids , Ġunused Coordinates , Ġdestination , Ġseen , Ġdepth Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ internal Ġfun Ġload P om Info ( ĊĠ Ġproject : ĠProject , ĊĠ Ġlogger : ĠLogger , ĊĠ Ġid : ĠDependency Coordinates , ĊĠ Ġdepth : ĠInt Ġ= Ġ 0 , Ċ ): ĠP om Info Ġ{ ĊĠ Ġval Ġpom Coordinates Ġ= Ġwith ( id ) Ġ{ Ġ"$ group :$ artifact :$ version @ pom " Ġ} ĊĠ Ġval Ġpom Dependency Ġ= Ġproject . dependencies . create ( pom Coordinates ) ĊĠ Ġval Ġpom Configuration Ġ= Ġproject . configurations ĊĠĠĠ Ġ. det ached Configuration ( pom Dependency ) ĊĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠ Ġ// ĠSee Ġhttps :// docs . gradle . org / current / user guide / dependency _ verification . html # sub : dis abling - specific - verification . ĊĠĠĠĠĠ Ġresolution Strategy . disable Dependency Verification () ĊĠĠĠ Ġ} ĊĠĠĠ Ġ. resolved Configuration ĊĠĠĠ Ġ. len ient Configuration ĊĊĠ Ġval Ġresolved Files Ġ= Ġpom Configuration ĊĠĠĠ Ġ. all Module Dependencies ĊĠĠĠ Ġ. flatMap Ġ{ Ġit . all Module Artifacts Ġ} ĊĠĠĠ Ġ. map Ġ{ Ġit . file Ġ} ĊĊĠ Ġif Ġ( logger . is Info Enabled ) Ġ{ ĊĠĠĠ Ġlogger . info ( ĊĠĠĠĠĠ Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠ Ġrepeat ( depth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġappend (" Ġ Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġappend ( pom Coordinates ) ĊĠĠĠĠĠĠĠ Ġappend (' Ġ') ĊĠĠĠĠĠĠĠ Ġappend ( resolved Files ) ĊĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠ Ġpom Configuration . un resolved Module Dependencies . single OrNull ()?. problem , ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġif Ġ( resolved Files . isEmpty ()) Ġ{ ĊĠĠĠ Ġreturn ĠP om Info ( null , Ġempty Set (), Ġnull ) ĊĠ Ġ} ĊĊĠ Ġval Ġfactory Ġ= ĠDocument BuilderFactory . newInstance () ĊĠ Ġval Ġpom Document Ġ= Ġfactory . new Document Builder (). parse ( resolved Files . single ()) ĊĊĠ Ġvar Ġlicenses Node : ĠNode ? Ġ= Ġnull ĊĠ Ġvar Ġsc m Node : ĠNode ? Ġ= Ġnull ĊĠ Ġvar Ġparent Node : ĠNode ? Ġ= Ġnull ĊĠ Ġvar Ġartifact Name : ĠString ? Ġ= Ġnull ĊĠ Ġfor Ġ( child Node Ġin Ġpom Document . documentElement . childNodes ) Ġ{ ĊĠĠĠ Ġwhen Ġ( child Node . nodeName ) Ġ{ ĊĠĠĠĠĠ Ġ" licenses " Ġ-> Ġlicenses Node Ġ= Ġchild Node ĊĠĠĠĠĠ Ġ" scm " Ġ-> Ġsc m Node Ġ= Ġchild Node ĊĠĠĠĠĠ Ġ" parent " Ġ-> Ġparent Node Ġ= Ġchild Node ĊĠĠĠĠĠ Ġ" name " Ġ-> Ġartifact Name Ġ= Ġchild Node . textContent ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġval Ġlicenses Ġ= Ġmutable Set Of < P om License >() ĊĠ Ġif Ġ( licenses Node Ġ!= Ġnull ) Ġ{ ĊĠĠĠ Ġfor Ġ( license Node Ġin Ġlicenses Node . childNodes ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( license Node . nodeName Ġ== Ġ" license ") Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġname : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġurl : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġfor Ġ( property Node Ġin Ġlicense Node . childNodes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( property Node . nodeName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" name " Ġ-> Ġname Ġ= Ġproperty Node . textContent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" url " Ġ-> Ġurl Ġ= Ġproperty Node . textContent ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( name Ġ!= Ġnull Ġ|| Ġurl Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlicenses Ġ+= ĠP om License ( name , Ġurl ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġvar Ġsc m : ĠP om Sc m ? Ġ= Ġnull ĊĠ Ġif Ġ( scm Node Ġ!= Ġnull ) Ġ{ ĊĠĠĠ Ġfor Ġ( property Node Ġin Ġsc m Node . childNodes ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( property Node . nodeName Ġ== Ġ" url ") Ġ{ ĊĠĠĠĠĠĠĠ Ġsc m Ġ= ĠP om Sc m ( property Node . textContent ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġif Ġ( parentNode Ġ!= Ġnull ) Ġ{ ĊĠĠĠ Ġvar Ġgroup : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġartifact : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġversion : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġfor Ġ( property Node Ġin Ġparent Node . childNodes ) Ġ{ ĊĠĠĠĠĠ Ġwhen Ġ( property Node . nodeName ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" groupId " Ġ-> Ġgroup Ġ= Ġproperty Node . textContent ĊĠĠĠĠĠĠĠ Ġ" artifactId " Ġ-> Ġartifact Ġ= Ġproperty Node . textContent ĊĠĠĠĠĠĠĠ Ġ" version " Ġ-> Ġversion Ġ= Ġproperty Node . textContent ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( group Ġ!= Ġnull Ġ&& Ġartifact Ġ!= Ġnull Ġ&& Ġversion Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġval Ġparent P om Info Ġ= Ġload P om Info ( ĊĠĠĠĠĠĠĠ Ġproject Ġ= Ġproject , ĊĠĠĠĠĠĠĠ Ġlogger Ġ= Ġlogger , ĊĠĠĠĠĠĠĠ Ġid Ġ= ĠDependency Coordinates ( group , Ġartifact , Ġversion ), ĊĠĠĠĠĠĠĠ Ġdepth Ġ= Ġdepth Ġ+ Ġ 1 ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġif Ġ( licenses . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġlicenses Ġ+= Ġparent P om Info . licenses ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( scm Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsc m Ġ= Ġparent P om Info . scm ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( artifact Name Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġartifact Name Ġ= Ġparent P om Info . name ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġreturn ĠP om Info ( artifact Name , Ġlicenses , Ġsc m ) Ċ } Ċ Ċ private Ġoperator Ġfun ĠNode List . iterator (): ĠIterator < Node > Ġ= Ġiterator Ġ{ ĊĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlength ) Ġ{ ĊĠĠĠ Ġyield ( item ( i )) ĊĠ Ġ} Ċ } Ċ