package Ġfr . y od am ad . svn 2 git . service . util Ċ Ċ import Ġfr . y od am ad . svn 2 git . config . Application Properties Ċ import Ġfr . y od am ad . svn 2 git . config . Constants Ċ import Ġfr . y od am ad . svn 2 git . data . Work Unit Ċ import Ġfr . y od am ad . svn 2 git . domain . enumeration . Status Enum Ċ import Ġfr . y od am ad . svn 2 git . domain . enumeration . Step Enum Ċ import Ġfr . y od am ad . svn 2 git . io . Shell Ċ import Ġfr . y od am ad . svn 2 git . service . History Manager Ċ import Ġorg . apache . commons . lang 3 . StringUtils Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġorg . springframework . util . FileSystem Utils Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ Ċ @ Service Ċ open Ġclass ĠIO Manager ( val Ġhistory Mgr : ĠHistory Manager , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapplication Properties : ĠApplication Properties ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠLOG Ġ= ĠLoggerFactory . getLogger ( IO Manager :: class . java ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDelete Ġworking Ġdirectory . ĊĠĠĠĠ Ġ* ĠCan Ġbe Ġin Ġcontext Ġof Ġusual Ġcleanup . ĊĠĠĠĠ Ġ* ĠCan Ġbe Ġin Ġcontext Ġof Ġfailed Ġmigration Ġ( in Ġpreparation Ġfor Ġclean Ġinitial isation Ġnext Ġtime ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġwork Unit ĊĠĠĠĠ Ġ* Ġ@ param Ġcopy Ġboolean Ġindicating Ġwhether Ġto Ġdelete Ġthe Ġcopy Ġor Ġnot ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġdelete Working Root ( work Unit : ĠWork Unit , Ġcopy : ĠBoolean ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠConstruct Ġfolder Ġname Ġ( will Ġbe Ġcopy Ġor Ġnot ) ĊĠĠĠĠĠĠĠ Ġval Ġfolder ToDelete Ġ= ĠString . format ("% s % s ", Ġwork Unit . root , Ġif Ġ( copy ) Ġ"_ copy " Ġelse Ġ"") ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 7 . ĠClean Ġwork Ġdirectory ĊĠĠĠĠĠĠĠ Ġval Ġhistory Ġ= Ġhistory Mgr . start Step ( work Unit . migration , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStep Enum . CLEAN ING , Ġ" Remove Ġ$ folder ToDelete ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠSan ity Ġcheck ĊĠĠĠĠĠĠĠ Ġif Ġ(! StringUtils . isBlank ( folder ToDelete ) Ġ&& Ġfolder ToDelete . contains (" 2 0 ") Ġ&& Ġfolder ToDelete . contains ("_ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Shell . is Windows ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFileUtils . delete Directory ( new ĠFile ( folder ToDelete )); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠF ails Ġocc ass ion ally Ġon Ġwindows Ġwith Ġfile Ġlock Ġissue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠF ails Ġon Ġwindows Ġnot Ġable Ġto Ġdelete Ġa Ġlarge Ġnumber Ġof Ġfiles ? .. ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShell . exec Command ( work Unit . command Manager , ĠShell . format Directory ( application Properties . work . directory ), Ġ" rd Ġ/ s Ġ/ q Ġ$ folder ToDelete ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSeems Ġto Ġwork Ġok Ġon Ġlinux . ĠKeep ing ĠJava Ġcommand Ġfor Ġthe Ġmoment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileSystem Utils . delete Re cursively ( File ( folder ToDelete )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhistory Mgr . end Step ( history , ĠStatus Enum . DONE , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exc : Ġjava . lang . Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . error (" Failed Ġdelete Directory : Ġ", Ġexc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhistory Mgr . end Step ( history , ĠStatus Enum . FAILED , Ġexc . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . error (" Failed Ġdelete Directory : ĠBad ly Ġformed Ġdelete Ġpath ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhistory Mgr . end Step ( history , ĠStatus Enum . FAILED , Ġ" Bad ly Ġformed Ġdelete Ġpath ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhen ĠGit ĠS vn ĠClone Ġstep Ġis Ġcompleted Ġ( and Ġassociated Ġcleanup ) ĊĠĠĠĠ Ġ* Ġwe Ġcopy Ġthe Ġfilesystem Ġso Ġthat Ġthe Ġmigration Ġcan Ġbe Ġre executed Ġfrom Ġthis Ġclean Ġstate . ĊĠĠĠĠ Ġ* ĠThis Ġavoids Ġwaiting Ġfor Ġlength y ĠGit Ġsvn Ġclone Ġstep ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġwork Unit ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĊĠĠĠĠ Ġ* Ġ@ throws ĠInterruptedException ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġopen Ġfun Ġcopy Root Directory ( work Unit : ĠWork Unit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhistory Ġ= Ġhistory Mgr . start Step ( work Unit . migration , ĠStep Enum . SV N _ COPY _ ROOT _ FOLDER , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( work Unit . command Manager . is First Attempt Migration ) Ġ"" Ġelse ĠConstants . RE EXEC UTION _ SKIP PING ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Copy ing ĠRoot ĠFolder ") ĊĠĠĠĠĠĠĠ Ġif Ġ( work Unit . command Manager . is First Attempt Migration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgit Command : ĠString Ġ= Ġif Ġ( Shell . is Windows ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ WIN _ COPY _ DIR Ġ${ work Unit . root } Ġ${ work Unit . root }_ copy " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ COPY _ DIR Ġ${ work Unit . root } Ġ${ work Unit . root }_ copy " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShell . exec Command ( work Unit . command Manager , ĠShell . format Directory ( application Properties . work . directory ), Ġgit Command ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġhistory Mgr . end Step ( history , ĠStatus Enum . DONE , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIn Ġa Ġmigration Ġre ex ect ution Ġthe Ġfirst Ġstep Ġis Ġto Ġrecuper ate Ġa Ġclean Ġstate . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġwork Unit ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĊĠĠĠĠ Ġ* Ġ@ throws ĠInterruptedException ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġopen Ġfun Ġinit Root Directory From Copy ( work Unit : ĠWork Unit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! work Unit . command Manager . is First Attempt Migration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhistory Ġ= Ġhistory Mgr . start Step ( work Unit . migration , ĠStep Enum . SV N _ COPY _ ROOT _ FOLDER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( work Unit . command Manager . is First Attempt Migration ) Ġ"" Ġelse ĠConstants . RE EXEC UTION _ SKIP PING ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Initial ising ĠRoot ĠDirectory Ġfrom ĠCopy Ġin Ġcontext Ġof Ġmigration Ġre execution .") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġclean Ġcopy Ġfolder Ġis Ġused Ġto Ġre initial ise Ġthe Ġwork Unit . root ĠFolder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgit Command Ġ: ĠString Ġ= Ġif Ġ( Shell . is Windows ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ WIN _ COPY _ DIR Ġ${ work Unit . root }_ copy Ġ${ work Unit . root }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ COPY _ DIR Ġ${ work Unit . root }_ copy Ġ${ work Unit . root }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShell . exec Command ( work Unit . command Manager , ĠShell . format Directory ( application Properties . work . directory ), Ġgit Command ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġgit Ġreset Ġin case Ġa Ġdeployment Ġhas Ġchanged Ġpermissions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdeployment Ġof Ġapplication Ġseems Ġto Ġchange Ġfiles Ġfrom Ġ 6 4 4 Ġto Ġ 7 5 5 Ġwhich Ġis Ġnot Ġdesired . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShell . exec Command ( work Unit . command Manager , Ġwork Unit . directory , Ġreset Head ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhistory Mgr . end Step ( history , ĠStatus Enum . DONE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ