/* Ċ Ġ* ĠÂ© Ġ 2 0 1 8 ĠMatch ĠGroup , ĠLLC . Ċ Ġ*/ Ċ Ċ package Ġcom . t inder . sc ar let . message adapter . mos hi Ċ Ċ import Ġcom . squareup . mos hi . Json Adapter Ċ import Ġcom . squareup . mos hi . Json Qualifier Ċ import Ġcom . squareup . mos hi . M oshi Ċ import Ġcom . t inder . sc ar let . Message Ċ import Ġcom . t inder . sc ar let . Message Adapter Ċ import Ġok io . ByteString Ċ import Ġjava . lang . reflect . Type Ċ Ċ /** Ċ Ġ* ĠA Ġ[ message Ġadapter ][ Message Adapter ] Ġthat Ġuses ĠM oshi . Ċ Ġ*/ Ċ class ĠM oshi Message Adapter < T > Ġprivate Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġjson Adapter : ĠJson Adapter < T > Ċ ) Ġ: ĠMessage Adapter < T > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġfrom Message ( message : ĠMessage ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstring Value Ġ= Ġwhen Ġ( message ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMessage . Text Ġ-> Ġmessage . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMessage . Bytes Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbyte String Ġ= ĠByte String . of ( message . value , Ġ 0 , Ġmessage . value . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠM oshi Ġhas Ġno Ġdocument - level ĠAPI Ġso Ġthe Ġresponsibility Ġof ĠB OM Ġskipping Ġfalls Ġto Ġwhatever Ġis Ġdeleg ating ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġit . ĠSince Ġit 's Ġa ĠUTF - 8 - only Ġlibrary Ġas Ġwell Ġwe Ġonly Ġhon or Ġthe ĠUTF - 8 ĠB OM . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( byte String . startsWith ( UTF 8 _ BO M )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbyte String . substring ( UTF 8 _ BO M . size ()). utf 8 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbyte String . utf 8 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġjson Adapter . fromJson ( stringValue ) !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġto Message ( data : ĠT ): ĠMessage Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstring Value Ġ= Ġjson Adapter . toJson ( data ) ĊĠĠĠĠĠĠĠ Ġreturn ĠMessage . Text ( stringValue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠFactory Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġm oshi : ĠM oshi Ġ= ĠDEFAULT _ MO SH I , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġconfig : ĠConfig Ġ= ĠConfig () ĊĠĠĠ Ġ) Ġ: ĠMessage Adapter . Factory Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate ( type : ĠType , Ġannotations : ĠArray < Annotation >): ĠMessage Adapter < *> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Annotations Ġ= Ġfilter Json Annotations ( annotations ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġadapter Ġ= Ġm oshi . adapter < Any >( type , Ġjson Annotations ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( config ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( len ient ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġadapter . len ient () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( serialize Null ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġadapter . serialize Null s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fail On Unknown ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġadapter . fail On Unknown () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠM oshi Message Adapter ( adapter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfilter Json Annotations ( annotations : ĠArray < Annotation >): ĠSet < Annotation > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġannotations ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . annotation Class . java . is Annotation Present ( Json Qualifier :: class . java ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠUsed Ġto Ġconfigure Ġ` mos hi ` Ġadapters . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġlen ient Ġlen ient Ġwhen Ġreading Ġand Ġwriting . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġserialize Null Ġinclude Ġnull Ġvalues Ġinto Ġthe Ġserialized ĠJSON . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġfail On Unknown Ġuse Ġ[ Json Adapter . fail On Unknown ] Ġadapters . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠConfig ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlen ient : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserialize Null : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfail On Unknown : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDEFAULT _ MO SH I Ġ= ĠM oshi . Builder (). build () ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠUTF 8 _ BO M Ġ= ĠByte String . decode Hex (" EF BB BF ") ĊĠĠĠ Ġ} Ċ } Ċ