/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 8 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 . android . build . gradle . internal . tasks Ċ Ċ import Ġcom . android . Sdk Constants Ċ import Ġcom . android . build . api . artifact . Multiple Artifact Ċ import Ġcom . android . build . gradle . internal . Logger Wrapper Ċ import Ġcom . android . build . gradle . internal . component . Component Creation Config Ċ import Ġcom . android . build . gradle . internal . coverage . J aco co Configurations Ċ import Ġcom . android . build . gradle . internal . publishing . Android Artifacts Ċ import Ġcom . android . build . gradle . internal . scope . Internal Artifact Type Ċ import Ġcom . android . build . gradle . internal . scope . Internal Multiple Artifact Type Ċ import Ġcom . android . build . gradle . internal . tasks . factory . Variant Task Creation Action Ċ import Ġcom . android . build . gradle . internal . utils . set Dis allow Changes Ċ import Ġcom . android . build . gradle . options . Boolean Option Ċ import Ġcom . android . build . gradle . tasks . to Serializable Ċ import Ġcom . android . builder . files . Serializable Change Ċ import Ġcom . android . utils . FileUtils Ċ import Ġcom . android . utils . Path Utils Ċ import Ġcom . google . common . base . Preconditions Ċ import Ġcom . google . common . collect . ImmutableList Ċ import Ġcom . google . common . io . Byte Streams Ċ import Ġcom . google . common . io . Files Ċ import Ġorg . gradle . api . file . Configurable File Collection Ċ import Ġorg . gradle . api . file . Directory Property Ċ import Ġorg . gradle . api . provider . Map Property Ċ import Ġorg . gradle . api . provider . Property Ċ import Ġorg . gradle . api . specs . Spec Ċ import Ġorg . gradle . api . tasks . Cache able Task Ċ import Ġorg . gradle . api . tasks . Classpath Ċ import Ġorg . gradle . api . tasks . Input Ċ import Ġorg . gradle . api . tasks . Nested Ċ import Ġorg . gradle . api . tasks . Output Directory Ċ import Ġorg . gradle . api . tasks . Task Provider Ċ import Ġorg . gradle . work . Incremental Ċ import Ġorg . gradle . work . Input Changes Ċ import Ġorg . gradle . workers . ClassLoader Worker Spec Ċ import Ġorg . gradle . workers . Process Worker Spec Ċ import Ġorg . gradle . workers . Work Action Ċ import Ġorg . gradle . workers . Work Parameters Ċ import Ġorg . gradle . workers . Work Queue Ċ import Ġorg . jac oco . core . instr . Instrument er Ċ import Ġorg . jac oco . core . runtime . Offline Instrumentation Access Generator Ċ import Ġjava . io . Buffered OutputStream Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . io . Unchecked IOException Ċ import Ġjava . util . ArrayList Ċ import Ġjava . util . Enum Map Ċ import Ġjava . util . HashSet Ċ import Ġjava . util . Objects Ċ import Ġjava . util . regex . Pattern Ċ import Ġjava . util . zip . Zip Entry Ċ import Ġjava . util . zip . Zip File Ċ import Ġjava . util . zip . Zip OutputStream Ċ Ċ @ Cache able Task Ċ abstract Ġclass ĠJ aco co Task Ġ: ĠNew Incremental Task () Ġ{ ĊĊĠĠĠ Ġ@ get : Classpath ĊĠĠĠ Ġabstract Ġval Ġj aco co Ant Task Configuration : ĠConfigur able File Collection ĊĊĠĠĠ Ġ@ get : Nested ĊĠĠĠ Ġabstract Ġval Ġj ars With Identity : ĠJ ars Classpath Input sWith Identity ĊĊĠĠĠ Ġ@ get : Classpath ĊĠĠĠ Ġ@ get : Incremental ĊĠĠĠ Ġabstract Ġval Ġclasses Dir : ĠConfigur able File Collection ĊĊĠĠĠ Ġ@ get : Input ĊĠĠĠ Ġabstract Ġval Ġforce OutOf Process : ĠProperty < Boolean > ĊĊĠĠĠ Ġ@ get : Output Directory ĊĠĠĠ Ġabstract Ġval Ġoutput For Dirs : ĠDirectory Property ĊĊĠĠĠ Ġ@ get : Output Directory ĊĠĠĠ Ġabstract Ġval Ġoutput For J ars : ĠDirectory Property ĊĊĠĠĠ Ġoverride Ġfun Ġdo Task Action ( input Changes : ĠInput Changes ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprocess Directories ( input Changes ) ĊĠĠĠĠĠĠĠ Ġprocess J ars ( input Changes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Directories ( input Changes : ĠInput Changes ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchanges Ġ= Ġinput Changes . getFile Changes ( classes Dir ). to Serializable () ĊĠĠĠĠĠĠĠ Ġval Ġfiles To Process : ĠMutable Set < Serializable Change > Ġ= ĠHashSet ( changes . added Files ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( removed File Ġin Ġchanges . removed Files ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove File ( removed File ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( modified File Ġin Ġchanges . modified Files ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove File ( modified File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiles To Process . add ( modified File ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġto Process : ĠMutable Map < Action , ĠMutable List < Serializable Change >> Ġ= ĠEnum Map ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAction :: class . java ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( change Ġin Ġfiles To Process ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġcalculate Action ( change . normalized Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Ġ== ĠAction . IGNORE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġby Action Ġ= Ġto Process . get OrDefault ( action , ĠArrayList ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġby Action . add ( change ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Process [ action ] Ġ= Ġby Action ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġwork Queue Ġ= Ġwork Queue ĊĠĠĠĠĠĠĠ Ġwork Queue . submit ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInstrument Dir Action :: class . java ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġparams : ĠInstrument Dir Action . Parameters Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . changes To Process . set ( to Process ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . output . set ( output For Dirs . as File ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess J ars ( input Changes : ĠInput Changes ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmapping State Ġ= Ġj ars With Identity . get Mapping State ( input Changes ) ĊĠĠĠĠĠĠĠ Ġif Ġ( mapping State . re process All ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileUtils . delete Directory Contents ( output For J ars . get (). as File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUn checked IOException ( ex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġfile Info ) Ġin Ġmapping State . j ars Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fileInfo . has Changed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstrument ed Jar Ġ= Ġget Corre sponding Instrument ed Jar ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput For J ars . get (). as File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObjects . requireNonNull ( fileInfo . identity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileUtils . delete IfExists ( instrument ed Jar ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUn checked IOException ( ex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwork Queue Ġ= Ġwork Queue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput J ars Folder Ġ= Ġoutput For J ars . as File . get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwork Queue . submit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInstrument Jar Action :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġparams : ĠInstrument Jar Action . Parameters Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . root . set ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . output . set ( instrument ed Jar ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove File ( file ToRemove : ĠSerializable Change ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġcalculate Action ( file ToRemove . normalized Path ) ĊĠĠĠĠĠĠĠ Ġif Ġ( action Ġ== ĠAction . IGNORE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġoutput Path Ġ= Ġoutput For Dirs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Path () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. resolve ( file ToRemove . normalized Path ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPath Utils . delete Re cursively IfExists ( output Path ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUn checked IOException ( ex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġwork Queue : ĠWork Queue ĊĠĠĠĠĠĠĠ Ġprivate Ġget () Ġ= Ġif Ġ( force OutOf Process . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġworker Executor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. process Isolation Ġ{ Ġspec : ĠProcess Worker Spec Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspec . classpath . from ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj aco co Ant Task Configuration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġworker Executor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. class Loader Isolation Ġ{ Ġspec : ĠClassLoader Worker Spec Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspec . classpath . from ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj aco co Ant Task Configuration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠThe Ġpossible Ġactions Ġwhich Ġcan Ġhappen Ġto Ġan Ġinput Ġfile Ġ Ġ*/ ĊĠĠĠ Ġenum Ġclass ĠAction ( var arg Ġpatterns : ĠPattern ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĠThe Ġfile Ġis Ġjust Ġcopied Ġto Ġthe Ġtransform Ġoutput . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ ĠCOPY ( K OT LIN _ MODULE _ PATTERN ), ĊĊĠĠĠĠĠĠĠ Ġ/** ĠThe Ġfile Ġis Ġignored . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ ĠIG NORE , ĊĊĠĠĠĠĠĠĠ Ġ/** ĠThe Ġfile Ġis Ġinstrument ed Ġand Ġadded Ġto Ġthe Ġtransform Ġoutput . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ ĠIN STR UMENT ( CLASS _ PATTERN ); ĊĊĠĠĠĠĠĠĠ Ġval Ġpatterns : ĠImmutableList < Pattern > ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġpatterns ĠPattern s Ġare Ġcompared Ġto Ġfiles ' Ġrelative Ġpaths Ġto Ġdetermine Ġif Ġthey ĊĠĠĠĠĠĠĠĠ Ġ* Ġunder go Ġthe Ġcorresponding Ġaction . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠImmutableList . Builder < Pattern >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( pattern Ġin Ġpatterns ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPreconditions . checkNotNull ( pattern ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add ( pattern ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . patterns Ġ= Ġbuilder . build () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġaction Ġis Ġnot Ġa Ġ[ Profile Aware Work Action ] Ġas Ġit Ġis Ġsubmitted Ġin Ġisolation Ġmode ĊĠĠĠĠ Ġ* Ġwhich Ġis Ġnot Ġsupported Ġby Ġ[ Analytics Service ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġclass ĠInstrument Dir Action Ġ: ĠWork Action < Instrument Dir Action . Parameters > Ġ{ ĊĠĠĠĠĠĠĠ Ġabstract Ġclass ĠParameters Ġ: ĠWork Parameters Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabstract Ġval Ġchanges To Process : ĠMap Property < Action , ĠMutable List < Serializable Change >> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabstract Ġval Ġoutput : ĠProperty < File ?> ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinputs Ġ= Ġparameters Ġ!! . changes To Process . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġparameters Ġ!! . output . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstrument er Ġ= ĠInstrument er ( Offline Instrumentation Access Generator ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( to Instrument Ġin Ġinputs . get OrDefault ( Action . INSTR UMENT , ĠImmutableList . of ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Instrument ing Ġfile : Ġ" Ġ+ Ġto Instrument . file . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . as Byte Source ( to Instrument . file ). open Buffered Stream (). use Ġ{ ĠinputStream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstrument ed Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstrument er . instrument ( inputStream , Ġto Instrument . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoutputFile Ġ= ĠFile ( output Dir , Ġto Instrument . normalized Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . create Parent Dirs ( outputFile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . write ( instrument ed , ĠoutputFile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUn checked IOException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unable Ġto Ġinstrument Ġfile Ġwith ĠJ aco co : Ġ" Ġ+ Ġto Instrument . file , Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( file , Ġ_, Ġnormalized Path ) Ġin Ġinputs . get OrDefault ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAction . COPY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImmutableList . of () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoutputFile Ġ= ĠFile ( output Dir , Ġnormalized Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . create Parent Dirs ( outputFile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . copy ( file , ĠoutputFile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUn checked IOException (" Unable Ġto Ġcopy Ġfile : Ġ$ file ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLogger Wrapper . getLogger ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInstrument Dir Action :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġclass ĠInstrument Jar Action Ġ: ĠWork Action < Instrument Jar Action . Parameters > Ġ{ ĊĠĠĠĠĠĠĠ Ġabstract Ġclass ĠParameters Ġ: ĠWork Parameters Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabstract Ġval Ġroot : ĠProperty < File ?> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabstract Ġval Ġoutput : ĠProperty < File ?> ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Jar Ġ= Ġparameters . root . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Instrument ing Ġjar : Ġ" Ġ+ Ġinput Jar ?. absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstrument ed Jar Ġ= Ġparameters . output . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstrument er Ġ= ĠInstrument er ( Offline Instrumentation Access Generator ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZip OutputStream ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuffered OutputStream ( File OutputStream ( instrument ed Jar )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). use Ġ{ Ġoutput Zip Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZip File ( input Jar ). use Ġ{ Ġzip File Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentries Ġ= Ġzip File . entries () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( entries . hasMore Elements ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġentries . nextElement () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Name Ġ= Ġentry . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Action Ġ= Ġcalculate Action ( entry Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry Action Ġ== ĠAction . IGNORE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass InputStream Ġ= Ġzip File . getInputStream ( entry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdata : ĠByteArray ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġif Ġ( entry Action Ġ== ĠAction . INSTR UMENT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstrument er . instrument ( class InputStream , Ġentry Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// Ġjust Ġcopy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠByte Streams . toByteArray ( class InputStream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Entry Ġ= ĠZip Entry ( entry Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAny Ġnegative Ġtime Ġvalue Ġsets ĠZip Entry 's Ġx d ost ime Ġto ĠDO ST IME _ BEFORE _ 1 9 8 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġconstant . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Entry . time Ġ= Ġ- Ġ 1 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Zip . put Next Entry ( next Entry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Zip . write ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Zip . close Entry () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUn checked IOException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unable Ġto Ġinstrument Ġfile Ġwith ĠJ aco co : Ġ$ input Jar ", Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLogger Wrapper . getLogger ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInstrument Jar Action :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠCreation Action ( creation Config : ĠComponent Creation Config ) Ġ: ĊĠĠĠĠĠĠĠ ĠVariant Task Creation Action < J aco co Task , ĠComponent Creation Config >( creation Config ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġname : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġcompute Task Name (" jac oco ") ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġtype : ĠClass < J aco co Task > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= ĠJ aco co Task :: class . java ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Provider ( task Provider : ĠTask Provider < J aco co Task >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . handle Provider ( task Provider ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreation Config ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. artifacts ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setInitial Provider ( task Provider ) Ġ{ Ġobj : ĠJ aco co Task Ġ-> Ġobj . output For Dirs Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Name (" out ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on ( Internal Artifact Type . J AC O CO _ INSTR UMENT ED _ CLASSES ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreation Config ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. artifacts ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setInitial Provider ( task Provider ) Ġ{ Ġobj : ĠJ aco co Task Ġ-> Ġobj . output For J ars Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Name (" out ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on ( Internal Artifact Type . J AC O CO _ INSTR UMENT ED _ J ARS ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġconfigure ( task : ĠJ aco co Task ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . configure ( task ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . j ars With Identity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. input J ars ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. from ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreation Config ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. artifacts ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getAll ( Multiple Artifact . ALL _ CLASSES _ J ARS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . classes Dir ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. from ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreation Config ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. artifacts ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getAll ( Multiple Artifact . ALL _ CLASSES _ DIRS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . jac oco Ant Task Configuration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. from ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ aco co Configurations . get J aco co Ant Task Configuration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . project , Ġget J aco co Version ( creation Config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . force OutOf Process ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreation Config ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. services ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. project Options [ Boolean Option . FORCE _ J AC O CO _ OUT _ OF _ PROCESS ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĠReturns Ġwhich ĠJ aco co Ġversion Ġto Ġuse . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget J aco co Version ( creation Config : ĠComponent Creation Config ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcreation Config . global Scope . extension . jac oco . jac oco Version ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠCLASS _ PATTERN Ġ= ĠPattern . compile (" .* \\. class $ ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠMETA - INF /*. kotlin _ module Ġfiles Ġneed Ġto Ġbe Ġcopied Ġto Ġoutput Ġso Ġthey Ġshow Ġup ĊĠĠĠĠĠĠĠ Ġ// Ġin Ġthe Ġintermediate Ġclasses Ġjar . ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠK OT LIN _ MODULE _ PATTERN Ġ= ĠPattern . compile ("^ META - INF / .* \\. kotlin _ module $ ") ĊĠĠĠĠĠĠĠ Ġfun Ġcalculate Action ( input RelativePath : ĠString ): ĠAction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input RelativePath . startsWith (" org / jac oco ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAction . COPY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( pattern Ġin ĠAction . COPY . patterns ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pattern . matcher ( input RelativePath ). matches ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAction . COPY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( pattern Ġin ĠAction . INSTR UMENT . patterns ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pattern . matcher ( input RelativePath ). matches ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAction . INSTR UMENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAction . IGNORE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Corre sponding Instrument ed Jar ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Folder : ĠFile , Ġidentity : ĠString ĊĠĠĠĠĠĠĠ Ġ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFile ( output Folder , Ġidentity Ġ+ ĠS dk Constants . DOT _ JAR ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ