/******************************************************************************* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 - 2 0 2 1 ĠExact pro Ġ( Exact pro ĠSystems ĠLimited ) Ċ Ġ* Ċ Ġ* Ġ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 . exact pro . th 2 . lw dat apro vider Ċ Ċ import Ġcom . exact pro . th 2 . common . grpc . Message Ċ import Ġcom . exact pro . th 2 . common . grpc . Message Metadata Ċ import Ġcom . exact pro . th 2 . common . grpc . Value Ċ import Ġcom . google . gson . Gson Ċ Ċ class ĠCustom Json Formatter Ġ Ġ{ ĊĠĠĠĠĊĠĠĠ Ġprivate Ġval Ġsb 1 Ġ: ĠStringBuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠQU OTE _ CHAR Ġ= Ġ'" '. toInt () ĊĠĠĠ Ġ} ĊĠĠĠĠĊĠĠĠ Ġfun Ġprint ( msg Ġ: ĠMessage ) Ġ: ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġsb 1 . set Length ( 0 ) ĊĠĠĠĠĠĠĠ Ġprint M ( msg , Ġsb 1 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsb 1 . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint M Ġ( msg : ĠMessage , Ġsb : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsb . append ("{ ") ĊĠĠĠĠĠĠĠ Ġif Ġ( msg . has Metadata ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint Metadata ( msg . metadata , Ġsb ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (',') ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsb . append ("\" fields \": { ") ĊĠĠĠĠĠĠĠ Ġval Ġfields Map Ġ= Ġmsg . fields Map ĊĠĠĠĠĠĠĠ Ġif Ġ( fields Map . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġfields Map . entries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ('" '). append ( entry . key ). append (" \": ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint V ( entry . value , Ġsb ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (',') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . set Length ( sb . length Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsb . append (' } '). append (' }') ĊĠĠĠĠĠĠĠĠĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġgson Ġ= ĠGson () ĊĠĠĠĠĊĠĠĠ Ġprivate Ġfun Ġprint V Ġ( value : ĠValue , Ġsb : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( value . kind Case ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠValue . Kind Case . SIMPLE _ VALUE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("{ \" simple Value \": ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconvert String ToJson ( value . simple Value , Ġsb ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (' }') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠValue . Kind Case . LIST _ VALUE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("{ \" list Value \":{\" values \": [ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues List Ġ= Ġvalue . list Value . values List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( values List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues List . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint V ( it , Ġsb ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (',') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . set Length ( sb . length Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" ]}} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠValue . Kind Case . MESSAGE _ VALUE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("{ \" message Value \": ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint M ( value . message Value , Ġsb ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (' }') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠValue . Kind Case . NULL _ VALUE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("{ \" null Value \": Ġ{} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Need To Escape ( s : ĠString ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġascii Ġ 3 2 Ġis Ġspace , Ġall Ġchars Ġbelow Ġshould Ġbe Ġescaped ĊĠĠĠĠĠĠĠ Ġreturn Ġs . chars (). any Match Ġ{ Ġit Ġ< Ġ 3 2 Ġ|| Ġit Ġ== ĠQU OTE _ CHAR Ġ} ĊĠĠĠ Ġ} ĊĠĠĠĠĊĠĠĠ Ġprivate Ġfun Ġconvert String ToJson ( s : ĠString , Ġbuilder : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Need To Escape ( s )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgson . toJson ( s , Ġbuilder ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ('" '). append ( s ). append ('" ') ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint Metadata Ġ( msg : ĠMessage Metadata , Ġsb : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsb . append ("\" metadata \": { ") ĊĠĠĠĠĠĠĠ Ġvar Ġfirst Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( msg . has Id ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("\" id \": { ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġmsg . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id . has Connection Id ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("\" connection Id \":{\" session Alias \": \"" ). append ( id . connection Id . session Alias ). append ("\" }, ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("\" direction \": \"" ). append ( id . direction . name ). append ("\ ", "); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("\" sequence \": \"" ). append ( id . sequence ). append ("\ ", "); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("\" sub sequence \": [ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id . sub sequence Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid . sub sequence List . forEach Ġ{ Ġsb . append ( it . toString ()). append (',') Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . set Length ( sb . length Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" ]} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( msg . has Timestamp ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! first ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (',') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("\" timestamp \":{\" seconds \": \"" ). append ( msg . timestamp . seconds ). append ("\ ", \" nan os \":\" ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ( msg . timestamp . nan os ). append ("\" }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( msg . message Type . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! first ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (',') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("\" message Type \": \"" ). append ( msg . message Type ). append ("\" ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( msg . properties Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! first ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (',') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("\" properties \": ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgson . toJson ( msg . properties Map , Ġsb ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( msg . protocol . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! first ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (',') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("\" protocol \": \"" ). append ( msg . protocol ). append ("\" ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsb . append (" }") ĊĠĠĠ Ġ} Ċ }