package Ġjet brains . build Server . runner . lambda . directory Ċ Ċ import Ġorg . apache . commons . compress . arch ivers . tar . Tar Archive Entry Ċ import Ġorg . apache . commons . compress . arch ivers . tar . Tar Archive InputStream Ċ import Ġorg . apache . commons . compress . arch ivers . tar . Tar Archive OutputStream Ċ import Ġorg . apache . commons . compress . utils . IO Utils Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . attribute . Pos ix File Permission ĊĊ Ċ class ĠTar Archive Manager ( private Ġval Ġlogger : ĠLogger ) Ġ: ĠArchive Manager Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġarchive Directory ( directory : ĠFile ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . message (" Starting Ġarch ival Ġof Ġdirectory Ġ$ directory ") ĊĠĠĠĠĠĠĠ Ġval Ġtar Ball Ġ= Ġkotlin . io . path . create TempFile (). to File () ĊĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĠTar Archive OutputStream ( tar Ball . output Stream ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġrecurse Directory ( directory ) ĊĊĠĠĠĠĠĠĠ Ġfiles . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= ĠTar Archive Entry ( it , Ġdirectory . to Path (). rel ativ ize ( it . to Path ()). toString ()). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġit . length () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmode Ġ= Ġmode FromFile Permissions ( Files . get Pos ix File Permissions ( it . to Path ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . put Archive Entry ( entry ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIO Utils . copy ( it . inputStream (), Ġoutput ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . close Archive Entry () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoutput . finish () ĊĠĠĠĠĠĠĠ Ġoutput . close () ĊĊĠĠĠĠĠĠĠ Ġlogger . message (" Finished Ġthe Ġarch ival Ġof Ġthe Ġdirectory ") ĊĠĠĠĠĠĠĠ Ġreturn Ġtar Ball ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrecurse Directory ( directory : ĠFile ): ĠList < File > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġmutable ListOf < File >() ĊĠĠĠĠĠĠĠ Ġif Ġ( directory . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( file Ġin Ġdirectory . list Files () !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles . addAll ( recur se Directory ( file )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles . add ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfiles ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġextract Directory ( tar : ĠFile ?, Ġdestination Directory : ĠFile ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( tar Ġ== Ġnull Ġ|| Ġdestination Directory Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . message (" Extract ing Ġtar Ġarchive Ġ$ tar Ġto Ġ$ destination Directory ") ĊĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠTar Archive InputStream ( tar . inputStream ()) ĊĊĠĠĠĠĠĠĠ Ġvar Ġentry : ĠTar Archive Entry ? ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( input . next Tar Entry . also Ġ{ Ġentry Ġ= Ġit Ġ} Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! input . can Read Entry Data ( entry )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Entry Ġ$ entry Ġis Ġnot Ġreadable ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( destination Directory , Ġentry !!. name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry !!. isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmake Directory ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmake Directory ( file . parent File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġfile . output Stream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIO Utils . copy ( input , Ġoutput ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . flush () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . set Pos ix File Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . to Path (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions From Int ( entry !!. mode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinput . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmake Directory ( file : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . isDirectory Ġ&& Ġ! file . mkdir s ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Failed Ġto Ġcreate Ġdirectory Ġ$ file ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠString . to Oct al () Ġ= Ġthis . toInt ( radix Ġ= Ġ 8 ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġint To Pos ix File Permission Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" 0 4 0 0 ". to Oct al (), ĠPos ix File Permission . OWNER _ READ ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" 0 2 0 0 ". to Oct al (), ĠPos ix File Permission . OWNER _ WRITE ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" 0 1 0 0 ". to Oct al (), ĠPos ix File Permission . OWNER _ EXECUTE ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" 0 0 4 0 ". to Oct al (), ĠPos ix File Permission . GROUP _ READ ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" 0 0 2 0 ". to Oct al (), ĠPos ix File Permission . GROUP _ WRITE ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" 0 0 1 0 ". to Oct al (), ĠPos ix File Permission . GROUP _ EXECUTE ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" 0 0 0 4 ". to Oct al (), ĠPos ix File Permission . OTHER S _ READ ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" 0 0 0 2 ". to Oct al (), ĠPos ix File Permission . OTHER S _ WRITE ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" 0 0 0 1 ". to Oct al (), ĠPos ix File Permission . OTHER S _ EXECUTE ), ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġposix ToInt File Permission Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Pos ix File Permission . OWNER _ READ , Ġ" 0 4 0 0 ". to Oct al ()), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Pos ix File Permission . OWNER _ WRITE , Ġ" 0 2 0 0 ". to Oct al ()), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Pos ix File Permission . OWNER _ EXECUTE , Ġ" 0 1 0 0 ". to Oct al ()), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Pos ix File Permission . GROUP _ READ , Ġ" 0 0 4 0 ". to Oct al ()), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Pos ix File Permission . GROUP _ WRITE , Ġ" 0 0 2 0 ". to Oct al ()), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Pos ix File Permission . GROUP _ EXECUTE , Ġ" 0 0 1 0 ". to Oct al ()), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Pos ix File Permission . OTHER S _ READ , Ġ" 0 0 0 4 ". to Oct al ()), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Pos ix File Permission . OTHER S _ WRITE , Ġ" 0 0 0 2 ". to Oct al ()), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Pos ix File Permission . OTHER S _ EXECUTE , Ġ" 0 0 0 1 ". to Oct al ()), ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġpermissions From Int ( mode : ĠInt ): ĠSet < Pos ix File Permission > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpermission Set Ġ= Ġmutable Set Of < Pos ix File Permission >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġint To Pos ix File Permission . forEach Ġ{ Ġ( key , Ġposix File Permission ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mode Ġand Ġkey Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Set . add ( posix File Permission ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpermission Set ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġmode FromFile Permissions ( file Permissions : ĠSet < Pos ix File Permission >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmode Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposix ToInt File Permission . forEach Ġ{ Ġ( permission , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Permissions . contains ( permission )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmode Ġ= Ġmode Ġor Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmode ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }