package Ġnet . cord a . node api . internal . serialization . amqp Ċ Ċ import Ġcom . es ot eric software . k ry o . io . ByteBuffer InputStream Ċ import Ġnet . cord a . core . internal . Visible ForTesting Ċ import Ġnet . cord a . core . internal . get StackTrace AsString Ċ import Ġnet . cord a . core . serialization . Encoding Whitelist Ċ import Ġnet . cord a . core . serialization . Serialized Bytes Ċ import Ġnet . cord a . core . utilities . Byte Sequence Ċ import Ġnet . cord a . node api . internal . serialization . C ord a Serialization Encoding Ċ import Ġnet . cord a . node api . internal . serialization . Null Encoding Whitelist Ċ import Ġnet . cord a . node api . internal . serialization . Section Id Ċ import Ġnet . cord a . node api . internal . serialization . encoding Not Per mitted Format Ċ import Ġorg . apache . q pid . pro ton . amqp . Binary Ċ import Ġorg . apache . q pid . pro ton . amqp . Descri bed Type Ċ import Ġorg . apache . q pid . pro ton . amqp . Unsigned Byte Ċ import Ġorg . apache . q pid . pro ton . amqp . Unsigned Integer Ċ import Ġorg . apache . q pid . pro ton . codec . Data Ċ import Ġjava . io . InputStream Ċ import Ġjava . io . Not Serializable Exception Ċ import Ġjava . lang . reflect . Parameterized Type Ċ import Ġjava . lang . reflect . Type Ċ import Ġjava . lang . reflect . Type Variable Ċ import Ġjava . lang . reflect . Wildcard Type Ċ import Ġjava . nio . ByteBuffer Ċ Ċ data Ġclass ĠObject And Envelope < out ĠT >( val Ġobj : ĠT , Ġval Ġenvelope : ĠEn velope ) Ċ Ċ /** Ċ Ġ* ĠMain Ġentry Ġpoint Ġfor Ġde serializing Ġan ĠAMQP Ġencoded Ġobject . Ċ Ġ* Ċ Ġ* Ġ@ param Ġserializer Factory ĠThis Ġis Ġthe Ġfactory Ġfor Ġ[ AM QP Serializer ] Ġinstances Ġand Ġcan Ġbe Ġshared Ġacross Ġmultiple Ċ Ġ* Ġinstances Ġand Ġthreads . Ċ Ġ*/ Ċ class ĠDeserial ization Input Ġ@ Jvm Over loads Ġconstructor ( private Ġval Ġserializer Factory : ĠSerializer Factory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġencoding Whitelist : ĠEncoding Whitelist Ġ= ĠNull Encoding Whitelist ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġobject History : ĠMutable List < Any > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġinternal Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠBY TES _ NE EDED _ TO _ PE EK : ĠInt Ġ= Ġ 2 3 ĊĊĠĠĠĠĠĠĠ Ġfun Ġpeek Size ( bytes : ĠByteArray ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThere 's Ġan Ġ 8 Ġbyte Ġheader , Ġand Ġthen Ġa Ġ 0 Ġbyte Ġplus Ġdescriptor Ġfollowed Ġby Ġconstructor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe ighth Ġ= Ġbytes [ 8 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( e ighth Ġ== Ġ 0 x 0 ) Ġ{ Ġ" Expected Ġto Ġfind Ġa Ġdescriptor Ġin Ġthe ĠAMQP Ġstream " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġshould Ġalways Ġhave Ġan ĠEn velope , Ġso Ġthe Ġdescriptor Ġshould Ġbe Ġa Ġ 6 4 - bit Ġlong Ġ( 0 x 8 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn in th Ġ= ĠUnsigned Byte . valueOf ( bytes [ 9 ]). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( nin th Ġ== Ġ 0 x 8 0 ) Ġ{ Ġ" Expected Ġto Ġfind Ġa Ġulong Ġin Ġthe ĠAMQP Ġstream " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSkip Ġ 8 Ġbytes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġeight e enth Ġ= ĠUnsigned Byte . valueOf ( bytes [ 1 8 ]). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( eight e enth Ġ== Ġ 0 xd 0 Ġ|| Ġeight e enth Ġ== Ġ 0 xc 0 ) Ġ{ Ġ" Expected Ġto Ġfind Ġa Ġlist 8 Ġor Ġlist 3 2 Ġin Ġthe ĠAMQP Ġstream " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġif Ġ( eight e enth Ġ== Ġ 0 xc 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNext Ġbyte Ġis Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnsigned Byte . valueOf ( bytes [ 1 9 ]). toInt () Ġ- Ġ 3 Ġ// ĠMin us Ġthree Ġas ĠP EEK _ SIZE Ġassumes Ġ 4 Ġbyte Ġunsigned Ġinteger . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNext Ġ 4 Ġbytes Ġis Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnsigned Byte . valueOf ( bytes [ 1 9 ]). toInt (). sh l ( 2 4 ) Ġ+ ĠUnsigned Byte . valueOf ( bytes [ 2 0 ]). toInt (). sh l ( 1 6 ) Ġ+ ĠUnsigned Byte . valueOf ( bytes [ 2 1 ]). toInt (). sh l ( 8 ) Ġ+ ĠUnsigned Byte . valueOf ( bytes [ 2 2 ]). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsize Ġ+ ĠBY TES _ NE EDED _ TO _ PE EK ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠĠĠĠĠ Ġ@ Throws ( Not Serializable Exception :: class ) ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġ< T > Ġwith Data Bytes ( byte Sequence : ĠByte Sequence , Ġencoding Whitelist : ĠEncoding Whitelist , Ġtask : Ġ( ByteBuffer ) Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthat Ġthe Ġlead Ġbytes Ġmatch Ġexpected Ġheader ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġam qp Sequence Ġ= Ġam qp Magic . consume ( byte Sequence ) Ġ?: Ġthrow ĠNot Serializable Exception (" Serialization Ġheader Ġdoes Ġnot Ġmatch .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstream : ĠInputStream Ġ= ĠByteBuffer InputStream ( amqp Sequence ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( Section Id . reader . read From ( stream )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSection Id . ENCODING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencoding Ġ= ĠC ord a Serialization Encoding . reader . read From ( stream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencoding Whitelist . accept Encoding ( encoding ) Ġ|| Ġthrow ĠNot Serializable Exception ( encoding Not Per mitted Format . format ( encoding )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream Ġ= Ġencoding . wrap ( stream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSection Id . DATA _ AND _ STOP , ĠSection Id . ALT _ DATA _ AND _ STOP Ġ-> Ġreturn Ġtask ( stream . as ByteBuffer ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Not Serializable Exception :: class ) ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġdeserialize ( bytes : ĠSerialized Bytes < T >): ĠT Ġ= Ġdeserialize ( bytes , ĠT :: class . java ) ĊĊĠĠĠ Ġ@ Throws ( Not Serializable Exception :: class ) ĊĠĠĠ Ġinline Ġinternal Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġdeserialize And Return Envelope ( bytes : ĠSerialized Bytes < T >): ĠObject And Envelope < T > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeserialize And Return Envelope ( bytes , ĠT :: class . java ) ĊĊĠĠĠ Ġ@ Throws ( Not Serializable Exception :: class ) ĊĠĠĠ Ġinternal Ġfun Ġget Envelope ( byte Sequence : ĠByte Sequence ): ĠEn velope Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Data Bytes ( byte Sequence , Ġencoding Whitelist ) Ġ{ Ġdata Bytes Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠData . Factory . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Size Ġ= Ġdata Bytes . remaining () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . decode ( data Bytes ) Ġ!= Ġexpected Size . to Long ()) Ġthrow ĠNot Serializable Exception (" Unexpected Ġsize Ġof Ġdata ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEn velope . get ( data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Not Serializable Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġ< R > Ġdes ( generator : Ġ() Ġ-> ĠR ): ĠR Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġgenerator () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( n se : ĠNot Serializable Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġn se ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNot Serializable Exception (" Unexpected Ġthrowable : Ġ${ t . message } Ġ${ t . get StackTrace AsString () }") ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject History . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġis Ġthe Ġmain Ġentry Ġpoint Ġfor Ġde serialization Ġof ĠAMQP Ġpayload s , Ġand Ġexpects Ġa Ġbyte Ġsequence Ġinvol ving Ġa Ġheader ĊĠĠĠĠ Ġ* Ġindicating Ġwhat Ġversion Ġof ĠC ord a Ġserialization Ġwas Ġused , Ġfollowed Ġby Ġan Ġ[ Envelope ] Ġwhich Ġcar ries Ġthe Ġobject Ġto ĊĠĠĠĠ Ġ* Ġbe Ġdeserialized Ġand Ġa Ġschema Ġdescribing Ġthe Ġtypes Ġof Ġthe Ġobjects . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( Not Serializable Exception :: class ) ĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġdeserialize ( bytes : ĠByte Sequence , Ġclazz : ĠClass < T >): ĠT Ġ= Ġdes Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġenvelope Ġ= Ġget Envelope ( bytes ) ĊĠĠĠĠĠĠĠ Ġclazz . cast ( read Object OrNull ( envelope . obj , ĠSerialization Schemas ( envelope . schema , Ġenvelope . transforms Schema ), Ġclazz )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Not Serializable Exception :: class ) ĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġdeserialize And Return Envelope ( bytes : ĠSerialized Bytes < T >, Ġclazz : ĠClass < T >): ĠObject And Envelope < T > Ġ= Ġdes Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġenvelope Ġ= Ġget Envelope ( bytes ) ĊĠĠĠĠĠĠĠ Ġ// ĠNow Ġpick Ġout Ġthe Ġobj Ġand Ġschema Ġfrom Ġthe Ġenvelope . ĊĠĠĠĠĠĠĠ ĠObject And Envelope ( clazz . cast ( read Object OrNull ( envelope . obj , ĠSerialization Schemas ( envelope . schema , Ġenvelope . transforms Schema ), Ġclazz )), Ġenvelope ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġread Object OrNull ( obj : ĠAny ?, Ġschema : ĠSerialization Schemas , Ġtype : ĠType , Ġoffset : ĠInt Ġ= Ġ 0 ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( obj Ġ== Ġnull ) Ġnull Ġelse Ġread Object ( obj , Ġschema , Ġtype , Ġoffset ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġread Object ( obj : ĠAny , Ġschemas : ĠSerialization Schemas , Ġtype : ĠType , Ġdebug Indent : ĠInt Ġ= Ġ 0 ): ĠAny Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( obj Ġis ĠDescri bed Type Ġ&& ĠRefer enced Object . DESCRIPTOR Ġ== Ġobj . descriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt Ġmust Ġbe Ġa Ġreference Ġto Ġan Ġinstance Ġthat Ġhas Ġalready Ġbeen Ġread , Ġche ap ly Ġand Ġquickly Ġreturning Ġit Ġby Ġreference . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobject Index Ġ= Ġ( obj . described Ġas ĠUnsigned Integer ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( object Index Ġ! in Ġ 0 .. object History . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNot Serializable Exception (" Retrie val Ġof Ġexisting Ġreference Ġfailed . ĠRequest ed Ġindex Ġ$ object Index Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" is Ġoutside Ġof Ġthe Ġbounds Ġfor Ġthe Ġlist Ġof Ġsize : Ġ${ object History . size }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobject Retrie ved Ġ= Ġobject History [ object Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! object Retrie ved :: class . java . is Sub Class Of ( type . as Class () !! )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNot Serializable Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Existing Ġreference Ġtype Ġmismatch . ĠExpected : Ġ'$ type ', Ġfound : Ġ'${ object Retrie ved :: class . java }' Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"@ Ġ${ object Index }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Retrie ved ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobject Read Ġ= Ġwhen Ġ( obj ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDescri bed Type Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLook Ġup Ġserializer Ġin Ġfactory Ġby Ġdescriptor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserializer Ġ= Ġserializer Factory . get ( obj . descriptor , Ġschemas ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Serializer Factory . Any Type Ġ!= Ġtype Ġ&& Ġserializer . type Ġ!= Ġtype Ġ&& Ġwith ( serializer . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! is Sub Class Of ( type ) Ġ&& Ġ! mat er ially Equivalent To ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNot Serializable Exception (" Descri bed Ġtype Ġwith Ġdescriptor Ġ${ obj . descriptor } Ġwas Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" expected Ġto Ġbe Ġof Ġtype Ġ$ type Ġbut Ġwas Ġ${ serializer . type }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserializer . read Object ( obj . described , Ġschemas , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBinary Ġ-> Ġobj . array ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġobj Ġ// Ġthis Ġwill Ġbe Ġthe Ġcase Ġfor Ġprimitive Ġtypes Ġlike Ġ[ boolean ] Ġet Ġal . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStore Ġthe Ġreference Ġin Ġcase Ġwe Ġneed Ġit Ġlater Ġon . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSkip Ġfor Ġprimitive Ġtypes Ġas Ġthey Ġare Ġtoo Ġsmall Ġand Ġoverhead Ġof Ġreferencing Ġthem Ġwill Ġbe Ġmuch Ġhigher Ġthan Ġtheir Ġcontent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( suit able For Object Reference ( object Read . java Class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject History . add ( object Read ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Read ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCurrently Ġperforms Ġchecks Ġa imed Ġat : ĊĠĠĠĠ Ġ* Ġ Ġ* Ġ[ java . util . List < Command <?>> ] Ġand Ġ[ java . lang . Class <? Ġextends Ġnet . cord a . core . contracts . Contract >] ĊĠĠĠĠ Ġ* Ġ Ġ* Ġ[ T Ġ: ĠParent ] Ġand Ġ[ Parent ] ĊĠĠĠĠ Ġ* Ġ Ġ* Ġ[ ? Ġextends ĠParent ] Ġand Ġ[ Parent ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIn Ġthe Ġfuture Ġtight er Ġcontrol Ġmight Ġbe Ġneeded ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠType . mat er ially Equivalent To ( that : ĠType ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( that ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠParameter ized Type Ġ-> Ġas Class () Ġ== Ġthat . as Class () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType Variable < *> Ġ-> Ġis Sub Class Of ( that . bounds . first ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ildcard Type Ġ-> Ġis Sub Class Of ( that . upper Bounds . first ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ } Ċ