package Ġcom . tester um . file _ service . cache s . resolved Ċ Ċ import Ġcom . tester um . file _ service . cache s . resolved . resolvers . Steps Resolver Ċ import Ġcom . tester um . file _ service . cache s . warnings . Warning Service Ċ import Ġcom . tester um . file _ service . file . Comp osed Step File Service Ċ import Ġcom . tester um . file _ service . util . is Changed Re qu iring Save Ċ import Ġcom . tester um . model . enums . Step Phase Enum Ċ import Ġcom . tester um . model . exception . ValidationException Ċ import Ġcom . tester um . model . infrastructure . path . Copy Path Ċ import Ġcom . tester um . model . infrastructure . path . Path Ċ import Ġcom . tester um . model . infrastructure . path . Rename Path Ċ import Ġcom . tester um . model . step . Basic Step Def Ċ import Ġcom . tester um . model . step . Comp osed Step Def Ċ import Ġcom . tester um . model . step . Step Def Ċ import Ġcom . tester um . model . step . Undefined Step Def Ċ import Ġcom . tester um . model . text . Step Pattern Ċ import Ġcom . tester um . model . text . parts . Text Step Pattern Part Ċ import Ġcom . tester um . model . util . Step Hash Util Ċ import Ġcom . tester um . model . util . escape Ċ import Ġcom . tester um . scanner . step _ lib _ scanner . model . hooks . Hook Def Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . util . concurrent . locks . Re entrant ReadWrite Lock Ċ import Ġkotlin . concurrent . read Ċ import Ġkotlin . concurrent . write Ċ import Ġjava . nio . file . Path Ġas ĠJava Path Ċ Ċ class ĠSteps Cache ( ĊĠĠĠ Ġprivate Ġval Ġbasic Steps Cache : ĠBasic Steps Cache , ĊĠĠĠ Ġprivate Ġval Ġcomposed Step File Service : ĠComp osed Step File Service , ĊĠĠĠ Ġprivate Ġval Ġsteps Resolver : ĠSteps Resolver , ĊĠĠĠ Ġprivate Ġval Ġwarning Service : ĠWarning Service Ċ ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOG Ġ= ĠLoggerFactory . getLogger ( Steps Cache :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġlock Ġ= ĠRe entrant ReadWrite Lock () ĊĊĠĠĠ Ġprivate Ġvar Ġcomposed Steps Dir : ĠJava Path ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġresources Dir : ĠJava Path ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġun resolved Comp osed Steps : ĠMutable List < Comp osed Step Def > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġprivate Ġvar Ġsteps By Hash : ĠMutable Map </ * hash : Ġ*/ String , ĠStep Def > Ġ= Ġhash Map Of () ĊĠĠĠ Ġprivate Ġvar Ġsteps By Path : ĠMutable Map < Path , ĠStep Def > Ġ= Ġhash Map Of () ĊĊĠĠĠ Ġfun Ġinitialize ( ĊĠĠĠĠĠĠĠ Ġpackages With Annotations : ĠList < String >, ĊĠĠĠĠĠĠĠ Ġadditional Basic Steps Dirs : ĠList < Java Path >, ĊĠĠĠĠĠĠĠ Ġcomposed Steps Dir : ĠJava Path , ĊĠĠĠĠĠĠĠ Ġresources Dir : ĠJava Path , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . composed Steps Dir Ġ= Ġcomposed Steps Dir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . resources Dir Ġ= Ġresources Dir ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbasic Steps Cache . initialize ( packages With Annotations , Ġadditional Basic Steps Dirs ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġload Ġun resolved Ġcomposed Ġsteps ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . un resolved Comp osed Steps Ġ= ĠArrayList ( load Comp osed Steps ( composed Steps Dir )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Steps () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġre initialize Comp osed Steps () Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposed Steps Dir Ġ= Ġthis . composed Steps Dir ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" cannot Ġresolve Ġsteps Ġbecause Ġthe Ġcomposed Steps Dir Ġis Ġnot Ġset ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġload Ġun resolved Ġcomposed Ġsteps ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . un resolved Comp osed Steps Ġ= ĠArrayList ( load Comp osed Steps ( composed Steps Dir )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Steps () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Comp osed Steps ( composed Steps Dir : ĠJava Path ): ĠList < Comp osed Step Def > Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstartTime Millis Ġ= ĠSystem . currentTimeMillis () ĊĊĠĠĠĠĠĠĠ Ġval Ġcomposed Steps : ĠList < Comp osed Step Def > Ġ= Ġcomposed Step File Service . getAll Comp osed Steps ( composed Steps Dir ) ĊĊĠĠĠĠĠĠĠ Ġval ĠendTime Init Millis Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ ĠLOG . info (" loading Ġ${ composed Steps . size } Ġcomposed Ġsteps Ġtook Ġ${ endTime Init Millis Ġ- ĠstartTime Millis } Ġms ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcomposed Steps ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresolve Steps () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresources Dir Ġ= Ġthis . resources Dir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" cannot Ġresolve Ġsteps Ġbecause Ġthe Ġresources Dir Ġis Ġnot Ġset ") ĊĊĠĠĠĠĠĠĠ Ġ// Ġresolve Ġsteps ĊĠĠĠĠĠĠĠ Ġval Ġbasic Steps Ġ= Ġbasic Steps Cache . get Basic Steps () ĊĠĠĠĠĠĠĠ Ġsteps By Hash Ġ= Ġresolve Steps ( basic Steps , Ġthis . un resolved Comp osed Steps , Ġresources Dir ) ĊĊĠĠĠĠĠĠĠ Ġsteps By Path Ġ= Ġhash Map Of () ĊĠĠĠĠĠĠĠ Ġsteps By Hash . map Keys To ( steps By Path ) Ġ{ Ġit . value . path Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresolve Steps ( basic Steps : ĠCollection < Basic Step Def >, Ġcomposed Steps : ĠList < Comp osed Step Def >, Ġresources Dir : ĠJava Path ): ĠMutable Map < String , ĠStep Def > Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstartTime Millis Ġ= ĠSystem . currentTimeMillis () ĊĊĠĠĠĠĠĠĠ Ġval Ġbasic Steps By Hash Ġ= Ġbasic Steps . associate By Ġ{ Ġit . hash Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġun resolved Comp osed Steps By Hash Ġ= Ġcomposed Steps . associate By Ġ{ Ġit . hash Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresolved Steps Ġ= Ġsteps Resolver . resolve ( basic Steps By Hash , Ġun resolved Comp osed Steps By Hash , Ġresources Dir ) ĊĠĠĠĠĠĠĠ Ġval Ġresolved Step sWith Warnings Ġ= Ġadd Warnings ( resolved Steps ) ĊĊĠĠĠĠĠĠĠ Ġval ĠendTime Init Millis Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ ĠLOG . info (" res olving Ġ${ resolved Step sWith Warnings . size } Ġsteps Ġtook Ġ${ endTime Init Millis Ġ- ĠstartTime Millis } Ġms ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresolved Step sWith Warnings ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Warnings ( resolved Steps : ĠMap </ * hash : Ġ*/ String , ĠStep Def >): ĠMutable Map </ * hash : Ġ*/ String , ĠStep Def > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġhash Map Of < String , ĠStep Def >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( hash , Ġstep ) Ġin Ġresolved Steps ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( step Ġis ĠComp osed Step Def ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstep With Warnings Ġ= Ġwarning Service . composed Step With Warnings ( step ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ step With Warnings . hash ] Ġ= Ġstep With Warnings ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ hash ] Ġ= Ġstep ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Basic Steps (): ĠList < Basic Step Def > Ġ= Ġlock . read Ġ{ Ġbasic Steps Cache . get Basic Steps () Ġ} ĊĊĠĠĠ Ġfun Ġget Basic Step At Path ( basic Step Path : ĠPath ): ĠBasic Step Def ? Ġ= Ġlock . read Ġ{ Ġbasic Steps Cache . get Step At Path ( basic Step Path ) Ġ} ĊĊĠĠĠ Ġfun Ġget Hooks (): ĠList < Hook Def > Ġ= Ġlock . read Ġ{ Ġbasic Steps Cache . get Hooks () Ġ} ĊĊĠĠĠ Ġfun ĠgetAll Steps (): ĠCollection < Step Def > Ġ= Ġlock . read Ġ{ Ġsteps By Hash . values Ġ} ĊĊĠĠĠ Ġfun Ġget Step At Path ( basic Step Path : ĠPath ): ĠStep Def ? Ġ= Ġlock . read Ġ{ Ġsteps By Path [ basic Step Path ] Ġ} ĊĊĠĠĠ Ġfun Ġget Comp osed Step At Path ( path : ĠPath ): ĠComp osed Step Def ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstep Ġ= Ġget Step At Path ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġif Ġ( step Ġ! is ĠComp osed Step Def ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġstep ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Step Def By Phase And Pattern ( step Phase : ĠStep Phase Enum , Ġstep Pattern : ĠStep Pattern ): ĠStep Def Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . read Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstep Hash Ġ= ĠStep Hash Util . calculate Step Hash ( step Phase , Ġstep Pattern ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsteps By Hash [ step Hash ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠUndefined Step Def ( step Phase , Ġstep Pattern ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Comp osed Steps (): ĠList < Comp osed Step Def > Ġ= ĠgetAll Steps (). filter Is Instance < Comp osed Step Def >() ĊĊĠĠĠ Ġfun Ġdelete Comp osed Step ( path : ĠPath ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposed Steps Dir Ġ= Ġthis . composed Steps Dir ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" cannot Ġdelete Ġcomposed Ġstep Ġbecause Ġthe Ġcomposed Steps Dir Ġis Ġnot Ġset ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomposed Step File Service . delete Comp osed Step ( path , Ġcomposed Steps Dir ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġun resolved Comp osed Steps . remove If Ġ{ Ġit . old Path Ġ== Ġpath Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Steps () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave Comp osed Step ( composed Step : ĠComp osed Step Def ): ĠComp osed Step Def Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposed Steps Dir Ġ= Ġthis . composed Steps Dir ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" cannot Ġsave Ġcomposed Ġstep Ġbecause Ġthe Ġcomposed Steps Dir Ġis Ġnot Ġset ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting Step Ġ= Ġcomposed Step . old Path ?. let Ġ{ Ġsteps By Path [ it ] Ġ} Ġas ? ĠComp osed Step Def ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġupdate Ġwithout Ġchanges ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing Step Ġ!= Ġnull Ġ&& Ġ! composed Step . is Changed Re qu iring Save ( existing Step )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexisting Step ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsave Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsaved Comp osed Step Def Ġ= Ġcomposed Step File Service . save ( composed Step , Ġcomposed Steps Dir ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġupdate Ġcache : Ġremove Ġold ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Path Ġ= Ġcomposed Step . old Path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Path Ġ= Ġcomposed Step . getNew Path () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Path Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun resolved Comp osed Steps . remove If Ġ{ Ġit . path Ġ== Ġold Path Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun resolved Comp osed Steps . remove If Ġ{ Ġit . path Ġ== Ġnew Path Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġupdate Ġcache : Ġadd Ġnew ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun resolved Comp osed Steps . add ( saved Comp osed Step Def ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġre - resolve Ġsteps ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Steps () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Step At Path ( saved Comp osed Step Def . path ) !! Ġas ĠComp osed Step Def ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrename Comp osed Step Directory ( rename Path : ĠRename Path ): ĠPath Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposed Steps Dir Ġ= Ġthis . composed Steps Dir ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" cannot Ġrename Ġdirectory Ġstep Ġbecause Ġthe Ġcomposed Steps Dir Ġis Ġnot Ġset ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrename Ġdirectory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Esc aped Path Ġ= Ġrename Path . path . escape () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Esc aped Path Ġ= Ġcomposed Step File Service . rename Directory ( rename Path , Ġcomposed Steps Dir ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. escape () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġupdate Ġcache ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Un resolved Comp osed Steps : ĠMutable List < Comp osed Step Def > Ġ= Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( step Ġin Ġun resolved Comp osed Steps ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Step Path Ġ= Ġstep . path . replace Dirs ( old Esc aped Path , Ġnew Esc aped Path ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Un resolved Comp osed Steps Ġ+= Ġstep . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ= Ġnew Step Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Path Ġ= Ġnew Step Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġun resolved Comp osed Steps Ġ= Ġnew Un resolved Comp osed Steps ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Steps () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnew Esc aped Path ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete Comp osed Step Directory ( path : ĠPath ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposed Steps Dir Ġ= Ġthis . composed Steps Dir ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" cannot Ġdelete Ġdirectory Ġstep Ġbecause Ġthe Ġcomposed Steps Dir Ġis Ġnot Ġset ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdelete Ġdirectory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomposed Step File Service . delete Directory ( path , Ġcomposed Steps Dir ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġupdate Ġcache ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Un resolved Comp osed Steps : ĠMutable List < Comp osed Step Def > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun resolved Comp osed Steps . filter To ( new Un resolved Comp osed Steps ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! it . path . is Child Or Self ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun resolved Comp osed Steps Ġ= Ġnew Un resolved Comp osed Steps ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Steps () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmove Comp osed Step Directory Or File ( copy Path : ĠCopy Path ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposed Steps Dir Ġ= Ġthis . composed Steps Dir ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" cannot Ġmove Ġcomposed Ġstep Ġdirectory Ġor Ġfile Ġbecause Ġthe Ġcomposed Steps Dir Ġis Ġnot Ġset ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomposed Step File Service . move Comp osed Step Directory Or File ( copy Path , Ġcomposed Steps Dir ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġre initialize Comp osed Steps () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcopy Comp osed Step ( source Path : ĠPath , Ġdestination DirPath : ĠPath ): ĠPath Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposed Steps Dir Ġ= Ġthis . composed Steps Dir ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" cannot Ġmove Ġcomposed Ġstep Ġdirectory Ġor Ġfile Ġbecause Ġthe Ġcomposed Steps Dir Ġis Ġnot Ġset ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlookup Ġstep Ġdef ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstep Def Ġ= Ġget Comp osed Step At Path OrFail WithError ( source Path ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġchange Ġpattern ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstep Def To Save Ġ= Ġcreate Comp osed Step Def CopyWith Unique Pattern ( step Def , Ġdestination DirPath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstep Def To Save Ġ= Ġstep Def To Save . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Path Ġ= Ġnull , Ġ// Ġsetting Ġold - path Ġto Ġ" null " Ġto Ġtell Ġ" save " Ġto Ġcreate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ= Ġstep Def To Save . getNew Path () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsave ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsaved Comp osed Step Def Ġ= Ġcomposed Step File Service . save ( step Def To Save , Ġcomposed Steps Dir ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreload Ġsteps ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre initialize Comp osed Steps () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsaved Comp osed Step Def . path ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmove Comp osed Step ( source Path : ĠPath , Ġdestination DirPath : ĠPath ): ĠPath Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposed Steps Dir Ġ= Ġthis . composed Steps Dir ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" cannot Ġmove Ġcomposed Ġstep Ġdirectory Ġor Ġfile Ġbecause Ġthe Ġcomposed Steps Dir Ġis Ġnot Ġset ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlookup Ġstep Ġdef ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstep Defs Ġ= Ġget Comp osed Steps At Path OrFail WithError ( source Path ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Path Ġ= Ġsource Path . getParent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( step Def Ġin Ġstep Defs ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstep Def New Path Ġ= Ġstep Def . path . replace Dirs ( old Path , Ġdestination DirPath ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstep Def To Save Ġ= Ġstep Def . copy ( path Ġ= Ġstep Def New Path ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsave ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomposed Step File Service . save ( step Def To Save , Ġcomposed Steps Dir ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreload Ġsteps ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre initialize Comp osed Steps () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsource Path . replace Dirs ( old Path , Ġdestination DirPath ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Comp osed Steps At Path OrFail WithError ( source Path : ĠPath ): ĠCollection < Comp osed Step Def > Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . read Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( source Path . isFile ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposed Step Def Ġ= Ġget Comp osed Step At Path OrFail WithError ( source Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( composed Step Def ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsteps To Move Ġ= Ġsteps By Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . key . is Child Or Self ( source Path ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . value Ġis ĠComp osed Step Def } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Values Ġ{ Ġit . value Ġas ĠComp osed Step Def Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. values . toList () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( steps To Move . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠValidation Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġglobal Message Ġ= Ġ" The Ġpath Ġ[$ source Path ] Ġdoes Ġnot Ġcontain Ġany Ġsteps .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġglobal Html Message Ġ= Ġ" The Ġstep Ġat Ġpath < br />< code >$ source Path </ code >< br /> does Ġnot Ġexist ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsteps To Move ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Comp osed Step At Path OrFail WithError ( source Path : ĠPath ): ĠComp osed Step Def Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . read Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstep Def Ġ= Ġsteps By Path [ source Path ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( step Def Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠValidation Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġglobal Message Ġ= Ġ" The Ġstep Ġat Ġpath Ġ[$ source Path ] Ġdoes Ġnot Ġexist .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġglobal Html Message Ġ= Ġ" The Ġstep Ġat Ġpath < br />< code >$ source Path </ code >< br /> does Ġnot Ġexist ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( step Def Ġ! is ĠComp osed Step Def ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠValidation Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġglobal Message Ġ= Ġ" The Ġstep Ġat Ġpath Ġ[$ source Path ] Ġis Ġnot Ġa Ġcomposed Ġstep .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġglobal Html Message Ġ= Ġ" The Ġstep Ġat Ġpath < br />< code >$ source Path </ code >< br /> is Ġnot Ġa Ġcomposed Ġstep ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstep Def ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Comp osed Step Def CopyWith Unique Pattern ( ĊĠĠĠĠĠĠĠ Ġsource Step Def : ĠComp osed Step Def , ĊĠĠĠĠĠĠĠ Ġdestination DirPath : ĠPath ĊĠĠĠ Ġ): ĠComp osed Step Def Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . read Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdestination Pattern : ĠStep Pattern ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpostfix Text Ġ= Ġ" Ġ- ĠCopy " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpostfix : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpostfix Count Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpostfix Count AsString Ġ= Ġif Ġ( postfix Count Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ$ postfix Count " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpostfix Ġ= Ġpostfix Text Ġ+ Ġpostfix Count AsString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpostfix Count ++ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Pattern Ġ= Ġsource Step Def . step Pattern . append Part ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Step Pattern Part ( postfix ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( step Exists ( source Step Def . phase , Ġdestination Pattern )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsource Step Def . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep Pattern Ġ= Ġdestination Pattern , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Path Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ= Ġdestination DirPath . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfileName Ġ= Ġsource Step Def . path . fileName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Extension Ġ= Ġsource Step Def . path . file Extension ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstep Exists ( step Phase : ĠStep Phase Enum , Ġstep Pattern : ĠStep Pattern ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . read Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstep Hash Ġ= ĠStep Hash Util . calculate Step Hash ( step Phase , Ġstep Pattern ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsteps By Hash [ step Hash ] Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠStep Def . hash : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠStep Hash Util . calculate Step Hash ( this ) Ċ Ċ } Ċ