package Ġgg . r sm od . cache Ċ Ċ import Ġgg . r sm od . cache . codec . impl . Archive Chunk Codec Ċ import Ġgg . r sm od . cache . codec . impl . Archive Group List Codec Ċ import Ġgg . r sm od . cache . codec . impl . Archive List Codec Ċ import Ġgg . r sm od . cache . codec . impl . Index Codec Ċ import Ġgg . r sm od . cache . ext . de compress Ċ import Ġgg . r sm od . cache . ext . read Chunks Ċ import Ġgg . r sm od . cache . struct . Archive Ċ import Ġgg . r sm od . cache . struct . Archive Chunk Ċ import Ġgg . r sm od . cache . struct . Group Ċ import Ġgg . r sm od . cache . struct . Index Ċ import Ġio . netty . buffer . Byte Buf Ċ import Ġio . netty . buffer . Un p ooled Ċ import Ġjava . util . Arrays Ċ import Ġjava . util . zip . CRC 3 2 Ċ Ċ /** Ċ Ġ* Ġ@ author ĠTom Ġ< rsp sm ods @ gmail . com > Ċ Ġ*/ Ċ data Ġclass ĠFile store Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġdata File : ĠCache File , ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġindex Files : ĠMap < Int , ĠCache File >, ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġaccess Types : ĠSet < Cache Files . AccessType >) Ġ{ ĊĊĠĠĠ Ġ/* ĠStep - by - step ĊĠĠĠĠ Ġ* Ġ 1 ) ĠLoad Ġoffset Ġ& Ġlength Ġof Ġarch ives Ġin Ġmaster Ġindex Ġfile ĊĠĠĠĠ Ġ* Ġ 2 ) ĠLoad Ġindex Ġmetadata Ġfrom Ġoffset Ġ& Ġlengths Ġof Ġarch ives ĊĠĠĠĠ Ġ* Ġ 3 ) ĠIterate Ġthrough Ġindexes Ġ> Ġload Ġmetadata Ġfor Ġarch ives Ġand Ġmetadata Ġfor Ġall Ġtheir Ġgroups ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġv fs : ĠVirtual FileSystem ĊĊĠĠĠ Ġinternal Ġfun Ġload V FS (): ĠVirtual FileSystem Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmaster Index Ġ= Ġindex Files . getValue ( MASTER _ IDX ) ĊĊĠĠĠĠĠĠĠ Ġval Ġarchive Chunks Ġ= Ġload Archive Chunks ( master Index ) ĊĠĠĠĠĠĠĠ Ġval Ġindexes Ġ= Ġload Indexes ( archive Chunks ) ĊĊĠĠĠĠĠĠĠ Ġval Ġindex Arch ives Ġ= Ġmutable Map Of < Index , ĠList < Archive >>() ĊĠĠĠĠĠĠĠ Ġval Ġarchive Groups Ġ= Ġmutable Map Of < Archive , ĠList < Group >>() ĊĊĠĠĠĠĠĠĠ Ġindexes . forEach Ġ{ Ġ_, Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠUn p ooled . wrapped Buffer ( index . archive Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarch ives Ġ= Ġload Arch ives ( buffer , Ġindex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroups Ġ= Ġload Archive Groups ( buffer , Ġindex , Ġarch ives ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Arch ives [ index ] Ġ= Ġarch ives ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarch ives . forEach Ġ{ Ġarchive Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Ġ= Ġgroups . getValue ( archive ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarchive Groups [ archive ] Ġ= Ġgroup ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠVirtual FileSystem ( indexes , Ġindex Arch ives , Ġarchive Groups ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Archive Chunks ( index File : ĠCache File ): ĠMap < Int , ĠArchive Chunk > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchunks Ġ= Ġmutable Map Of < Int , ĠArchive Chunk >() ĊĊĠĠĠĠĠĠĠ Ġval Ġindex Count Ġ= Ġ( index File . length () Ġ/ ĠINDEX _ ENTRY _ LENGTH ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġindex Data Ġ= ĠByteArray ( INDEX _ ENTRY _ LENGTH ) ĊĠĠĠĠĠĠĠ Ġval Ġindex Buffer Ġ= ĠUn p ooled . wrapped Buffer ( index Data ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġindex Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex File . seek (( i Ġ* ĠFile store . INDEX _ ENTRY _ LENGTH ). to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex File . read ( index Data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchunk Ġ= ĠArchive Chunk Codec . decode ( index Buffer . reset Reader Index ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunks [ i ] Ġ= Ġchunk ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġchunks ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Indexes ( archive Chunks : ĠMap < Int , ĠArchive Chunk >): ĠMap < Int , ĠIndex > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindexes Ġ= Ġmutable Map Of < Int , ĠIndex >() ĊĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠByteArray ( DATA _ FILE _ CHUNK _ SIZE ) ĊĊĠĠĠĠĠĠĠ Ġarchive Chunks . forEach Ġ{ Ġarchive Idx , Ġchunk Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArrays . fill ( data , Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġchunk . offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġchunk . length ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcrc Ġ= ĠCRC 3 2 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġde compressed Ġ= Ġdata . read Chunks ( data File , Ġoffset , Ġlength , Ġ 8 ). de compress ( crc ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= ĠIndex Codec . decode ( de compressed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindexes [ archive Idx ] Ġ= Ġindex ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġreturn Ġindexes ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Arch ives ( archive Buf : ĠByte Buf , Ġindex : ĠIndex ): ĠList < Archive > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠArchive List Codec ( index . version Type , Ġindex . name Hash ). decode ( archive Buf ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Archive Groups ( archive Buf : ĠByte Buf , Ġindex : ĠIndex , Ġarch ives : ĠList < Archive >): ĠMap < Archive , ĠList < Group >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠArchive Group List Codec ( archives , Ġindex . version Type , Ġindex . name Hash ). decode ( archive Buf ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġamount Ġof Ġbytes Ġin Ġeach Ġindex Ġentry . ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠINDEX _ ENTRY _ LENGTH Ġ= Ġ 6 ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġchunk Ġsize Ġof Ġeach Ġdata Ġfile . ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDATA _ FILE _ CHUNK _ SIZE Ġ= Ġ 5 2 0 ĊĠĠĠ Ġ} Ċ }