package Ġat . w avy walk . simp ler . orm . template Data Models . model Ċ Ċ import Ġorg . jetbrains . annotations . Nullable Ċ import Ġat . w avy walk . simp ler . orm . annotations . Is PrimaryKey Ċ import Ġat . w avy walk . simp ler . orm . annotations . Table Field Ċ import Ġjavax . lang . model . element . Element Ċ import Ġjavax . lang . model . element . Element Kind Ċ Ċ object ĠField Beans List Factory Ġ{ ĊĊĠĠĠ Ġfun Ġcreate ( element : ĠElement ): ĠMutable List < Field Bean > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfield Beans Ġ= Ġmutable ListOf < Field Bean >() ĊĊĠĠĠĠĠĠĠ Ġelement . enc losed Elements . forEach Ġ{ Ġen closed Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Is Table Field ( enc losed Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtable Field Annotation Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Beans . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproduce Field Bean ( table Field Annotation , Ġen closed Element ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfield Beans ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġprivate Ġfun Ġif Is Table Field ( element : ĠElement , Ġlambda : Ġ( table Field : ĠTable Field ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( element . kind Ġ== ĠElement Kind . FIELD ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Annotation : ĠTable Field ? Ġ= Ġelement . getAnnotation ( Table Field :: class . java ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Annotation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlambda . invoke ( field Annotation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġproduce Field Bean ( table Field Annotation : ĠTable Field , Ġelement : ĠElement ): ĠField Bean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġproperty : ĠString Ġ= Ġelement . simple Name . toString () // . toString (). split ("$ "). get ( 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġtable FieldName : ĠString Ġ= Ġtable Field Annotation . name ĊĠĠĠĠĠĠĠ Ġval Ġtype : ĠString Ġ= Ġco un struct Type ( element )// element . as Type (). toString (). split ('. '). last () Ġ+ Ġ" ?" ĊĠĠĠĠĠĠĠ Ġval Ġis PrimaryKey Ġ= Ġdoes Have PrimaryKey Annotation ( element ) ĊĠĠĠĠĠĠĠ Ġval Ġnon Nullable Type Ġ= Ġconstruct Non Nullable Type ( type ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠField Bean ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Ġ= Ġelement , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Ġ= Ġproperty , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtable FieldName Ġ= Ġtable FieldName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis PrimaryKey Ġ= Ġis PrimaryKey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnon Nullable Type Ġ= Ġnon Nullable Type ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġco un struct Type ( element : ĠElement ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġbase TypeName Ġ= Ġelement . as Type (). toString (). split ('. '). last () ĊĠĠĠĠĠĠĠ Ġbase TypeName Ġ= Ġconvert Type If Ne cessary ( base TypeName ) ĊĠĠĠĠĠĠĠ Ġif Ġ( is Nullable Property ( element )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase TypeName Ġ+= Ġ" ?" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbase TypeName ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Type If Ne cessary ( base TypeName : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( base TypeName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Integer " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" Int " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbase TypeName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Nullable Property ( element : ĠElement ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnullable Annotation Ġ= Ġelement . getAnnotation ( Nullable :: class . java ) ĊĠĠĠĠĠĠĠ Ġif Ġ( nullable Annotation Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconstruct Non Nullable Type ( type : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkotlin Question Mark Ġ= Ġtype [ type . length Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠ Ġif Ġ( kotlin Question Mark Ġ== Ġ'? '){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtype . substring ( 0 , Ġtype . length Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtype ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdoes Have PrimaryKey Annotation ( element : ĠElement ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġannotation Ġ= Ġelement . getAnnotation ( Is PrimaryKey :: class . java ) ĊĠĠĠĠĠĠĠ Ġif Ġ( annotation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ