package Ġcom . im ma . persist . defs Ċ Ċ import Ġcom . im ma . persist . Dynamic Topic K its Ċ import Ġcom . im ma . persist . annotation .* Ċ import Ġjava . beans . Property Descriptor Ċ Ċ open Ġclass ĠM apped Entity Field Def ( name : ĠString , Ġtype : ĠEntity FieldType , Ġprivate Ġval Ġdescriptor : ĠProperty Descriptor ) Ġ: Ċ ĉ Entity Field Def ( name , Ġtype ) Ġ{ ĊĊ ĉ fun Ġget PropertyName (): ĠString Ġ{ Ċĉ ĉ return Ġdescriptor . name Ċ ĉ } ĊĊ ĉ override Ġfun Ġread ( entity : ĠAny ): ĠAny ? Ġ{ Ċĉ ĉ return Ġdescriptor . read Method . invoke ( entity ) Ċ ĉ } ĊĊ ĉ override Ġfun Ġwrite ( entity : ĠAny , Ġvalue : ĠAny ?) Ġ{ Ċĉ ĉ descriptor . write Method . invoke ( entity , Ġvalue ) Ċ ĉ } Ċ } Ċ Ċ interface ĠM apped Entity Def Ġ: ĠEntity Def Ċ Ċ abstract Ġclass ĠAbstract Mapped Entity Def ( Ċ ĉ name : ĠString , Ċ ĉ protected Ġval Ġentity Class : ĠClass <* >, Ċ ĉ fields : ĠList < Entity Field Def > Ċ ) Ġ: Ċ ĉ Abstract Entity Def ( name , Ġfields ), ĠM apped Entity Def Ġ{ Ċ ĉ override Ġfun Ġto Persist Object ( entity : ĠAny ): ĠPers ist Object Ġ{ Ċĉ ĉ val Ġmap Ġ= Ġfields . associate Ġ{ Ġfield Ġ-> Ċĉĉ ĉ field . fieldName Ġto Ġfield . read ( entity ) Ċĉ ĉ }. to Mutable Map () ĊĊĉ ĉ this . remove Empty Id ( map ) Ċĉ ĉ this . handle LastModified At ( map ) Ċĉ ĉ return Ġmap Ċ ĉ } ĊĊ ĉ override Ġfun Ġfrom Persist Object ( po : ĠPers ist Object ): ĠAny Ġ{ Ċĉ ĉ return Ġentity Class . get Constructor (). newInstance (). also Ġ{ Ċĉĉ ĉ fields . forEach Ġ{ Ġfield Ġ-> Ċĉĉĉ ĉ field . write ( this , Ġpo [ field . fieldName ]) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun Ġto FieldName ( property Or Factor Name : ĠString ): ĠString Ġ{ Ċĉ ĉ val Ġfield Ġ= Ġfields . find Ġ{ Ċĉĉ ĉ val Ġfield Ġ= Ġit Ġas ĠM apped Entity Field Def Ċĉĉ ĉ field . getProperty Name () Ġ== Ġproperty Or Factor Name Ċĉĉĉĉ ĉ || Ġfield . key Ġ== Ġproperty Or Factor Name Ċĉĉĉĉ ĉ || Ġfield . fieldName . equals ( property Or Factor Name , Ġtrue ) Ċĉ ĉ } Ċĉ ĉ return Ġfield ?. fieldName Ġ?: ĠDynamic Topic K its . to FieldName ( property Or Factor Name ) Ċ ĉ } ĊĊ ĉ override Ġfun Ġis Multiple Topics Supported (): ĠBoolean Ġ{ Ċĉ ĉ return Ġfalse Ċ ĉ } ĊĊ ĉ override Ġfun Ġis Topic Supported ( entity Or Topic Name : ĠString ): ĠBoolean Ġ{ Ċĉ ĉ return Ġentity Or Topic Name Ġ== Ġkey Ġ|| Ġentity Or Topic Name Ġ== Ġcollection Name Ċ ĉ } ĊĊ ĉ override Ġfun Ġto Collection Name (): ĠString Ġ{ Ċĉ ĉ return Ġcollection Name Ċ ĉ } Ċ } Ċ Ċ fun Ġis Mapped Entity ( entity Class : ĠClass < *> ): ĠBoolean Ġ{ Ċ ĉ return Ġentity Class . is Annotation Present ( Entity :: class . java ) Ċ } Ċ Ċ data Ġclass ĠM apped Entity Field ( Ċ ĉ val Ġname : ĠString , Ċ ĉ val Ġtype : ĠEntity FieldType , Ċ ĉ val Ġdescriptor : ĠProperty Descriptor Ċ ) Ċ Ċ data Ġclass ĠM apped Entity ( Ċ ĉ val Ġname : ĠString , Ċ ĉ val Ġentity Class : ĠClass <* >, Ċ ĉ val Ġfields : ĠList < Mapped Entity Field > Ċ ) Ċ Ċ fun Ġparse Mapped Entity ( entity Class : ĠClass <* >, Ġentity Name : ĠString ?): ĠM apped Entity Ġ{ Ċ ĉ val Ġentity Ġ= Ġentity Class . getAnnotation ( Entity :: class . java ) Ċĉ ĉ ?: Ġthrow ĠRuntimeException (" Class [$ entity Class ] Ġis Ġnot Ġan Ġentity .") ĊĊ ĉ var Ġname Ġ= Ġentity Name Ċ ĉ if Ġ( name . isNull Or Blank ()) Ġ{ Ċĉ ĉ name Ġ= Ġentity . value Ċ ĉ } Ċ ĉ if Ġ( name . isNull Or Blank ()) Ġ{ Ċĉ ĉ throw ĠRuntimeException (" Entity Ġname Ġnot Ġdefined Ġfor Ġclass [$ entity Class ]. ") Ċ ĉ } ĊĊ ĉ val Ġfields Ġ= Ġentity Class . declared Fields . map NotNull Ġ{ Ġfield Ġ-> Ċĉ ĉ when Ġ{ Ċĉĉ ĉ field . is Annotation Present ( Id :: class . java ) Ġ-> Ġ{ Ċĉĉĉ ĉ @ Suppress (" NAME _ SH ADO WING ") Ġval Ġname Ġ= Ġfield . getAnnotation ( Id :: class . java ). value Ċĉĉĉ ĉ Mapped Entity Field ( name , ĠEntity FieldType . ID , ĠProperty Descriptor ( field . name , Ġfield . decl aring Class )) Ċĉĉ ĉ } Ċĉĉ ĉ field . is Annotation Present ( CreatedAt :: class . java ) Ġ-> Ġ{ Ċĉĉĉ ĉ @ Suppress (" NAME _ SH ADO WING ") Ġval Ġname Ġ= Ġfield . getAnnotation ( CreatedAt :: class . java ). value Ċĉĉĉ ĉ Mapped Entity Field ( Ċĉĉĉĉ ĉ name , Ċĉĉĉĉ ĉ Entity FieldType . CREATED _ AT , Ċĉĉĉĉ ĉ Property Descriptor ( field . name , Ġfield . decl aring Class ) Ċĉĉĉ ĉ ) Ċĉĉ ĉ } Ċĉĉ ĉ field . is Annotation Present ( LastModified At :: class . java ) Ġ-> Ġ{ Ċĉĉĉ ĉ @ Suppress (" NAME _ SH ADO WING ") Ġval Ġname Ġ= Ġfield . getAnnotation ( LastModified At :: class . java ). value Ċĉĉĉ ĉ Mapped Entity Field ( Ċĉĉĉĉ ĉ name , Ċĉĉĉĉ ĉ Entity FieldType . LAST _ MODI FIED _ AT , Ċĉĉĉĉ ĉ Property Descriptor ( field . name , Ġfield . decl aring Class ) Ċĉĉĉ ĉ ) Ċĉĉ ĉ } Ċĉĉ ĉ field . is Annotation Present ( Field :: class . java ) Ġ-> Ġ{ Ċĉĉĉ ĉ @ Suppress (" NAME _ SH ADO WING ") Ġval Ġname Ġ= Ġfield . getAnnotation ( Field :: class . java ). value Ċĉĉĉ ĉ Mapped Entity Field ( Ċĉĉĉĉ ĉ name , Ċĉĉĉĉ ĉ Entity FieldType . REG ULAR , Ċĉĉĉĉ ĉ Property Descriptor ( field . name , Ġfield . decl aring Class ) Ċĉĉĉ ĉ ) Ċĉĉ ĉ } Ċĉĉ ĉ else Ġ-> Ġnull Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ return ĠM apped Entity ( name , Ġentity Class , Ġfields ) Ċ }