package Ġstudio . crud . crud framework . crud . model Ċ Ċ import Ġstudio . crud . crud framework . crud . annotation .* Ċ import Ġstudio . crud . crud framework . crud . cache . Crud Cache Options Ċ import Ġstudio . crud . crud framework . crud . handler . Crud Dao Ċ import Ġstudio . crud . crud framework . crud . hooks . interfaces . CRUD Hooks Ċ import Ġstudio . crud . crud framework . model . Base Crud Entity Ċ import Ġstudio . crud . crud framework . model . Persistent Entity Ċ import Ġstudio . crud . crud framework . utils . utils . Reflection Utils Ċ import Ġstudio . crud . crud framework . utils . utils . get GenericClass Ċ import Ġorg . springframework . core . annotation . Annotated Element Utils Ċ import Ġorg . springframework . core . annotation . Annotation Utils Ċ import Ġjava . lang . reflect . Field Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . full . all Super classes Ċ Ċ class ĠEntity Metadata DTO Ġ{ ĊĊĠĠĠ Ġval Ġsimple Name : ĠString ĊĊĠĠĠ Ġval Ġdelete Field : ĠField ? ĊĊĠĠĠ Ġval Ġdelete able Type : ĠDelete able Type ĊĊĠĠĠ Ġval Ġcache Metadata : ĠEntity Cache Metadata ? ĊĊĠĠĠ Ġval Ġimmutable : ĠBoolean ĊĊĠĠĠ Ġval Ġalways Persist Copy : ĠBoolean ĊĊĠĠĠ Ġval Ġhook Types From Annotations : ĠMutable Set < Class < CRUD Hooks < *, Ġ* >>> Ġ= Ġmutable Set Of () ĊĊĠĠĠ Ġval Ġhooks From Annotations : ĠMutable Set < CRUD Hooks < *, Ġ* >> Ġ= Ġmutable Set Of () ĊĊĠĠĠ Ġval Ġfields : ĠMutable Map < String , ĠField > Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġval Ġdao Clazz : ĠClass < out ĠCr ud Dao > ĊĊĠĠĠ Ġconstructor ( entity Clazz : ĠK Class < out ĠBase Crud Entity <* >>) Ġ: Ġthis ( entity Clazz . java ) ĊĊĠĠĠ Ġconstructor ( entity Clazz : ĠClass < out ĠBase Crud Entity <* >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġdelete Field Ġ= Ġget Entity Delete Field ( entity Clazz ) ĊĠĠĠĠĠĠĠ Ġdelete able Type Ġ= Ġget Entity Delete able Type ( entity Clazz ) ĊĠĠĠĠĠĠĠ Ġcache Metadata Ġ= Ġget Entity Cache Metadata ( entity Clazz ) ĊĠĠĠĠĠĠĠ Ġimmutable Ġ= Ġis Entity Immutable ( entity Clazz ) ĊĠĠĠĠĠĠĠ Ġalways Persist Copy Ġ= Ġshould Always Persist Copy ( entity Clazz ) ĊĠĠĠĠĠĠĠ Ġcollect Hook Annotations ( entity Clazz ) ĊĠĠĠĠĠĠĠ Ġdao Clazz Ġ= Ġget Entity Dao ( entity Clazz ) ĊĠĠĠĠĠĠĠ Ġget Fields ( entity Clazz ) ĊĠĠĠĠĠĠĠ Ġsimple Name Ġ= Ġentity Clazz . simple Name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Fields ( entity Clazz : ĠClass < out ĠPersistent Entity >, Ġprefix : ĠString ? Ġ= Ġnull , Ġcurrent Depth : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġeffective Prefix : ĠString ĊĠĠĠĠĠĠĠ Ġif ( prefix . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeffective Prefix Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeffective Prefix Ġ= Ġprefix . replace (".", Ġ"/") Ġ+ Ġ"." ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠReflection Utils . get Fields ( entity Clazz ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it . name Ġ== Ġ" copy " Ġ&& Ġit . type Ġ== ĠBase Crud Entity :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfield Clazz Ġ= Ġit . type ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Collection :: class . java . isAssignableFrom ( field Clazz )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpotential Field Clazz Ġ= Ġit . get GenericClass ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( potential Field Clazz Ġ!= Ġnull Ġ&& ĠPersistent Entity :: class . java . isAssignableFrom ( potential Field Clazz )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Clazz Ġ= Ġpotential Field Clazz ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( Persistent Entity :: class . java . isAssignableFrom ( field Clazz ) Ġ&& Ġcurrent Depth Ġ< ĠMAX _ FILTER FIELD _ DEPTH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Fields ( field Clazz Ġas ĠClass < out ĠPersistent Entity >, Ġeffective Prefix Ġ+ Ġit . name , Ġcurrent Depth Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields [ effective Prefix Ġ+ Ġit . name ] Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcollect Hook Annotations ( entity Clazz : ĠClass < out ĠBase Crud Entity <* >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhook Annotations Ġ= Ġmutable Set Of < With Hooks >() ĊĠĠĠĠĠĠĠ Ġval Ġannotations Ġ= Ġentity Clazz . declared Annotations Ġ+ Ġentity Clazz . kotlin . all Super classes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . java . declared Annotations . toList () Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġfirst Ġsearch Ġtargets Ġthe ĠWith Hooks . List Ġannotation , Ġwhich Ġis Ġthe Ġrepeat able Ġcontainer Ġfor ĠWith Hooks ĊĠĠĠĠĠĠĠ Ġannotations ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnnotation Utils . find Annotation ( Annotated Element Utils . for Annotations ( it ), ĠWith Hooks . List :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . value . isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap To ( hook Annotations ) Ġ{ Ġit . value . toList () Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġrun Ġthis Ġsecond Ġsearch Ġbecause Ġa Ġnested , Ġsingle ĠWith Hooks Ġannotation Ġin Ġa ĠKotlin Ġfile Ġdoes Ġnot Ġregister Ġas ĠWith Hooks . List ĊĠĠĠĠĠĠĠ Ġannotations ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull To ( hook Annotations ) Ġ{ ĠAnnotation Utils . find Annotation ( Annotated Element Utils . for Annotations ( it ), ĠWith Hooks :: class . java ) Ġ} ĊĊĊĊĠĠĠĠĠĠĠ Ġif Ġ( hook Annotations . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( hook Annotation Ġin Ġhook Annotations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhooks Array Ġ= ĠAnnotation Utils . getAnnotation Attributes ( hook Annotation )[" hooks "] Ġas ĠArray < Class < CRUD Hooks < *, Ġ* >>> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hooks Array . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhook Types From Annotations . addAll ( hooks Array . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Entity Dao ( clazz : ĠClass < out ĠBase Crud Entity <* >> ): ĠClass < out ĠCr ud Dao > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcr ud Entity Ġ= ĠAnnotation Utils . find Annotation ( clazz , ĠCr ud Entity :: class . java ) Ġ?: Ġerror ("@ Crud Entity Ġnot Ġfound Ġon Ġentity Ġ${ clazz . name }") ĊĠĠĠĠĠĠĠ Ġreturn Ġcr ud Entity . dao . java ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Entity Cache Metadata ( clazz : ĠClass < out ĠBase Crud Entity <* >> ): ĠEntity Cache Metadata ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcached By Ġ= Ġclazz . getDeclared Annotation ( Cached By :: class . java ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġfun ĠLong . null If Minus One (): ĠLong ? Ġ= Ġif ( this Ġ== Ġ- 1 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠEntity Cache Metadata ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached By . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached By . create If Missing , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCr ud Cache Options ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached By . time To Live Seconds . null If Minus One (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached By . time To Idle Seconds . null If Minus One (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached By . max Entries . null If Minus One () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Entity Delete able Type ( clazz : ĠClass < out ĠBase Crud Entity <* >> ): ĠDelete able Type Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelete able Ġ= Ġclazz . getDeclared Annotation ( Delete able :: class . java ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete able Ġ== Ġnull Ġ-> ĠDelete able Type . None ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete able . soft Delete Ġ-> ĠDelete able Type . Soft ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠDelete able Type . Hard ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Entity Delete Field ( clazz : ĠClass < out ĠBase Crud Entity <* >> ): ĠField ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfields Ġ= ĠReflection Utils . get Fields ( clazz ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġdelete Field : ĠField ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġfor Ġ( field Ġin Ġfields ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field . getDeclared Annotation ( Delete Column :: class . java ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Field Ġ= Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdelete Field ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Entity Immutable ( clazz : ĠClass < out ĠBase Crud Entity <* >> ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġclazz . getDeclared Annotation ( Immutable :: class . java ) Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshould Always Persist Copy ( clazz : ĠClass < out ĠBase Crud Entity <* >> ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġclazz . getDeclared Annotation ( Persist Copy On Fetch :: class . java ) Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠDelete able Type Ġ{ ĊĠĠĠĠĠĠĠ ĠNone , ĠSoft , ĠHard ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMAX _ FILTER FIELD _ DEPTH Ġ= Ġ 4 ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠEntity Cache Metadata ( ĊĠĠĠĠĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġcreate If Missing : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġval Ġoptions : ĠCr ud Cache Options Ċ )