package Ġcom . mapbox . navigation . core . telemetry . events Ċ Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . google . gson . JsonArray Ċ import Ġcom . google . gson . Json Element Ċ import Ġcom . google . gson . JsonObject Ċ import Ġcom . google . gson . Json Parser Ċ import Ġcom . google . gson . Json Primitive Ċ import Ġcom . google . gson . annotations . SerializedName Ċ import Ġcom . mapbox . navigation . base . metrics . Navigation Metrics Ċ import Ġorg . apache . commons . io . IO Utils Ċ import Ġorg . junit . Assert . assertEquals Ċ import Ġorg . junit . Assert . assertNotNull Ċ import Ġorg . junit . Assert . assertTrue Ċ import Ġorg . junit . Test Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . ByteArray InputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Reader Ċ import Ġjava . lang . reflect . Field Ċ import Ġjava . lang . reflect . Modifier Ċ import Ġjava . util . ArrayList Ċ import Ġjava . util . zip . GZIP InputStream Ċ Ċ /** Ċ Ġ* ĠNote : Ġ[ Navigation Step Data . distance Remaining ] Ġ-> Ġstep distance Remaining Ġand Ċ Ġ* Ġ[ Navigation Step Data . duration Remaining ] Ġ-> Ġstep duration Remaining Ġto Ġavoid Ġnames Ġcollision Ċ Ġ*/ Ċ class ĠSchema Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġevent Schemas : ĠList < Event Schema > Ġ= Ġunpack Schemas () ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġcheck Navigation Ar rive Event Size () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġschema Ġ= Ġgrab Event Schema ( Navigation Metrics . AR RI VE ) ĊĠĠĠĠĠĠĠ Ġval Ġfields Ġ= Ġgrab Schema Property Fields ( Navigation Ar rive Event :: class . java ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( schema . properties . size (). to Long (), Ġfields . size . to Long ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġcheck Navigation Ar rive Event Fields () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġschema Ġ= Ġgrab Event Schema ( Navigation Metrics . AR RI VE ) ĊĠĠĠĠĠĠĠ Ġval Ġfields Ġ= Ġgrab Schema Property Fields ( Navigation Ar rive Event :: class . java ) ĊĠĠĠĠĠĠĠ Ġschema Contains Property Fields ( schema . properties , Ġfields ) ĊĠĠĠĠĠĠĠ Ġproperties Fields Contains Schema Fields ( fields , Ġschema . properties ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġcheck Navigation Cancel Event Size () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġschema Ġ= Ġgrab Event Schema ( Navigation Metrics . CANCEL _ SESSION ) ĊĠĠĠĠĠĠĠ Ġval Ġfields Ġ= Ġgrab Schema Property Fields ( Navigation Cancel Event :: class . java ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( schema . properties . size (). to Long (), Ġfields . size . to Long ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġcheck Navigation Cancel Event Fields () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġschema Ġ= Ġgrab Event Schema ( Navigation Metrics . CANCEL _ SESSION ) ĊĠĠĠĠĠĠĠ Ġval Ġfields Ġ= Ġgrab Schema Property Fields ( Navigation Cancel Event :: class . java ) ĊĠĠĠĠĠĠĠ Ġschema Contains Property Fields ( schema . properties , Ġfields ) ĊĠĠĠĠĠĠĠ Ġproperties Fields Contains Schema Fields ( fields , Ġschema . properties ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġcheck Navigation Depart Event Size () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġschema Ġ= Ġgrab Event Schema ( Navigation Metrics . DEP ART ) ĊĠĠĠĠĠĠĠ Ġval Ġfields Ġ= Ġgrab Schema Property Fields ( Navigation Depart Event :: class . java ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( schema . properties . size (). to Long (), Ġfields . size . to Long ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġcheck Navigation Depart Event Fields () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġschema Ġ= Ġgrab Event Schema ( Navigation Metrics . DEP ART ) ĊĠĠĠĠĠĠĠ Ġval Ġfields Ġ= Ġgrab Schema Property Fields ( Navigation Depart Event :: class . java ) ĊĠĠĠĠĠĠĠ Ġschema Contains Property Fields ( schema . properties , Ġfields ) ĊĠĠĠĠĠĠĠ Ġproperties Fields Contains Schema Fields ( fields , Ġschema . properties ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġcheck Navigation Feedback Event Size () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġschema Ġ= Ġgrab Event Schema ( Navigation Metrics . FEED BACK , Ġversion Ġ= Ġ" 2 . 2 ") ĊĠĠĠĠĠĠĠ Ġval Ġfields Ġ= Ġgrab Schema Property Fields ( Navigation Feedback Event :: class . java ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( schema . properties . size (). to Long (), Ġfields . size . to Long ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġcheck Navigation Feedback Event Fields () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġschema Ġ= Ġgrab Event Schema ( Navigation Metrics . FEED BACK , Ġversion Ġ= Ġ" 2 . 2 ") ĊĠĠĠĠĠĠĠ Ġval Ġfields Ġ= Ġgrab Schema Property Fields ( Navigation Feedback Event :: class . java ) ĊĠĠĠĠĠĠĠ Ġschema Contains Property Fields ( schema . properties , Ġfields ) ĊĠĠĠĠĠĠĠ Ġproperties Fields Contains Schema Fields ( fields , Ġschema . properties ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġcheck Navigation R er oute Event Size () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġschema Ġ= Ġgrab Event Schema ( Navigation Metrics . R ER OUT E ) ĊĠĠĠĠĠĠĠ Ġval Ġfields Ġ= Ġgrab Schema Property Fields ( Navigation R er oute Event :: class . java ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( schema . properties . size (). to Long (), Ġfields . size . to Long ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcheck Navigation R er oute Event Fields () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġschema Ġ= Ġgrab Event Schema ( Navigation Metrics . R ER OUT E ) ĊĠĠĠĠĠĠĠ Ġval Ġfields Ġ= Ġgrab Schema Property Fields ( Navigation R er oute Event :: class . java ) ĊĠĠĠĠĠĠĠ Ġschema Contains Property Fields ( schema . properties , Ġfields ) ĊĠĠĠĠĠĠĠ Ġproperties Fields Contains Schema Fields ( fields , Ġschema . properties ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcheck Navigation Free Drive Event Size () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġschema Ġ= Ġgrab Event Schema ( Navigation Metrics . FREE _ DRIVE ) ĊĠĠĠĠĠĠĠ Ġval Ġfields Ġ= Ġgrab Schema Property Fields ( Navigation Free Drive Event :: class . java ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( schema . properties . size (). to Long (), Ġfields . size . to Long ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcheck Navigation Free Drive Event Fields () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġschema Ġ= Ġgrab Event Schema ( Navigation Metrics . FREE _ DRIVE ) ĊĠĠĠĠĠĠĠ Ġval Ġfields Ġ= Ġgrab Schema Property Fields ( Navigation Free Drive Event :: class . java ) ĊĠĠĠĠĠĠĠ Ġschema Contains Property Fields ( schema . properties , Ġfields ) ĊĠĠĠĠĠĠĠ Ġproperties Fields Contains Schema Fields ( fields , Ġschema . properties ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġschema Contains Property Fields ( ĊĠĠĠĠĠĠĠ Ġproperties : ĠJsonObject , ĊĠĠĠĠĠĠĠ Ġfields : ĠList < Field > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġdistance Remaining Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġduration Remaining Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġfields . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Field Ġ= Ġfields [ i ]. toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Array Ġ= Ġthis Field . split (" Ġ". to Regex ()). to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Array Ġ= Ġfield Array [ field Array . size Ġ- Ġ 2 ]. split ("\\ .". to Regex ()). to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġtype Array [ type Array . size Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Array Ġ= Ġfield Array [ field Array . size Ġ- Ġ 1 ]. split ("\\ .". to Regex ()). to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfield Ġ= Ġname Array [ name Array . size Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠserializedName Ġ= Ġfields [ i ]. getAnnotation ( SerializedName :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( serialized Name Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= ĠserializedName . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field . equals (" duration Remaining ", Ġignore Case Ġ= Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Remaining Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( duration Remaining Count Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġ" step $ field " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field . equals (" distance Remaining ", Ġignore Case Ġ= Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdistance Remaining Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( distance Remaining Count Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġ" step $ field " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Schema Ġ= Ġfind Schema ( properties , Ġfield ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( field , Ġthis Schema ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Schema . has (" type ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtypes Match ( this Schema , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Property ( this Schema , Ġfields [ i ]. type , Ġfields [ i ]. name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġproperties Fields Contains Schema Fields ( fields : ĠList < Field >, Ġproperties : ĠJsonObject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmissing Fields Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġvar Ġstep distance Remaining Catch Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġstep duration Remaining Catch Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġproperties . keySet (). forEach Ġ{ Ġjson Property Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexist Ġ= Ġfields . any Ġ{ Ġit . name Ġ== Ġjson Property Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! exist ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson Property Ġ== Ġ" step duration Remaining " Ġ&& Ġ! step duration Remaining Catch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep duration Remaining Catch Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson Property Ġ== Ġ" step distance Remaining " Ġ&& Ġ! step distance Remaining Catch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep distance Remaining Catch Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmissing Fields . add ( json Property ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertTrue (" Missing Ġfields : Ġ$ missing Fields ", Ġmissing Fields . isEmpty ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġverify Property ( property : ĠJsonObject , Ġproperty Impl : ĠClass <* >, ĠfieldName : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproperty Type Ġ= Ġproperty . get (" type ") ?. let Ġ{ Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ let Ġif Ġ( element . is JsonArray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfilter Ġout Ġnullable Ġoptions , Ġand Ġdon 't Ġexpect Ġmultiple Ġtypes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( element Ġas ĠJson Array ). first Ġ{ Ġit . asString Ġ!= Ġ" null " Ġ}. asString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . asString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġexpected PropertyType : ĠString Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNumber :: class . java . isAssignableFrom ( property Impl ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Impl . simple Name . equals (" short ", Ġignore Case Ġ= Ġtrue ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Impl . simple Name . equals (" int ", Ġignore Case Ġ= Ġtrue ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Impl . simple Name . equals (" long ", Ġignore Case Ġ= Ġtrue ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Impl . simple Name . equals (" float ", Ġignore Case Ġ= Ġtrue ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Impl . simple Name . equals (" double ", Ġignore Case Ġ= Ġtrue ) Ġ-> Ġ" number " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBoolean :: class . java . isAssignableFrom ( property Impl ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Impl . simple Name . equals (" boolean ", Ġignore Case Ġ= Ġtrue ) Ġ-> Ġ" boolean " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString :: class . java . isAssignableFrom ( property Impl ) Ġ-> Ġ" string " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Impl . isArray Ġ|| ĠList :: class . java . isAssignableFrom ( property Impl ) Ġ-> Ġ" array " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" object " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals (" Incorrect Ġtype Ġfor Ġ$ fieldName ", Ġproperty Type , Ġexpected PropertyType ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( property Type Ġ== Ġ" object ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobject Properties Ġ= Ġproperty . getAs JsonObject (" properties ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfiltering Ġout Ġsynthetic Ġfields Ġinjected Ġby Ġj aco co , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsee Ġhttps :// github . com / jac oco / jac oco / issues / 1 6 8 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Fields Ġ= Ġproperty Impl . declared Fields . filter Ġ{ Ġit . is Synt hetic . not () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" schema Ġand Ġimpl Ġfields Ġcount Ġshould Ġmatch Ġfor Ġ$ fieldName ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Properties . keySet (). size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Fields . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Fields . forEach Ġ{ Ġobject Field Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġobject Field ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getAnnotation ( SerializedName :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . value Ġ?: Ġobject Field . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" schema Ġand Ġimpl Ġobject Ġ$ fieldName Ġshould Ġboth Ġhave Ġa Ġ$ name Ġproperty ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Properties . has ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobject Property Ġ= Ġobject Properties . get ( name ). as JsonObject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Property ( object Property , Ġobject Field . type , Ġobject Field . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( property Type Ġ== Ġ" array ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Item Ġ= Ġproperty . getAs JsonObject (" items ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Property ( array Item , Ġproperty Impl . get Generic List Impl Class (), ĠfieldName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠClass <* >. get Generic List Impl Class (): ĠClass < *> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( this . typeName . endsWith (" [] ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClass . forName ( this . typeName . substring ( 0 , Ġthis . typeName . length Ġ- Ġ 2 )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ("${ this . typeName } Ġis Ġnot Ġa Ġlist Ġtype ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Schema ( schema : ĠJsonObject , Ġfield : ĠString ): ĠJsonObject Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġschema . getAs JsonObject ( field ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtypes Match ( schema : ĠJsonObject , Ġtype : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠeventType Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . equals (" int ", Ġignore Case Ġ= Ġtrue ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . equals (" integer ", Ġignore Case Ġ= Ġtrue ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . equals (" double ", Ġignore Case Ġ= Ġtrue ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . equals (" float ", Ġignore Case Ġ= Ġtrue ) Ġ-> Ġ" number " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . contains (" [] ") Ġ-> Ġ" array " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . equals (" string ", Ġignore Case Ġ= Ġtrue ) Ġ-> Ġ" string " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . equals (" boolean ", Ġignore Case Ġ= Ġtrue ) Ġ-> Ġ" boolean " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" object " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtype Class : ĠClass < out ĠJson Element > Ġ= Ġschema [" type "]. java Class ĊĠĠĠĠĠĠĠ Ġval Ġjson Element Ġ= ĠJson Parser (). parse ( eventType . toLowerCase ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( type Class Ġ== ĠJson Primitive :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Primitive Ġ= Ġschema [" type "] ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( type Primitive , Ġjson Element ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠarrayOf Types Ġ= Ġschema . getAs JsonArray (" type ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( array Of Types . contains ( json Element )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgrab Schema Property Fields ( aClass : ĠClass < *> ): ĠList < Field > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfields : ĠMutable List < Field > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġval Ġall Fields Ġ= Ġa Class . declared Fields ĊĠĠĠĠĠĠĠ Ġfor Ġ( field Ġin Ġall Fields ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field . type Ġ== ĠNavigation Step Data :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Fields Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield . type . declared Fields ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( data Field Ġin Ġdata Fields ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Modifier . is Private ( data Field . modifiers ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! Modifier . is Static ( data Field . modifiers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields . add ( data Field ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . is Private ( field . modifiers ) Ġ&& Ġ! Modifier . is Static ( field . modifiers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields . add ( field ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsuper Fields Ġ= Ġa Class . super class !!. declared Fields ĊĠĠĠĠĠĠĠ Ġfor Ġ( field Ġin Ġsuper Fields ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Modifier . is Private ( field . modifiers ) Ġ&& Ġ! Modifier . is Static ( field . modifiers )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields . add ( field ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġfilter Ġout Ġnon - property Ġfields ĊĠĠĠĠĠĠĠ Ġfields . remove If Ġ{ Ġit . name Ġ== Ġ" version " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfields ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgrab Event Schema ( eventName : ĠString , Ġversion : ĠString Ġ= Ġ" 2 . 2 "): ĠEvent Schema Ġ= ĊĠĠĠĠĠĠĠ Ġevent Schemas . filter Ġ{ Ġit . name Ġ== ĠeventName Ġ&& Ġit . version Ġ== Ġversion Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isEmpty () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" missing Ġ$ eventName Ġschema Ġfor Ġversion Ġ$ version " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . size Ġ> Ġ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" multiple Ġ$ eventName Ġschemas Ġfor Ġversion Ġ$ version " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġunpack Schemas (): ĠList < Event Schema > Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSchema Test :: class . java . class Loader !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getResource AsStream (" mobile - event - schemas . json l . gz ") ĊĠĠĠĠĠĠĠ Ġval Ġbyte Out Ġ= ĠIO Utils . toByteArray ( inputStream ) ĊĠĠĠĠĠĠĠ Ġval Ġschema FileStream Ġ= ĠByteArrayInputStream ( byte Out ) ĊĠĠĠĠĠĠĠ Ġval Ġgz is Ġ= ĠG ZIP InputStream ( schema FileStream ) ĊĠĠĠĠĠĠĠ Ġval Ġreader Ġ= ĠInputStreamReader ( gz is ) ĊĠĠĠĠĠĠĠ Ġval Ġ` in ` Ġ= ĠBufferedReader ( reader ) ĊĠĠĠĠĠĠĠ Ġval Ġschema List Ġ= Ġmutable ListOf < Event Schema >() ĊĠĠĠĠĠĠĠ Ġval Ġgson Ġ= ĠGson () ĊĠĠĠĠĠĠĠ Ġvar Ġread : ĠString ? ĊĠĠĠĠĠĠĠ Ġwhile Ġ(` in `. readLine (). also Ġ{ Ġread Ġ= Ġit Ġ} Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġschema Ġ= Ġgson . fromJson ( read , ĠJsonObject :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġschema [" name "]. asString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġschema [" version "]. asString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperties Ġ= Ġget Properties ( schema ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġschema List . add ( Event Schema ( name , Ġversion , Ġproperties )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġschema List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġget Properties ( schema : ĠJsonObject ): ĠJsonObject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgson Ġ= ĠGson () ĊĠĠĠĠĠĠĠ Ġvar Ġschema Json Ġ= Ġgson . toJson ( schema [" properties "]) ĊĠĠĠĠĠĠĠ Ġvar Ġproperties Ġ= Ġgson . fromJson ( schema [" properties "], ĠJsonObject :: class . java ) ĊĠĠĠĠĠĠĠ Ġif Ġ( properties . has (" step ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstep Json Ġ= Ġproperties [" step "]. as JsonObject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstep Properties Ġ= Ġstep Json [" properties "]. as JsonObject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstep Properties Json Ġ= Ġgson . toJson ( step Properties ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġschema Json Ġ= Ġgenerate Step Schema Json ( step Properties Json , Ġschema Json ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperties Ġ= Ġgson . fromJson ( schema Json , ĠJsonObject :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperties . remove (" step ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġproperties . remove (" userAgent ") ĊĠĠĠĠĠĠĠ Ġproperties . remove (" received ") ĊĠĠĠĠĠĠĠ Ġproperties . remove (" token ") ĊĠĠĠĠĠĠĠ Ġproperties . remove (" authorization ") ĊĠĠĠĠĠĠĠ Ġproperties . remove (" owner ") ĊĠĠĠĠĠĠĠ Ġproperties . remove (" location Authorization ") ĊĠĠĠĠĠĠĠ Ġproperties . remove (" location Enabled ") ĊĠĠĠĠĠĠĠ Ġ// Ġtemporary Ġneed Ġto Ġwork Ġout Ġa Ġsolution Ġto Ġinclude Ġthis Ġdata ĊĠĠĠĠĠĠĠ Ġproperties . remove (" platform ") ĊĠĠĠĠĠĠĠ Ġproperties . remove (" version ") ĊĠĠĠĠĠĠĠ Ġreturn Ġproperties ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Step Schema Json ( ĊĠĠĠĠĠĠĠ Ġstep Json : ĠString , ĊĠĠĠĠĠĠĠ Ġschema String : ĠString ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġstep Json Ġ= Ġstep Json ĊĠĠĠĠĠĠĠ Ġvar Ġschema String Ġ= Ġschema String ĊĠĠĠĠĠĠĠ Ġstep Json Ġ= Ġstep Json . replace ("\" distance Remaining \"", Ġ"\" step distance Remaining \" ") ĊĠĠĠĠĠĠĠ Ġstep Json Ġ= Ġstep Json . replace (" duration Remaining ", Ġ" step duration Remaining ") ĊĠĠĠĠĠĠĠ Ġstep Json Ġ= Ġstep Json . replace First ("\\ { ". to Regex (), Ġ", ") ĊĠĠĠĠĠĠĠ Ġschema String Ġ= Ġschema String . replace (" }$ ". to Regex (), Ġ"") ĊĠĠĠĠĠĠĠ Ġschema String Ġ+= Ġstep Json ĊĠĠĠĠĠĠĠ Ġreturn Ġschema String ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġdata Ġclass ĠEvent Schema ( val Ġname : ĠString , Ġval Ġversion : ĠString , Ġval Ġproperties : ĠJsonObject ) Ċ