package Ġcodes . st ev ob rock . min id ocument storage . sqlite Ċ Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . locks . Re entrant ReadWrite Lock Ċ import Ġkotlin . collections . HashMap Ċ import Ġkotlin . concurrent . read Ċ import Ġkotlin . concurrent . write Ċ Ċ //---------------------------------------------------------------- ------------------------------------------------ ------ Ċ class ĠMD SS QL ite Document Backing Ġ{ ĊĊ ĉ // ĠProperties Ċ ĉ val ĉ id Ġ: Long Ċ ĉ val ĉ creation Date Ġ: Date ĊĊ ĉ var ĉ revision Ġ: Int Ċ ĉ var ĉ modification Date Ġ: Date Ċ ĉ val ĉ property Map Ġ: HashMap < String , ĠAny > Ġget () Ġ= Ġthis . properties Lock . read () Ġ{ Ġthis . property Map Internal Ġ} Ċ ĉ var ĉ active Ġ: Boolean ĊĊ ĉ private ĉ val Ġproperty Map Internal Ġ: HashMap < String , ĠAny > Ċ ĉ private ĉ val Ġproperties Lock Ġ= ĠRe entrant ReadWrite Lock () ĊĊ ĉ // ĠLifecycle Ġmethods Ċ ĉ //---------------------------------------------------------------- ------------------------------------------------ -- Ċ ĉ constructor ( id Ġ: Long , Ġrevision Ġ: Int , Ġcreation Date Ġ: Date , Ġmodification Date Ġ: Date , Ġproperty Map Ġ: HashMap < String , ĠAny >, Ċĉĉ ĉ active Ġ: Boolean ) Ġ{ Ċĉ ĉ // ĠStore Ċĉ ĉ this . id Ġ= Ġid Ċĉ ĉ this . creation Date Ġ= Ġcreation Date ĊĊĉ ĉ this . revision Ġ= Ġrevision Ċĉ ĉ this . modification Date Ġ= Ġmodification Date Ċĉ ĉ this . property Map Internal Ġ= Ġproperty Map Ċĉ ĉ this . active Ġ= Ġactive Ċ ĉ } ĊĊ ĉ //---------------------------------------------------------------- ------------------------------------------------ -- Ċ ĉ constructor ( document Type Ġ: String , Ġdocument ID Ġ: String , Ġcreation Date Ġ: Date ? Ġ= Ġnull , Ġmodification Date Ġ: Date ? Ġ= Ġnull , Ċĉĉ ĉ property Map Ġ: HashMap < String , ĠAny >, Ġdatabase Manager Ġ: MD SS QL ite Database Manager ) Ġ{ Ċĉ ĉ // ĠSetup Ċĉ ĉ val Ġ( id , Ġrevision , Ġcreation Date Use , Ġmodification Date Use ) Ġ= Ċĉĉĉĉ ĉ database Manager . new ( document Type , Ġdocument ID , Ġcreation Date , Ġmodification Date , Ġproperty Map ) ĊĊĉ ĉ // ĠStore Ċĉ ĉ this . id Ġ= Ġid Ċĉ ĉ this . creation Date Ġ= Ġcreation Date Use ĊĊĉ ĉ this . revision Ġ= Ġrevision Ċĉ ĉ this . modification Date Ġ= Ġmodification Date Use Ċĉ ĉ this . property Map Internal Ġ= Ġproperty Map Ċĉ ĉ this . active Ġ= Ġtrue Ċ ĉ } ĊĊ ĉ // ĠInstance Ġmethods Ċ ĉ //---------------------------------------------------------------- ------------------------------------------------ -- Ċ ĉ fun Ġvalue ( property Ġ: String ) Ġ: Any ? Ġ{ Ġreturn Ġthis . properties Lock . read () Ġ{ Ġthis . property Map Internal [ property ] Ġ} Ġ} ĊĊ ĉ //---------------------------------------------------------------- ------------------------------------------------ -- Ċ ĉ fun Ġset ( property Ġ: String , Ġvalue Ġ: Any ?, Ġdocument Type Ġ: String , Ġdatabase Manager Ġ: MD SS QL ite Database Manager , Ċĉĉ ĉ commit Change Ġ: Boolean Ġ= Ġtrue ) Ġ{ Ċĉ ĉ // ĠUpdate Ċĉ ĉ update ( document Type , Ġif Ġ( value Ġ!= Ġnull ) Ġhash Map Of ( property Ġto Ġvalue ) Ġelse Ġnull , Ċĉĉ ĉ if Ġ( value Ġ== Ġnull ) Ġset Of ( property ) Ġelse Ġnull , Ġdatabase Manager , Ġcommit Change ) Ċ ĉ } ĊĊ ĉ //---------------------------------------------------------------- ------------------------------------------------ -- Ċ ĉ fun Ġupdate ( document Type Ġ: String , Ġupdated Property Map Ġ: HashMap < String , ĠAny >? Ġ= Ġnull , Ċĉĉ ĉ removed Properties Ġ: Set < String >? Ġ= Ġnull , Ġdatabase Manager Ġ: MD SS QL ite Database Manager , Ċĉĉ ĉ commit Change Ġ: Boolean Ġ= Ġtrue ) Ġ{ Ċĉ ĉ // ĠUpdate Ċĉ ĉ this . properties Lock . write () Ġ{ Ċĉĉ ĉ // ĠStore Ċĉĉ ĉ updated Property Map ?. forEach () Ġ{ Ġthis . property Map Internal [ it . key ] Ġ= Ġit . value Ġ} Ċĉĉ ĉ removed Properties ?. forEach () Ġ{ Ġthis . property Map Internal . remove ( it ) Ġ} ĊĊĉĉ ĉ // ĠCheck Ġif Ġcommit ting Ġchange Ċĉĉ ĉ if Ġ( commit Change ) Ġ{ Ċĉĉĉ ĉ // ĠGet Ġinfo Ċĉĉĉ ĉ val Ġ( revision , Ġmodification Date ) Ġ= Ċĉĉĉĉĉĉ ĉ database Manager . update ( document Type , Ġthis . id , Ġthis . property Map Internal ) ĊĊĉĉĉ ĉ // ĠStore Ċĉĉĉ ĉ this . revision Ġ= Ġrevision Ċĉĉĉ ĉ this . modification Date Ġ= Ġmodification Date Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } Ċ } Ċ