/* - Ċ Ġ* Ġ#% L Ċ Ġ* Ġmatch making . server Ċ Ġ* Ġ%% Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 6 Ġ- Ġ 2 0 1 9 ĠFre der ik ĠK am mel Ċ Ġ* Ġ%% Ċ Ġ* Ġ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 . Ċ Ġ* Ġ# L % Ċ Ġ*/ Ċ package Ġcom . github . vat b ub . match making . server . logic . ro omp ro viders Ċ Ċ import Ġcom . github . vat b ub . match making . common . data . Room Ċ import Ġcom . github . vat b ub . match making . common . logger Ċ import Ġcom . github . vat b ub . match making . server . logic . ro omp ro viders . data . Observable Room Ċ import Ġcom . github . vat b ub . match making . server . logic . ro omp ro viders . data . Room Transaction Ċ import Ġkotlin . random . Random Ċ Ċ /** Ċ Ġ* ĠThis Ġimplementation Ġof Ġ[ Room Provider ] Ġkeeps Ġthe Ġprovided Ġrooms Ġin Ġmemory . ĠThis Ġimplementation Ġtherefore Ċ Ġ* Ġ- Ġ* does Ġnot * Ġsupport Ġsharing Ġdata Ġacross Ġmultiple Ġnodes Ċ Ġ* Ġ- Ġ* does Ġnot * Ġpersist Ġits Ġdata Ġacross Ġserver Ġrestart s Ċ Ġ*/ Ċ open Ġclass ĠMemory Room Provider Ġ: ĠRoom Provider () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġsupports Concurrent Transactions On Same Room Ġ= Ġfalse ĊĊĠĠĠ Ġinternal Ġval Ġrooms Ġ= Ġmutable Map Of < String , ĠRoom >() ĊĠĠĠ Ġprivate Ġval Ġpending Transactions Ġ= Ġmutable Map Of < String , ĠRoom Transaction >() ĊĊĠĠĠ Ġoverride Ġfun Ġbegin Transaction With Room ( id : ĠString ): ĠRoom Transaction ? Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ" Beginning Ġa Ġtransaction Ġfor Ġroom Ġ$ id ..." Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġroom Ġ= Ġrooms [ id ] Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= ĠRoom Transaction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable Room ( room ), Ġthis ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( pending Transactions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! pending Transactions . containsKey ( room . id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpending Transactions [ room . id ] Ġ= Ġtransaction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtransaction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcommit Transaction Impl ( room Transaction : ĠRoom Transaction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ" Commit ting Ġa Ġroom Ġtransaction Ġfor Ġroom Ġ${ room Transaction . room . id }" Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! pending Transactions . contains Value ( room Transaction )) Ġreturn ĊĠĠĠĠĠĠĠ Ġrooms [ room Transaction . room . id ] Ġ= Ġroom Transaction . room . to Room () ĊĠĠĠĠĠĠĠ Ġpending Transactions . remove ( room Transaction . room . id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġabort Transaction ( room Transaction : ĠRoom Transaction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ" Abort ing Ġa Ġroom Ġtransaction Ġfor Ġroom Ġ${ room Transaction . room . id }" Ġ} ĊĠĠĠĠĠĠĠ Ġpending Transactions . remove ( room Transaction . room . id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetAll Rooms (): ĠCollection < Room > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrooms . values . toList () Ġ// Ġcopy Ġthe Ġlist ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcontains Room ( id : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrooms . containsKey ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate New Room ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhost User Connection Id : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhitelist : ĠList < String > ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblacklist : ĠList < String > ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Room Size : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Room Size : ĠInt ĊĠĠĠ Ġ): ĠRoom Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ" Creating Ġa Ġnew Ġroom ..." Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġroom Id AsString : ĠString ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġroom Id Ġ= ĠRandom . nextInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( roomId Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroom Id Ġ= Ġ- roomId ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġroom Id AsString Ġ= Ġroom Id . toString ( 1 6 ) ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( contains Room ( roomId AsString )) ĊĊĠĠĠĠĠĠĠ Ġval Ġroom Ġ= ĠRoom ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroom Id AsString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhost User Connection Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhitelist , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblacklist , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Room Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Room Size ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrooms [ roomId AsString ] Ġ= Ġroom ĊĠĠĠĠĠĠĠ Ġreturn Ġroom ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget ( id : ĠString ) Ġ= Ġrooms [ id ]?. copy () ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Room ( id : ĠString ): ĠRoom ? Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ" Deleting Ġroom Ġwith Ġid Ġ$ id ..." Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġrooms . remove ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclear Rooms () Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" Deleting Ġall Ġrooms Ġfrom Ġmemory ..." Ġ} ĊĠĠĠĠĠĠĠ Ġrooms . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠforEach ( action : Ġ( room : ĠRoom ) Ġ-> ĠUnit ) Ġ= Ġrooms . forEach Ġ{ Ġ(_, Ġroom ) Ġ-> Ġaction ( room ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠforEach Transaction ( action : Ġ( transaction : ĠRoom Transaction ) Ġ-> ĠUnit ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠforEach Ġ{ Ġroom Ġ-> Ġaction ( beginTransaction With Room ( room . id ) !! ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfilter ( filter : Ġ( room : ĠRoom ) Ġ-> ĠBoolean ): ĠCollection < Room > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < Room >() ĊĠĠĠĠĠĠĠ Ġrooms . filter Ġ{ Ġfilter ( it . value ) Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( it . value . copy ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( java Class Ġ!= Ġother ?. java Class ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġother Ġas ĠMemory Room Provider ĊĊĠĠĠĠĠĠĠ Ġif Ġ( supports Concurrent Transactions On Same Room Ġ!= Ġother . supports Concurrent Transactions On Same Room ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( rooms Ġ!= Ġother . rooms ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( pending Transactions Ġ!= Ġother . pending Transactions ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġsupports Concurrent Transactions On Same Room . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġrooms . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġpending Transactions . hashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ } Ċ