/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 - 2 0 2 0 ĠHERE ĠEurope ĠB . V . Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ* Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ġ* ĠLicense - Filename : ĠLICENSE Ċ Ġ*/ Ċ Ċ package Ġorg . oss review toolkit . model . utils Ċ Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ Ċ import Ġorg . oss review toolkit . model . Identifier Ċ import Ġorg . oss review toolkit . model . Provenance Ċ import Ġorg . oss review toolkit . model . config . Package Configuration Ċ import Ġorg . oss review toolkit . model . config . V cs Matcher Ċ import Ġorg . oss review toolkit . model . readValue Ċ Ċ /** Ċ Ġ* ĠA Ġprovider Ġfor Ġ[ Package Configuration ] s Ġproviding Ġexactly Ġthe Ġpackages Ġof Ġthe Ġgiven Ġlist . Ċ Ġ* ĠThrows Ġan Ġexception Ġif Ġthere Ġis Ġmore Ġthan Ġone Ġconfiguration Ġper Ġ[ Identifier ] Ġand Ġ[ Provenance ]. Ċ Ġ*/ Ċ class ĠSimple Package Configuration Provider ( ĊĠĠĠ Ġconfigurations : ĠCollection < Package Configuration > Ġ= Ġempty List () Ċ ) Ġ: ĠPackage Configuration Provider Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠReturn Ġa Ġ[ Simple Package Configuration Provider ] Ġwhich Ġprovides Ġall Ġ[ Package Configuration ] s Ġfound Ġrecursively ĊĠĠĠĠĠĠĠĠ Ġ* Ġin Ġthe Ġgiven Ġ[ directory ]. ĠAll Ġnon - hidden Ġfiles Ġwithin Ġthe Ġgiven Ġ[ directory ] Ġmust Ġbe Ġpackage Ġc uration Ġfiles . ĊĠĠĠĠĠĠĠĠ Ġ* ĠThrows Ġan Ġexception Ġif Ġthere Ġis Ġmore Ġthan Ġone Ġconfiguration Ġper Ġ[ Identifier ] Ġand Ġ[ Provenance ]. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġfor Directory ( directory : ĠFile ): ĠSimple Package Configuration Provider Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentries Ġ= Ġdirectory . walk Bottom Up () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter To ( mutable ListOf ()) Ġ{ Ġ! it . is Hidden Ġ&& Ġit . isFile Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . readValue < Package Configuration >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Error Ġreading Ġpackage Ġconfiguration Ġfrom Ġ'${ file . absolute File }'. ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSimple Package Configuration Provider ( entries ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠReturn Ġa Ġ[ Simple Package Configuration Provider ] Ġwhich Ġprovides Ġall Ġ[ Package Configuration ] s Ġfound Ġin Ġthe Ġgiven ĊĠĠĠĠĠĠĠĠ Ġ* Ġfile . ĠThrows Ġan Ġexception Ġif Ġthere Ġis Ġmore Ġthan Ġone Ġconfiguration Ġper Ġ[ Identifier ] Ġand Ġ[ Provenance ]. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġfor File ( file : ĠFile ): ĠSimple Package Configuration Provider Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentries Ġ= Ġfile . readValue < List < Package Configuration >>() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSimple Package Configuration Provider ( entries ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġconfigurations ById : ĠMap < Identifier , ĠList < Package Configuration >> ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġconfigurations . check At Most One Configuration Per Id And Provenance () ĊĊĠĠĠĠĠĠĠ Ġconfigurations ById Ġ= Ġconfigurations . groupBy To ( HashMap ()) Ġ{ Ġit . id Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Package Configuration ( packageId : ĠIdentifier , Ġpro venance : ĠPro venance ): ĠPackage Configuration ? Ġ= ĊĠĠĠĠĠĠĠ Ġconfigurations ById [ packageId ]?. filter Ġ{ Ġit . matches ( packageId , Ġpro venance ) Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( it . size Ġ<= Ġ 1 ) Ġ{ Ġ" There Ġmust Ġbe Ġat Ġmost Ġone Ġpackage Ġconfiguration Ġper ĠId Ġand Ġpro venance ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . single OrNull () ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠCollection < Package Configuration >. check At Most One Configuration Per Id And Provenance () Ġ{ ĊĠĠĠ Ġdata Ġclass ĠKey ( val Ġid : ĠIdentifier , Ġval Ġsource Artifact Url : ĠString ?, Ġval Ġv cs Matcher : ĠV cs Matcher ?) ĊĊĠĠĠ Ġfun ĠPackage Configuration . key () Ġ= ĠKey ( id , Ġsource Artifact Url , Ġv cs ) ĊĊĠĠĠ Ġval Ġconfigurations With Same Matcher Ġ= Ġgroup By Ġ{ Ġit . key () Ġ}. filter Ġ{ Ġit . value . size Ġ> Ġ 1 Ġ} ĊĊĠĠĠ Ġrequire ( configurations With Same Matcher . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" There Ġmust Ġbe Ġat Ġmost Ġone Ġpackage Ġconfiguration Ġper ĠId Ġand Ġpro venance , Ġbut Ġfound Ġmultiple Ġfor :\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ configurations With Same Matcher . keys . join ToString ( prefix Ġ= Ġ" Ġ Ġ", Ġseparator Ġ= Ġ"\ n Ġ Ġ" )} ." ĊĠĠĠ Ġ} Ċ } Ċ