/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 8 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . android . build . gradle . internal . tasks Ċ Ċ import Ġcom . google . common . collect . Maps Ċ import Ġorg . gradle . api . artifacts . Artifact Collection Ċ import Ġorg . gradle . api . file . Regular File Property Ċ import Ġorg . gradle . api . provider . Map Property Ċ import Ġorg . gradle . api . provider . Property Ċ import Ġorg . gradle . workers . Work Action Ċ import Ġorg . gradle . workers . Work Parameters Ċ import Ġorg . gradle . workers . Worker Executor Ċ import Ġjava . io . File Ċ import Ġjava . io . Serializable Ċ import Ġjavax . inject . Inject Ċ Ċ /** Ċ Ġ* ĠA Ġclass Ġthat Ġchecks Ġfor Ġduplicate Ġclasses Ġwithin Ġan ĠArtifact Collection . ĠClasses Ġare Ġassumed Ġto Ġbe Ċ Ġ* Ġduplicate Ġif Ġthey Ġhave Ġthe Ġsame Ġname Ġand Ġthey Ġare Ġposition ed Ġwithin Ġthe Ġsame Ġpackage Ġ( this Ġis Ċ Ġ* Ġpossible Ġif Ġthey Ġare Ġin Ġdifferent Ġartifacts ). Ċ Ġ*/ Ċ class ĠCheck Duplicate Classes Delegate Ġ{ ĊĠĠĠ Ġprivate Ġfun Ġextract Classes ( artifact Map : ĠMap < String , ĠFile >): ĠMap < String , ĠList < String >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclasses Map Ġ= ĠHashMap < String , ĠList < String >>() ĊĊĠĠĠĠĠĠĠ Ġartifact Map . keys . forEach Ġ{ Ġkey : ĠString Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartifact File Ġ= Ġartifact Map . getValue ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( artifact File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclasses Map [ key ] Ġ= Ġartifact File . read Lines () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġclasses Map ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrun ( ĊĠĠĠĠĠĠĠ ĠprojectName : ĠString , ĊĠĠĠĠĠĠĠ Ġenum erated Classes : ĠMap < String , ĠFile >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġclasses Map Ġ= Ġextract Classes ( enum erated Classes ) ĊĊĠĠĠĠĠĠĠ Ġval ĠmaxSize Ġ= Ġclasses Map . map Ġ{ Ġit . value . size Ġ}. sum () ĊĠĠĠĠĠĠĠ Ġval Ġclasses Ġ= ĠMaps . new HashMap With Expected Size < String , ĠMutable List < String >>( maxSize ) ĊĊĠĠĠĠĠĠĠ Ġclasses Map . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartifact Name Ġ= Ġit . key ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . value . forEach Ġ{ ĠclassName Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclasses . get Or Put ( className ) Ġ{ Ġmutable ListOf () Ġ}. add ( artifact Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġduplicates Map Ġ= Ġclasses . filter Ġ{ Ġit . value . size Ġ> Ġ 1 Ġ}. to Sorted Map () ĊĠĠĠĠĠĠĠ Ġif Ġ(! duplicates Map . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Separator Ġ= ĠSystem . line Separator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduplicate Messages Ġ= Ġduplicates Map ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġduplicate Class Message ( it . key , Ġit . value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ( line Separator ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ("$ duplicate Messages $ line Separator $ line Separator $ RE COMM END ATION ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġconst Ġval ĠRE COMM END ATION Ġ= ĊĠĠĠ Ġ" Go Ġto Ġthe Ġdocumentation Ġto Ġlearn Ġhow Ġto Ġ< a Ġhref =\" d . android . com / r / tools / classpath - sync - errors \"> Fix Ġdependency Ġresolution Ġerrors </ a > ." Ċ Ċ private Ġfun Ġduplicate Class Message ( className : ĠString , Ġartifact Names : ĠList < String >): ĠString Ġ{ ĊĠĠĠ Ġval Ġsorted Ġ= Ġartifact Names . sorted () ĊĠĠĠ Ġval Ġmodules Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġartifact Names . size Ġ== Ġ 2 Ġ-> Ġ" modules Ġ${ sorted [ 0 ]} Ġand Ġ${ sorted [ 1 ]}" ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Ġ= Ġsorted . last () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" the Ġfollowing Ġmodules : Ġ${ sorted . drop Last ( 1 ). join ToString (", Ġ" )} Ġand Ġ$ last " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġ" Duplicate Ġclass Ġ$ className Ġfound Ġin Ġ$ modules " Ċ } Ċ Ċ abstract Ġclass ĠCheck Duplicates Params : ĠWork Parameters Ġ{ ĊĠĠĠ Ġabstract Ġval ĠprojectName : ĠProperty < String > ĊĠĠĠ Ġabstract Ġval Ġenum erated Classes : ĠMap Property < String , ĠFile > Ċ } Ċ Ċ abstract Ġclass ĠCheck Duplicates Runnable Ġ@ Inject Ġconstructor (): ĠWork Action < Check Duplicates Params > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġexecute () Ġ{ ĊĠĠĠĠĠĠĠ ĠCheck Duplicate Classes Delegate (). run ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . projectName . get (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . enum erated Classes . get () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ }