package Ġcom . vic pin . but cher knife . annotation . processor . model čĊč Ċ import Ġcom . vic pin . but cher knife . annotation . processor . Environment Util č Ċ import Ġcom . vic pin . but cher knife . annotation . processor . entity . Entity Property č Ċ import Ġcom . vic pin . but cher knife . annotation . processor . entity . Entity Property Factory č Ċ import Ġjavax . annotation . processing . Round Environment č Ċ import Ġjavax . lang . model . element . Element č Ċ import Ġjavax . lang . model . element . Element Kind č Ċ import Ġjavax . lang . model . element . Package Element čĊčĊč Ċ /** čĊ Ġ* ĠCreated Ġby ĠO es ia Ġon Ġ 0 7 / 1 2 / 2 0 1 7 . čĊ Ġ*/ č Ċ class ĠModel Ġprivate Ġconstructor () Ġ{ čĊčĊĠĠĠ Ġvar Ġentities Ġ= Ġmutable ListOf < Entity Model >() čĊčĊĠĠĠ Ġprivate Ġfun Ġparse Annotation ( env : ĠRound Environment , Ġannotation Class : ĠClass < Annotation >) Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġannotated Fields Ġ= Ġenv . getElement s Annotated With ( annotation Class ) čĊčĊĠĠĠĠĠĠĠ Ġfor Ġ( annotated Field Ġin Ġannotated Fields ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( annotated Field . kind Ġ!= ĠElement Kind . FIELD ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEnvironment Util . log Error ( annotation Class . simple Name Ġ+ Ġ" Ġcan Ġonly Ġbe Ġused Ġfor Ġproperties ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentity Ġ= Ġcreate Entity Model ( annotated Field . enc lo sing Element ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Ġ= ĠEntity Property Factory . create Property ( annotated Field , Ġannotation Class ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity . addProperty ( property ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġentities . add ( entity ) čĊčĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġcreate Entity Model ( parent Class : ĠElement ): ĠEntity Model Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġvar Ġentity Model Ġ= Ġfind Entity Model ( parent Class ) čĊĠĠĠĠĠĠĠ Ġif Ġ( entity Model Ġ== Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity Model Ġ= ĠEntity Model ( parent Class , Ġget Pack page For ( parent Class )) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġentities . add ( entity Model ) čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġreturn Ġentity Model čĊčĊčĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġget Pack page For ( parent Class : ĠElement ): ĠString Ġ{ čĊĠĠĠĠĠĠĠ Ġvar Ġparent Ġ= Ġparent Class . enc lo sing Element čĊĠĠĠĠĠĠĠ Ġwhile Ġ( parent Ġ! is ĠPackage Element ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġparent . enc lo sing Element čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġreturn Ġparent . qualified Name . toString () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġfind Entity Model ( model Class : ĠElement ): ĠEntity Model ? Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġentities . first OrNull Ġ{ Ġit . model Class Ġ== Ġmodel Class Ġ} čĊĠĠĠ Ġ} čĊčĊčĊĠĠĠ Ġinner Ġclass ĠEntity Model ( internal Ġval Ġmodel Class : ĠElement , Ġinternal Ġval Ġpkg : ĠString ) Ġ{ čĊĠĠĠĠĠĠĠ Ġvar Ġname : ĠString čĊĠĠĠĠĠĠĠ Ġvar Ġproperties Ġ= Ġmutable ListOf < Entity Property >() čĊčĊĠĠĠĠĠĠĠ Ġinit Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . name Ġ= Ġmodel Class . simple Name . toString () čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġfun Ġadd Property ( property : ĠEntity Property ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperties . add ( property ) čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġfun Ġget PropertyName ( property : ĠEntity Property ): ĠString Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"${ name . toLowerCase ()} _${ properties . indexOf ( property )}" čĊĠĠĠĠĠĠĠ Ġ} čĊčĊčĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġcompanion Ġobject Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġfun Ġbuild From ( env : ĠRound Environment , Ġannotations : ĠSet < String >): ĠModel Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= ĠModel () čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( annotation Ġin Ġannotations ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . parse Annotation ( env , ĠClass . forName ( annotation ) Ġas ĠClass < Annotation >) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmodel čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} č Ċ } čĊčĊčĊ