/** Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 ĠNam ics ĠAG Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġcom . nam ics . oss . gradle . license Ċ Ċ import Ġorg . gradle . api . Default Task Ċ import Ġorg . gradle . api . Gradle Exception Ċ import Ġorg . gradle . api . tasks . Input Ċ import Ġorg . gradle . api . tasks . Task Action Ċ import Ġorg . gradle . language . base . plugins . Lifecycle Base Plugin Ċ import Ġjava . io . File Ċ Ċ open Ġclass ĠLicense En force Task Ġ: ĠDefault Task () Ġ{ ĊĊĠĠĠ Ġ@ Input ĊĠĠĠ Ġvar Ġdictionaries : ĠList < String > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġ@ Input ĊĠĠĠ Ġvar Ġallowed Dependencies : ĠList < String > Ġ= Ġempty List () ĊĊĠĠĠ Ġ@ Input ĊĠĠĠ Ġvar Ġallowed Categories : ĠList < String > Ġ= Ġempty List () ĊĊĠĠĠ Ġ@ Input ĊĠĠĠ Ġvar Ġallowed License s : ĠList < String > Ġ= Ġempty List () ĊĊĠĠĠ Ġ@ Input ĊĠĠĠ Ġvar Ġfail On Missing License Information : ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġ@ Input ĊĠĠĠ Ġvar Ġanaly se Configurations : ĠList < String > Ġ= ĠlistOf (" compile ", Ġ" api ", Ġ" implementation ") ĊĊĠĠĠ Ġprivate Ġval Ġdictionary Ġ= ĠLicense Dictionary () ĊĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġgroup Ġ= ĠLifecycle Base Plugin . VER IFICATION _ GROUP ĊĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" En forces Ġlicenses Ġof Ġdependencies Ġto Ġcomp ly Ġwith Ġdefinitions ." ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Task Action ĊĠĠĠ Ġfun Ġenforce () Ġ{ ĊĠĠĠĠĠĠĠ Ġinitialize Dictionary () ĊĊĠĠĠĠĠĠĠ Ġval Ġdependencies : ĠList < Dependency > Ġ= ĠDependency Analy ser ( project , Ġanaly se Configurations ). analy se () ĊĊĠĠĠĠĠĠĠ Ġval Ġdenied Ġ= Ġdependencies ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . licenses . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ! allowed ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġno License Ġ= Ġdependencies ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . licenses . isEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ! allowed Dependency ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( den ied . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġknown Ġ= Ġdictionary . known License s () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" Max Line Length ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠGradle Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" You Ġare Ġusing Ġdependencies Ġlicensed Ġunder Ġa Ġpermitted Ġlicense !" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n You Ġmay Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n - Ġconfigure Ġadditional Ġlicense Ġmappings Ġto Ġ$ LICENSE _ DI CTIONARY _ FILE _ NAME Ġin Ġ\$ project Dir " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n - Ġadd Ġfurther Ġdictionaries Ġin Ġtask Ġconfig " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n - Ġadd Ġallowed Ġcategories Ġ/ Ġlicenses Ġ/ Ġdependencies Ġin Ġtask Ġconfig " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ ne . g . :" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n \ tt ask s . enforce License s Ġ{" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n \ t ĠĠĠ Ġdictionaries Ġ= Ġ\" path To Your File \" Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n \ t ĠĠĠ Ġallowed Categories Ġ= ĠlistOf (\" Apache \", Ġ\" BSD \", Ġ\" L GPL \", Ġ\" MIT \") " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n \ t ĠĠĠ Ġallowed License s Ġ= ĠlistOf (\" Apache - 2 . 0 \", Ġ\" https :// not . in . dictionary / LICENSE - 1 . 0 \", Ġ\" Another Ġunknown ĠLicense Ġ 1 . 0 Ġ( A UL )\ ")" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n \ t ĠĠĠ Ġallowed Dependencies Ġ= ĠlistOf (\" my . group : allowed . dependency : 1 2 3 \") " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n \ t }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n \ n Currently Ġallowed :" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n Categories : Ġ" Ġ+ Ġallowed Categories . distinct (). sorted (). join ToString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n License s : Ġ" Ġ+ Ġallowed License s . distinct (). sorted (). join ToString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n Dependencies : Ġ" Ġ+ Ġallowed Dependencies . distinct (). sorted (). join ToString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n \ n Currently Ġaval iable Ġin Ġdictionaries :" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n Categories : Ġ" Ġ+ Ġknown . map Ġ{ Ġit . category Ġ}. distinct (). sorted (). join ToString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n License s : Ġ" Ġ+ Ġknown . map Ġ{ Ġit . id Ġ}. distinct (). sorted (). join ToString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n \ n Dependencies Ġwith Ġlicenses Ġnot Ġallowed : Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġdenied . map Ġ{ Ġ"$ it " Ġ}. join ToString ( prefix Ġ= Ġ"\ n - Ġ", Ġpostfix Ġ= Ġ"", Ġseparator Ġ= Ġ"- Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( no License . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreport Ġ= Ġno License . map Ġ{ Ġit . id Ġ}. join ToString ( separator Ġ= Ġ"\ n - Ġ", Ġprefix Ġ= Ġ"\ n - Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fail On Missing License Information ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠGradle Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" You Ġare Ġusing Ġdependencies Ġwithout Ġlicensing Ġinformation !" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n You Ġmay :" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n - Ġverify Ġlicense Ġmanually Ġand Ġadd Ġit Ġto Ġallowed Dependencies Ġin Ġtask Ġconfig " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n - Ġdisable Ġfail On Missing License Information Ġin Ġtask Ġconfig " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ ne . g . :" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n \ tt ask s . enforce License s Ġ{" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n \ t ĠĠĠ Ġfail On Missing License Information Ġ= Ġfalse " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n \ t ĠĠĠ Ġallowed Dependencies Ġ= ĠlistOf (\" my . group : allowed . dependency : 1 2 3 \") " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n \ t }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n \ n Dependencies Ġwithout Ġlicense Ġinformation : Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġreport ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Dependencies Ġwithout Ġlicense Ġinformation : Ġ{}", Ġreport ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġallowed ( dependency : ĠDependency ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdependency ĊĠĠĠĠĠĠĠ Ġif Ġ( allowed Dependency ( dependency )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdependency . licenses . any Ġ{ Ġallowed ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġallowed Dependency ( dependency : ĠDependency ) Ġ= ĊĠĠĠĠĠĠĠ Ġallowed Dependencies . map Ġ{ ĠDependency ( it , Ġempty List ()) Ġ}. any Ġ{ Ġdependency . matches ( it ) Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġallowed ( license : ĠLicense ) Ġ= Ġallowed License s . contains ( license . name ) ĊĠĠĠĠĠĠĠ Ġ|| Ġallowed License s . contains ( license . url ) ĊĠĠĠĠĠĠĠ Ġ|| Ġallowed ( lookup ( license )) ĊĊĠĠĠ Ġprivate Ġfun Ġlookup ( license : ĠLicense ) Ġ= Ġdictionary . lookup ( license . name ) Ġ?: Ġdictionary . lookup ( license . url ) ĊĊĠĠĠ Ġprivate Ġfun Ġallowed ( license : ĠLicense Definition ?) Ġ= ĊĠĠĠĠĠĠĠ Ġlicense ?. let Ġ{ Ġ( allowed Categories . contains ( license . category ) Ġ|| Ġallowed License s . contains ( license . id )) Ġ} Ġ?: Ġtrue ĊĊĊĠĠĠ Ġprivate Ġfun Ġinitialize Dictionary () Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Project Dictionary () ĊĠĠĠĠĠĠĠ Ġadd Bund led Dictionary () ĊĠĠĠĠĠĠĠ Ġadd Configured Di ctionaries () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Project Dictionary () Ġ= ĊĠĠĠĠĠĠĠ Ġproject . project Dir . resolve ( LICENSE _ DI CTIONARY _ FILE _ NAME ). take If Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . isFile ĊĠĠĠĠĠĠĠ Ġ} ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdictionary . add Config ( read Text ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Bund led Dictionary () Ġ= ĊĠĠĠĠĠĠĠ ĠLicense En force Task :: class . java . getResource ( LICENSE _ DI CTIONARY _ FILE _ NAME )?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdictionary . add Config ( this . read Text ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Configured Di ctionaries () Ġ= ĊĠĠĠĠĠĠĠ Ġdictionaries ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠFile ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isFile Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . read Text () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠFile ( it ). read Text () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġdictionary . add Config ( it ) Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLICENSE _ DI CTIONARY _ FILE _ NAME Ġ= Ġ" license - dictionary . yaml " ĊĠĠĠ Ġ} Ċ } Ċ