package Ġorg . vit riv r . coll ab ord inator . handler Ċ Ċ import Ġcom . fasterxml . jackson . core . Jack son Exception Ċ import Ġcom . fasterxml . jackson . module . kotlin . jackson ObjectMapper Ċ import Ġorg . eclipse . jetty . websocket . api . Session Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . vit riv r . coll ab ord inator . message . Action Ċ import Ġorg . vit riv r . coll ab ord inator . message . Message Ċ Ċ object ĠMessage Handler Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger (" MessageHandler ") ĊĠĠĠ Ġprivate Ġval Ġmapper Ġ= Ġj ack son ObjectMapper () ĊĊĠĠĠ Ġfun Ġon Connect ( user : ĠSession ) Ġ{ ĊĠĠĠĠĠĠĠ ĠConnection Handler . add Connection ( user ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UNUSED _ PARAMETER ") ĊĠĠĠ Ġfun ĠonClose ( user : ĠSession , Ġstatus : ĠInt , Ġreason : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠConnection Handler . remove Connection ( user ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Message ( user : ĠSession , Ġdata : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmapper . readValue ( data , ĠMessage :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠJack son Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" received Ġinvalid Ġmessage : Ġ$ data ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( message . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAction . ADD Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Entries Ġ= ĠList Handler . add ( message . key , Ġmessage . attribute ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Entries . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Handler . broadcast ( Message ( Action . ADD , Ġmessage . key , Ġnew Entries )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Adding Ġentries Ġ$ new Entries Ġto Ġlist Ġ${ message . key }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAction . REMOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremoved Entries Ġ= ĠList Handler . remove ( message . key , Ġmessage . attribute ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( removed Entries . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Handler . broadcast ( Message ( Action . REMOVE , Ġmessage . key , Ġremoved Entries )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Removing Ġentries Ġ$ removed Entries Ġto Ġlist Ġ${ message . key }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAction . CLEAR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList Handler . clear ( message . key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Handler . broadcast ( Message ( Action . CLEAR , Ġmessage . key )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Clear ing Ġlist Ġ${ message . key }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAction . LIST Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser . remote . send String ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmapper . writeValue AsString ( Message ( Action . ADD , Ġmessage . key , ĠList Handler . list ( message . key ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }