package Ġcom . aut onomous apps . internal Ċ Ċ import Ġcom . aut onomous apps . ad vice . Dependency Ċ import Ġcom . aut onomous apps . internal . asm . Class Reader Ċ import Ġcom . aut onomous apps . internal . utils . map To Ordered Set Ċ import Ġcom . aut onomous apps . internal . utils . map To Set Ċ import Ġcom . aut onomous apps . services . InMemory Cache Ċ import Ġorg . gradle . api . Gradle Exception Ċ import Ġorg . gradle . api . artifacts . Configuration Ċ import Ġorg . gradle . api . artifacts . component . Module Component Identifier Ċ import Ġorg . gradle . api . artifacts . component . Project Component Identifier Ċ import Ġorg . gradle . api . artifacts . result . Dependency Result Ċ import Ġorg . gradle . api . artifacts . result . Resolved Dependency Result Ċ import Ġorg . gradle . api . logging . Logger Ċ import Ġjava . util . zip . Zip File Ċ Ċ /** Ċ Ġ* ĠUsed Ġby Ġ[ Dependency Report Task ][ com . aut onomous apps . tasks . Dependency Report Task ]. Ċ Ġ*/ Ċ internal Ġclass ĠJar Analyzer ( ĊĠ Ġprivate Ġval Ġconfiguration : ĠConfiguration , ĊĠ Ġprivate Ġval Ġartifacts : ĠList < Artifact >, ĊĠ Ġprivate Ġval Ġlogger : ĠLogger , ĊĠ Ġprivate Ġval Ġin Memory Cache : ĠIn Memory Cache Ċ ) Ġ{ ĊĊĠ Ġfun Ġcomponents (): ĠList < Component > Ġ{ ĊĠĠĠ Ġcompute Transit ivity () ĊĠĠĠ Ġreturn Ġartifacts . as Components () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcompute Transit ivity () Ġ{ ĊĠĠĠ Ġval Ġdirect Dependencies Ġ= Ġconfiguration . direct Dependencies () ĊĊĠĠĠ Ġ// Ġ" Artifacts " Ġare Ġeverything Ġused Ġto Ġcompile Ġthe Ġproject . ĠIf Ġthere Ġis Ġa Ġdirect Ġartifact Ġwith Ġa ĊĠĠĠ Ġ// Ġmatching Ġidentifier , Ġthen Ġthat Ġartifact Ġis ĠNOT Ġtrans itive . ĠOtherwise , Ġit ĠIS Ġtrans itive . ĊĠĠĠ Ġartifacts . forEach Ġ{ Ġartifact Ġ-> ĊĠĠĠĠĠ Ġartifact . is Trans itive Ġ= Ġdirect Dependencies . none Ġ{ Ġit Ġ== Ġartifact . dependency Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠMaps Ġcollection Ġof Ġ[ Artifact ] s Ġto Ġ[ Component ] s , Ġbasically Ġby Ġexplo ding Ġthe Ġcontents Ġof ĊĠĠ Ġ* Ġ[ Artifact . file ] Ġinto Ġa Ġset Ġof Ġclass Ġnames Ġ([ Component . classes ]). ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun ĠIterable < Artifact >. as Components (): ĠList < Component > Ġ= ĊĠĠĠ Ġmap Ġ{ Ġartifact Ġ-> ĊĠĠĠĠĠ Ġval Ġanalyzed Jar Ġ= Ġanalyze Jar ( artifact ) ĊĠĠĠĠĠ ĠComponent ( artifact Ġ= Ġartifact , Ġanalyzed Jar Ġ= Ġanalyzed Jar ) ĊĠĠĠ Ġ}. sorted () ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠAnaly zes Ġbytecode Ġin Ġorder Ġto Ġextract Ġclass Ġnames Ġand Ġsome Ġbasic Ġstructural Ġinformation Ġfrom ĊĠĠ Ġ* Ġthe Ġjar Ġ([ Artifact . file ]). ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġanalyze Jar ( artifact : ĠArtifact ): ĠAnaly zed Jar Ġ{ ĊĠĠĠ Ġval Ġzip Ġ= ĠZip File ( artifact . file ) ĊĊĠĠĠ Ġval Ġalready Analy zed Jar : ĠAnaly zed Jar ? Ġ= Ġin Memory Cache . analy zed J ars [ zip . name ] ĊĠĠĠ Ġif Ġ( already Analy zed Jar Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġalready Analy zed Jar ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġin Memory Cache . update J ars ( zip . name ) ĊĊĠĠĠ Ġval Ġkt Files Ġ= ĠK t File . from Zip ( zip ) ĊĠĠĠ Ġval Ġanalyzed Classes Ġ= Ġzip . entries (). toList () ĊĠĠĠĠĠ Ġ. filter Ġ{ Ġit . name . endsWith (". class ") Ġ} ĊĠĠĠĠĠ Ġ. map Ġ{ Ġclass Entry Ġ-> ĊĠĠĠĠĠĠĠ ĠClass Name And Annotations Visitor ( logger ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġreader Ġ= Ġzip . getInputStream ( class Entry ). use Ġ{ ĠClass Reader ( it . read Bytes ()) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġreader . accept ( this , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ. map Ġ{ Ġit . get Analy zed Class () Ġ} ĊĠĠĠĠĠ Ġ. filter Not Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠFilter Ġout Ġ` java ` Ġpackages , Ġbut Ġnot Ġ` javax ` ĊĠĠĠĠĠĠĠ Ġit . className . startsWith (" java /") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ. map To Ordered Set Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġalso Ġreplace Ġ"$ "? ĊĠĠĠĠĠĠĠ Ġit . copy ( className Ġ= Ġit . className . replace ("/", Ġ". ")) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ. on Each Ġ{ Ġin Memory Cache . update Classes ( it . className ) Ġ} ĊĊĠĠĠ Ġreturn ĠAnaly zed Jar ( analy zed Classes , Ġkt Files ). also Ġ{ ĊĠĠĠĠĠ Ġin Memory Cache . analy zed J ars . put If Absent ( zip . name , Ġit ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠTr aver ses Ġthe Ġtop Ġlevel Ġof Ġthe Ġdependency Ġgraph Ġto Ġget Ġall Ġ" direct " Ġdependencies . Ċ Ġ*/ Ċ private Ġfun ĠConfiguration . direct Dependencies (): ĠSet < Dependency > Ġ{ ĊĠ Ġ// ĠUpdate Ġall - artifacts Ġlist : Ġtrans itive Ġor Ġnot ? ĊĠ Ġ// Ġruntime Ġclasspath Ġwill Ġgive Ġme Ġonly Ġthe Ġdirect Ġdependencies ĊĠ Ġval Ġdependencies : ĠSet < Dependency Result > Ġ= ĊĠĠĠ Ġincoming ĊĠĠĠĠĠ Ġ. resolution Result ĊĠĠĠĠĠ Ġ. root ĊĠĠĠĠĠ Ġ. dependencies ĊĊĠ Ġreturn Ġtraverse Dependencies ( dependencies ) Ċ } Ċ Ċ /** Ċ Ġ* ĠThis Ġwas Ġheav ily Ġmodified Ġfrom Ġcode Ġfound Ġin Ġthe ĠGradle Ġ 5 . 6 . x Ġdocumentation . ĠCan 't Ġfind Ġthe Ġlink Ġany Ġmore . Ċ Ġ*/ Ċ private Ġfun Ġtraverse Dependencies ( results : ĠSet < Dependency Result >): ĠSet < Dependency > Ġ= Ġresults ĊĠ Ġ. filter Is Instance < Resolved Dependency Result >() ĊĠ Ġ. map To Set Ġ{ Ġresult Ġ-> ĊĠĠĠ Ġval Ġcomponent Result Ġ= Ġresult . selected ĊĊĠĠĠ Ġwhen Ġ( val Ġcomponent Identifier Ġ= Ġcomponent Result . id ) Ġ{ ĊĠĠĠĠĠ Ġis ĠProject Component Identifier Ġ-> ĠDependency ( component Identifier ) ĊĠĠĠĠĠ Ġis ĠModule Component Identifier Ġ-> ĠDependency ( component Identifier ) ĊĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠGradle Exception (" Unexpected ĠComponent Identifier Ġtype : Ġ${ component Identifier . java Class . simple Name }") ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ