/* Ċ Ġ* ĠĠĠ ĠCopyright Ġ 2 0 1 9 ĠNim rod ĠDay an Ġn im ro dd ay an . com Ċ Ġ* Ċ Ġ* ĠĠĠ Ġ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 . nim ro dd ay an . build metrics . plugin Ċ Ċ import Ġcom . nim ro dd ay an . build metrics . cache . CacheManager Ċ import Ġcom . nim ro dd ay an . build metrics . cache . Client Dao Ċ import Ġcom . nim ro dd ay an . build metrics . cache . Client Dao No Op Ċ import Ġcom . nim ro dd ay an . build metrics . cache . Client Dao Sqlite Ċ import Ġcom . nim ro dd ay an . build metrics . cache . Database Helper Ċ import Ġcom . nim ro dd ay an . build metrics . cache . Event Dao Ċ import Ġcom . nim ro dd ay an . build metrics . cache . Event Dao No Op Ċ import Ġcom . nim ro dd ay an . build metrics . cache . Event Dao Sqlite Ċ import Ġcom . nim ro dd ay an . build metrics . client id . Client Manager Ċ import Ġcom . nim ro dd ay an . build metrics . publisher . Build Metrics Listener Ċ import Ġcom . nim ro dd ay an . build metrics . tracker . Build Duration Tracker Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . gradle . api . Plugin Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . model . ObjectFactory Ċ import Ġorg . gradle . api . provider . SetProperty Ċ import Ġo shi . System Info Ċ import Ġjava . util . concurrent . Copy On Write Array Set Ċ Ċ private Ġval Ġlog Ġ= ĠKotlin Logging . logger Ġ{} Ċ Ċ @ Suppress (" unused ") Ċ class ĠBuild Metrics Plugin Ġ: ĠPlugin < Project > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġapply ( project : ĠProject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġproject . extensions . create (" build Metrics ", ĠBuild Metrics Extensions :: class . java , Ġproject . objects ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdb Helper : ĠDatabase Helper ? Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase Helper () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn ( e ) Ġ{ Ġ" Failed Ġto Ġconnect Ġto Ġbuild Ġmetrics Ġdatabase " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġclient Dao Ġ= Ġcreate Client Dao ( db Helper ) ĊĠĠĠĠĠĠĠ Ġval Ġevent Dao Ġ= Ġcreate Event Dao ( db Helper ) ĊĠĠĠĠĠĠĠ Ġval Ġsystem Info Ġ= ĠSystem Info () ĊĠĠĠĠĠĠĠ Ġval Ġclient Manager Ġ= ĠClient Manager ( client Dao , Ġsystem Info ) ĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= Ġclient Manager . get OrCreate Client () ĊĠĠĠĠĠĠĠ Ġval Ġcache Manager Ġ= ĠCache Manager ( event Dao ) ĊĊĠĠĠĠĠĠĠ Ġproject . after Evaluate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextension Ġ= Ġproject . extensions . getBy Type ( Build Metrics Extensions :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Filter Ġ= Ġextension . task Filter . or Null Ġ?: Ġempty Set () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlisteners Ġ= Ġextension . build Metrics Listeners ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" Task Ġfilter : Ġ$ task Filter " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Manager . notify Client Created ( client , Ġlisteners ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" Register ing Ġbuild Ġlistener " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject . gradle . add Build Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuild Duration Tracker ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Dao , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsystem Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask Filter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Client Dao ( db Helper : ĠDatabase Helper ?): ĠClient Dao Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( db Helper Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" Creating ĠClient Dao Sqlite " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClient Dao Sqlite ( db Helper . database . client Queries ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" Creating ĠClient Dao No Op " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClient Dao No Op () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Event Dao ( db Helper : ĠDatabase Helper ?): ĠEvent Dao Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( db Helper Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" Creating ĠEvent Dao Sqlite " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEvent Dao Sqlite ( db Helper . database . event Queries ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" Creating ĠEvent Dao No Op " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEvent Dao No Op () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠBuild metrics Ġruntime Ġplugin Ġextensions . Ċ Ġ* Ċ Ġ* ĠUsing Ġthis Ġextensions Ġyou Ġcan Ġregister Ġyour Ġown Ġ[ Build Metrics Listener ] Ċ Ġ* Ġto Ġpublish Ġanalytics Ġto Ġa Ġcustom Ġservice Ġor Ġfilter Ġthe Ġtasks Ġyou Ġwould Ġlike Ċ Ġ* Ġto Ġtrack . Ċ Ġ* Ċ Ġ* Ġ@ see Ġ[ Build Metrics Listener ] Ċ Ġ*/ Ċ abstract Ġclass ĠBuild Metrics Extensions ( object Factory : ĠObject Factory ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġ_ listeners Ġ= ĠCopy On Write Array Set < Build Metrics Listener >() ĊĠĠĠ Ġ@ Suppress (" Member Visibility Can Be Private ") ĊĠĠĠ Ġval Ġbuild Metrics Listeners : ĠSet < Build Metrics Listener > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ listeners ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġset Ġof Ġtasks Ġwhich Ġshould Ġbe Ġtracked . ĠIf Ġleft Ġempty , Ġall Ġtasks Ġwill Ġbe Ġtracked . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġtasks Ġcontained Ġin Ġthis Ġset Ġmust Ġbe Ġthe Ġtasks Ġthat Ġstarts Ġthe Ġbuild . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" unused ") ĊĠĠĠ Ġval Ġtask Filter : ĠSet Property < String > Ġ= Ġobject Factory . setProperty ( String :: class . java ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegister Ġa Ġ[ Build Metrics Listener ] Ġwhich Ġwill Ġbe Ġcalled Ġwhen Ġthe Ġbuild Ġis Ġfinished ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġregister ( build Metrics Listener : ĠBuild Metrics Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" Register Ġbuild Ġmetrics Ġlistener : Ġ$ build Metrics Listener " Ġ} ĊĠĠĠĠĠĠĠ Ġ_ listeners . add ( build Metrics Listener ) ĊĠĠĠ Ġ} Ċ } Ċ