package Ġorg . open rs 2 . de ob . byte code . remap Ċ Ċ import Ġorg . object web . asm . Type Ċ import Ġorg . open rs 2 . asm . Member Ref Ċ import Ġorg . open rs 2 . asm . classpath . Class Path Ċ import Ġorg . open rs 2 . asm . filter . Member Filter Ċ import Ġorg . open rs 2 . de ob . util . map . Name Map Ċ import Ġorg . open rs 2 . util . capitalize Ċ import Ġorg . open rs 2 . util . collect . Dis joint Set Ċ import Ġorg . open rs 2 . util . in defin ite Article Ċ Ċ public Ġclass ĠField Mapping Generator ( ĊĠĠĠ Ġprivate Ġval Ġclass Path : ĠClass Path , ĊĠĠĠ Ġprivate Ġval Ġexcluded Fields : ĠMember Filter , ĊĠĠĠ Ġprivate Ġval Ġname Map : ĠName Map , ĊĠĠĠ Ġprivate Ġval Ġinherited Field Sets : ĠDis joint Set < Member Ref >, ĊĠĠĠ Ġprivate Ġval Ġclass Mapping : ĠMap < String , ĠString > Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġname Generator Ġ= ĠName Generator () ĊĊĠĠĠ Ġpublic Ġfun Ġgenerate (): ĠMap < Dis joint Set . Partition < Member Ref >, ĠString > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmapping Ġ= Ġmutable Map Of < Dis joint Set . Partition < Member Ref >, ĠString >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( partition Ġin Ġinherited Field Sets ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Ren am able ( partition )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= ĠType . getType ( partition . first (). desc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmapping [ partition ] Ġ= Ġname Map . map FieldName ( partition , Ġgenerate Name ( type )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmapping ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Ren am able ( partition : ĠDis joint Set . Partition < Member Ref >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( field Ġin Ġpartition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= Ġclass Path [ field . owner ] !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( excluded Fields . matches ( field ) Ġ|| Ġclazz . dependency ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Name ( type : ĠType ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdimensions : ĠString ĊĠĠĠĠĠĠĠ Ġval Ġelement Type : ĠType ĊĠĠĠĠĠĠĠ Ġif Ġ( type . sort Ġ== ĠType . ARRAY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdimensions Ġ= Ġ" Array ". repeat ( type . dimensions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Type Ġ= Ġtype . elementType ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdimensions Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Type Ġ= Ġtype ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġprefix Ġ= Ġwhen Ġ( elementType . sort ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . BOOLEAN , ĠType . BYTE , ĠType . CHAR , ĠType . SHORT , ĠType . INT , ĠType . LONG , ĠType . FLOAT , ĠType . DOUBLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Type . className Ġ+ Ġdimensions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . OBJECT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠclassName Ġ= Ġclass Mapping . get OrDefault ( elementType . internal Name , Ġelement Type . internal Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclassName . get ClassName () Ġ+ Ġdimensions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unknown Ġfield Ġtype Ġ$ elementType ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġname Generator . generate ( prefix . in defin ite Article () Ġ+ Ġprefix . capitalize ()) ĊĠĠĠ Ġ} Ċ } Ċ