package Ġcom . github . gr 3 g dev . jdbc . generator Ċ Ċ import Ġcom . github . gr 3 g dev . jdbc . dao . Queries Ċ import Ġcom . github . gr 3 g dev . jdbc . dao . Query Ċ import Ġcom . github . gr 3 g dev . jdbc . metadata . element . Table Element Ċ import Ġcom . github . gr 3 g dev . jdbc . processor . Reflect Utils Ċ import Ġcom . github . gr 3 g dev . jdbc . template . DAO Impl Template Ċ import Ġcom . github . gr 3 g dev . jdbc . template . JDBC Factory Template Ċ import Ġjavax . annotation . processing . Processing Environment Ċ import Ġjavax . annotation . processing . Processor Ċ import Ġjavax . lang . model . element . Element Ċ import Ġjavax . lang . model . element . Element Kind Ċ Ċ internal Ġobject ĠDAO Generator Ġ{ ĊĊĠĠĠ Ġfun Ġgenerate ( processing Env : ĠProcessing Environment , Ġelements DAO : ĠMutable Set < out ĠElement >, ĠpackageName : ĠString , Ġtables : ĠSet < Element >): ĠPair < List < Pair < Element , ĠString ? >>, ĠString > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclasses Ġ= Ġelements DAO . map Ġ{ Ġdao Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Implement DAO ( processing Env , Ġdao , ĠpackageName , Ġtables ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( classes , Ġclasses . join ToString ("\ n ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJDBC Factory Template . getter ( it ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Implement DAO ( processing Env : ĠProcessing Environment , Ġelement : ĠElement , ĠpackageName : ĠString , Ġtables : ĠSet < Element >): ĠPair < Element , ĠString ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġannotation Ġ= ĠReflect Utils . getAnnotation ( element , ĠQueries :: class ) ĊĠĠĠĠĠĠĠ Ġval Ġimplementation Ġ= ĠReflect Utils . getAnnotation AttributeValue ( annotation , Ġ" implementation ") ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġif Ġ( implementation Ġ!= Ġnull Ġ&& Ġimplementation . toString () Ġ!= ĠProcessor :: class . qualified Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" extends Ġ$ implementation " ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" implements Ġ$ element " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtables Element Ġ= Ġtables . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTable Element ( processing Env , Ġit , Ġit . as Type (). toString ()) ĊĠĠĠĠĠĠĠ Ġ}. toSet () ĊĠĠĠĠĠĠĠ Ġif Ġ( element . kind Ġ== ĠElement Kind . INTERFACE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġ"${ element . simple Name } Impl " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqueries Ġ= Ġelement . enc losed Elements ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĠReflect Utils . is Annotation Present ( it , ĠQuery :: class ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQuery Generator . generate ( tables Element , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimports Ġ= Ġqueries . flatMap To ( HashSet ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . imports ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. sorted (). join ToString ("\ n ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" import Ġ$ it ;" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethods Ġ= Ġqueries . join ToString ("\ n ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . method ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Content Ġ= ĠDAO Impl Template . generate ( packageName , Ġimports , Ġparent , ĠfileName , Ġmethods ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Env . filer . create SourceFile ("$ packageName .$ fileName "). open Writer (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . write ( class Content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( element , ĠfileName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( element , Ġnull ) ĊĠĠĠ Ġ} Ċ Ċ }