/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠS FE IR ĠS . A . S . Ċ Ġ* Ċ Ġ* Ġ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 . s fe ir . open . k beam . coder Ċ Ċ import Ġcom . es ot eric software . k ry o . K ry o Ċ import Ġcom . es ot eric software . k ry o . io . Input Ċ import Ġcom . es ot eric software . k ry o . io . Output Ċ import Ġorg . apache . beam . sdk . coders .* Ċ import Ġorg . apache . beam . sdk . values . KV Ċ import Ġorg . apache . beam . sdk . values . TypeDescriptor Ċ import Ġorg . obj en esis . strategy . Std Instanti ator Strategy Ċ import Ġjava . io .* Ċ Ċ class ĠK ry o Coder Provider ( private Ġvar Ġk ry o Builder : Ġ() Ġ-> ĠK ry o Ġ= Ġ{ ĊĠĠĠ Ġval Ġk Ġ= ĠK ry o () ĊĠĠĠ Ġk . is Registration Required Ġ= Ġfalse ĊĠĠĠ Ġk . inst anti ator Strategy Ġ= ĠK ry o . Default Instanti ator Strategy ( Std Instanti ator Strategy ()) ĊĠĠĠ Ġk Ċ }) ĊĠĠĠ Ġ: ĠCod er Provider (), ĠExternal izable Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġregistry : ĠCod er Registry Ġ= ĠCod er Registry . create Default () ĊĊĠĠĠ Ġoverride Ġfun Ġread External ( o is : ĠObject Input ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġk ry o Builder Ġ= Ġo is . read Object () Ġas Ġ() Ġ-> ĠK ry o ĊĠĠĠĠĠĠĠ Ġk ry o Ġ= ĠThread Local . with Initial ( k ry o Builder ) ĊĠĠĠĠĠĠĠ Ġregistry Ġ= ĠCod er Registry . create Default () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġwrite External ( out : ĠObject Output ) Ġ{ ĊĠĠĠĠĠĠĠ Ġout . write Object ( k ry o Builder ) ĊĠĠĠĠĠĠĠ Ġout . flush () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠAny > Ġcod er For ( type Descriptor : ĠType Descriptor < T >, Ġcomponent Cod ers : ĠMutable List < out ĠCod er <* >> ): ĠCod er < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregistry . getC oder ( type Descriptor ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠCannot Provide Coder Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Descriptor . raw Type Ġ== ĠK V :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCannot Provide Coder Exception (" C ow ard ly Ġref using Ġto Ġencode ĠK V ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠK ry o Coder ( this , Ġtype Descriptor . raw Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġvar Ġk ry o : ĠThread Local < K ry o > Ġ= ĠThread Local . with Initial ( k ry o Builder ) ĊĊĊĠĠĠ Ġclass ĠK ry o Coder < T >( private Ġval Ġprovider : ĠK ry o Coder Provider , Ġprivate Ġval Ġkl azz : ĠClass < in ĠT >) Ġ: ĠAtomic Coder < T >(), ĠSerializable Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġencode ( value : ĠT , Ġout Stream : ĠOutputStream ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠOutput ( out Stream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . k ry o . get (). write Class And Object ( out , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . flush () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdecode ( in Stream : ĠInputStream ): ĠT Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠInput ( in Stream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġo Ġ= Ġprovider . k ry o . get (). read Class And Object ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġo Ġas ĠT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCod er Exception ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ } Ċ