package Ġnet . cord a . core . serialization . amqp Ċ Ċ import Ġcom . google . common . hash . Hash er Ċ import Ġcom . google . common . hash . Hash ing Ċ import Ġnet . cord a . core . crypto . to Base 6 4 Ċ import Ġnet . cord a . core . utilities . Opaque Bytes Ċ import Ġorg . apache . q pid . pro ton . amqp . Descri bed Type Ċ import Ġorg . apache . q pid . pro ton . amqp . Unsigned Long Ċ import Ġorg . apache . q pid . pro ton . codec . Data Ċ import Ġorg . apache . q pid . pro ton . codec . Descri bed Type Constructor Ċ import Ġjava . io . Not Serializable Exception Ċ import Ġjava . lang . reflect . Generic ArrayType Ċ import Ġjava . lang . reflect . Parameterized Type Ċ import Ġjava . lang . reflect . Type Ċ import Ġjava . lang . reflect . Type Variable Ċ import Ġjava . util .* Ċ Ċ import Ġnet . cord a . core . serialization . car p enter . Schema Ġas ĠC arp enter Schema Ċ import Ġnet . cord a . core . serialization . car p enter . Field Ġas ĠC arp enter Field Ċ Ċ // ĠTODO : Ġget Ġan Ġassigned Ġnumber Ġas Ġper ĠAMQP Ġspec Ċ val ĠDESCRIP TOR _ TOP _ 3 2 BITS : ĠLong Ġ= Ġ 0 xc 0 da 0 0 0 0 Ċ Ċ val ĠDESCRIP TOR _ DOMAIN : ĠString Ġ= Ġ" net . cord a " Ċ Ċ // Ġ" cord a " Ġ+ Ġmajor Version Byte Ġ+ Ġminor Version MSB Ġ+ Ġminor Version LSB Ċ val ĠA mq p Header V 1 _ 0 : ĠO pa que Bytes Ġ= ĠO pa que Bytes (" cord a \ u 0 0 0 1 \ u 0 0 0 0 \ u 0 0 0 0 ". toByteArray ()) Ċ Ċ /** Ċ Ġ* ĠThis Ġclass Ġwraps Ġall Ġserialized Ġdata , Ġso Ġthat Ġthe Ġschema Ġcan Ġbe Ġcarried Ġalong Ġwith Ġit . Ġ ĠWe Ġwill Ġprovide Ġvarious Ġinternal Ġutilities Ċ Ġ* Ġto Ġde compose Ġand Ġre compose Ġwith / without Ġschema Ġetc Ġso Ġthat Ġe . g . Ġwe Ġcan Ġstore Ġobjects Ġwith Ġa Ġ( relation ally ) Ġnormal ised Ġout Ġschema Ġto Ċ Ġ* Ġavoid Ġexcess ive Ġduplication . Ċ Ġ*/ Ċ // ĠTODO : Ġmake Ġthe Ġschema Ġparsing Ġlazy Ġsince Ġmostly Ġschemas Ġwill Ġhave Ġbeen Ġseen Ġbefore Ġand Ġwe Ġonly Ġneed Ġit Ġif Ġwe Ġdon 't Ġrecogn ise Ġa Ġtype Ġdescriptor . Ċ data Ġclass ĠEn velope ( val Ġobj : ĠAny ?, Ġval Ġschema : ĠSchema ) Ġ: ĠDescri bed Type Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ: ĠDescri bed Type Constructor < Envelope > Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠDESCRIP TOR Ġ= ĠUnsigned Long ( 1 L Ġor ĠDESCRIP TOR _ TOP _ 3 2 BITS ) ĊĠĠĠĠĠĠĠ Ġval ĠDESCRIP TOR _ OBJECT Ġ= ĠDescriptor ( null , ĠDESCRIP TOR ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġget ( data : ĠData ): ĠEn velope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescribed Type Ġ= Ġdata .` object ` Ġas ĠDescri bed Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( described Type . descriptor Ġ!= ĠDESCRIP TOR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNot Serializable Exception (" Unexpected Ġdescriptor Ġ${ described Type . descriptor }. ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġdescribed Type . described Ġas ĠList < *> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnew Instance ( listOf ( list [ 0 ], ĠSchema . get ( list [ 1 ] !! ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetType Class (): ĠClass < *> Ġ= ĠEn velope :: class . java ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnew Instance ( described : ĠAny ?): ĠEn velope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġdescribed Ġas ? ĠList < *> Ġ?: Ġthrow ĠIllegalStateException (" Was Ġexpecting Ġa Ġlist ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠEn velope ( list [ 0 ], Ġlist [ 1 ] Ġas ĠSchema ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetDescriptor (): ĠAny Ġ= ĠDESCRIP TOR ĊĊĠĠĠ Ġoverride Ġfun Ġget Descri bed (): ĠAny Ġ= ĠlistOf ( obj , Ġschema ) Ċ } Ċ Ċ /** Ċ Ġ* ĠThis Ġand Ġthe Ġclasses Ġbelow Ġare ĠO O Ġrepresentations Ġof Ġthe ĠAMQP ĠXML Ġschema Ġdescribed Ġin Ġthe Ġspecification . ĠThe ir Ċ Ġ* Ġ[ toString ] Ġrepresentations Ġgenerate Ġthe Ġassociated ĠXML Ġform . Ċ Ġ*/ Ċ data Ġclass ĠSchema ( val Ġtypes : ĠList < Type Not ation >) Ġ: ĠDescri bed Type Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ: ĠDescri bed Type Constructor < Schema > Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠDESCRIP TOR Ġ= ĠUnsigned Long ( 2 L Ġor ĠDESCRIP TOR _ TOP _ 3 2 BITS ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġget ( obj : ĠAny ): ĠSchema Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescribed Type Ġ= Ġobj Ġas ĠDescri bed Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( described Type . descriptor Ġ!= ĠDESCRIP TOR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNot Serializable Exception (" Unexpected Ġdescriptor Ġ${ described Type . descriptor }. ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġdescribed Type . described Ġas ĠList < *> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnew Instance ( listOf (( list [ 0 ] Ġas ĠList < *> ). map Ġ{ ĠType Not ation . get ( it !! ) Ġ})) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetType Class (): ĠClass < *> Ġ= ĠSchema :: class . java ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnew Instance ( described : ĠAny ?): ĠSchema Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġdescribed Ġas ? ĠList < *> Ġ?: Ġthrow ĠIllegalStateException (" Was Ġexpecting Ġa Ġlist ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSchema ( list [ 0 ] Ġas ĠList < Type Not ation >) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetDescriptor (): ĠAny Ġ= ĠDESCRIP TOR ĊĊĠĠĠ Ġoverride Ġfun Ġget Descri bed (): ĠAny Ġ= ĠlistOf ( types ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġtypes . join ToString ("\ n ") Ċ } Ċ Ċ data Ġclass ĠDescriptor ( val Ġname : ĠString ?, Ġval Ġcode : ĠUnsigned Long ? Ġ= Ġnull ) Ġ: ĠDescri bed Type Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ: ĠDescri bed Type Constructor < Descriptor > Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠDESCRIP TOR Ġ= ĠUnsigned Long ( 3 L Ġor ĠDESCRIP TOR _ TOP _ 3 2 BITS ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġget ( obj : ĠAny ): ĠDescriptor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescribed Type Ġ= Ġobj Ġas ĠDescri bed Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( described Type . descriptor Ġ!= ĠDESCRIP TOR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNot Serializable Exception (" Unexpected Ġdescriptor Ġ${ described Type . descriptor }. ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnew Instance ( described Type . described ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetType Class (): ĠClass < *> Ġ= ĠDescriptor :: class . java ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnew Instance ( described : ĠAny ?): ĠDescriptor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġdescribed Ġas ? ĠList < *> Ġ?: Ġthrow ĠIllegalStateException (" Was Ġexpecting Ġa Ġlist ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDescriptor ( list [ 0 ] Ġas ? ĠString , Ġlist [ 1 ] Ġas ? ĠUnsigned Long ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetDescriptor (): ĠAny Ġ= ĠDESCRIP TOR ĊĊĠĠĠ Ġoverride Ġfun Ġget Descri bed (): ĠAny Ġ= ĠlistOf ( name , Ġcode ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder ("< descriptor ") ĊĠĠĠĠĠĠĠ Ġif Ġ( name Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" Ġname =\" $ name \" ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( code Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Ġ= ĠString . format (" 0 x % 0 8 x : 0 x % 0 8 x ", Ġcode . to Long (). shr ( 3 2 ), Ġcode . to Long (). and ( 0 xffff )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" Ġcode =\" $ code \" ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsb . append (" /> ") ĊĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠField ( val Ġname : ĠString , Ġval Ġtype : ĠString , Ġval Ġrequires : ĠList < String >, Ġval Ġdefault : ĠString ?, Ġval Ġlabel : ĠString ?, Ġval Ġmandatory : ĠBoolean , Ġval Ġmultiple : ĠBoolean ) Ġ: ĠDescri bed Type Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ: ĠDescri bed Type Constructor < Field > Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠDESCRIP TOR Ġ= ĠUnsigned Long ( 4 L Ġor ĠDESCRIP TOR _ TOP _ 3 2 BITS ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġget ( obj : ĠAny ): ĠField Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescribed Type Ġ= Ġobj Ġas ĠDescri bed Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( described Type . descriptor Ġ!= ĠDESCRIP TOR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNot Serializable Exception (" Unexpected Ġdescriptor Ġ${ described Type . descriptor }. ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnew Instance ( described Type . described ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetType Class (): ĠClass < *> Ġ= ĠField :: class . java ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnew Instance ( described : ĠAny ?): ĠField Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġdescribed Ġas ? ĠList < *> Ġ?: Ġthrow ĠIllegalStateException (" Was Ġexpecting Ġa Ġlist ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠField ( list [ 0 ] Ġas ĠString , Ġlist [ 1 ] Ġas ĠString , Ġlist [ 2 ] Ġas ĠList < String >, Ġlist [ 3 ] Ġas ? ĠString , Ġlist [ 4 ] Ġas ? ĠString , Ġlist [ 5 ] Ġas ĠBoolean , Ġlist [ 6 ] Ġas ĠBoolean ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetDescriptor (): ĠAny Ġ= ĠDESCRIP TOR ĊĊĠĠĠ Ġoverride Ġfun Ġget Descri bed (): ĠAny Ġ= ĠlistOf ( name , Ġtype , Ġrequires , Ġdefault , Ġlabel , Ġmandatory , Ġmultiple ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder ("< field Ġname =\" $ name \" Ġtype =\" $ type \" Ġmandatory =\" $ mandatory \" Ġmultiple =\" $ multiple \" ") ĊĠĠĠĠĠĠĠ Ġif Ġ( requires . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" Ġrequires =\" ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( requires . join ToString ("," )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("\" ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( default Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" Ġdefault =\" $ default \" ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! label . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" Ġlabel =\" $ label \" ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsb . append (" /> ") ĊĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtype AsString () Ġ= Ġif Ġ( type Ġ= =" * ") Ġrequires [ 0 ] Ġelse Ġtype Ċ } Ċ Ċ sealed Ġclass ĠType Not ation Ġ: ĠDescri bed Type Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġget ( obj : ĠAny ): ĠType Not ation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescribed Type Ġ= Ġobj Ġas ĠDescri bed Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( described Type . descriptor Ġ== ĠComposite Type . DESCRIPTOR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComposite Type . get ( described Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( described Type . descriptor Ġ== ĠRe stricted Type . DESCRIPTOR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRe stricted Type . get ( described Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNot Serializable Exception (" Unexpected Ġdescriptor Ġ${ described Type . descriptor }. ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġval Ġname : ĠString ĊĠĠĠ Ġabstract Ġval Ġlabel : ĠString ? ĊĠĠĠ Ġabstract Ġval Ġprovides : ĠList < String > ĊĠĠĠ Ġabstract Ġval Ġdescriptor : ĠDescriptor Ċ } Ċ Ċ data Ġclass ĠComposite Type ( override Ġval Ġname : ĠString , Ġoverride Ġval Ġlabel : ĠString ?, Ġoverride Ġval Ġprovides : ĠList < String >, Ġoverride Ġval Ġdescriptor : ĠDescriptor , Ġval Ġfields : ĠList < Field >) Ġ: ĠType Not ation () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ: ĠDescri bed Type Constructor < Composite Type > Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠDESCRIP TOR Ġ= ĠUnsigned Long ( 5 L Ġor ĠDESCRIP TOR _ TOP _ 3 2 BITS ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġget ( described Type : ĠDescri bed Type ): ĠComposite Type Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( described Type . descriptor Ġ!= ĠDESCRIP TOR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNot Serializable Exception (" Unexpected Ġdescriptor Ġ${ described Type . descriptor }. ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġdescribed Type . described Ġas ĠList < *> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnew Instance ( listOf ( list [ 0 ], Ġlist [ 1 ], Ġlist [ 2 ], ĠDescriptor . get ( list [ 3 ] !! ), Ġ( list [ 4 ] Ġas ĠList < *> ). map Ġ{ ĠField . get ( it !! ) Ġ})) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetType Class (): ĠClass < *> Ġ= ĠComposite Type :: class . java ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnew Instance ( described : ĠAny ?): ĠComposite Type Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġdescribed Ġas ? ĠList < *> Ġ?: Ġthrow ĠIllegalStateException (" Was Ġexpecting Ġa Ġlist ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComposite Type ( list [ 0 ] Ġas ĠString , Ġlist [ 1 ] Ġas ? ĠString , Ġlist [ 2 ] Ġas ĠList < String >, Ġlist [ 3 ] Ġas ĠDescriptor , Ġlist [ 4 ] Ġas ĠList < Field >) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetDescriptor (): ĠAny Ġ= ĠDESCRIP TOR ĊĊĠĠĠ Ġoverride Ġfun Ġget Descri bed (): ĠAny Ġ= ĠlistOf ( name , Ġlabel , Ġprovides , Ġdescriptor , Ġfields ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder ("< type Ġclass =\" composite \" Ġname =\" $ name \" ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! label . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" Ġlabel =\" $ label \" ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( provides . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" Ġprovides =\" ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( provides . join ToString ("," )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("\" ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsb . append ( ">\ n ") ĊĠĠĠĠĠĠĠ Ġsb . append (" Ġ Ġ$ descriptor \ n ") ĊĠĠĠĠĠĠĠ Ġfor Ġ( field Ġin Ġfields ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" Ġ Ġ$ field \ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsb . append ("</ type >") ĊĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠRe stricted Type ( override Ġval Ġname : ĠString , Ġoverride Ġval Ġlabel : ĠString ?, Ġoverride Ġval Ġprovides : ĠList < String >, Ġval Ġsource : ĠString , Ġoverride Ġval Ġdescriptor : ĠDescriptor , Ġval Ġchoices : ĠList < Choice >) Ġ: ĠType Not ation () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ: ĠDescri bed Type Constructor < Restricted Type > Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠDESCRIP TOR Ġ= ĠUnsigned Long ( 6 L Ġor ĠDESCRIP TOR _ TOP _ 3 2 BITS ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġget ( described Type : ĠDescri bed Type ): ĠRe stricted Type Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( described Type . descriptor Ġ!= ĠDESCRIP TOR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNot Serializable Exception (" Unexpected Ġdescriptor Ġ${ described Type . descriptor }. ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġdescribed Type . described Ġas ĠList < *> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnew Instance ( listOf ( list [ 0 ], Ġlist [ 1 ], Ġlist [ 2 ], Ġlist [ 3 ], ĠDescriptor . get ( list [ 4 ] !! ), Ġ( list [ 5 ] Ġas ĠList < *> ). map Ġ{ ĠChoice . get ( it !! ) Ġ})) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetType Class (): ĠClass < *> Ġ= ĠRe stricted Type :: class . java ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnew Instance ( described : ĠAny ?): ĠRe stricted Type Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġdescribed Ġas ? ĠList < *> Ġ?: Ġthrow ĠIllegalStateException (" Was Ġexpecting Ġa Ġlist ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRe stricted Type ( list [ 0 ] Ġas ĠString , Ġlist [ 1 ] Ġas ? ĠString , Ġlist [ 2 ] Ġas ĠList < String >, Ġlist [ 3 ] Ġas ĠString , Ġlist [ 4 ] Ġas ĠDescriptor , Ġlist [ 5 ] Ġas ĠList < Choice >) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetDescriptor (): ĠAny Ġ= ĠDESCRIP TOR ĊĊĠĠĠ Ġoverride Ġfun Ġget Descri bed (): ĠAny Ġ= ĠlistOf ( name , Ġlabel , Ġprovides , Ġsource , Ġdescriptor , Ġchoices ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder ("< type Ġclass =\" restricted \" Ġname =\" $ name \" ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! label . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" Ġlabel =\" $ label \" ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsb . append (" Ġsource =\" $ source \" ") ĊĠĠĠĠĠĠĠ Ġif Ġ( provides . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" Ġprovides =\" ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( provides . join ToString ("," )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("\" ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsb . append ( ">\ n ") ĊĠĠĠĠĠĠĠ Ġsb . append (" Ġ Ġ$ descriptor \ n ") ĊĠĠĠĠĠĠĠ Ġsb . append ("</ type >") ĊĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠChoice ( val Ġname : ĠString , Ġval Ġvalue : ĠString ) Ġ: ĠDescri bed Type Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ: ĠDescri bed Type Constructor < Choice > Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠDESCRIP TOR Ġ= ĠUnsigned Long ( 7 L Ġor ĠDESCRIP TOR _ TOP _ 3 2 BITS ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġget ( obj : ĠAny ): ĠChoice Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescribed Type Ġ= Ġobj Ġas ĠDescri bed Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( described Type . descriptor Ġ!= ĠDESCRIP TOR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNot Serializable Exception (" Unexpected Ġdescriptor Ġ${ described Type . descriptor }. ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnew Instance ( described Type . described ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetType Class (): ĠClass < *> Ġ= ĠChoice :: class . java ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnew Instance ( described : ĠAny ?): ĠChoice Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġdescribed Ġas ? ĠList < *> Ġ?: Ġthrow ĠIllegalStateException (" Was Ġexpecting Ġa Ġlist ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠChoice ( list [ 0 ] Ġas ĠString , Ġlist [ 1 ] Ġas ĠString ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetDescriptor (): ĠAny Ġ= ĠDESCRIP TOR ĊĊĠĠĠ Ġoverride Ġfun Ġget Descri bed (): ĠAny Ġ= ĠlistOf ( name , Ġvalue ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"< choice Ġname =\" $ name \" Ġvalue =\" $ value \" /> " ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval ĠARRAY _ HASH : ĠString Ġ= Ġ" Array Ġ= Ġtrue " Ċ private Ġval ĠAL READY _ SE EN _ HASH : ĠString Ġ= Ġ" Already Ġseen Ġ= Ġtrue " Ċ private Ġval ĠNULL ABLE _ HASH : ĠString Ġ= Ġ" Nullable Ġ= Ġtrue " Ċ private Ġval ĠNOT _ NULL ABLE _ HASH : ĠString Ġ= Ġ" Nullable Ġ= Ġfalse " Ċ private Ġval ĠANY _ TYPE _ HASH : ĠString Ġ= Ġ" Any Ġtype Ġ= Ġtrue " Ċ private Ġval ĠTYPE _ VARIABLE _ HASH : ĠString Ġ= Ġ" Type Ġvariable Ġ= Ġtrue " Ċ Ċ /** Ċ Ġ* ĠThe Ġmethod Ġgenerates Ġa Ġfingerprint Ġfor Ġa Ġgiven ĠJVM Ġ[ Type ] Ġthat Ġshould Ġbe Ġunique Ġto Ġthe Ġschema Ġrepresentation . Ċ Ġ* ĠThus Ġit Ġonly Ġtakes Ġinto Ġaccount Ġproperties Ġand Ġtypes Ġand Ġonly Ġsupports Ġthe Ġsame Ġobject Ġgraph Ġsubset Ġas Ġthe Ġoverall Ċ Ġ* Ġserialization Ġcode . Ċ Ġ* Ċ Ġ* ĠThe Ġidea Ġbeing Ġthat Ġeven Ġfor Ġtwo Ġclasses Ġthat Ġshare Ġthe Ġsame Ġname Ġbut Ġdiffer Ġin Ġa Ġminor Ġway , Ġthe Ġfingerprint Ġwill Ġbe Ċ Ġ* Ġdifferent . Ċ Ġ*/ Ċ // ĠTODO : Ġwrite Ġtests Ċ internal Ġfun Ġfingerprint ForType ( type : ĠType , Ġfactory : ĠSerializer Factory ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġfingerprint ForType ( type , Ġnull , ĠHashSet (), ĠHash ing . m urm ur 3 _ 1 2 8 (). new Hash er (), Ġfactory ). hash (). as Bytes (). to Base 6 4 () Ċ } Ċ Ċ internal Ġfun Ġfingerprint For Descriptors ( var arg Ġtype Descriptors : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġval Ġhash er Ġ= ĠHash ing . m urm ur 3 _ 1 2 8 (). new Hash er () ĊĠĠĠ Ġfor Ġ( type Descriptor Ġin Ġtype Descriptors ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhash er . put Un encoded Chars ( type Descriptor ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġhash er . hash (). as Bytes (). to Base 6 4 () Ċ } Ċ Ċ // ĠThis Ġmethod Ġconcat ent ates Ġvarious Ġelements Ġof Ġthe Ġtypes Ġrecursively Ġas Ġun encoded Ġstrings Ġinto Ġthe Ġhash er , Ġeffectively Ċ // Ġcreating Ġa Ġunique Ġstring Ġfor Ġa Ġtype Ġwhich Ġwe Ġthen Ġhash Ġin Ġthe Ġcalling Ġfunction Ġabove . Ċ private Ġfun Ġfingerprint ForType ( type : ĠType , Ġcontext Type : ĠType ?, Ġalready Seen : ĠMutable Set < Type >, Ġhash er : ĠHash er , Ġfactory : ĠSerializer Factory ): ĠHash er Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( type Ġin Ġalready Seen ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhash er . put Un encoded Chars ( AL READY _ SE EN _ HASH ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġalready Seen Ġ+= Ġtype ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġis ĠSerializer Factory . Any Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhash er . put Un encoded Chars ( ANY _ TYPE _ HASH ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( type Ġis ĠClass <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type . isArray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfingerprint ForType ( type . component Type , Ġcontext Type , Ġalready Seen , Ġhash er , Ġfactory ). put Un encoded Chars ( ARRAY _ HASH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( Serializer Factory . is Primitive ( type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhash er . put Un encoded Chars ( type . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( is Collection Or Map ( type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhash er . put Un encoded Chars ( type . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNeed Ġto Ġcheck Ġif Ġa Ġcustom Ġserializer Ġis Ġapplicable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcustom Serializer Ġ= Ġfactory . find Custom Serializer ( type , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( custom Serializer Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type . kotlin . object Instance Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġname Ġcollision Ġis Ġtoo Ġlikely Ġfor Ġkotlin Ġobjects , Ġwe Ġneed Ġto Ġintroduce Ġsome Ġreference ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġthe ĠCor D app Ġbut Ġmaybe Ġreference Ġto Ġthe ĠJ AR Ġin Ġthe Ġshort Ġterm . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhash er . put Un encoded Chars ( type . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfingerprint For Object ( type , Ġcontext Type , Ġalready Seen , Ġhash er , Ġfactory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhash er . put Un encoded Chars ( custom Serializer . type Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( type Ġis ĠParameter ized Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHash Ġthe Ġraw Type Ġ+ Ġparams ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= Ġtype . raw Type Ġas ĠClass < *> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstarting Hash Ġ= Ġif Ġ( is Collection Or Map ( clazz )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhash er . put Un encoded Chars ( clazz . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfingerprint For Object ( type , Ġtype , Ġalready Seen , Ġhash er , Ġfactory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ... Ġand Ġconcat ent ate Ġthe Ġtype Ġdata Ġfor Ġeach Ġparameter Ġtype . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . actual Type Arguments . fold ( starting Hash ) Ġ{ Ġorig , Ġparam Type Ġ-> Ġfingerprint ForType ( param Type , Ġtype , Ġalready Seen , Ġorig , Ġfactory ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( type Ġis ĠGeneric ArrayType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHash Ġthe Ġelement Ġtype Ġ+ Ġsome Ġarray Ġhash ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfingerprint ForType ( type . generic ComponentType , Ġcontext Type , Ġalready Seen , Ġhash er , Ġfactory ). put Un encoded Chars ( ARRAY _ HASH ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( type Ġis ĠType Variable <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġinclude Ġbounds ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhash er . put Un encoded Chars ( type . name ). put Un encoded Chars ( TYPE _ VARIABLE _ HASH ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNot Serializable Exception (" Don 't Ġknow Ġhow Ġto Ġhash ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠNot Serializable Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNot Serializable Exception ("${ e . message } Ġ-> Ġ$ type ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġis Collection Or Map ( type : ĠClass <* >) Ġ= ĠCollection :: class . java . isAssignableFrom ( type ) Ġ|| ĠMap :: class . java . isAssignableFrom ( type ) Ċ Ċ private Ġfun Ġfingerprint For Object ( type : ĠType , Ġcontext Type : ĠType ?, Ġalready Seen : ĠMutable Set < Type >, Ġhash er : ĠHash er , Ġfactory : ĠSerializer Factory ): ĠHash er Ġ{ ĊĠĠĠ Ġ// ĠHash Ġthe Ġclass Ġ+ Ġproperties Ġ+ Ġinterfaces ĊĠĠĠ Ġval Ġname Ġ= Ġtype . as Class ()?. name Ġ?: Ġthrow ĠNot Serializable Exception (" Expected Ġonly ĠClass Ġor ĠParameter ized Type Ġbut Ġfound Ġ$ type ") ĊĠĠĠ Ġproperties For Serialization ( constructor For Deserialization ( type ), Ġcontext Type Ġ?: Ġtype , Ġfactory ). fold ( hash er . put Un encoded Chars ( name )) Ġ{ Ġorig , Ġprop Ġ-> ĊĠĠĠĠĠĠĠ Ġfingerprint ForType ( prop . resolved Type , Ġtype , Ġalready Seen , Ġorig , Ġfactory ). put Un encoded Chars ( prop . name ). put Un encoded Chars ( if Ġ( prop . mandatory ) ĠNOT _ NULL ABLE _ HASH Ġelse ĠNULL ABLE _ HASH ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġinterfaces For Serialization ( type ). map Ġ{ Ġfingerprint ForType ( it , Ġtype , Ġalready Seen , Ġhash er , Ġfactory ) Ġ} ĊĠĠĠ Ġreturn Ġhash er Ċ } Ċ