// ĠCopyright Ġ 2 0 1 9 ĠAmazon . com , ĠInc . Ġor Ġits Ġaffiliates . ĠAll ĠRights ĠReserved . Ċ // ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ċ package Ġsoftware . aws . tool k its . jetbrains . utils Ċ Ċ import Ġcom . intellij . openapi . util . System Info Ċ import Ġcom . intellij . openapi . util . io . File Util Ċ import Ġorg . apache . commons . compress . arch ivers . zip . Zip Archive Entry Ċ import Ġorg . apache . commons . compress . arch ivers . zip . Zip File Ċ import Ġorg . apache . commons . compress . utils . Seek able InMemory Byte Channel Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . attribute . Pos ix File Permission Ċ Ċ // ĠTODO : ĠWrite Ġtests Ċ class ĠZip De compressor ( source Bytes : ĠByteArray ) Ġ: ĠAuto Closeable Ġ{ ĊĠĠĠ Ġprivate Ġval Ġzip File Ġ= ĠZip File ( Seek able InMemory Byte Channel ( source Bytes )) ĊĠĠĠ Ġprivate Ġval Ġzip Entries Ġ= Ġzip File . entries . toList () ĊĠĠĠ Ġprivate Ġval Ġdirectory Split Regex Ġ= ĠRegex . from Literal (""" [/ \\ ] """) ĊĊĠĠĠ Ġfun Ġextract ( destination : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġzip Entries . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoutputFile Ġ= ĠoutputFile ( destination , Ġit . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠHandle Ġsymlink Ġif Ġwe Ġever Ġneed Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isDirectory Ġ-> ĠFile Util . create Directory ( outputFile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcreate File ( outputFile , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate File ( outputFile : ĠFile , Ġzip Entry : ĠZip Archive Entry ) Ġ{ ĊĠĠĠĠĠĠĠ Ġzip File . getInputStream ( zip Entry ). use Ġ{ Ġzip Stream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Util . create Parent Dirs ( outputFile ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠFileOutputStream ( outputFile ). use Ġ{ ĠoutputStream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip Stream . copy To ( output Stream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( System Info . is Unix ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . set Pos ix File Permissions ( outputFile . to Path (), Ġconvert Permissions ( zip Entry . unix Mode )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠoutputFile ( output Dir : ĠFile , Ġentry Name : ĠString ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( entry Name . split ( directory Split Regex ). contains (" .. ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Entry Ġname Ġattempting Ġto Ġtraverse Ġup Ġdirectory : Ġ$ entry Name ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠFile ( output Dir , Ġentry Name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Permissions ( mode : ĠInt ): ĠSet < Pos ix File Permission > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpermissions Ġ= Ġmutable Set Of < Pos ix File Permission >() ĊĠĠĠĠĠĠĠ Ġif Ġ(( mode Ġand Ġ 4 0 0 ) Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions . add ( Pos ix File Permission . OWNER _ READ ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(( mode Ġand Ġ 2 0 0 ) Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions . add ( Pos ix File Permission . OWNER _ WRITE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(( mode Ġand Ġ 1 0 0 ) Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions . add ( Pos ix File Permission . OWNER _ EXECUTE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(( mode Ġand Ġ 4 0 ) Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions . add ( Pos ix File Permission . GROUP _ READ ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(( mode Ġand Ġ 2 0 ) Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions . add ( Pos ix File Permission . GROUP _ WRITE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(( mode Ġand Ġ 1 0 ) Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions . add ( Pos ix File Permission . GROUP _ EXECUTE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(( mode Ġand Ġ 4 ) Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions . add ( Pos ix File Permission . OTHER S _ READ ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(( mode Ġand Ġ 2 ) Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions . add ( Pos ix File Permission . OTHER S _ WRITE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(( mode Ġand Ġ 1 ) Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions . add ( Pos ix File Permission . OTHER S _ EXECUTE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġpermissions ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġzip File . close () ĊĠĠĠ Ġ} Ċ } Ċ