package Ġnet . cord a . plugins . cp k Ċ Ċ import Ġorg . gradle . api . Default Task Ċ import Ġorg . gradle . api . Invalid UserData Exception Ċ import Ġorg . gradle . api . file . Configurable File Collection Ċ import Ġorg . gradle . api . file . Directory Property Ċ import Ġorg . gradle . api . file . File Collection Ċ import Ġorg . gradle . api . file . Regular File Ċ import Ġorg . gradle . api . model . ObjectFactory Ċ import Ġorg . gradle . api . provider . Property Ċ import Ġorg . gradle . api . provider . Provider Ċ import Ġorg . gradle . api . tasks . Input Ċ import Ġorg . gradle . api . tasks . Input Files Ċ import Ġorg . gradle . api . tasks . Internal Ċ import Ġorg . gradle . api . tasks . OutputFile Ċ import Ġorg . gradle . api . tasks . Path Sensitive Ċ import Ġorg . gradle . api . tasks . Path Sensitivity . REL ATIVE Ċ import Ġorg . gradle . api . tasks . Task Action Ċ import Ġorg . gradle . api . tasks . Task Provider Ċ import Ġjava . io . File Ċ import Ġjava . security . Message Digest Ċ import Ġjava . util . Base 6 4 Ċ import Ġjavax . inject . Inject Ċ Ċ @ Suppress (" Un stable Api Usage ") Ċ open Ġclass ĠDependency Constraints Task Ġ@ Inject Ġconstructor ( objects : ĠObject Factory ) Ġ: ĠDefault Task () Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" Comp utes Ġthe Ġconstraints Ġfor Ġthis ĠCor D app 's Ġlibrary Ġdependencies ." ĊĠĠĠĠĠĠĠ Ġgroup Ġ= ĠC ORD APP _ TASK _ GROUP ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ libraries : ĠConfigur able File Collection Ġ= Ġobjects . file Collection () ĊĠĠĠ Ġval Ġlibraries : ĠFile Collection ĊĠĠĠĠĠĠĠ Ġ@ Path Sensitive ( REL ATIVE ) ĊĠĠĠĠĠĠĠ Ġ@ Input Files ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ libraries ĊĊĠĠĠ Ġ@ get : Input ĊĠĠĠ Ġval Ġhash Algorithm : ĠProperty < String > Ġ= Ġobjects . property ( String :: class . java ) ĊĊĠĠĠ Ġ@ get : Internal ĊĠĠĠ Ġval Ġconstraints Dir : ĠDirectory Property Ġ= Ġobjects . directory Property () ĊĊĠĠĠ Ġ@ get : OutputFile ĊĠĠĠ Ġval Ġconstraints Output : ĠProvider < Regular File > Ġ= Ġconstraints Dir . file ( DEPEND ENCY _ CONSTRAINT S ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDon 't Ġeager ly Ġconfigure Ġthe Ġ[ Dependency Calculator ] Ġtask , Ġeven Ġif ĊĠĠĠĠ Ġ* Ġsomeone Ġeager ly Ġconfig ures Ġthis Ġ[ Dependency Constraints Task ] Ġby Ġaccident . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġset Libraries From ( task : ĠTask Provider < Dependency Calculator >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ libraries . set From ( task . flatMap ( Dependency Calculator :: libraries )) ĊĠĠĠĠĠĠĠ Ġ_ libraries . dis allow Changes () ĊĠĠĠĠĠĠĠ Ġdepends On ( task ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Task Action ĊĠĠĠ Ġfun Ġgenerate () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdigest Ġ= Ġdigest For ( hash Algorithm . get (). toUpperCase ()) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġxml Document Ġ= Ġcreate Xml Document () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Constraints Ġ= Ġxml Document . create Root Element ( CP K _ XML _ NAMESPACE , Ġ" dependency Constraints ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencoder Ġ= ĠBase 6 4 . get Encoder () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlibraries . forEach Ġ{ Ġlibrary Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Cor D app Ġlibrary Ġdependency : Ġ{}", Ġlibrary . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependency Constraints . append Element (" dependency Constraint "). also Ġ{ Ġconstraint Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraint . append Element (" fileName ", Ġlibrary . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjar Hash Ġ= Ġdigest . hash Of ( library ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraint . append Element (" hash ", Ġencoder . encode ToString ( jar Hash )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAttribute (" algorithm ", Ġdigest . algorithm ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWrite Ġdependency Ġconstraints Ġas ĠXML Ġdocument . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstraints Output . get (). as File . buffered Writer (). use ( xml Document :: writeTo ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġ( e Ġas ? ĠRuntimeException ) Ġ?: ĠInvalid UserData Exception ( e . message Ġ?: Ġ"", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFor Ġcomputing Ġfile Ġhashes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠMessage Digest . hash Of ( file : ĠFile ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfile . inputStream (). use (:: hash For ) ĊĠĠĠ Ġ} Ċ } Ċ