package Ġcom . lik et hes al ad . android . buddy . modules . libraries Ċ Ċ import Ġcom . lik et hes al ad . android . buddy . configuration . Android Bu ddy Plugin Configuration Ċ import Ġcom . lik et hes al ad . android . buddy . configuration . libraries . scope . Libraries Scope Ċ import Ġcom . lik et hes al ad . android . buddy . di . App Scope Ċ import Ġcom . lik et hes al ad . android . buddy . modules . libraries . exceptions . Android Bu ddy Library NotFoundException Ċ import Ġcom . lik et hes al ad . android . buddy . modules . libraries . exceptions . Duplicate Byte Bu ddy Plugin Exception Ċ import Ġcom . lik et hes al ad . android . buddy . modules . libraries . exceptions . Duplicate Library Id Exception Ċ import Ġcom . lik et hes al ad . android . buddy . modules . libraries . models . Android Bu ddy Library Extract ed Ċ import Ġcom . lik et hes al ad . android . buddy . modules . libraries . models . Library Plugins Extract ed Ċ import Ġcom . lik et hes al ad . android . common . models . lib info . Android Bu ddy Library Info Ċ import Ġcom . lik et hes al ad . android . common . models . lib info . Library Info Mapper Ċ import Ġcom . lik et hes al ad . android . common . models . lib info . Named Class Info Ċ import Ġcom . lik et hes al ad . android . common . utils . Constants Ċ import Ġcom . lik et hes al ad . android . common . utils . Constants . PLUGIN S _ METADATA _ FILE _ EXT Ċ import Ġcom . lik et hes al ad . android . common . utils . Constants . PLUGIN S _ METADATA _ FILE _ NAME Ċ import Ġcom . lik et hes al ad . android . common . utils . Instanti ator Wrapper Ċ import Ġio . github . class graph . Class Graph Ċ import Ġio . github . class graph . Resource Ċ import Ġio . github . class graph . Scan Result Ċ import Ġjava . io . File Ċ import Ġjava . io . InputStream Ċ import Ġjavax . inject . Inject Ċ Ċ @ App Scope Ċ class ĠAndroid Bu ddy Library Plugins Extractor Ċ @ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġinstanti ator Wrapper : ĠInstanti ator Wrapper , ĊĠĠĠ Ġprivate Ġval Ġplugin Configuration : ĠAndroid Bu ddy Plugin Configuration , ĊĠĠĠ Ġprivate Ġval Ġlibrary Info Mapper : ĠLibrary Info Mapper Ċ ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠRESOURCE _ DEFINITION _ PATTERN Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRegex (". +$ PLUGIN S _ METADATA _ FILE _ NAME \\ .$ PLUGIN S _ METADATA _ FILE _ EXT "). to Pattern () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġextract Library Plugins ( jar Files : ĠSet < File >): ĠLibrary Plugins Extract ed Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscope Ġ= Ġplugin Configuration . get Libraries Scope () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( scope Ġ== ĠLibraries Scope . Ignore All ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLibrary Plugins Extract ed . EMPTY ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlibraries Found Ġ= Ġfind Libraries ( getClass Graph Scan ( jar Files )) ĊĊĠĠĠĠĠĠĠ Ġval Ġlibraries ToUse Ġ= Ġwhen Ġ( scope ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLibraries Scope . Use All Ġ-> Ġlibraries Found ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLibraries Scope . Use Only Ġ-> Ġget Libraries ById s ( libraries Found , Ġscope . library Ids ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlibraries Info Ġ= Ġlibraries ToUse . map Ġ{ Ġit . info Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate No Duplicate Library Ids ( libraries Info ) ĊĠĠĠĠĠĠĠ Ġvalidate No Shared Plugin Names Ac ross Libraries ( libraries Info ) ĊĊĠĠĠĠĠĠĠ Ġval Ġplugin Names Ġ= Ġlibraries Info . map Ġ{ Ġit . plugin Names Ġ}. flatten (). toSet () ĊĠĠĠĠĠĠĠ Ġval Ġj ars Containing Plugins Ġ= Ġlibraries ToUse . map Ġ{ Ġit . jar File Ġ}. toSet () ĊĠĠĠĠĠĠĠ Ġreturn ĠLibrary Plugins Extract ed ( plugin Names , Ġj ars Containing Plugins ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Libraries ( scan Result : ĠScan Result ): ĠList < Android Bu ddy Library Extract ed > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlibraries Found Ġ= Ġmutable ListOf < Android Bu ddy Library Extract ed >() ĊĊĠĠĠĠĠĠĠ Ġscan Result . getResources Matching Pattern ( RESOURCE _ DEFINITION _ PATTERN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach InputStream Ign oring IOException Ġ{ Ġresource , ĠinputStream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlibraries Found . add ( get Library Extract ed From Properties File ( resource , ĠinputStream )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlibraries Found ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġextract Name From Path ( path : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFile ( path ). name Without Extension ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetClass Graph Scan ( jar Files : ĠSet < File >): ĠScan Result Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinstanti ator Wrapper . getClass Graph () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. override Class Lo aders ( jar Files To ClassLoader ( jar Files )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. accept Paths ( Constants . LIBRARY _ METADATA _ DIR ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. scan () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Libraries ById s ( ĊĠĠĠĠĠĠĠ Ġall Libraries : ĠList < Android Bu ddy Library Extract ed >, ĊĠĠĠĠĠĠĠ Ġrequested Ids : ĠSet < String > ĊĠĠĠ Ġ): ĠList < Android Bu ddy Library Extract ed > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlibraries Found Ġ= Ġall Libraries . filter Ġ{ Ġit . info . id Ġin Ġrequested Ids Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlibraries Found Ids Ġ= Ġlibraries Found . map Ġ{ Ġit . info . id Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnot Found Ids Ġ= Ġrequested Ids . filter Ġ{ Ġit Ġ! in Ġlibraries Found Ids Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( not Found Ids . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAndroid Bu ddy Library NotFoundException ( not Found Ids ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlibraries Found ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate No Duplicate Library Ids ( libraries : ĠList < Android Bu ddy Library Info >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlibraries ById Ġ= Ġlibraries . groupBy Ġ{ Ġit . id Ġ} ĊĠĠĠĠĠĠĠ Ġlibraries ById . forEach Ġ{ Ġ( library Id , Ġinfo List ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info List . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDuplicate Library Id Exception ( library Id , Ġinfo List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate No Shared Plugin Names Ac ross Libraries ( libraries : ĠList < Android Bu ddy Library Info >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġlibraries . size ĊĠĠĠĠĠĠĠ Ġval Ġlast Index Ġ= Ġsize Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġlibraries . forEach Indexed Ġ{ Ġindex , Ġinfo Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġlast Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( other Index Ġin Ġindex Ġ+ Ġ 1 Ġuntil Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Info Ġ= Ġlibraries [ other Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommon Plugin Names Ġ= Ġinfo . plugin Names . intersect ( other Info . plugin Names ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( common Plugin Names . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDuplicate Byte Bu ddy Plugin Exception ( common Plugin Names , ĠlistOf ( info , Ġother Info )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġjar Files To ClassLoader ( jar Files : ĠSet < File >): ĠClassLoader Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinstanti ator Wrapper . getUrl ClassLoader ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjar Files . map Ġ{ Ġit . to URI (). to URL () Ġ}. to Typed Array (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClass Graph :: class . java . class Loader ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Library Extract ed From Properties File ( ĊĠĠĠĠĠĠĠ Ġresource : ĠResource , ĊĠĠĠĠĠĠĠ Ġstream : ĠInputStream ĊĠĠĠ Ġ): ĠAndroid Bu ddy Library Extract ed Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġextract Name From Path ( resource . path ) ĊĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġlibrary Info Mapper . convertTo Android Bu ddy Library Info ( Named Class Info ( name , Ġstream . read Bytes ())) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠAndroid Bu ddy Library Extract ed ( resource . classpath Element File , Ġinfo ) ĊĠĠĠ Ġ} Ċ }