/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠThomas ĠH off mann Ċ Ġ* Ċ Ġ* Ġ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 Ġde . j 4 vel in . xml helper . databinding Ċ Ċ import Ġde . j 4 vel in . xml helper . XmlElement Ċ import Ġde . j 4 vel in . xml helper . Xml List Ċ import Ġde . j 4 vel in . xml helper . Xml Object Ċ import Ġde . j 4 vel in . xml helper . Xml Primitive Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Parameter Ċ import Ġkotlin . reflect . full . primary Constructor Ċ Ċ @ Requires Opt In ( ĊĠĠĠ Ġmessage Ġ= Ġ" This Ġfeature Ġis Ġexperimental Ġand Ġonly Ġworks Ġfor Ġselected Ġdata Ġtypes ", ĊĠĠĠ Ġlevel Ġ= ĠRequires Opt In . Level . WARNING Ċ ) Ċ @ Retention ( Annotation Retention . BINARY ) Ċ @ Target ( Annotation Target . FUNCTION ) Ċ /** Ċ Ġ* ĠAnnot ates Ġan Ġexperimental Ġfeature Ġthat Ġonly Ġworks Ġfor Ġselected Ġdata Ġtypes Ċ Ġ*/ Ċ annotation Ġclass ĠTo Data Class Ċ Ċ /** Ċ Ġ* ĠT ries Ġto Ġconstruct Ġan Ġinstance Ġof Ġthe Ġdata Ġclass Ġ' c ' Ġwith Ġthe Ġdata Ġgiven Ġin Ġ' xml '. Ċ Ġ* Ċ Ġ* ĠThis Ġmethod Ġonly Ġworks Ġif Ġ' c ' Ġis Ġa ĠKotlin Ġdata Ġclass Ġwith Ġproperties Ġbeing Ġprimitives , Ġother Ġdata Ċ Ġ* Ġclasses Ġor Ġof Ġtype ĠList < String >. ĠOptions Ġto Ġprovide Ġcustom Ġde serializer Ġcode Ġfor Ġother Ġtypes Ġmight Ċ Ġ* Ġbe Ġadded Ġat Ġsome Ġpoint . Ċ Ġ* Ċ Ġ* Ġ@ param Ġc Ġthe Ġdata Ġclass Ġto Ġserialize Ġinto Ċ Ġ* Ġ@ param Ġxml Ġthe Ġxml Ġsource Ċ Ġ* Ċ Ġ* Ġ@ return Ġa Ġkotlin Ġdata Ġclass Ġrepresenting Ġthe Ġgiven Ġxml Ġelement Ċ Ġ*/ Ċ @ To Data Class Ċ fun Ġ< T Ġ: ĠAny > Ġto Data Class ( c : ĠK Class < T >, Ġxml : ĠXml Element ): ĠT Ġ{ ĊĠĠĠ Ġif Ġ(! c . is Data ) ĊĠĠĠĠĠĠĠ Ġthrow Ġjava . lang . IllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only Ġdata Ġclasses Ġare Ġsupported Ġin Ġthis Ġversion . ĠProblem atic Ġclass : Ġ${ c . qualified Name }" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġval Ġparameter List Ġ= Ġc . primary Constructor !!. parameters ĊĠĠĠ Ġval Ġctor Values Map Ġ= ĠHashMap < K Parameter , ĠAny ? >( parameter List . size ) ĊĊĠĠĠ Ġfor Ġ( parameter Ġin Ġparameter List ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġparameter . name ĊĠĠĠĠĠĠĠ Ġval Ġclassifier Ġ= Ġparameter . type . classifier Ġas ĠK Class < *> ĊĠĠĠĠĠĠĠ Ġif Ġ( xml Ġis ĠXml Object Ġ&& Ġxml . containsKey ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctor Values Map [ parameter ] Ġ= ĠgetObject ( classifier , Ġxml [ name ] !! ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( xml . attributes . containsKey ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctor Values Map [ parameter ] Ġ= Ġget Primitive ( classifier , Ġxml . attributes [ name ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġc . primary Constructor !!. call By ( ctor Values Map ) Ċ } Ċ Ċ /** Ċ Ġ* ĠT ries Ġto Ġconvert Ġthe Ġgiven ĠXML Ġelement Ġinto Ġthe Ġgiven Ġclass . ĠShould Ġwork Ġfor Ġdata Ġclasses , Ċ Ġ* Ġprimitives Ġand Ġlist Ġof Ġstrings Ċ Ġ* Ċ Ġ* Ġ@ param Ġc Ġthe Ġtarget Ġclass Ċ Ġ* Ġ@ param Ġxml Ġthe Ġsource Ġxml Ġdata Ċ Ġ* Ċ Ġ* Ġ@ return Ġan Ġobject Ġof Ġtype Ġ' c ' Ġrepresenting Ġthe Ġdata Ġof Ġ' xml ' Ċ Ġ*/ Ċ @ To Data Class Ċ private Ġfun ĠgetObject ( c : ĠK Class <* >, Ġxml : ĠXml Element ) Ġ= ĊĠĠĠ Ġwhen Ġ( xml ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠXml Object Ġ-> Ġto Data Class ( c , Ġxml ) ĊĠĠĠĠĠĠĠ Ġis ĠXml Primitive Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== ĠString :: class Ġ|| Ġc . java Primitive Type Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Primitive ( c , Ġxml . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Data Class ( c , Ġxml ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠXml List Ġ-> Ġxml . elements . filter Is Instance < Xml Primitive >(). map Ġ{ Ġit . value Ġ} ĊĠĠĠ Ġ} Ċ Ċ /** Ċ Ġ* ĠConverts Ġthe Ġgiven Ġstring Ġinto Ġto Ġgiven Ġprimitive Ġclass Ġobject Ċ Ġ* Ċ Ġ* Ġ@ param Ġc Ġthe Ġprimitive Ġtype Ċ Ġ* Ġ@ param Ġvalue Ġthe Ġsource Ġstring Ċ Ġ* Ċ Ġ* Ġ@ return Ġan Ġinstance Ġof Ġthe Ġ' c ' Ġclass Ġwith Ġthe Ġvalue Ġgiven Ġin Ġ' value ' Ċ Ġ*/ Ċ private Ġfun Ġget Primitive ( c : ĠK Class <* >, Ġvalue : ĠString ?): ĠAny ? Ġ= Ġwhen Ġ( c ) Ġ{ ĊĠĠĠ ĠString :: class Ġ-> Ġvalue . toString () ĊĠĠĠ ĠBoolean :: class Ġ-> Ġvalue ?. to Boolean () ĊĠĠĠ ĠByte :: class Ġ-> Ġvalue ?. to Byte () ĊĠĠĠ ĠShort :: class Ġ-> Ġvalue ?. to Short () ĊĠĠĠ ĠInt :: class Ġ-> Ġvalue ?. toInt () ĊĠĠĠ ĠLong :: class Ġ-> Ġvalue ?. to Long () ĊĠĠĠ ĠFloat :: class Ġ-> Ġvalue ?. toFloat () ĊĠĠĠ ĠDouble :: class Ġ-> Ġvalue ?. toDouble () ĊĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unknown Ġprimitive Ġtype : Ġ${ c . qualified Name }") Ċ }