package Ġcom . pio tr walk us z . smart law . annotation processor Ċ Ċ import Ġcom . google . auto . service . Auto Service Ċ import Ġcom . squareup . kotlin po et .* Ċ import Ġcom . squareup . kotlin po et . Parameterized TypeName . Companion . parameter ized By Ċ import Ġjava . io . File Ċ import Ġjavax . annotation . processing .* Ċ import Ġjavax . lang . model . Source Version Ċ import Ġjavax . lang . model . element . Element Kind Ċ import Ġjavax . lang . model . element . Executable Element Ċ import Ġjavax . lang . model . element . Type Element Ċ Ċ @ Auto Service ( Processor :: class ) Ċ @ Supported Source Version ( Source Version . RELEASE _ 8 ) Ċ @ Supported Options ( Generate Template Processor . K AP T _ K OT LIN _ GENERATED _ OPTION _ NAME ) Ċ class ĠGenerate Template Processor Ġ: ĠAbstract Processor () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠK AP T _ K OT LIN _ GENERATED _ OPTION _ NAME Ġ= Ġ" k apt . kotlin . generated " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠParameter ( val Ġname : ĠString , Ġval Ġtype : ĠType Name ) ĊĊĠĠĠ Ġoverride Ġfun Ġget Supported Annotation Types (): ĠMutable Set < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmutable Set Of ( Generate Template :: class . java . name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Supported Source Version (): ĠSource Version Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSource Version . latest () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( set : ĠMutable Set < out ĠType Element > ?, Ġround Environment : ĠRound Environment ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġround Environment ?. getElement s Annotated With ( Generate Template :: class . java )?. forEach Ġ{ Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Template ( element Ġas ĠType Element ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Template ( model Class : ĠType Element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġk apt Kotlin Generated Dir Ġ= Ġprocessing Env . options [ K AP T _ K OT LIN _ GENERATED _ OPTION _ NAME ] ĊĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġprocessing Env . element Utils . get Package Of ( model Class ). toString () ĊĠĠĠĠĠĠĠ Ġval Ġmodel ClassName Ġ= Ġmodel Class . simple Name . toString () ĊĠĠĠĠĠĠĠ Ġval Ġtemplate ClassName Ġ= Ġ"${ model ClassName } Template " ĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġget Parameters ( model Class ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Spec Ġ= ĠFile Spec . builder ( packageName , Ġtemplate ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Type ( Type Spec . class Builder ( template ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( Annotation Spec . builder ( ClassName (" com . fasterxml . jackson . annotation ", Ġ" Json TypeName ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Member ("\" $ template ClassName \" ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . DATA ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Super interface ( getBase Class ( packageName , Ġmodel ClassName )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. primary Constructor ( generate Constructor ( parameters )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Properties ( parameters . map Ġ{ ĠProperty Spec . builder ( it . name , Ġit . type ). initializer ( it . name ). build () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addFunction ( generate GetValue Function ( model Class . as ClassName (), Ġparameters )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġfile Spec . writeTo ( File ( k apt Kotlin Generated Dir , Ġ"$ template ClassName . kt ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Base Class ( packageName : ĠString , Ġmodel ClassName : ĠString ): ĠType Name Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠClass Name (" com . pio tr walk us z . smart law . core . model . template ", Ġ" Complex Template ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. parameter ized By ( ClassName ( packageName , Ġmodel ClassName )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Parameters ( model Class : ĠType Element ): ĠList < Parameter > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget First Constructor ( model Class ). parameters . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnullable Ġ= Ġit . getAnnotation ( org . jetbrains . annotations . NotNull :: class . java ) Ġ== Ġnull Ġ&& Ġ! it . as Type (). kind . is Primitive ĊĠĠĠĠĠĠĠĠĠĠĠ ĠParameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġit . simple Name . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġconvert Type To Template ( it . as Type (). as TypeName (). copy ( nullable Ġ= Ġnullable )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Type To Template ( type : ĠType Name ): ĠType Name Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠClass Name (" com . pio tr walk us z . smart law . core . model . template ", Ġ" Template ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. parameter ized By ( map Java Type To Kotlin Type ( type )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget First Constructor ( type Element : ĠType Element ): ĠExec utable Element Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtype Element . enc losed Elements . first Ġ{ Ġit . kind Ġ=== ĠElement Kind . CON STRUCTOR Ġ} Ġas ĠExec utable Element ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Constructor ( parameters : ĠList < Parameter >): ĠFun Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconstructor Spec Ġ= ĠFun Spec . constructor Builder () ĊĠĠĠĠĠĠĠ Ġparameters . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor Spec . add Parameter ( Parameter Spec . builder ( it . name , Ġit . type ). build ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġconstructor Spec . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate GetValue Function ( model Class : ĠClass Name , Ġparameters : ĠList < Parameter >): ĠFun Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFun Spec . builder (" getValue ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . OVERRIDE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter (" template Processor ", ĠClass Name (" com . pio tr walk us z . smart law . core . model . template ", Ġ" Complex Template . Template Processor ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( model Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code (" return Ġ${ model Class . simple Name }(\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code ( parameters . map Ġ{ Ġit . name Ġ}. join ToString (", \ n ") Ġ{ Ġ" Ġ Ġ$ it Ġ= Ġtemplate Processor . process Template ($ it )" Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code ("\ n )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmap Java Type To Kotlin Type ( java Type : ĠType Name ): ĠType Name Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnullable Ġ= Ġjava Type . is Nullable ĊĠĠĠĠĠĠĠ Ġval Ġjava TypeName Ġ= Ġjava Type . copy ( nullable Ġ= Ġfalse ). toString () ĊĠĠĠĠĠĠĠ Ġif Ġ( java TypeName Ġ== Ġ" java . lang . String ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠString :: class . as TypeName (). copy ( nullable Ġ= Ġnullable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( java TypeName Ġ== Ġ" java . lang . Integer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠInt :: class . as TypeName (). copy ( nullable Ġ= Ġnullable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( java Type Ġis ĠParameter ized TypeName Ġ&& Ġjava Type . raw Type Ġ== ĠClass Name (" java . util ", Ġ" List ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠList :: class . as ClassName (). parameter ized By ( map Java Type To Kotlin Type ( java Type . type Arguments [ 0 ])) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( java Type Ġis ĠParameter ized TypeName Ġ&& Ġjava Type . raw Type Ġ== ĠClass Name (" java . util ", Ġ" Map ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMap :: class . as ClassName (). parameter ized By ( map Java Type To Kotlin Type ( java Type . type Arguments [ 0 ]), Ġmap Java Type To Kotlin Type ( java Type . type Arguments [ 1 ])) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( java Type Ġis ĠParameter ized TypeName Ġ&& Ġjava Type . raw Type Ġ== ĠClass Name (" java . util ", Ġ" Set ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSet :: class . as ClassName (). parameter ized By ( map Java Type To Kotlin Type ( java Type . type Arguments [ 0 ])) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġjava Type ĊĠĠĠ Ġ} Ċ }