package Ġcom . s yle im an . mapping Processor . processor . source Data Har v esting Ċ Ċ import Ġcom . s yle im an . mapping Processor . annotations . M appable Entity Ċ import Ġcom . s yle im an . mapping Processor . annotations . M appable Property Ċ import Ġcom . s yle im an . mapping Processor . annotations . Mapped By Ċ import Ġcom . s yle im an . mapping Processor . processor . Consts Ċ import Ġcom . s yle im an . mapping Processor . processor . source Data Har v esting . source Classes Struct . Class Info Ċ import Ġcom . s yle im an . mapping Processor . processor . source Data Har v esting . source Classes Struct . M appable Entity Info Ċ import Ġcom . s yle im an . mapping Processor . processor . source Data Har v esting . source Classes Struct . M appable PropertyInfo Ċ import Ġorg . jetbrains . annotations . Nullable Ċ import Ġjavax . annotation . processing . Mess ager Ċ import Ġjavax . annotation . processing . Round Environment Ċ import Ġjavax . lang . model . element . Element Ċ import Ġjavax . lang . model . element . Element Kind Ċ import Ġjavax . lang . model . type . Mir rored Type Exception Ċ import Ġjavax . lang . model . util . Elements Ċ Ċ /** ĠHar v ests Ġinfo Ġabout Ġmap Ġentities Ġ*/ Ċ class ĠEntities Info Har v ester ( private Ġvar Ġenv : ĠRound Environment , Ġprivate Ġvar Ġlogger : ĠMess ager , Ġprivate Ġvar Ġelement Utils : ĠElements ) Ġ{ ĊĠĠĠ Ġ/** Ġ*/ ĊĠĠĠ Ġfun Ġhar vest () Ġ: ĠList < M appable Entity Info > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < M appable Entity Info >() ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġall Ġmapped Ġentities ĊĠĠĠĠĠĠĠ Ġval Ġannotated Elements Ġ= Ġenv . getElement s Annotated With ( M appable Entity :: class . java ) ĊĠĠĠĠĠĠĠ Ġif Ġ( annotated Elements . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĊĠĠĠĠĠĠĠ Ġlogger . print Message ( Consts . LOG _ LEVEL _ DEBUG , Ġ" Total Ġm appable Ġentities : Ġ"+ annotated Elements . size ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġannotated Elements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCollect Ġgeneral Ġinto ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm appable Entity Info Forward Ġ= ĠM appable Entity Info (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm appable Entity Ġ= ĠClass Info . from Element ( element , Ġelement Utils ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmapped To Ġ= Ġget Mapped To Entity ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . print Message ( Consts . LOG _ LEVEL _ DEBUG , Ġ" Forward Ġentity : Ġ${ m appable Entity Info Forward . m appable Entity . fullName }; Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Mapped Ġto : Ġ${ m appable Entity Info Forward . mapped To . fullName }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠProcess Ġproperties ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Java Ġ= Ġis Map From Java ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmembers Ġ= Ġelement Utils . getAll Members ( element Utils . getType Element ( m appable Entity Info Forward . m appable Entity . fullName )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( member Ġin Ġmembers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( member . kind != ĠElement Kind . FIELD ) ĠĠĠĠ Ġ// ĠSkip Ġnot Ġproperties ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! check Is M appable ( member )) ĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSkip Ġproperties Ġwithout ĠM appable Property Ġannotation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Info Ġ= ĠM appable PropertyInfo (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Name Ġ= Ġmember . simple Name . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Class Ġ= ĠClass Info . from Type ( member . as Type ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Nullable Ġ= Ġcheck Is Nullable ( member , Ġis Java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Name Ġ= Ġget Destination PropertyName ( member ) Ġ?: Ġmember . simple Name . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparser Ġ= Ġget Parser Forward ( member ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm appable Entity Info Forward . properties . add ( property Info ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . print Message ( Consts . LOG _ LEVEL _ DEBUG , Ġ" Property . ĠSource Name : Ġ${ property Info . source Name }; Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Source Class : Ġ${ property Info . source Class . fullName }; ĠIsNullable : Ġ${ property Info . is Nullable }; Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Destination Name : Ġ${ property Info . destination Name }; ĠParser : Ġ${ property Info . parser ?. fullName }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( m appable Entity Info Forward ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . print Message ( Consts . LOG _ LEVEL _ DEBUG , Ġ" ------------------------------------------------------------------------- ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNeed Ġtwo Ġgenerate Ġbackward Ġmapper ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( is Two Way ( element )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCollect Ġgeneral Ġinto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm appable Entity Backward Ġ= ĠM appable Entity Info (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm appable Entity Ġ= Ġm appable Entity Info Forward . mapped To ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmapped To Ġ= Ġm appable Entity Info Forward . m appable Entity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . print Message ( Consts . LOG _ LEVEL _ DEBUG , Ġ" Backward Ġentity : Ġ${ m appable Entity Backward . m appable Entity . fullName }; Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Mapped Ġto : Ġ${ m appable Entity Backward . mapped To . fullName }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmembers Source Ġ= Ġelement Utils . getAll Members ( element Utils . getType Element ( m appable Entity Info Forward . m appable Entity . fullName )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmembers Target Ġ= Ġelement Utils . getAll Members ( element Utils . getType Element ( m appable Entity Info Forward . mapped To . fullName )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠProcess Ġproperties Ġ( from Ġforward Ġentity Ġto Ġbackward !) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Java Ġ= Ġis Map To Java ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( member Ġin Ġmembers Source ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . print Message ( Consts . LOG _ LEVEL _ DEBUG , Ġ" Source Ġproperty Ġname : Ġ${ member . simple Name }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( member . kind != ĠElement Kind . FIELD ) ĠĠĠĠ Ġ// ĠSkip Ġnot Ġproperties ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! check Is M appable ( member )) ĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSkip Ġproperties Ġwithout ĠM appable Property Ġannotation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmapped PropertyName Ġ= Ġget Destination PropertyName ( member ) Ġ?: Ġmember . simple Name . toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . print Message ( Consts . LOG _ LEVEL _ DEBUG , Ġ" Property Ġname : Ġ$ mapped PropertyName ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprop Ġ= Ġmembers Target . first OrNull ({ it . simple Name . toString ()== mapped PropertyName }) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( prop == null ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . print Message ( Consts . LOG _ LEVEL _ DEBUG , Ġ" not Ġfound Ġ- Ġskip ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Info Ġ= ĠM appable PropertyInfo (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Name Ġ= Ġmapped PropertyName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Class Ġ= ĠClass Info . from Type ( prop !!. as Type ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Nullable Ġ= Ġcheck Is Nullable ( prop !! , Ġis Java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Name Ġ= Ġmember . simple Name . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparser Ġ= Ġget Parser Backward ( member ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm appable Entity Backward . properties . add ( property Info ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . print Message ( Consts . LOG _ LEVEL _ DEBUG , Ġ" Property . ĠSource Name : Ġ${ property Info . source Name }; Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Source Class : Ġ${ property Info . source Class . fullName }; ĠIsNullable : Ġ${ property Info . is Nullable }; Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Destination Name : Ġ${ property Info . destination Name }; ĠParser : Ġ${ property Info . parser ?. fullName }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( m appable Entity Backward ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . print Message ( Consts . LOG _ LEVEL _ DEBUG , Ġ" ------------------------------------------------------------------------- ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Mapped To Entity ( element Ġ: ĠElement ) Ġ: ĠClass Info ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġtry ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThere Ġis Ġalways Ġexception Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSee Ġthis : Ġhttps :// community . oracle . com / thread / 1 1 8 4 1 9 0 ? start = 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand Ġthis : Ġhttps :// area - 5 1 . blog / 2 0 0 9 / 0 2 / 1 3 / getting - class - values - from - annotations - in - an - annotation processor / ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . getAnnotation ( M appable Entity :: class . java ). map To ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex Ġ: ĠMir rored Type Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠClass Info . from Type ( ex . type Mirror ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠException (" Not Ġexpected Ġresult ĠExcept ed ĠMir rored Type Exception ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Two Way ( element Ġ: ĠElement ) Ġ: ĠBoolean ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġelement . getAnnotation ( M appable Entity :: class . java ). is Two Way ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Map From Java ( element Ġ: ĠElement ) Ġ: ĠBoolean ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġelement . getAnnotation ( M appable Entity :: class . java ). is Map From Java ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Map To Java ( element Ġ: ĠElement ) Ġ: ĠBoolean ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġelement . getAnnotation ( M appable Entity :: class . java ). is Map To Java ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcheck Is Nullable ( element Ġ: ĠElement , Ġis Java : ĠBoolean ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( is Java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġelement . getAnnotation ( Nullable :: class . java )!= null ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcheck Is M appable ( element Ġ: ĠElement ) Ġ: ĠBoolean Ġ= Ġelement . getAnnotation ( M appable Property :: class . java )!= null ĊĊĠĠĠ Ġ/** Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Destination PropertyName ( element Ġ: ĠElement ) Ġ: ĠString ? Ġ Ġ= ĊĠĠĠĠĠĠĠ Ġ( element . getAnnotation ( M appable Property :: class . java ). map To ). let Ġ{ Ġif ( it ==" ") Ġnull Ġelse Ġit Ġ} ĊĊĠĠĠ Ġ/** Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Parser Forward ( element Ġ: ĠElement ) Ġ: ĠClass Info ? ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġtry ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsee Ġcomment Ġin Ġget Mapped To Entity Ġmethod ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparser Annotation Ġ= Ġelement . getAnnotation ( Mapped By :: class . java ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparser Annotation . parser Forward ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex Ġ: ĠMir rored Type Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠClass Info . from Type ( ex . type Mirror ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠException (" Not Ġexpected Ġresult ĠExcept ed ĠMir rored Type Exception ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Parser Backward ( element Ġ: ĠElement ) Ġ: ĠClass Info ? ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġtry ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsee Ġcomment Ġin Ġget Mapped To Entity Ġmethod ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparser Annotation Ġ= Ġelement . getAnnotation ( Mapped By :: class . java ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparser Annotation . parser Backward ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex Ġ: ĠMir rored Type Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠClass Info . from Type ( ex . type Mirror ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠException (" Not Ġexpected Ġresult ĠExcept ed ĠMir rored Type Exception ") ĊĠĠĠ Ġ} Ċ }