/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 Ġthe Ġoriginal Ġauthor Ġor Ġauthors . Ċ Ġ* Ċ Ġ* Ġ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 Ġorg . gradle . kotlin . dsl . access ors Ċ Ċ import Ġgro ovy . json . Json Output Ċ import Ġgro ovy . json . Json Sl ur per Ċ Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . reflect . TypeOf Ċ Ċ import Ġjava . io . File Ċ import Ġjava . io . Serializable ĊĊ Ċ interface ĠProject Schema Provider Ġ{ ĊĊĠĠĠ Ġfun Ġschema For ( project : ĠProject ): ĠProject Schema < TypeOf <* >> ĊĊĠĠĠ Ġfun Ġmulti Project Schema For ( root : ĠProject ): ĠMap < String , ĠProject Schema < TypeOf <* >>> Ġ= ĊĠĠĠĠĠĠĠ Ġroot . all projects . map Ġ{ Ġit . path Ġto Ġschema For ( it ) Ġ}. toMap () Ċ } ĊĊ Ċ data Ġclass ĠProject Schema < out ĠT >( ĊĠĠĠ Ġval Ġextensions : ĠList < Project Schema Entry < T >>, ĊĠĠĠ Ġval Ġconventions : ĠList < Project Schema Entry < T >>, ĊĠĠĠ Ġval Ġconfigurations : ĠList < String > Ċ ) Ġ: ĠSerializable Ġ{ ĊĊĠĠĠ Ġfun Ġ< U > Ġmap ( f : Ġ( T ) Ġ-> ĠU ) Ġ= ĊĠĠĠĠĠĠĠ ĠProject Schema ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextensions . map Ġ{ Ġit . map ( f ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconventions . map Ġ{ Ġit . map ( f ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfigurations . toList ()) Ċ } ĊĊ Ċ data Ġclass ĠProject Schema Entry < out ĠT >( ĊĠĠĠ Ġval Ġtarget : ĠT , ĊĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠ Ġval Ġtype : ĠT Ċ ) Ġ: ĠSerializable Ġ{ ĊĊĠĠĠ Ġfun Ġ< U > Ġmap ( f : Ġ( T ) Ġ-> ĠU ) Ġ= ĊĠĠĠĠĠĠĠ ĠProject Schema Entry ( f ( target ), Ġname , Ġf ( type )) Ċ } ĊĊ Ċ fun ĠProject Schema < TypeOf <* >> . with Kotlin Type Strings () Ġ= ĊĠĠĠ Ġmap (:: kotlin TypeString For ) ĊĊ Ċ fun ĠtoJson ( multi Project String Schema : ĠMap < String , ĠProject Schema < String >> ): ĠString Ġ= ĊĠĠĠ ĠJson Output . toJson ( multi Project String Schema ) ĊĊ Ċ @ Suppress (" unchecked _ cast ") Ċ fun Ġload Multi Project Schema From ( file : ĠFile ) Ġ= ĊĠĠĠ Ġ( Json Sl ur per (). parse ( file ) Ġas ĠMap < String , ĠMap < String , Ġ* >> ). map Values Ġ{ Ġ(_, Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠ ĠProject Schema ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextensions Ġ= Ġload Schema Entry List From ( value [" extensions "]), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconventions Ġ= Ġload Schema Entry List From ( value [" con ventions "]), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfigurations Ġ= Ġvalue [" configurations "] Ġas ? ĠList < String > Ġ?: Ġempty List ()) ĊĠĠĠ Ġ} ĊĊ Ċ @ Suppress (" unchecked _ cast ") Ċ private Ċ fun Ġload Schema Entry List From ( extensions : ĠAny ?): ĠList < Project Schema Entry < String >> Ġ= ĊĠĠĠ Ġwhen Ġ( extensions ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠMap < *, Ġ*> Ġ-> Ġ// Ġ< 0 . 1 7 Ġformat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( extensions Ġas ? ĠMap < String , ĠString >) ?. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProject Schema Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProject :: class . java . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠ Ġis ĠList < *> Ġ-> Ġ// Ġ>= 0 . 1 7 Ġformat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( extensions Ġas ? ĠList < Map < String , ĠString >>) ?. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProject Schema Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . getValue (" target "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . getValue (" name "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . getValue (" type ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġempty List () ĊĠĠĠ Ġ} Ċ