package Ġorg . tools 4 j . stacked . index Ċ Ċ import Ġmu . K Logging Ċ import Ġnet . sf . se ven zip j binding .* Ċ import Ġnet . sf . se ven zip j binding . impl . Random Access File In Stream Ċ import Ġjava . io . OutputStream Ċ import Ġjava . io . Pip ed InputStream Ċ import Ġjava . io . Pip ed OutputStream Ċ import Ġjava . io . Random Access File Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . Future Ċ Ċ class ĠSe Zip File Parser ( private Ġval Ġse File In Zip Parser Provider : ĠSe File In Zip Parser Provider ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject : ĠK Logging () ĊĊĠĠĠ Ġfun Ġparse ( ĊĠĠĠĠĠĠĠ Ġarchive File : ĠString , ĊĠĠĠĠĠĠĠ Ġjob Status : ĠJob Status Ġ= ĠJob Status Impl () ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug { Ġ" Parsing Ġ$ archive File " Ġ} ĊĠĠĠĠĠĠĠ ĠRandom Access File ( archive File , Ġ" r "). use Ġ{ Ġrandom Access File Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSe ven Zip . open In Archive ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , Ġ// Ġaut ode t ect Ġarchive Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRandom Access File In Stream ( random Access File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). use Ġ{ Ġarchive Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarchive Indices To Parse Ġ= ĠArrayList < Int >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. ( archive . numberOf Items Ġ- Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Folder Ġ= Ġarchive . getProperty ( i , ĠProp ID . IS _ FOLDER ) Ġas ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Folder ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath In Archive Ġ= Ġarchive . getProperty ( i , ĠProp ID . PATH ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! se File In Zip Parser Provider . has Zip Parser For ( path In Archive )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarchive Indices To Parse . add ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextract Callback Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExtract Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarchive File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarchive , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġse File In Zip Parser Provider , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob Status ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġouter Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarchive . extract ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarchive Indices To Parse . to IntArray (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , Ġ// ĠNon - test Ġmode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextract Callback ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġouter Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( extract Callback . exception During Parsing Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġextract Callback . exception During Parsing !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( outer Exception Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnknown Extractor Exception ( archive File , Ġouter Exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠExtract or Exception ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnknown Extractor Exception ( archive File , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠExtract Callback ( ĊĠĠĠ Ġprivate Ġval Ġarchive File : ĠString , ĊĠĠĠ Ġprivate Ġval Ġarchive : ĠI In Archive , ĊĠĠĠ Ġprivate Ġval Ġse File In Zip Parser Provider : ĠSe File In Zip Parser Provider , ĊĠĠĠ Ġprivate Ġval Ġjob Status : ĠJob Status Ġ= ĠJob Status Impl () Ċ Ċ ) Ġ: ĠI Archive Extract Callback Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġindex Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġvar Ġfile In Zip Parser : ĠFile In Zip Parser ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġtotal File In Zip Size : ĠLong Ġ= Ġ 0 ; ĊĠĠĠ Ġ@ Volatile Ġvar Ġparsing Future : ĠFuture < *> ? Ġ= Ġnull ĊĠĠĠ Ġ@ Volatile Ġlateinit Ġvar Ġpath In Archive : ĠString ĊĠĠĠ Ġ@ Volatile Ġprivate Ġvar Ġextracted File In Zip Size : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġ@ Volatile Ġvar Ġexception During Parsing : ĠException ? Ġ= Ġnull ĊĠĠĠ Ġcompanion Ġobject : ĠK Logging () ĊĊĠĠĠ Ġoverride Ġfun Ġget Stream ( ĊĠĠĠĠĠĠĠ Ġindex : ĠInt , ĊĠĠĠĠĠĠĠ Ġextract Ask Mode : ĠExtract Ask Mode ĊĠĠĠ Ġ): ĠI Sequential Out Stream ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( extract Ask Mode Ġ== ĠExtract Ask Mode . SKIP ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif ( exception During Parsing Ġ!= Ġnull ) Ġthrow Ġexception During Parsing !! ĊĠĠĠĠĠĠĠ Ġthis . index Ġ= Ġindex ĊĠĠĠĠĠĠĠ Ġpath In Archive Ġ= Ġarchive . getProperty ( index , ĠProp ID . PATH ). toString () ĊĠĠĠĠĠĠĠ Ġlogger . debug { Ġ" Extractor Ġcalling Ġget Stream () Ġfor : Ġ$ path In Archive " Ġ} ĊĠĠĠĠĠĠĠ Ġtotal File In Zip Size Ġ= Ġarchive . getProperty ( index , ĠProp ID . SIZE ). toString (). to Long () ĊĠĠĠĠĠĠĠ Ġfile In Zip Parser Ġ= Ġse File In Zip Parser Provider . getFile In Zip Parser ( path In Archive ) ĊĠĠĠĠĠĠĠ Ġjob Status . add Operation (" Parsing Ġ$ path In Archive Ġfrom Ġ$ archive File ...") ĊĠĠĠĠĠĠĠ Ġparsing Future Ġ= ĠExec utors . new Single Thread Executor (). submit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( exception During Parsing Ġ!= Ġnull ) Ġthrow Ġexception During Parsing !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Zip Parser !!. start () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFile In Zip Parser Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception During Parsing Ġ= ĠExtract or Exception ( archive File , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġexception During Parsing !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception During Parsing Ġ= ĠUnknown Extractor Exception ( archive File , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġexception During Parsing !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġextracted File In Zip Size Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġreturn ĠI Sequential Out Stream Ġ{ Ġdata Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Zip Parser !!. output Stream To WriteTo . write ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextracted File In Zip Size Ġ+= Ġdata . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Status . current Operation Progress Ġ= Ġto Progress ( total File In Zip Size , Ġextracted File In Zip Size . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . size Ġ// ĠReturn Ġamount Ġof Ġprocessed Ġdata ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Operation Result ( extract Operation Result : ĠExtract Operation Result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( extract Operation Result Ġ!= ĠExtract Operation Result . OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Extraction Ġerror ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif ( index Ġ< Ġ 0 Ġ|| Ġfile In Zip Parser Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠ Ġjob Status . current Operation Progress Ġ= Ġ" Completed Ġextracting Ġ[ ${ file In Zip Parser !!. fileName }], Ġscanning Ġarchive Ġfor Ġfurther Ġdata Ġfiles ..." ĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠ ĠAt Ġthis Ġpoint Ġwe Ġknow Ġthat Ġwriting Ġto Ġthe Ġoutput Ġstream Ġhas Ġfinished . ĊĠĠĠĠĠĠĠ ĠTherefore Ġwe Ġneed Ġto Ġclose Ġthe Ġoutput Ġstream . Ġ ĠThis Ġwill Ġcause Ġa Ġ- 1 ĊĠĠĠĠĠĠĠ Ġto Ġbe Ġwritten Ġto Ġthe Ġoutput Ġstream . Ġ ĠThe Ġreader Ġ( in Ġthe Ġfuture ) Ġmight ĊĠĠĠĠĠĠĠ Ġnot Ġhave Ġfinished Ġreading Ġfrom Ġthe ĠinputStream . Ġ ĠSo Ġwe Ġneed Ġto Ġwait ĊĠĠĠĠĠĠĠ Ġfor Ġit Ġto Ġfinish . Ġ ĠHence Ġthe Ġ' get ' ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfile In Zip Parser !!. flush And Close () ĊĠĠĠĠĠĠĠ Ġparsing Future ?. get () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Completed ( complete Value : ĠLong ) Ġ{} ĊĠĠĠ Ġoverride Ġfun Ġprepare Operation ( extract Ask Mode : ĠExtract Ask Mode ?) Ġ{} ĊĠĠĠ Ġoverride Ġfun Ġset Total ( total : ĠLong ) Ġ{} Ċ } Ċ Ċ class ĠUnknown Extractor Exception ( val Ġarchive File : ĠString , Ġcause : ĠThrowable ): ĠException ( cause ){ ĊĠĠĠ Ġoverride Ġval Ġmessage : ĠString ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ" Error Ġoccurred Ġwh il st Ġparsing Ġfile Ġ[$ archive File ] Ġ${ cause ?. message }" Ċ } Ċ Ċ class ĠExtract or Exception ( val Ġarchive File : ĠString , Ġval Ġfile In Zip Parser Exception : ĠFile In Zip Parser Exception ): ĠException (){ ĊĠĠĠ Ġoverride Ġval Ġmessage : ĠString ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfile In Zip Parser Exception . message Ġ+ Ġ" Ġwh il st Ġparsing Ġarchive Ġ[$ archive File ]" Ċ } Ċ Ċ interface ĠSe File In Zip Parser Provider Ġ{ ĊĠĠĠ Ġfun ĠgetFile In Zip Parser ( path In Archive : ĠString ): ĠFile In Zip Parser ĊĠĠĠ Ġfun Ġhas Zip Parser For ( path In Archive : ĠString ): ĠBoolean Ċ } Ċ Ċ class ĠSe File In Zip Parser Provider Impl Ġ( ĊĠĠĠ Ġval Ġrow Handlers : ĠMap < String , ĠXml Row Handler <* >>) Ġ: ĠSe File In Zip Parser Provider Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġhas Zip Parser For ( path In Archive : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠ Ġreturn Ġrow Handlers . containsKey ( path In Archive ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetFile In Zip Parser ( path In Archive : ĠString ): ĠFile In Zip Parser Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġxml Row Handler Provider Ġ= Ġrow Handlers . getValue ( path In Archive ) ĊĠĠĠĠĠĠĠ Ġval Ġpip ed InputStream Ġ= ĠP ip ed InputStream () ĊĠĠĠĠĠĠĠ Ġval Ġpip ed OutputStream Ġ= ĠP ip ed OutputStream ( pip ed InputStream ) ĊĠĠĠĠĠĠĠ Ġval Ġxml File Parser Ġ= ĠXml File Parser ( pip ed InputStream , Ġxml Row Handler Provider Ġ) ĊĠĠĠĠĠĠĠ Ġreturn ĠFile In Zip Parser ( path In Archive , Ġxml File Parser , Ġpip ed OutputStream ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠFile In Zip Parser ( ĊĠĠĠ Ġval ĠfileName : ĠString , ĊĠĠĠ Ġval Ġxml File Parser : ĠXml File Parser , ĊĠĠĠ Ġval ĠoutputStream To WriteTo : ĠOutputStream ) Ġ{ ĊĊĠĠĠ Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġxml File Parser . parse () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠXml File Parser Exception ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFile In Zip Parser Exception ( fileName , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġflush And Close () Ġ{ ĊĠĠĠĠĠĠĠ ĠoutputStream To WriteTo . flush () ĊĠĠĠĠĠĠĠ ĠoutputStream To WriteTo . close () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠFile In Zip Parser Exception ( ĊĠĠĠ Ġval ĠfileName : ĠString , ĊĠĠĠ Ġval Ġxml File Parser Exception : ĠXml File Parser Exception ): ĠException ( xml File Parser Exception ){ ĊĊĠĠĠ Ġoverride Ġval Ġmessage : ĠString ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġxml File Parser Exception . message Ġ+ Ġ" Ġin Ġfile Ġ[$ fileName ]" Ċ } Ċ