/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠPaul ĠR y bits ky i , Ġpa ul . ry bits ky i . work @ gmail . com Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . paul ry bits ky i . game d ge . ig db . ap ical yp se . serialization Ċ Ċ import Ġcom . paul ry bits ky i . game d ge . ig db . ap ical yp se . Constants Ċ import Ġcom . paul ry bits ky i . game d ge . ig db . ap ical yp se . serialization . annotations . Ap ical yp se Ċ import Ġcom . paul ry bits ky i . game d ge . ig db . ap ical yp se . serialization . annotations . Ap ical yp se Class Ċ import Ġcom . paul ry bits ky i . game d ge . ig db . ap ical yp se . serialization . field serializers . Field Serializer Ċ import Ġcom . paul ry bits ky i . game d ge . ig db . ap ical yp se . serialization . field serializers . Field Serializer Factory Ċ import Ġjava . lang . reflect . Field Ċ import Ġjava . lang . reflect . Parameterized Type Ċ Ċ internal Ġclass ĠAp ical yp se Serializer Impl Ġ: ĠAp ical yp se Serializer Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġserialize ( clazz : ĠClass < *> ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck If Marker Annotation Is Present ( clazz ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġclazz ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. field Serial izers ( field Chain Ġ= Ġmutable ListOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseparator Ġ= ĠConstants . FIELD _ SEPARATOR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Ġ= ĠField Serializer :: serialize ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck If Marker Annotation Is Present ( clazz : ĠClass <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! clazz . is Annotation Present ( Ap ical yp se Class :: class . java )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġprovided Ġclass , Ġ\" ${ clazz . simple Name }\ ', Ġdoes Ġnot Ġhave Ġthe Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\" ${ Ap ical yp se Class :: class . simple Name }\" Ġannotation Ġpresent ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠClass <* >. field Serial izers ( field Chain : ĠMutable List < String >): ĠList < Field Serializer > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! shouldBe Serialized ()) Ġreturn ĠlistOf () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbuild List Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( field Ġin Ġdeclared Fields ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield . serializer ( field Chain )?. let (:: add ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠClass <* >. shouldBe Serialized (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġis Annotation Present ( Ap ical yp se Class :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠField . serializer ( field Chain : ĠMutable List < String >): ĠField Serializer ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! shouldBe Serialized ()) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġap ical yp se Annotation Ġ= ĠcheckNotNull ( getAnnotation ( Ap ical yp se :: class . java )) ĊĠĠĠĠĠĠĠ Ġval ĠfieldName Ġ= Ġap ical yp se Annotation . name ĊĊĠĠĠĠĠĠĠ Ġcheck If FieldName IsValid ( this , ĠfieldName ) ĊĊĠĠĠĠĠĠĠ Ġfield Chain . add ( fieldName ) ĊĊĠĠĠĠĠĠĠ Ġval Ġchild Serial izers Ġ= Ġchild Serial izers ( field Chain ) ĊĠĠĠĠĠĠĠ Ġval Ġfield Serializer Ġ= ĠField Serializer Factory . create ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Chain Ġ= Ġfield Chain . toList (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Ġ= Ġchild Serial izers ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġfield Chain . remove ( fieldName ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfield Serializer ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠField . shouldBe Serialized (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġis Annotation Present ( Ap ical yp se :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck If FieldName IsValid ( field : ĠField , Ġname : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( name . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġfield Ġ\" ${ field . name }\" Ġof Ġthe Ġclass Ġ\" ${ field . decl aring Class . simple Name }\" Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" is Ġannotated Ġwith Ġan Ġinvalid Ġname Ġ\"$ name \" ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠField . child Serial izers ( field Chain : ĠMutable List < String >): ĠList < Field Serializer > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! type . is Generic () Ġ-> Ġtype . field Serial izers ( field Chain ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Collection GenericType () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter ized Type Ġ= Ġ( generic Type Ġas ĠParameter ized Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Argument Ġ= Ġparameter ized Type . actual Type Arguments . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Class Ġ= Ġ( type Argument Ġas ĠClass <* >) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Class . field Serial izers ( field Chain ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAll Ġother Ġtypes Ġare Ġunsupported Ġfor Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Serialization Ġfor Ġa Ġclass Ġ\" ${ type . simple Name }\" Ġis Ġunsupported Ġat Ġthe Ġmoment ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠClass <* >. is Generic (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtype Parameters . isNotEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠClass <* >. is Collection GenericType (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCollection :: class . java . isAssignableFrom ( this ) ĊĠĠĠ Ġ} Ċ } Ċ