package Ġmb . pie . example . copy file Ċ Ċ import Ġmb . pie . api .* Ċ import Ġmb . pie . api . stamp . File Stamp ers Ċ import Ġmb . pie . runtime . Pie Builder Impl Ċ import Ġmb . pie . runtime . logger . Stream Logger Ċ import Ġmb . pie . runtime . task defs . Mutable Map Task Defs Ċ import Ġmb . pie . store . l mdb . LM DB Store Ċ import Ġmb . pie . store . l mdb . with LM DB Store Ċ import Ġmb . pie . vfs . path . P Path Ċ import Ġmb . pie . vfs . path . Path Srv Impl Ċ import Ġjava . io . File Ċ import Ġjava . io . Serializable Ċ import Ġkotlin . system . exit Process Ċ Ċ /** Ċ Ġ* ĠThis Ġexample Ġdemonstrates Ġhow Ġto Ġwrite Ġa ĠP IE Ġbuild Ġscript Ġin ĠKotlin Ġwith Ġthe ĠP IE ĠAPI , Ġand Ġhow Ġto Ġincrement ally Ġexecute Ġthat Ġbuild Ġscript Ċ Ġ* Ġwith Ġthe ĠP IE Ġruntime . Ċ Ġ* Ċ Ġ* ĠThe Ġgoal Ġof Ġthe Ġbuild Ġscript Ġis Ġto Ġfirst Ġgenerate Ġa Ġsource Ġfile , Ġand Ġto Ġthen Ġcopy Ġthat Ġgenerated Ġsource Ġfile Ġto Ġa Ġdestination Ġfile . Ċ Ġ*/ Ċ Ċ /** Ċ Ġ* ĠThe Ġ[ File Generator ] Ġ[ task Ġdefinition ][ Task Def ] Ġtakes Ġas Ġinput Ġa Ġ[ path ][ P Path ] Ġto Ġa Ġfile , Ġand Ġthen Ġwrites Ġ" Hello Ġworld " Ġto Ġit . ĠThis Ġtask Ċ Ġ* Ġdefinition Ġdoes Ġnot Ġreturn Ġa Ġvalue , Ġso Ġwe Ġuse Ġ[ None ] Ġas Ġoutput Ġtype . Ċ Ġ*/ Ċ class ĠFile Generator Ġ: ĠTask Def < P Path , ĠNone > Ġ{ ĊĠ Ġ/** ĊĠĠ Ġ* ĠThe Ġ[ id ] Ġproperty Ġmust Ġbe Ġoverridden Ġto Ġprovide Ġa Ġunique Ġidentifier Ġfor Ġthis Ġtask Ġdefinition . ĠIn Ġthis Ġcase , Ġwe Ġuse Ġreflection Ġto ĊĠĠ Ġ* Ġcreate Ġa Ġunique Ġidentifier . ĊĠĠ Ġ*/ ĊĠ Ġoverride Ġval Ġid : ĠString Ġ= Ġjava Class . simple Name ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠThe Ġ[ exec ] Ġmethod Ġmust Ġbe Ġoverridden Ġto Ġimplement Ġthe Ġlogic Ġof Ġthis Ġtask Ġdefinition . ĠThis Ġfunction Ġis Ġexecuted Ġwith Ġan ĊĠĠ Ġ* Ġ[ execution Ġcontext ][ Exec Context ] Ġobject Ġas Ġreceiver , Ġwhich Ġis Ġused Ġto Ġtell ĠP IE Ġabout Ġdynamic Ġtask Ġor Ġfile Ġdependencies . ĊĠĠ Ġ*/ ĊĠ Ġoverride Ġfun ĠExec Context . exec ( input : ĠP Path ): ĠNone Ġ{ ĊĠĠĠ Ġ// ĠWe Ġwrite Ġ" Hello Ġworld " Ġto Ġthe Ġfile . ĊĠĠĠ Ġinput . output Stream (). buffered (). use Ġ{ ĊĠĠĠĠĠ Ġit . write (" Hello Ġworld ". toByteArray ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠSince Ġwe Ġhave Ġwritten Ġto Ġor Ġgenerated Ġthe Ġfile Ġthat Ġ[ input ] Ġpoints Ġto , Ġwe Ġneed Ġto Ġtell ĠP IE Ġabout Ġthis Ġdynamic Ġdependency , Ġby Ġcalling ĊĠĠĠ Ġ// Ġgenerate , Ġwhich Ġis Ġdefined Ġin ĠExec Context . ĊĠĠĠ Ġgenerate ( input ) ĊĠĠĠ Ġ// ĠSince Ġthis Ġtask Ġdoes Ġnot Ġgenerate Ġa Ġvalue , Ġand Ġwe Ġuse Ġthe ĠNone Ġtype Ġto Ġindicate Ġthat , Ġwe Ġneed Ġto Ġreturn Ġthe Ġsingleton Ġinstance Ġof ĠNone . ĊĠĠĠ Ġreturn ĠNone . instance ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠThe Ġ[ File Cop ier ] Ġtask Ġdefinition Ġcopies Ġa Ġfile , Ġgenerated Ġby Ġ[ File Generator ] Ġto Ġanother Ġfile . ĠIn Ġthis Ġcase , Ġwe Ġneed Ġto Ġtake Ġmultiple Ċ Ġ* Ġinputs , Ġso Ġwe Ġgroup Ġthem Ġinto Ġthe Ġ[ File Cop ier . Input ] Ġdata Ġclass . Ċ Ġ*/ Ċ class ĠFile Cop ier Ġ: ĠTask Def < File Cop ier . Input , ĠP Path > Ġ{ ĊĠ Ġoverride Ġval Ġid : ĠString Ġ= Ġjava Class . simple Name ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠA Ġdata Ġclass Ġthat Ġgroups Ġmultiple Ġinputs Ġto Ġthis Ġtask Ġdefinition . ĊĠĠ Ġ*/ ĊĠ Ġdata Ġclass ĠInput ( ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPath Ġto Ġthe Ġfile Ġwe Ġwant Ġto Ġcopy Ġfrom . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġsource File : ĠP Path , ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTask Ġthat Ġgenerated Ġthe Ġfile Ġwe Ġwould Ġlike Ġto Ġcopy . ĊĠĠĠĠ Ġ* ĠWe Ġneed Ġto Ġpass Ġthis Ġtask Ġas Ġan Ġinput Ġto Ġthis Ġtask , Ġso Ġthat Ġwe Ġcan Ġrequire Ġit , Ġto Ġprevent Ġa Ġhidden Ġdependency Ġerror . ĊĠĠĠĠ Ġ* ĠTasks Ġcan Ġbe Ġpassed Ġto Ġother Ġtasks Ġusing Ġthe Ġ[ ST ask ] Ġor Ġ[ Task Key ] Ġtype . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġsource Task : ĠS Task <* >, ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPath Ġof Ġthe Ġdestination Ġwe Ġwant Ġto Ġcopy Ġthe Ġsource Ġfile Ġto . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġdestination File : ĠP Path ĊĠ Ġ) Ġ: ĠSerializable ĊĊĠ Ġoverride Ġfun ĠExec Context . exec ( input : ĠInput ): ĠP Path Ġ{ ĊĠĠĠ Ġval Ġ( source File , Ġsource Task , Ġdestination ) Ġ= Ġinput ĊĠĠĠ Ġ// ĠSince Ġwe Ġare Ġgoing Ġto Ġread Ġthe Ġsource Ġfile , Ġwhich Ġwas Ġgenerated Ġby Ġanother Ġtask , Ġwe Ġneed Ġto Ġcreate Ġa Ġdynamic Ġdependency Ġto Ġthe Ġtask ĊĠĠĠ Ġ// Ġand Ġthe Ġfile , Ġwhich Ġwe Ġdo Ġas Ġfollows . ĊĠĠĠ Ġrequire ( source Task ) ĊĠĠĠ Ġ// ĠWe Ġuse Ġa Ġhash Ġstamp er Ġon Ġthe Ġsource Ġfile , Ġto Ġprevent Ġcopies Ġwhen Ġthe Ġcontents Ġof Ġthe Ġsource Ġfile Ġdoes Ġnot Ġchange . ĊĠĠĠ Ġrequire ( source File , ĠFile Stamp ers . hash ) ĊĠĠĠ Ġ// ĠThen Ġwe Ġread Ġthe Ġsource Ġfile , Ġadd Ġsome Ġtext Ġto Ġit , Ġand Ġwrite Ġit Ġto Ġthe Ġdestination . ĊĠĠĠ Ġval Ġsource Text Ġ= ĠString ( source File . read All Bytes ()) Ġ+ Ġ", Ġand Ġuniverse !" ĊĠĠĠ Ġdestination . output Stream (). buffered (). use Ġ{ ĊĠĠĠĠĠ Ġit . write ( source Text . toByteArray ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠAgain , Ġsince Ġwe Ġhave Ġwritten Ġto / generated Ġa Ġfile , Ġwe Ġmust Ġadd Ġa Ġdynamic Ġdependency . ĊĠĠĠ Ġgenerate ( destination ) ĊĠĠĠ Ġreturn Ġdestination ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠThe Ġmain Ġfunction Ġwill Ġstart Ġup Ġthe ĠP IE Ġruntime Ġand Ġexecute Ġthe Ġbuild Ġscript . Ċ Ġ*/ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠ Ġ// ĠWe Ġexpect Ġtwo Ġarguments : Ġthe Ġsource Ġfile Ġto Ġgenerate , Ġand Ġthe Ġdestination Ġfile . ĊĠ Ġif ( args . size Ġ< Ġ 2 ) Ġ{ ĊĠĠĠ Ġprintln (" Expected Ġ 2 Ġarguments , Ġgot Ġ${ args . size }") ĊĠĠĠ Ġexit Process ( 1 ) ĊĠ Ġ} ĊĠ Ġval Ġsource File Str Ġ= Ġargs [ 0 ] ĊĠ Ġval Ġdestination File Str Ġ= Ġargs [ 1 ] ĊĊĠ Ġ// ĠTo Ġwork Ġwith Ġpaths Ġthat ĠP IE Ġcan Ġunderstand Ġ( P Path Ġtype ), Ġwe Ġcreate Ġa ĠPath Srv , Ġand Ġdo Ġsome Ġerror Ġchecking . ĊĠ Ġval Ġpath Srv Ġ= ĠPath Srv Impl () ĊĠ Ġval Ġsource File Ġ= Ġpath Srv . resolve Local ( source File Str ) ĊĠ Ġif ( source File . exists () Ġ&& Ġsource File . is Dir ) Ġ{ ĊĠĠĠ Ġprintln (" Source Ġfile Ġ$ source File Ġis Ġa Ġdirectory ") ĊĠĠĠ Ġexit Process ( 2 ) ĊĠ Ġ} ĊĠ Ġval Ġdestination File Ġ= Ġpath Srv . resolve Local ( destination File Str ) ĊĠ Ġif ( destination File . exists () Ġ&& Ġdestination File . is Dir ) Ġ{ ĊĠĠĠ Ġprintln (" Destination Ġfile Ġ$ destination File Ġis Ġa Ġdirectory ") ĊĠĠĠ Ġexit Process ( 2 ) ĊĠ Ġ} ĊĊĠ Ġ// ĠNow Ġwe Ġinstantiate Ġthe Ġtask Ġdefinitions . ĊĠ Ġval Ġfile Creator Ġ= ĠFile Generator () ĊĠ Ġval Ġfile Cop ier Ġ= ĠFile Cop ier () ĊĊĠ Ġ// ĠThen , Ġwe Ġadd Ġthem Ġto Ġa ĠTask Defs Ġobject , Ġwhich Ġtells ĠP IE Ġabout Ġwhich Ġtask Ġdefinitions Ġare Ġavailable . ĊĠ Ġval Ġtask Defs Ġ= ĠMutable Map Task Defs () ĊĠ Ġtask Defs . add ( file Creator . id , Ġfile Creator ) ĊĠ Ġtask Defs . add ( file Cop ier . id , Ġfile Cop ier ) ĊĊĠ Ġ// ĠWe Ġneed Ġto Ġcreate Ġthe ĠP IE Ġruntime , Ġusing Ġa ĠP ie Builder Impl . ĊĠ Ġval Ġpie Builder Ġ= ĠP ie Builder Impl () ĊĠ Ġ// ĠWe Ġpass Ġin Ġthe ĠTask Defs Ġobject Ġwe Ġcreated . ĊĠ Ġpie Builder . with Task Defs ( task Defs ) ĊĠ Ġ// ĠFor Ġstoring Ġbuild Ġresults Ġand Ġthe Ġdependency Ġgraph , Ġwe Ġwill Ġuse Ġthe ĠL MDB Ġembedded Ġdatabase , Ġstored Ġat Ġtarget / l mdb . ĊĠ Ġpie Builder . with LM DB Store ( File (" target / l mdb ")) ĊĠ Ġ// ĠFor Ġexample Ġpurposes , Ġwe Ġuse Ġverbose Ġlogging Ġwhich Ġwill Ġoutput Ġto Ġstdout . ĊĠ Ġpie Builder . with Logger ( Stream Logger . verbose ()) ĊĠ Ġ// ĠThen Ġwe Ġbuild Ġthe ĠP IE Ġruntime . ĊĠ Ġval Ġpie Ġ= Ġpie Builder . build () ĊĊĠ Ġ// ĠNow Ġwe Ġcreate Ġconcrete Ġtask Ġinstances Ġfrom Ġthe Ġtask Ġdefinitions . ĊĠ Ġval Ġfile Creator Task Ġ= Ġfile Creator . create Task ( source File ) ĊĠ Ġval Ġfile Cop ier Task Ġ= Ġfile Cop ier . create Task ( File Cop ier . Input ( source File , Ġfile Creator Task . to ST ask (), Ġdestination File )) ĊĊĠ Ġ// ĠWe Ġ( increment ally ) Ġexecute Ġthe Ġfile Ġcop ier Ġtask Ġusing Ġthe Ġtop - down Ġexecutor . ĊĠ Ġval Ġoutput Ġ= Ġpie . top Down Executor . new Session (). require Initial ( file Cop ier Task ) ĊĠ Ġprintln (" Copied Ġto : Ġ$ output ") ĊĊĠ Ġ// ĠFinally , Ġwe Ġclean Ġup Ġour Ġresources . ĊĠ Ġpie . close () ĊĠ Ġpath Srv . close () Ċ }