/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 Ġthe Ġoriginal Ġauthor Ġor Ġauthors . Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttps :// 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 Ġrich san Ċ Ċ import Ġorg . obj en esis . Obj en esis Std Ċ import Ġsoftware . amazon . aw ssdk . services . dynamodb . model . AttributeValue Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . math . BigInteger Ċ import Ġjava . time . Instant Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjava . util .* Ċ import Ġkotlin . jvm . internal . Lambda Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Mutable Property Ċ import Ġkotlin . reflect . full . declared Member Properties Ċ import Ġkotlin . reflect . full . is Subclass Of Ċ import Ġkotlin . reflect . full . star Project ed Type Ċ import Ġkotlin . reflect . jvm . is Accessible Ċ import Ġkotlin . reflect . jvm . java Field Ċ import Ġkotlin . reflect . jvm . java Getter Ċ import Ġkotlin . reflect . jvm . jvm Er asure ĊĊ Ċ /** Ċ Ġ* Ġ@ author ĠHen rique ĠSeb ast iao Ċ Ġ* Ġ@ since Ġ 0 8 / 0 3 / 1 9 Ġ 1 4 : 5 2 Ċ Ġ* Ġ@ version Ġ$ Revision : Ġ$< br /> Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ$ Id : Ġ$ Ċ Ġ* Ċ Ġ*/ Ċ object ĠK Dyn a Mapper Ġ{ ĊĊĊĠĠĠ Ġfun Ġmap To D ynamo Object Request ( object Value : ĠAny ): ĠMap < String , ĠAttribute Value > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġobj Class Ġ= Ġobject Value :: class ĊĊĠĠĠĠĠĠĠ Ġval Ġprops Ġ= Ġobj Class . declared Member Properties ĊĊĠĠĠĠĠĠĠ Ġval Ġd ynamo Db Request Obj : ĠMutable Map < String , ĠAttribute Value > Ġ= Ġmutable Map Of () ĊĊĠĠĠĠĠĠĠ Ġprops . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobj Value Ġ= Ġit . call ( object Value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( obj Value Ġ! is ĠLambda <* >) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd ynamo Db Request Obj [ it . name ] Ġ= Ġmap Single ( obj Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġd ynamo Db Request Obj ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfrom D ynamo Map Response ( d ynamo Db Response : ĠMap < String , ĠAttribute Value >, Ġresponse Class : ĠClass < out ĠAny >): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( d ynamo Db Response . entries . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġobj Instance Ġ= ĠOb jen esis Std (). newInstance ( response Class ) ĊĊĠĠĠĠĠĠĠ Ġd ynamo Db Response . entries . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ObjectProperty IfExists ( obj Instance , Ġit . key , Ġit . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġobj Instance ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfrom D ynamo Map Response ( d ynamo Db Response : ĠMap < String , ĠAttribute Value >, Ġresponse Class : ĠK Class < *> ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfrom D ynamo Map Response ( d ynamo Db Response , response Class . java ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmap Single ( obj Value : ĠAny ?): ĠAttribute Value Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( obj Value Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAttribute Value . builder (). nul ( true ). build () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( obj Value Ġis ĠList <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġatt List : ĠMutable List < AttributeValue > Ġ= Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj Value . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġatt List . add ( map Single ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAttribute Value . builder (). l ( att List ). build () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( obj Value Ġis ĠMap < *, Ġ* >) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġobj Value . map Ġ{ Ġit . key . toString () Ġto Ġmap Single ( it . value ) Ġ}. toMap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAttribute Value . builder (). m ( map ). build () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( isNumber Value ( obj Value )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAttribute Value . builder (). n ( obj Value . toString ()). build () ĊĊĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( obj Value ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Ġ-> ĠAttribute Value . builder (). s ( obj Value ). build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBoolean Ġ-> ĠAttribute Value . builder (). bool ( obj Value ). build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUUID Ġ-> ĠAttribute Value . builder (). s ( obj Value . toString ()). build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInstant Ġ-> ĠAttribute Value . builder (). s ( format To ISO 8 6 0 1 ( obj Value )). build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( obj Value :: class . java Primitive Type Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAttribute Value . builder (). m ( map To D ynamo Object Request ( obj Value )). build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Un sup orted Ġtype Ġattribute : Ġ${ obj Value :: class . star Project ed Type }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Number Value ( obj Value : ĠAny ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( obj Value Ġis ĠInt Ġ|| Ġobj Value Ġis ĠLong ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġobj Value Ġis ĠFloat Ġ|| Ġobj Value Ġis ĠDouble ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġobj Value Ġis ĠBigDecimal Ġ|| Ġobj Value Ġis ĠBigInteger ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġset ObjectProperty IfExists ( obj : ĠAny , ĠpropertyName : ĠString , Ġattr Value : ĠAttribute Value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproperty Ġ= Ġobj :: class . declared Member Properties . find Ġ{ Ġit . name Ġ== ĠpropertyName Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĊĊĊĠĠĠĠĠĠĠ Ġif ( attr Value . nul () Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġjava Field Ġ= Ġproperty . java Field ĊĠĠĠĠĠĠĠ Ġjava Field ?. is Accessible Ġ= Ġtrue ĊĊĊĠĠĠĠĠĠĠ Ġif Ġ( property . returnType . jvm Er asure . is Subclass Of ( List :: class ) Ġ&& Ġjava Field Ġ!= Ġnull ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Type Ġ= Ġproperty . returnType . arguments . first (). type !!. jvm Er asure ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent List Ġ= Ġmutable ListOf < Any ?> () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġattr Value . l (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent List . add ( getValue From AttributeValue ( list Type , Ġit )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Field . set ( obj , Ġcontent List ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġif Ġ( property . returnType . jvm Er asure . is Subclass Of ( Map :: class ) Ġ&& Ġjava Field Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdue Ġto Ġa ĠD ynamoDB Ġlimitation , Ġmaps Ġalways Ġhave Ġkey Ġtype ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Type Ġ= Ġproperty . returnType . arguments [ 1 ]. type !!. jvm Er asure ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġattr Value . m (). map Values Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetValue From AttributeValue ( valueType , Ġit . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Mutable Map () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Field . set ( obj , Ġmap ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( property Ġis ĠK Mutable Property <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . setter . call ( obj , ĠgetValue From AttributeValue ( property . returnType . jvm Er asure , Ġattr Value )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġjava Field ?. set ( obj , ĠgetValue From AttributeValue ( property . returnType . jvm Er asure , Ġattr Value )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetValue From AttributeValue ( attribute Class : ĠK Class <* >, Ġattribute Value : ĠAttribute Value ?): ĠAny ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( attribute Value Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġif Ġ( isNumber Class ( attribute Class )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Number AttributeValue ( attribute Class , Ġattribute Value ) ĊĊĊĊ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( attribute Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString :: class Ġ-> Ġattribute Value . s () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠBoolean :: class Ġ-> Ġattribute Value . bool () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠUUID :: class Ġ-> Ġattribute Value . s ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUUID . fromString ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠInstant :: class Ġ-> Ġattribute Value . s ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInstant . parse ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( attribute Class . java Primitive Type Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfrom D ynamo Map Response ( attribute Value . m (), Ġattribute Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Un sup orted Ġtype Ġattribute : Ġ${ attribute Class :: class . star Project ed Type }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Number Class ( obj Class : ĠK Class < *> ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( obj Class Ġ== ĠInt :: class Ġ|| Ġobj Class Ġ== ĠLong :: class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġobj Class Ġ== ĠFloat :: class Ġ|| Ġobj Class Ġ== ĠDouble :: class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġobj Class Ġ== ĠBigDecimal :: class Ġ|| Ġobj Class Ġ== ĠBigInteger :: class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Number AttributeValue ( attribute Class : ĠK Class <* >, Ġattribute Value : ĠAttribute Value ): ĠAny ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġnumber Value : ĠString Ġ= Ġattribute Value . n () Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( attribute Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInt :: class Ġ-> Ġnumber Value . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUInt :: class Ġ-> Ġnumber Value . to UInt () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLong :: class Ġ-> Ġnumber Value . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠU Long :: class Ġ-> Ġnumber Value . to UL ong () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠFloat :: class Ġ-> Ġnumber Value . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDouble :: class Ġ-> Ġnumber Value . toDouble () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠBigInteger :: class Ġ-> Ġnumber Value . to BigInteger () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBigDecimal :: class Ġ-> Ġnumber Value . to BigDecimal () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠException (" invalid Ġnumber Ġtype Ġ$ attribute Class ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġformat To ISO 8 6 0 1 ( time : ĠInstant ?): ĠString ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( time Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĊĊĠĠĠĠĠĠĠ Ġreturn ĠDateTime Formatter . ISO _ INST ANT . format ( time ) ĊĠĠĠ Ġ} Ċ } Ċ