package Ġcom . white cloud . socket . client . action Ċ Ċ import Ġcom . white cloud . socket . client . Connection Info Ċ import Ġcom . white cloud . socket . client . managers . I ConnectionManager Ċ import Ġcom . white cloud . socket . core . interfaces . Abs Loop Thread Ċ import Ġcom . white cloud . socket . core . interfaces . IP ulse Send able Ċ import Ġcom . white cloud . socket . core . interfaces . IS end able Ċ import Ġcom . white cloud . socket . core . interfaces . I State Sender Ċ import Ġcom . white cloud . socket . core . interfaces . dispatcher . I Register Ċ import Ġjava . io . Serializable Ċ import Ġjava . util . ArrayList Ċ import Ġjava . util . concurrent . Linked BlockingQueue Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjava . util . concurrent . locks . Re entrant Lock Ċ Ċ class ĠAction Dispatcher ( ĊĠĠĠ Ġprivate Ġval Ġinfo : ĠConnection Info , ĊĠĠĠ Ġprivate Ġval Ġmanager : ĠI ConnectionManager Ċ ): ĠI Register < IS ocket ActionListener , ĠI ConnectionManager >, ĠI State Sender Ġ{ ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġresponse Handler List Ġ= ĠArrayList < IS ocket ActionListener >() ĊĊĠĠĠ Ġprivate Ġval Ġre entrant Lock Ġ= ĠRe entrant Lock ( true ) ĊĊĠĠĠ Ġoverride Ġfun Ġregister Receiver ( socket ActionListener : ĠIS ocket ActionListener ): ĠI ConnectionManager Ġ{ ĊĠĠĠĠĠĠĠ Ġ// println (" Action Dispatcher . register Receiver Ġ-> Ġresponse Handler Ġis : Ġ$ socket ActionListener ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( re entrant Lock . try Lock ( 1 , ĠTimeUnit . SECONDS )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! response Handler List . contains ( socket ActionListener )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Handler List . add ( socket ActionListener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre entrant Lock . unlock () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmanager ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġun Register Receiver ( socket ActionListener : ĠIS ocket ActionListener ): ĠI ConnectionManager Ġ{ ĊĠĠĠĠĠĠĠ Ġ// println (" Action Dispatcher . un Register Receiver Ġ-> Ġresponse Handler Ġis : Ġ$ socket ActionListener ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( re entrant Lock . try Lock ( 1 , ĠTimeUnit . SECONDS )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Handler List . remove ( socket ActionListener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre entrant Lock . unlock () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmanager ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsend Broadcast ( action : ĠI State Sender . State , Ġserial izable : ĠSerializable ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction Bean Ġ= ĠAction Bean ( this , Ġaction , Ġserial izable ) ĊĠĠĠĠĠĠĠ ĠBLOCK ING _ QUEUE . offer ( action Bean ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdispatch Action To Listener ( action : ĠI State Sender . State , Ġarg : ĠSerializable ?, Ġresponse Handler : ĠIS ocket ActionListener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Action Dispatcher . dispatch Action To Listener Ġ-> Ġaction : Ġ$ action , Ġhandler Ġ= Ġ$ response Handler ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI State Sender . State . ACTION _ CONNECTION _ SUCCESS Ġ-> Ġresponse Handler . on Socket Connection Success ( info , Ġaction ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI State Sender . State . ACTION _ CONNECTION _ FAILED Ġ-> Ġresponse Handler . on Socket Connection Failed ( info , Ġaction , Ġarg Ġas ĠException ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI State Sender . State . ACTION _ READ _ THREAD _ START Ġ-> Ġresponse Handler . on Socket IO Thread Start ( action ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI State Sender . State . ACTION _ READ _ THREAD _ SHUT DOWN Ġ-> Ġresponse Handler . on Socket IO Thread Shutdown ( action , Ġarg Ġas ĠException ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI State Sender . State . ACTION _ READ _ COMPLETE Ġ-> Ġresponse Handler . on Socket Read Response ( info , Ġaction , Ġarg Ġas ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI State Sender . State . ACTION _ WRITE _ THREAD _ START Ġ-> Ġresponse Handler . on Socket IO Thread Start ( action ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI State Sender . State . ACTION _ WRITE _ THREAD _ SHUT DOWN Ġ-> Ġresponse Handler . on Socket IO Thread Shutdown ( action , Ġarg Ġas ĠException ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI State Sender . State . ACTION _ WRITE _ COMPLETE Ġ-> Ġresponse Handler . on Socket Write Response ( info , Ġaction , Ġarg Ġas ĠIS end able ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI State Sender . State . ACTION _ P UL SE _ REQUEST Ġ-> Ġresponse Handler . on Pulse Send ( info , Ġarg Ġas ĠIP ulse Send able ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI State Sender . State . ACTION _ DIS CONNECTION Ġ-> Ġresponse Handler . on Socket Dis connection ( info , Ġaction , Ġarg Ġas ĠException ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Action Dispatcher . dispatch Action To Listener Ġ-> Ġerror : Ġ${ e . localized Message }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠAction Bean ( val Ġdispatcher : ĠAction Dispatcher , Ġval Ġaction : ĠI State Sender . State , Ġval Ġarg : ĠSerializable ? Ġ= Ġnull ) ĊĊĠĠĠ Ġprivate Ġclass ĠDispatch Thread : ĠAbs Loop Thread () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun In Loop Thread () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Bean Ġ= ĠBLOCK ING _ QUEUE . take () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Dispatcher Ġ= Ġaction Bean . dispatcher ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( action Dispatcher . response Handler List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopy Data Ġ= ĠArrayList ( action Dispatcher . response Handler List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( listener Ġin Ġcopy Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Dispatcher . dispatch Action To Listener ( action Bean . action , Ġaction Bean . arg , Ġlistener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġloop Finish ( e : Ġjava . lang . Exception ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Dispatch Thread . loop Finish ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠBLOCK ING _ QUEUE Ġ= ĠLinked BlockingQueue < Action Bean >() ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠHANDLE _ THREAD Ġ= ĠDispatch Thread () ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĠHANDLE _ THREAD . start () Ġ} ĊĠĠĠ Ġ} Ċ }