/* Ċ Ġ* ĠCopyright Ġ 2 0 1 6 ĠMark ĠF air child Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġres aver . archive Ċ Ċ import ĠPlatform ByteBuffer Ċ import Ġmf . Buffer Util Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . channels . File Channel Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Path Matcher Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠHandles Ġthe Ġjob Ġof Ġreading Ġscripts Ġout Ġof ĠB SA Ġfiles . Ċ Ġ* Ċ Ġ* Ġ@ author ĠMark ĠF air child Ċ Ġ*/ Ċ class ĠB A 2 Parser ( path : ĠPath ?, Ġchannel : ĠFile Channel ) Ġ: ĠArchive Parser ( path !! , Ġchannel ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see ĠArchive Parser . get Files ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġget Files ( dir : ĠPath ?, Ġmatcher : ĠPath Matcher ?): ĠMutable Map < Path ?, ĠPlatform ByteBuffer ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFILE S ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġfile : ĠB A 2 File Record Ġ-> Ġdir Ġ== Ġnull Ġ|| Ġfile . path !!. startsWith ( dir ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġfile : ĠB A 2 File Record Ġ-> Ġmatcher !!. matches ( file . path ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. associate By ({ file : ĠB A 2 File Record Ġ-> Ġsuper . PATH . resolve ( file . path !! )}, { file : ĠB A 2 File Record Ġ-> Ġfile . getData ( CHANNEL )} ). to Mutable Map () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see ĠArchive Parser . get Filename s ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġget Filename s ( dir : ĠPath ?, Ġmatcher : ĠPath Matcher ?): ĠMap < Path , ĠPath > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFILE S ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġfile : ĠB A 2 File Record Ġ-> Ġdir Ġ== Ġnull Ġ|| Ġfile . path !!. startsWith ( dir ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġfile : ĠB A 2 File Record Ġ-> Ġmatcher !!. matches ( file . path ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. associate By ({ Ġk : ĠB A 2 File Record Ġ-> Ġsuper . PATH . fileName . resolve ( k . path !! ) Ġ}, Ġ{ Ġv : ĠB A 2 File Record Ġ-> Ġv . path !! Ġ}) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval ĠHEADER : ĠB A 2 Header ĊĠĠĠ Ġprivate Ġval ĠFILE S : ĠMutable List < BA 2 File Record > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġnew Ġ` BA 2 Parser `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpath ĊĠĠĠĠ Ġ* Ġ@ param Ġchannel ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĊĠĠĠĠ Ġ* Ġ@ see ĠArchive Parser . Archive Parser ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinit Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠRead Ġthe Ġheader . ĊĠĠĠĠĠĠĠ Ġval ĠHEADER BLOCK Ġ= ĠPlatform ByteBuffer . allocate ( BA 2 Header . SIZE ) ĊĠĠĠĠĠĠĠ ĠHEADER BLOCK . make Le () ĊĠĠĠĠĠĠĠ ĠHEADER BLOCK . readFile Channel ( channel ) ĊĠĠĠĠĠĠĠ ĠHEADER BLOCK . flip () ĊĠĠĠĠĠĠĠ ĠHEADER Ġ= ĠB A 2 Header ( HEADER BLOCK ) ĊĠĠĠĠĠĠĠ ĠFILE S Ġ= ĠArrayList ( HEADER . FILE _ COUNT ) ĊĠĠĠĠĠĠĠ Ġval ĠFIL ER EC ORD S Ġ= ĠPlatform ByteBuffer . allocate ( HEADER . FILE _ COUNT Ġ* ĠB A 2 File Record . SIZE ) ĊĠĠĠĠĠĠĠ ĠFIL ER EC ORD S . make Le () ĊĠĠĠĠĠĠĠ ĠFIL ER EC ORD S . readFile Channel ( channel ) ĊĠĠĠĠĠĠĠ ĠFIL ER EC ORD S . make Le () ĊĠĠĠĠĠĠĠ ĠFIL ER EC ORD S . flip () ĊĊĠĠĠĠĠĠĠ Ġ// ĠRead Ġfile Ġrecords . ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil ĠHEADER . FILE _ COUNT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠB A 2 File Record ( FIL ER EC ORD S , ĠHEADER ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFILE S . add ( file ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠRead Ġthe Ġfilename Ġtable . ĊĠĠĠĠĠĠĠ Ġchannel . position ( HEADER . NAME TABLE _ OFFSET ) ĊĠĠĠĠĠĠĠ Ġval ĠNAME BUFFER Ġ= ĠPlatform ByteBuffer . allocate ( 2 0 4 8 ) ĊĠĠĠĠĠĠĠ ĠNAME BUFFER . make Le () ĊĠĠĠĠĠĠĠ ĠNAME BUFFER . readFile Channel ( channel ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil ĠHEADER . FILE _ COUNT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNAME BUFFER . flip () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= ĠBuffer Util . get W String ( NAME BUFFER ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFILE S [ i ]. name Ġ= ĠfileName ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNAME BUFFER . compact () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNAME BUFFER . readFile Channel ( channel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }