package Ġorg . el k oser ver . foundation . net Ċ Ċ import Ġorg . el k oser ver . foundation . byte io fr amer . Byte Io F ram er Factory Ċ import Ġorg . el k oser ver . util . trace . slf 4 j . G or gel Ċ import Ġjava . io . IOException Ċ import Ġjava . net . Inet SocketAddress Ċ import Ġjava . nio . channels . Closed Channel Exception Ċ import Ġjava . nio . channels . Selection Key Ċ import Ġjava . nio . channels . Selector Ċ import Ġjava . nio . channels . SocketChannel Ċ import Ġjava . util . Array Deque Ċ import Ġjava . util . concurrent . Callable Ċ import Ġjavax . net . ssl . SSL Context Ċ Ċ /** Ċ Ġ* ĠA Ġthread Ġfor Ġdoing Ġall Ġnetwork ĠI / O Ġoperations Ġ( send , Ġreceive , Ġaccept ) Ġusing Ċ Ġ* Ġnon - blocking ĠChannels . Ġ ĠRequests Ġto Ġopen Ġlisteners , Ġconnect Ġto Ġremote Ġhosts , Ċ Ġ* Ġand Ġsend Ġmessages Ġon Ġconnections Ġare Ġall Ġfed Ġto Ġthis Ġthread Ġvia Ġa Ġqueue . Ċ Ġ* ĠThis Ġthread Ġin Ġturn Ġfeeds Ġreceived Ġinput Ġevents Ġto Ġthe Ġrun Ġqueue . Ċ Ġ* Ċ Ġ* Ġ@ param Ġssl Context Ġ ĠSSL Ġcontext Ġto Ġuse , Ġif Ġsupporting ĠSSL , Ġelse Ġnull Ċ Ġ*/ Ċ class ĠSelect Thread ( ĊĠĠĠĠĠĠĠ Ġssl Context : ĠSSL Context ?, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcomm G or gel : ĠG or gel , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtcp ConnectionFactory : ĠTcp ConnectionFactory , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlistener Factory : ĠListener Factory ) ĊĠĠĠ Ġ: ĠThread (" El ko ĠSelect ") Ġ{ ĊĠĠĠ Ġ/** ĠSelector Ġto Ġawait Ġavailable ĠI / O Ġopport unities . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġmy Selector : ĠSelector ĊĊĠĠĠ Ġ/** ĠQueue Ġof Ġun serv iced ĠI / O Ġrequests . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġmy Queue Ġ= ĠArray Deque < Any >() ĊĊĠĠĠ Ġprivate Ġvar Ġmust Stop Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġbody Ġof Ġthe Ġthread . Ġ ĠResp ons ible Ġfor Ġde queue ing ĠI / O Ġrequests Ġand ĊĠĠĠĠ Ġ* Ġact ing Ġupon Ġthem , Ġand Ġfor Ġselecting Ġover Ġthe Ġcurrently Ġopen Ġset Ġof ĊĠĠĠĠ Ġ* Ġsockets . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġcomm G or gel . d ?. run Ġ{ Ġdebug (" select Ġthread Ġrunning ") Ġ} ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! must Stop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselected Count Ġ= Ġmy Selector . select () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomm G or gel . d ?. run Ġ{ Ġdebug (" select () Ġreturned Ġwith Ġcount =$ selected Count ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġwork ToDo Ġ= Ġmy Queue . poll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( work ToDo Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( work ToDo ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠListener Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġwork ToDo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . register ( this , Ġmy Selector ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomm G or gel . d ?. run Ġ{ Ġdebug (" select Ġthread Ġregisters Ġlistener Ġ$ listener ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCallable < *> Ġ-> Ġwork ToDo . call () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFIXME : ĠDoes Ġnot Ġhandle ĠTcp Connection . ĠSee Ġ# ready ToSend ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcomm G or gel . error (" m yst ery Ġobject Ġon Ġselect Ġqueue : Ġ$ work ToDo ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwork ToDo Ġ= Ġmy Queue . poll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( 0 Ġ< Ġselected Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiter Ġ= Ġmy Selector . selected Keys (). iterator () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( iter . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ actual Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġiter . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiter . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key . isValid Ġ&& Ġkey . is Accept able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġkey . attachment () Ġas ĠListener ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomm G or gel . d ?. run Ġ{ Ġdebug (" select Ġhas Ġaccept Ġfor Ġ$ listener ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . do Accept () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key . isValid Ġ&& Ġkey . is Readable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġkey . attachment () Ġas ĠTcp Connection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomm G or gel . d ?. run Ġ{ Ġdebug (" select Ġhas Ġread Ġfor Ġ$ connection ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . do Read () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key . isValid Ġ&& Ġkey . is Writable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġkey . attachment () Ġas ĠTcp Connection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . wake up Select For Write () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomm G or gel . d ?. run Ġ{ Ġdebug (" select Ġhas Ġwrite Ġfor Ġ$ connection ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . do Write () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( 0 Ġ< Ġactual Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomm G or gel . d ?. run Ġ{ Ġdebug (" select Ġthread Ġselected Ġ$ actual Count /$ selected Count ĠI / O Ġsources ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomm G or gel . error (" select Ġfailed ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMake Ġa Ġnew Ġoutbound ĠTCP Connection Ġto Ġanother Ġhost Ġon Ġthe Ġnet . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġhandler Factory Ġ ĠProvider Ġof Ġa Ġmessage Ġhandler Ġto Ġprocess Ġmessages ĊĠĠĠĠ Ġ* Ġreceived Ġon Ġthe Ġnew Ġconnection . ĊĠĠĠĠ Ġ* Ġ@ param Ġfram er Factory Ġ ĠByte ĠI / O Ġfram er Ġfactory Ġfor Ġthe Ġnew Ġconnection . ĊĠĠĠĠ Ġ* Ġ@ param Ġremote Addr Ġ ĠHost Ġname Ġand Ġport Ġnumber Ġto Ġconnect Ġto . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġconnect ( handler Factory : ĠMessage Handler Factory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfram er Factory : ĠByte Io F ram er Factory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremote Addr : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmy Queue . add ( Callable < Any ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremote Net Addr Ġ= ĠNet Addr ( remote Addr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsocket Address Ġ= ĠInet SocketAddress ( remote Net Addr . inet Address , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremote Net Addr . port ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomm G or gel . i ?. run Ġ{ Ġinfo (" connecting Ġto Ġ$ remote Net Addr ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠSocket Channel . open ( socket Address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Channel ( handler Factory , Ġfram er Factory , Ġchannel , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomm G or gel . error (" unable Ġto Ġconnect Ġto Ġ$ remote Addr : Ġ$ e ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler Factory . handle Connection Failure () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġmy Selector . wake up () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBegin Ġlistening Ġfor Ġinbound ĠTCP Ġconnections Ġon Ġsome Ġport . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlocal Address Ġ ĠHost Ġname Ġand Ġport Ġto Ġlisten Ġfor Ġconnections Ġon . ĊĠĠĠĠ Ġ* Ġ@ param Ġhandler Factory Ġ ĠMessage Ġhandler Ġfactory Ġto Ġprovide Ġthe Ġhandlers ĊĠĠĠĠ Ġ* Ġfor Ġconnections Ġmade Ġto Ġthis Ġport . ĊĠĠĠĠ Ġ* Ġ@ param Ġfram er Factory Ġ ĠByte ĠI / O Ġfram er Ġfactory Ġfor Ġnew Ġconnections . ĊĠĠĠĠ Ġ* Ġ@ param Ġsecure Ġ ĠIf Ġtrue , Ġuse ĠSSL . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġlisten ( local Address : ĠString , Ġhandler Factory : ĠMessage Handler Factory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfram er Factory : ĠByte Io F ram er Factory , Ġsecure : ĠBoolean ): ĠListener Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlistener Factory . create ( local Address , Ġhandler Factory , Ġfram er Factory , Ġsecure ) ĊĠĠĠĠĠĠĠ Ġmy Queue . add ( listener ) ĊĠĠĠĠĠĠĠ Ġmy Selector . wake up () ĊĠĠĠĠĠĠĠ Ġreturn Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandle Ġthe Ġestablish ment Ġof Ġa Ġnew Ġconnection Ġas Ġthe Ġresult Ġof Ġan ĊĠĠĠĠ Ġ* Ġoutbound Ġconnection Ġmade Ġto Ġanother Ġhost Ġor Ġan Ġaccept Ġoperation Ġby Ġa ĊĠĠĠĠ Ġ* Ġlistener . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġhandler Factory Ġ ĠMessage Ġhandler Ġfactory Ġto Ġprovide Ġthe Ġhandlers ĊĠĠĠĠ Ġ* Ġfor Ġthe Ġnew Ġconnection . ĊĠĠĠĠ Ġ* Ġ@ param Ġfram er Factory Ġ ĠByte ĠI / O Ġfram er Ġfactory Ġfor Ġthe Ġnew Ġconnection . ĊĠĠĠĠ Ġ* Ġ@ param Ġchannel Ġ ĠThe Ġnew Ġchannel Ġfor Ġthe Ġnew Ġconnection . ĊĠĠĠĠ Ġ* Ġ@ param Ġis Secure Ġ ĠIf Ġtrue , Ġthis Ġwill Ġbe Ġan ĠSSL Ġconnection . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnew Channel ( handler Factory : ĠMessage Handler Factory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfram er Factory : ĠByte Io F ram er Factory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel : ĠSocket Channel , Ġis Secure : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . configure Blocking ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġchannel . register ( my Selector , ĠSelection Key . OP _ READ ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey . attach ( tcp ConnectionFactory . create ( handler Factory , Ġfram er Factory , Ġchannel , Ġis Secure , Ġkey , Ġthis )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClosed Channel Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler Factory . handle Connection Failure () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomm G or gel . error (" channel Ġclosed Ġbefore Ġit Ġcould Ġbe Ġused ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler Factory . handle Connection Failure () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomm G or gel . error (" tro uble Ġopening ĠTCP Connection Ġfor Ġchannel ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e 2 : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠSo Ġif Ġclose Ġfails , Ġwe 're Ġsupposed Ġto Ġdo Ġwhat ? Ġ ĠClose ? Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNotify Ġthis Ġthread Ġthat Ġa Ġconnection Ġnow Ġhas Ġmessages Ġqueued Ġready Ġfor ĊĠĠĠĠ Ġ* Ġtransmission . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġconnection Ġ ĠThe Ġconnection Ġthat Ġhas Ġmessages Ġready Ġto Ġsend . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġready ToSend ( connection : ĠTcp Connection ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcomm G or gel . d ?. run Ġ{ Ġdebug ("$ connection Ġready Ġto Ġsend ") Ġ} ĊĠĠĠĠĠĠĠ Ġmy Queue . add ( connection ) ĊĠĠĠĠĠĠĠ Ġmy Selector . wake up () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshut Down () Ġ{ ĊĠĠĠĠĠĠĠ Ġmust Stop Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġinterrupt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Selector Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( false Ġ&& Ġssl Context Ġ!= Ġnull ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSSL Selector . open ( ssl Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSelector . open () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomm G or gel . error (" failed Ġto Ġstart ĠSelect Thread ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ