/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠRealm ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġio . realm . processor Ċ Ċ import Ġjava . util . Locale Ċ Ċ import Ġjavax . lang . model . element . Modifier Ċ import Ġjavax . lang . model . element . Variable Element Ċ Ċ import Ġio . realm . annotations . Link ing Objects Ċ import Ġio . realm . annotations . Required Ċ Ċ /** Ċ Ġ* ĠA Ġ** Back link ** Ġis Ġan Ġimplicit Ġbackwards Ġreference . Ġ ĠIf Ġfield Ġ` source Field ` Ġin Ġinstance Ġ` I ` Ċ Ġ* Ġof Ġtype Ġ` Source Class ` Ġholds Ġa Ġreference Ġto Ġinstance Ġ` J ` Ġof Ġtype Ġ` Target Class `, Ċ Ġ* Ġthen Ġa Ġ" back link " Ġis Ġthe Ġautomatically Ġcreated Ġreference Ġfrom Ġ` J ` Ġto Ġ` I `. Ċ Ġ* Ċ Ġ* ĠBack links Ġare Ġautomatically Ġcreated Ġand Ġdestroyed Ġwhen Ġthe Ġforward Ġreferences Ġto Ġwhich Ġthey Ċ Ġ* Ġcorrespond Ġare Ġcreated Ġand Ġdestroyed . Ġ ĠThis Ġcan Ġd ram atically Ġreduce Ġthe Ġcomplexity Ġof Ġclient Ċ Ġ* Ġcode . Ċ Ġ* Ċ Ġ* ĠTo Ġexpose Ġback links Ġfor Ġuse , Ġcreate Ġa Ġdeclaration Ġas Ġfollows : Ċ Ġ* Ċ Ġ* Ġ``` Ċ Ġ* Ġ// ĠFor ĠNormal Ġtop - level Ġobjects Ċ Ġ* Ġclass ĠTarget Class Ġ{ Ċ Ġ* ĠĠ Ġ// Ġ... Ċ Ġ* ĠĠ Ġ@ Link ing Objects (" source Field ") Ċ Ġ* ĠĠ Ġfinal ĠRealm Results < Source Class > Ġtarget Field Ġ= Ġnull ; Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġ// ĠIf Ġthe Ġclass Ġis Ġan Ġembedded Ġobject , Ġwe Ġknow Ġthere Ġis Ġalways Ġone Ġparent , Ġso Ċ Ġ* Ġ// Ġback links Ġin Ġthis Ġcase Ġcan Ġalso Ġbe Ġdefined Ġthis Ġway : Ċ Ġ* Ġclass ĠTarget Class Ġ{ Ċ Ġ* ĠĠ Ġ// Ġ... Ċ Ġ* ĠĠ Ġ@ Link ing Objects (" source Field ") Ċ Ġ* ĠĠ Ġfinal ĠSource Class Ġtarget Field ; Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* ``` Ċ Ġ* Ċ Ġ* ĠThe Ġ` target Field `, Ġthe Ġfield Ġannotated Ġwith Ġthe Ġ@ Link ing Objects Ġannotation Ġmust Ġbe Ġfinal . Ċ Ġ* ĠIts Ġtype Ġmust Ġbe Ġ` Realm Results ` Ġwhose Ġgeneric Ġargument Ġis Ġthe Ġ` Source Class `, Ġthe Ġclass Ġwith Ġthe Ċ Ġ* Ġ` source Field ` Ġthat Ġwill Ġhold Ġthe Ġforward Ġreference Ġto Ġan Ġinstance Ġof Ġ` Target Class ` Ċ Ġ* Ċ Ġ* ĠThe Ġ` source Field ` Ġmust Ġbe Ġeither Ġof Ġtype Ġ` Target Class ` Ġ Ġor Ġ` Realm List < Target Class >` Ċ Ġ* Ċ Ġ* ĠIn Ġthe Ġcode Ġlink Ġdirection Ġis Ġfrom Ġthe Ġperspective Ġof Ġthe Ġlink , Ġnot Ġthe Ġback link : Ġthe Ġsource Ġis Ċ Ġ* Ġthe Ġinstance Ġto Ġwhich Ġthe Ġback link Ġpoints , Ġthe Ġtarget Ġis Ġthe Ġinstance Ġholding Ġthe Ġpointer . Ċ Ġ* ĠThis Ġis Ġconsistent Ġwith Ġthe Ġuse Ġof Ġterms Ġin Ġthe ĠRealm ĠCore . Ċ Ġ* Ċ Ġ* ĠAs Ġshould Ġbe Ġobvious , Ġfrom Ġthe Ġdeclaration , Ġback links Ġare Ġuseful Ġonly Ġon Ġmanaged Ġobjects . Ċ Ġ* ĠAn Ġunmanaged ĠModel Ġobject Ġwill Ġhave , Ġas Ġthe Ġvalue Ġof Ġits Ġback link Ġfield , Ġthe Ġvalue Ġwith Ġwhich Ċ Ġ* Ġthe Ġfield Ġis Ġinitialized Ġ( typ ically Ġnull ). Ċ Ġ*/ Ċ class ĠBack link ( private Ġval Ġclazz : ĠClass MetaData , Ġprivate Ġval Ġback link Field : ĠVariable Element ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġfully - qualified Ġname Ġof Ġthe Ġclass Ġcontaining Ġthe Ġ` target Field `, Ġwhich Ġis Ġthe Ġfield ĊĠĠĠĠ Ġ* Ġannotated Ġwith Ġthe Ġ@ Link ing Objects Ġannotation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġtarget Class : ĠQual ified ClassName Ġ= Ġclazz . qualified ClassName ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġname Ġof Ġthe Ġback link Ġfield , Ġin Ġ` target Class `. ĊĠĠĠĠ Ġ* ĠA Ġ` Realm Results < >` Ġfield Ġannotated Ġwith Ġa Ġ@ Link ing Objects Ġannotation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġtarget Field : ĠString Ġ= Ġback link Field . simple Name . toString () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġfully - qualified Ġname Ġof Ġthe Ġclass Ġto Ġwhich Ġthe Ġback links , Ġfrom Ġ` target Field `, Ġpoint . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġsource Class : ĠQual ified ClassName ? Ġ= Ġif Ġ( Utils . is Realm Results ( back link Field )) ĠUtils . get Realm Results Type ( back link Field ) Ġelse ĠUtils . getModel Class QualifiedName ( back link Field ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġname Ġof Ġthe Ġfield , Ġin Ġ` Source Class ` Ġthat Ġhas Ġa Ġnormal Ġlink Ġto Ġ` target Class `. ĊĠĠĠĠ Ġ* ĠMaking Ġthis Ġfield , Ġin Ġan Ġinstance ĠI Ġof Ġ` Source Class `, Ġa Ġreference Ġto Ġan Ġinstance ĠJ Ġof ĊĠĠĠĠ Ġ* Ġ` Target Class ` Ġwill Ġcause Ġthe Ġ` target Field ` Ġof ĠJ Ġto Ġcontain Ġa Ġback link Ġto ĠI . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġsource Field : ĠString ? Ġ= Ġback link Field . getAnnotation ( Link ing Objects :: class . java )?. value ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ{@ code Ġtrue } Ġif Ġthe Ġparent Ġlink Ġshould Ġbe Ġmode led Ġas Ġa ĠRealm Results Ġinstead Ġof Ġa Ġsingle Ġlink . ĊĠĠĠĠ Ġ* ĠSingle Ġlinks Ġare Ġonly Ġsupported Ġin Ġclasses Ġthat Ġare Ġembedded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġexpose As Realm Results : ĠBoolean Ġ= ĠUtils . is Realm Results ( back link Field ) ĊĊĠĠĠ Ġval Ġtarget FieldType : ĠString Ġ= Ġback link Field . as Type (). toString () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠValidate Ġthe Ġsource Ġside Ġof Ġthe Ġback link . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġback link Ġsource Ġlooks Ġgood . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġvalidate Source (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġannotation Ġmust Ġhave Ġan Ġargument , Ġidentifying Ġthe Ġlinked Ġfield . ĊĠĠĠĠĠĠĠ Ġif Ġ( source Field Ġ== Ġnull Ġ|| Ġsource Field Ġ== Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . error ( String . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocale . US , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġ@ Link ing Objects Ġannotation Ġfor Ġthe Ġfield Ġ\"% s .% s \" Ġmust Ġhave Ġa Ġparameter Ġidentifying Ġthe Ġlink Ġtarget .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Field )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠUsing Ġlink Ġsyntax Ġto Ġtry Ġto Ġreference Ġa Ġlinked Ġfield Ġis Ġnot Ġpossible . ĊĠĠĠĠĠĠĠ Ġif Ġ( source Field . contains (". ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . error ( String . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocale . US , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġparameter Ġto Ġthe Ġ@ Link ing Objects Ġannotation Ġfor Ġthe Ġfield Ġ\"% s .% s \" Ġcontains Ġa Ġ'. '. Ġ ĠThe Ġuse Ġof Ġ'.' Ġto Ġspecify Ġfields Ġin Ġreferenced Ġclasses Ġis Ġnot Ġsupported .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Field )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Utils . is Realm Results ( back link Field )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalidate Back links As Realm Results ( back link Field ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalidate Back link As Object Reference ( back link Field ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Back link As Object Reference ( field : ĠVariable Element ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠUsing Ġ@ Link ing Objects Ġas Ġa Ġsingle Ġparent Ġreference Ġis Ġonly Ġallowed Ġin Ġembedded Ġclasses ĊĠĠĠĠĠĠĠ Ġif Ġ(! clazz . embedded Ġ&& Ġ! Utils . is Realm Results ( back link Field )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . error ( String . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocale . US , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġfield Ġ\"% s .% s \" Ġis Ġa Ġ\"% s \" . ĠFields Ġannotated Ġwith Ġ@ Link ing Objects Ġmust Ġbe ĠRealm Results .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Field , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġback link Field . as Type ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠA Ġ@ Link ing Objects Ġcan Ġonly Ġbe Ġrequired Ġif Ġfor Ġthe Ġclass Ġbeing Ġembedded Ġthere Ġis ĊĠĠĠĠĠĠĠ Ġ// Ġonly Ġone Ġ@ Link ing Field Ġfield Ġdefined . ĠAnd Ġeven Ġin Ġthat Ġcase , Ġit Ġrequires Ġruntime ĊĠĠĠĠĠĠĠ Ġ// Ġschema Ġvalidation Ġsince Ġwe Ġneed Ġto Ġknow Ġif Ġonly Ġone Ġother Ġtype Ġis Ġpointing Ġto Ġit . ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġmultiple Ġtypes Ġpoint Ġto Ġit , Ġwe Ġcannot Ġkeep Ġthe Ġcontract Ġof Ġ@ Required . ĊĠĠĠĠĠĠĠ Ġif Ġ( field . getAnnotation ( Required :: class . java ) Ġ!= Ġnull Ġ&& Ġclazz . back link Fields . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . error ( String . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocale . US , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"@ Required Ġcannot Ġbe Ġused Ġon Ġ@ Link ing Objects Ġfield Ġif Ġmultiple Ġ@ Link ing Parents Ġare Ġdefined : Ġ\"% s .% s \" .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Field )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠA Ġ@ Link ing Objects Ġfield Ġmust Ġbe Ġfinal . ĊĠĠĠĠĠĠĠ Ġif Ġ(! field . modifiers . contains ( Modifier . FINAL )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . error ( String . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocale . US , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġ@ Link ing Objects Ġfield Ġ\"% s .% s \" Ġmust Ġbe Ġfinal .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Field )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Back links As Realm Results ( field : ĠVariable Element ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠA Ġ@ Link ing Objects Ġon Ġa ĠRealm Results Ġcannot Ġbe Ġ@ Required Ġas Ġdoesn 't Ġhave Ġany ĊĠĠĠĠĠĠĠ Ġ// Ġmeaning . ĊĠĠĠĠĠĠĠ Ġif Ġ( field . getAnnotation ( Required :: class . java ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . error ( String . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocale . US , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġ@ Link ing Objects Ġfield Ġ\"% s .% s \" Ġcannot Ġbe Ġ@ Required .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Field )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( source Class Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . error ( String . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocale . US , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\" The Ġfield Ġ\"% s .% s \", Ġannotated Ġwith Ġ@ Link ing Objects , Ġmust Ġspecify Ġa Ġgeneric Ġtype .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Field )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠA Ġ@ Link ing Objects Ġfield Ġmust Ġbe Ġfinal . ĊĠĠĠĠĠĠĠ Ġif Ġ(! back link Field . modifiers . contains ( Modifier . FINAL )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . error ( String . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocale . US , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" A Ġ@ Link ing Objects Ġfield Ġ\"% s .% s \" Ġmust Ġbe Ġfinal .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Field )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvalidate Target ( clazz : ĠClass MetaData ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġclazz . getDeclared Field ( source Field ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( field Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . error ( String . format ( Locale . US , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Field Ġ\"% s \", Ġthe Ġtarget Ġof Ġthe Ġ@ Linked Objects Ġannotation Ġon Ġfield Ġ\"% s .% s \", Ġdoes Ġnot Ġexist Ġin Ġclass Ġ\"% s \" .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Field , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Field , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Class )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠfieldType Ġ= ĠQual ified ClassName ( field . as Type (). toString ()) ĊĠĠĠĠĠĠĠ Ġif Ġ(!( target Class Ġ== ĠfieldType Ġ|| Ġtarget Class Ġ== ĠUtils . get Realm ListType ( field ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . error ( String . format ( Locale . US , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Field Ġ\"% s .% s \", Ġthe Ġtarget Ġof Ġthe Ġ@ Linked Objects Ġannotation Ġon Ġfield Ġ\"% s .% s \", Ġhas Ġtype Ġ\"% s \" Ġinstead Ġof Ġ\"% 3 \$ s \" .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Field , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Field , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfieldType )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Back link {$ source Class .$ source Field Ġ==> Ġ$ target Class .$ target Field }" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( java Class Ġ!= Ġother ?. java Class ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġother Ġas ĠBack link ĊĊĠĠĠĠĠĠĠ Ġif Ġ( back link Field Ġ!= Ġother . back link Field ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( target Class Ġ!= Ġother . target Class ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( target Field Ġ!= Ġother . target Field ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( source Class Ġ!= Ġother . source Class ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( source Field Ġ!= Ġother . source Field ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġback link Field . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġtarget Class . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġtarget Field . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġ( source Class ?. hashCode () Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġsource Field . hashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ Ċ } Ċ