package Ġcom . ch imer apps . mo or inspector . client Ċ Ċ import Ġcom . ch imer apps . discovery . utils . debug Ċ import Ġcom . ch imer apps . discovery . utils . logger Ċ import Ġcom . ch imer apps . mo or inspector . client . protocol . Export Response Ċ import Ġcom . ch imer apps . mo or inspector . client . protocol . Mo or Inspector Protocol Ċ import Ġcom . ch imer apps . mo or inspector . client . protocol . Mo or Inspector Server Info Ċ import Ġcom . ch imer apps . mo or inspector . client . protocol . Mo or Inspector V 1 Protocol Handler Ċ import Ġcom . ch imer apps . mo or inspector . ui . view . Bulk Action Data Ċ import Ġcom . ch imer apps . mo or inspector . ui . view . Mo or Inspector Variable Ċ import Ġcom . google . gson package d . Gson Ċ import Ġcom . google . gson package d . JsonArray Ċ import Ġcom . google . gson package d . JsonObject Ċ import Ġcom . google . gson package d . Json Parser Ċ import Ġorg . java _ websocket . client . WebSocket Client Ċ import Ġorg . java _ websocket . draft s . Draft _ 6 4 5 5 Ċ import Ġorg . java _ websocket . handshake . Server Handshake Ċ import Ġjava . io . Closeable Ċ import Ġjava . net . URI Ċ import Ġjava . util .* Ċ Ċ class ĠMo or Inspector Client ( server URI : ĠURI ) Ġ: ĠMo or Inspector Message Listener , ĠClose able Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMESSAGE _ TYPE _ PROTOCOL Ġ= Ġ" protocol " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġval Ġclient Listeners : ĠMutable Set < Mo or Inspector Message Listener > Ġ= ĠHashSet () ĊĠĠĠ Ġprivate Ġval Ġsocket Client Ġ= ĠWebSocket Mo or Inspector Client ( server URI , Ġthis ) ĊĠĠĠ Ġinternal Ġvar Ġprotocol Handler : ĠMo or Inspector Protocol ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġregister Message Listener ( listener : ĠMo or Inspector Message Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( client Listeners ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Listeners . add ( listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġunregister Message Listener ( listener : ĠMo or Inspector Message Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( client Listeners ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Listeners . remove ( listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġregister Protocol Handler ( protocol Version : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprotocol Handler Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠMo or Inspector V 1 Protocol Handler ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Ready () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġconnect () Ġ{ ĊĠĠĠĠĠĠĠ Ġsocket Client . connect () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġsocket Client . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Filter Data ( table Id : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠrequestId : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrows : ĠList < Map < String , ĠAny ? >>, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumns : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġclient Listeners . forEach Ġ{ Ġit . on Filter Data ( table Id , ĠrequestId , Ġrows , Ġcolumns ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Closed () Ġ{ ĊĠĠĠĠĠĠĠ Ġclient Listeners . forEach Ġ{ Ġit . on Closed () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Server Info ( server Info : ĠMo or Inspector Server Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclient Listeners . forEach Ġ{ Ġit . on Server Info ( server Info ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Ready () Ġ{ ĊĠĠĠĠĠĠĠ Ġclient Listeners . forEach Ġ{ Ġit . on Ready () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonUpdate Result ( table Id : ĠString , ĠrequestId : ĠString , Ġnum Rows Updated : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclient Listeners . forEach Ġ{ Ġit . on Update Result ( table Id , ĠrequestId , Ġnum Rows Updated ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonError ( requestId : ĠString , Ġmessage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclient Listeners . forEach Ġ{ Ġit . onError ( requestId , Ġmessage ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bulk Update Result ( requestId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclient Listeners . forEach Ġ{ Ġit . on Bulk Update Result ( requestId ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Export Result ( database Id : ĠString , ĠrequestId : ĠString , Ġexport Response : ĠExport Response ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclient Listeners . forEach Ġ{ Ġit . on Export Result ( database Id , ĠrequestId , Ġexport Response ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġquery ( requestId : ĠString , Ġdatabase Id : ĠString , Ġquery : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsocket Client . send String ("{ \" type \":\" filter \", Ġ\" body \": Ġ{ \" database Id \":\" $ database Id \",\" requestId \":\" $ requestId \",\" query \":\" $ query \" }} ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate ( ĊĠĠĠĠĠĠĠ ĠrequestId : ĠString , ĊĠĠĠĠĠĠĠ Ġdatabase Id : ĠString , ĊĠĠĠĠĠĠĠ Ġquery : ĠString , ĊĠĠĠĠĠĠĠ Ġaffected Tables : ĠList < String >, ĊĠĠĠĠĠĠĠ Ġvariables : ĠList < Mo or Inspector Variable > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgson Ġ= ĠGson () ĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= ĠJsonObject () ĊĠĠĠĠĠĠĠ Ġjson . addProperty (" type ", Ġ" update ") ĊĠĠĠĠĠĠĠ Ġjson . add (" body ", ĠJsonObject (). also Ġ{ Ġbody Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody . addProperty (" database Id ", Ġdatabase Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody . addProperty (" requestId ", ĠrequestId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody . addProperty (" query ", Ġquery ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody . add (" affected Tables ", ĠJson Array (). also Ġ{ Ġarray Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaffected Tables . forEach Ġ{ Ġarray . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody . add (" variables ", Ġgson . toJson Tree ( variables )) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġsocket Client . send String ( json . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbulk Update ( requestId : ĠString , Ġdatabase Id : ĠString , Ġdata : ĠList < Bulk Action Data >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgson Ġ= ĠGson () ĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= ĠJsonObject () ĊĠĠĠĠĠĠĠ Ġjson . addProperty (" type ", Ġ" batch ") ĊĠĠĠĠĠĠĠ Ġjson . add (" body ", ĠJsonObject (). also Ġ{ Ġbody Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody . addProperty (" requestId ", ĠrequestId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody . add (" actions ", ĠJson Array (). also Ġ{ Ġarray Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . forEach Ġ{ Ġaction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray . add ( JsonObject (). also Ġ{ Ġaction Wrapper Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Wrapper . addProperty (" type ", Ġ" update ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Wrapper . add (" body ", ĠJsonObject (). also Ġ{ Ġaction Body Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Body . addProperty (" database Id ", Ġdatabase Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Body . addProperty (" query ", Ġaction . query ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Body . add (" affected Tables ", ĠJson Array (). also Ġ{ Ġarray Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction . affected Tables . forEach Ġ{ Ġarray . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Body . add (" variables ", Ġgson . toJson Tree ( action . variables )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġsocket Client . send String ( json . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexport ( requestId : ĠString , Ġdatabase Id : ĠString , Ġtable Names : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= ĠJsonObject () ĊĠĠĠĠĠĠĠ Ġjson . addProperty (" type ", Ġ" export ") ĊĠĠĠĠĠĠĠ Ġjson . add (" body ", ĠJsonObject (). also Ġ{ Ġbody Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody . addProperty (" database Id ", Ġdatabase Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody . addProperty (" requestId ", ĠrequestId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody . add (" tables ", ĠJson Array (). also Ġ{ Ġarray Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtable Names . forEach Ġ{ ĠtableName Ġ-> Ġarray . add ( tableName ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġsocket Client . send String ( json . toString ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ interface ĠMo or Inspector Message Listener Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġthe Ġconnection Ġwith Ġthe Ġserver Ġhas Ġbeen Ġclosed ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Closed () Ġ{} ĊĊĠĠĠ Ġfun Ġon Filter Data ( table Id : ĠString , ĠrequestId : ĠString , Ġrows : ĠList < Map < String , ĠAny ? >>, Ġcolumns : ĠList < String >) Ġ{} ĊĊĠĠĠ Ġfun ĠonUpdate Result ( table Id : ĠString , ĠrequestId : ĠString , Ġnum Rows Updated : ĠInt ) Ġ{} ĊĊĠĠĠ Ġfun Ġon Bulk Update Result ( requestId : ĠString ) Ġ{} ĊĊĠĠĠ Ġfun Ġon Server Info ( server Info : ĠMo or Inspector Server Info ) Ġ{} ĊĊĠĠĠ Ġfun ĠonError ( requestId : ĠString , Ġmessage : ĠString ) Ġ{} ĊĊĠĠĠ Ġfun Ġon Ready () Ġ{} ĊĊĠĠĠ Ġfun Ġon Export Result ( database Id : ĠString , ĠrequestId : ĠString , Ġexport Response : ĠExport Response ) Ġ{} Ċ } Ċ Ċ private Ġclass ĠWebSocket Mo or Inspector Client ( server URI : ĠURI , Ġprivate Ġval Ġparent : ĠMo or Inspector Client ) Ġ: ĊĠĠĠ ĠWebSocket Client ( server URI , ĠDraft _ 6 4 5 5 ()) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġ= Ġlogger < WebSocket Mo or Inspector Client >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Open ( handshake Data : ĠServer Handshake ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug (" Connection Ġsucceeded : Ġ${ connection . remote SocketAddress }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonClose ( code : ĠInt , Ġreason : ĠString ?, Ġremote : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug (" Connection Ġclosed : Ġ$ reason ") ĊĠĠĠĠĠĠĠ Ġsynchronized ( parent . client Listeners ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . client Listeners . forEach Ġ{ Ġit . on Closed () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Message ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug (" Got Ġmessage : Ġ$ message ") ĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= ĠJson Parser . parse String ( message ). as JsonObject ĊĠĠĠĠĠĠĠ Ġval Ġmessage Type Ġ= Ġjson . get (" type "). asString ĊĊĠĠĠĠĠĠĠ Ġif Ġ( message Type Ġ== ĠMo or Inspector Client . MESSAGE _ TYPE _ PROTOCOL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . register Protocol Handler ( json . get (" protocol Version "). as Int ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġparent . protocol Handler ?. on Message ( this , Ġjson ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonError ( ex : ĠException ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug ( ex . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend String ( data : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsend ( data ) ĊĠĠĠ Ġ} Ċ } Ċ