package Ġ rip . dead code . as ash imo . jpa Ċ Ċ import Ġcom . google . common . collect . ImmutableList Ċ import Ġjava . lang . reflect . Modifier Ċ import Ġjavax . persistence . Column Ċ import Ġjavax . persistence . Id Ċ import Ġjavax . persistence . Table Ċ import Ġkotlin . reflect . K Class Ċ Ċ object ĠJ pa Int ros pector Ġ{ ĊĊĠĠĠ Ġ// ĠTODO Ġrefactoring ĊĊĠĠĠ Ġfun Ġint rospect ( entity : ĠAny ): ĠJ pa Int rospection Result Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġcache Ġresults ĊĊĠĠĠĠĠĠĠ Ġval Ġtable Ġ= Ġget Table ( entity :: class ) ĊĠĠĠĠĠĠĠ Ġval Ġcolumns Ġ= Ġget Columns ( entity ) ĊĠĠĠĠĠĠĠ Ġreturn ĠJ pa Int rospection Result ( table , Ġcolumns . id Name , Ġcolumns . id , Ġcolumns . column Names , Ġcolumns . columns ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġint rospect ( cls : ĠK Class < *> ): ĠJ pa Int rospection Type Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtable Ġ= Ġget Table ( cls ) ĊĠĠĠĠĠĠĠ Ġval Ġcolumns Ġ= Ġget Columns ( cls ) ĊĠĠĠĠĠĠĠ Ġreturn ĠJ pa Int rospection Type Result ( table , Ġcolumns . id Name , Ġcolumns . columns Name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Bindings ( entity : ĠAny ): ĠMap < String , ĠAny ?> Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġfields Ġ= Ġentity :: class . java . declared Fields ĊĠĠĠĠĠĠĠ Ġval Ġcolumn Names Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġval Ġcolumns Ġ= Ġmutable ListOf < Any >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( f Ġin Ġfields ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( f . is Synt hetic Ġ|| ĠModifier . is Transient ( f . modifiers )) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf . is Accessible Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolumn Mark Ġ= Ġf . getAnnotation ( Column :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġcolumn Mark ?. name Ġ?: Ġf . name ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn Names Ġ+= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolumns Ġ+= Ġf . get ( entity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ( column Names Ġzip Ġcolumns ). associate Ġ{ Ġit Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Table ( cls : ĠK Class < *> ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmark Ġ= Ġcls . java . getDeclared Annotation ( Table :: class . java ) ĊĠĠĠĠĠĠĠ Ġreturn Ġmark ?. name Ġ?: Ġcls . java . simple Name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Columns ( entity : ĠAny ): ĠColumns Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġfields Ġ= Ġentity :: class . java . declared Fields ĊĠĠĠĠĠĠĠ Ġvar Ġid Name : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġid : ĠAny ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġcolumn Names Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġval Ġcolumns Ġ= Ġmutable ListOf < Any >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( f Ġin Ġfields ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( f . is Synt hetic Ġ|| ĠModifier . is Transient ( f . modifiers )) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf . is Accessible Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Mark Ġ= Ġf . getAnnotation ( Id :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolumn Mark Ġ= Ġf . getAnnotation ( Column :: class . java ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġcolumn Mark ?. name Ġ?: Ġf . name ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id Mark Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Name Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġf . get ( entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn Names Ġ+= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumns Ġ+= Ġf . get ( entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠColumns ( id Name !! , Ġid !! , ĠImmutableList . copyOf ( column Names ), Ġcolumns ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠColumns ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Name : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid : ĠAny , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolumn Names : ĠList < String >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolumns : ĠList < Any ?> ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġget Columns ( cls : ĠK Class < *> ): ĠColumn sType Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġfields Ġ= Ġcls . java . declared Fields ĊĠĠĠĠĠĠĠ Ġvar Ġid Name : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġcolumn Names Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( f Ġin Ġfields ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( f . is Synt hetic Ġ|| ĠModifier . is Transient ( f . modifiers )) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf . is Accessible Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Mark Ġ= Ġf . getAnnotation ( Id :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolumn Mark Ġ= Ġf . getAnnotation ( Column :: class . java ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġcolumn Mark ?. name Ġ?: Ġf . name ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id Mark Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Name Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn Names Ġ+= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠColumn sType ( id Name !! , ĠImmutableList . copyOf ( column Names )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠColumn sType ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Name : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolumns Name : ĠList < String > ĊĠĠĠ Ġ) Ċ Ċ } Ċ Ċ data Ġclass ĠJ pa Int rospection Result ( ĊĠĠĠĠĠĠĠ Ġval ĠtableName : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġid Name : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġid : ĠAny , ĊĠĠĠĠĠĠĠ Ġval Ġcolumn Names : ĠList < String >, ĊĠĠĠĠĠĠĠ Ġval Ġcolumns : ĠList < Any ?> Ċ ) Ċ Ċ data Ġclass ĠJ pa Int rospection Type Result ( ĊĠĠĠĠĠĠĠ Ġval ĠtableName : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġid Name : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġcolumn Names : ĠList < String > Ċ ) Ċ