// Ġpackage Ġorg . map db . db Ċ // Ċ // Ġimport Ġcom . google . common . cache . Cache Builder Ċ // Ġimport Ġorg . map db . DB Exception Ċ // Ġimport Ġorg . map db . list . LinkedList Ċ // Ġimport Ġorg . map db . ser . Serializer Ċ // Ġimport Ġorg . map db . ser . Serial izers Ċ // Ġimport Ġorg . map db . store . Mutable Store Ċ // Ġimport Ġorg . map db . store . Rec ids Ċ // Ġimport Ġorg . map db . store . Store Append Ċ // Ġimport Ġorg . map db . store . Store On Heap Ċ // Ġimport Ġorg . map db . store . Store On Heap Ser Ċ // Ġimport Ġorg . map db . util . data Assert Ċ // Ġimport Ġorg . map db . util . getBoolean OrDefault Ċ // Ġimport Ġjava . io . Closeable Ċ // Ġimport Ġjava . io . File Ċ // Ġimport Ġjava . nio . file . Path Ċ // Ġimport Ġjava . util . TreeMap Ċ // Ġimport Ġjava . util . concurrent . Callable Ċ // Ġimport Ġjava . util . concurrent . Concurrent Navig able Map Ċ // Ġimport Ġjava . util . concurrent . Concurrent Skip List Map Ċ // Ċ // Ġ/** ĠMain Ġclass Ġfor Ġaccessing ĠMap DB Ġ*/ Ċ // Ġclass ĠDB ( val Ġstore : ĠMutable Store ) Ġ: ĠClose able Ġ{ Ċ // Ċ // ĠĠĠĠ Ġcompanion Ġobject Ġ{ Ċ // Ċ // ĠĠĠĠĠĠĠĠ Ġprivate Ġval ĠTRUE Ġ= Ġ" true " Ċ // ĠĠĠĠĠĠĠĠ Ġprivate Ġval ĠFALSE Ġ= Ġ" false " Ċ // Ċ // ĠĠĠĠĠĠĠĠ Ġ@ Jvm Static Ċ // ĠĠĠĠĠĠĠĠ Ġfun Ġnew On Heap DB (): ĠM aker Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm aker Ġ= ĠM aker () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġm aker . props [ Config Key . store Type . name ] Ġ= ĠConfig Val . on Heap . name Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm aker Ċ // ĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠĠ Ġ@ Jvm Static Ċ // ĠĠĠĠĠĠĠĠ Ġfun Ġnew On Heap Ser DB (): ĠM aker Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm aker Ġ= ĠM aker () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġm aker . props [ Config Key . store Type . name ] Ġ= ĠConfig Val . on Heap Ser . name Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm aker Ċ // ĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠ Ġprivate Ġenum Ġclass ĠConfig Key Ġ{ Ċ // ĠĠĠĠĠĠĠĠ Ġfile , Ċ // ĠĠĠĠĠĠĠĠ Ġstore Type , Ċ // ĠĠĠĠĠĠĠĠ Ġthread Safe Ċ // ĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠ Ġprivate Ġenum Ġclass ĠConfig Val Ġ{ Ċ // ĠĠĠĠĠĠĠĠ Ġon Heap , Ġon Heap Ser , Ġfile Append Ċ // ĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠ Ġclass ĠM aker Ġ{ Ċ // ĠĠĠĠĠĠĠĠ Ġval Ġprops Ġ= ĠTreeMap < String , ĠString >() Ċ // Ċ // ĠĠĠĠĠĠĠĠ Ġfun Ġthread Safe Disable (): ĠM aker Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġprops [ Config Key . thread Safe . name ] Ġ= ĠFALSE Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis Ċ // ĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠĠ Ġfun Ġthread Safe ( thread Safe : ĠBoolean ): ĠM aker Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġprops [ Config Key . thread Safe . name ] Ġ= Ġthread Safe . toString () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis Ċ // ĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠĠ Ġfun Ġtx Block (): ĠM aker Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO Ġtransactions Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis Ċ // ĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠĠ Ġfun Ġmake (): ĠDB Ġ{ Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthread Safe Ġ= Ġprops . getBoolean OrDefault ( Config Key . thread Safe . name , Ġtrue ) Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfile (): ĠPath Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġprops [ Config Key . file . name ] Ġ?: Ġthrow ĠDB Exception . Wrong Config (" File Ġnot Ġprovided ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFile ( p ). to Path () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġwhen Ġ( props [ Config Key . store Type . name ]) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConfig Val . on Heap . name Ġ-> ĠStore On Heap ( is Thread Safe Ġ= Ġthread Safe ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConfig Val . on Heap Ser . name Ġ-> ĠStore On Heap Ser ( is Thread Safe Ġ= Ġthread Safe ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConfig Val . file Append . name Ġ-> ĠStore Append ( file Ġ= Ġfile (), Ġis Thread Safe Ġ= Ġthread Safe ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠDB Exception . Wrong Config (" unknown Ġstore Ġtype ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( store . isEmpty () Ġ&& Ġstore Ġis ĠMutable Store ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// fill Ġrec ids Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( rec id Ġin Ġ 1 .. Rec ids . REC ID _ MAX _ RESERVED ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrec id 2 Ġ= Ġstore . pre allocate () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Assert ( rec id Ġ== Ġrec id 2 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDB ( store ) Ċ // ĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠĠ Ġfun ĠreadOnly (): ĠM aker Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// FIX ME Ġreadme Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis Ċ // ĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġappend File ( f : ĠFile ): ĠM aker Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm aker Ġ= ĠM aker () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm aker . props [ Config Key . file . name ] Ġ= Ġf . path Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm aker . props [ Config Key . store Type . name ] Ġ= ĠConfig Val . file Append . name Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm aker Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġheap (): ĠM aker Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm aker Ġ= ĠM aker () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm aker . props [ Config Key . store Type . name ] Ġ= ĠConfig Val . on Heap . name Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm aker Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġheap Ser (): ĠM aker Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm aker Ġ= ĠM aker () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm aker . props [ Config Key . store Type . name ] Ġ= ĠConfig Val . on Heap Ser . name Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm aker Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠ Ġclass ĠLinkedList Maker < T >( Ċ // ĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġdb : ĠDB , Ċ // ĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġserializer : ĠSerializer < T > Ċ // ĠĠĠĠ Ġ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠ Ġval Ġprops Ġ= ĠTreeMap < String , ĠString >() Ċ // Ċ // ĠĠĠĠĠĠĠĠ Ġfun Ġmake (): ĠLinkedList < T > Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLinkedList ( store Ġ= Ġdb . store Ġas ĠMutable Store , Ġserializer Ġ= Ġserializer ) Ċ // ĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠ Ġfun Ġ< E > Ġlink edList ( name : ĠString , Ġserializer : ĠSerializer < E >) Ġ= ĠLinkedList Maker ( db Ġ= Ġthis , Ġserializer Ġ= Ġserializer ) Ċ // Ċ // ĠĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ Ċ // ĠĠĠĠĠĠĠĠ Ġstore . close (); Ċ // ĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠ Ġ// TODO Ġmake Ġprivate Ċ // ĠĠĠĠ Ġinternal Ġval Ġinstances Ġ= ĠCache Builder . newBuilder (). weak Values (). build < String , ĠAny >() Ċ // Ċ // ĠĠĠĠ Ġprivate Ġval Ġparam Serializer Ġ= ĠSerial izers . JAVA Ġas ĠSerializer < Map < String , ĠMap < String , ĠString >>> Ċ // Ċ // ĠĠĠĠ Ġfun Ġparams Load (): ĠMap < String , ĠMap < String , ĠString >> Ġ= Ċ // ĠĠĠĠĠĠĠĠ Ġstore . get ( Rec ids . REC ID _ NAME _ PARAMS , Ġparam Serializer ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠTreeMap () Ċ // Ċ // ĠĠĠĠ Ġfun Ġparams Save ( params : ĠMap < String , ĠMap < String , ĠString >>) Ġ{ Ċ // ĠĠĠĠĠĠĠĠ Ġfor Ġ(( k , Ġv ) Ġin Ġparams ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( k . length Ġ> Ġ 0 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( v . size Ġ> Ġ 0 ) Ċ // ĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠ Ġ( store Ġas ĠMutable Store ). update ( Rec ids . REC ID _ NAME _ PARAMS , Ġparam Serializer , Ġparams ) Ċ // ĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠ Ġfun Ġ< T > Ġqueue ( name : ĠString , Ġserializer : ĠSerializer < T >): ĠQueue Maker < T > Ġ{ Ċ // ĠĠĠĠĠĠĠĠ Ġreturn ĠQueue Maker < T >( this , Ġname , Ġserializer ) Ċ // ĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠ Ġobject ĠParam Names Ġ{ Ċ // Ċ // ĠĠĠĠĠĠĠĠ Ġval Ġrec id Ġ= Ġ" rec id " Ċ // ĠĠĠĠĠĠĠĠ Ġval Ġserializer Ġ= Ġ" serializer " Ċ // ĠĠĠĠĠĠĠĠ Ġval Ġformat Ġ= Ġ" format " Ċ // ĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠ Ġval Ġserializer Names : ĠMap < String , ĠSerializer <* >> Ġ= Ċ // ĠĠĠĠĠĠĠĠ ĠSerial izers :: class . java . fields . filter Ġ{ Ġit . name Ġ!= Ġ" INSTANCE " Ġ}. map Ġ{ Ġf Ġ-> Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" Serial izers ." Ġ+ Ġf . name , Ġf . get ( null ) Ġas ĠSerializer <* >) Ċ // ĠĠĠĠĠĠĠĠ Ġ}. toMap () Ċ // ĠĠĠĠ Ġval Ġserializer Instances : ĠMap < Serializer <* >, ĠString > Ġ= Ġserializer Names . map Ġ{ Ġp Ġ-> ĠPair ( p . value , Ġp . key ) Ġ}. toMap () Ċ // Ċ // ĠĠĠĠ Ġfun Ġserializer Name ( serializer : ĠSerializer < *> ): ĠString ? Ġ{ Ċ // ĠĠĠĠĠĠĠĠ Ġreturn Ġserializer Instances [ serializer ] Ċ // ĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠ Ġfun Ġserializer ByName ( name : ĠString ): ĠSerializer < *> ? Ġ{ Ċ // ĠĠĠĠĠĠĠĠ Ġreturn Ġserializer Names [ name ] Ċ // ĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠ Ġfun Ġ< E > Ġserializer For Class ( clazz : ĠClass < E >): ĠSerializer < E > Ġ{ Ċ // ĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġwhen Ġ( clazz ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ ĠString :: class . java Ġ-> ĠSerial izers . STRING Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ ĠByteArray :: class . java Ġ-> ĠSerial izers . BYTE _ ARRAY Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġjava . lang . Integer :: class . java Ġ-> ĠSerial izers . INTEGER Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġjava . lang . Long :: class . java Ġ-> ĠSerial izers . LONG Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠDB Exception . Wrong Config (" No Ġregistered Ġserializer Ġfor Ġclass : Ġ" Ġ+ Ġclazz . name ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO Ġconfig Ġfor Ġfallback Ġ( default Ġserial zier ), Ġor Ġregister Ġ' catch Ġall ' Ġserializer Ġfor Ġjava . lang . Object Ċ // ĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠ Ġreturn Ġs Ġas ĠSerializer < E > Ċ // ĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠ Ġfun Ġtx ( o : ĠRunnable ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠ Ġ// TODO Ġtx Ċ // ĠĠĠĠĠĠĠĠ Ġo . run () Ċ // ĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠ Ġfun Ġ< E > Ġtx ( o : ĠCallable < E >): ĠE Ġ{ Ċ // ĠĠĠĠĠĠĠĠ Ġ// TODO Ġtx Ċ // ĠĠĠĠĠĠĠĠ Ġ// TODO Ġmake Ġsure Ġit Ġis Ġnot Ġembed d able Ċ // ĠĠĠĠĠĠĠĠ Ġ// TODO Ġin Ġseparate Ġinterface Ċ // ĠĠĠĠĠĠĠĠ Ġreturn Ġo . call () Ċ // ĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠ Ġfun Ġ< K , ĠV > Ġtree Map ( Ċ // ĠĠĠĠĠĠĠĠ Ġtest : ĠString , Ġkey Ser : ĠSerializer < K >, Ċ // ĠĠĠĠĠĠĠĠ Ġvalue Ser : ĠSerializer < V > Ċ // ĠĠĠĠ Ġ): ĠNavig able Map Maker < K , ĠV > Ġ{ Ċ // ĠĠĠĠĠĠĠĠ Ġreturn ĠNavig able Map Maker < K , ĠV >( this , Ġkey Ser , Ġvalue Ser ) Ċ // ĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠ Ġclass ĠNavig able Map Maker < K , ĠV >( Ċ // ĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġdb : ĠDB , Ċ // ĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġkey Serializer : ĠSerializer < K >, Ċ // ĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġvalue Serializer : ĠSerializer < V > Ċ // ĠĠĠĠ Ġ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠ Ġfun Ġmake (): ĠConcurrent Navig able Map < K , ĠV > Ġ= ĠConcurrent Skip List Map () Ġ// TODO Ġmock Ġtre emap Ċ // ĠĠĠĠ Ġ} Ċ // Ġ} Ċ