package Ġcom . on eli ang . k tx . util . state Ċ Ċ import Ġcom . on eli ang . k tx . util . logging . Logger Manager Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġjava . util . concurrent . Concurrent Linked Queue Ċ Ċ class ĠState Map < K , ĠT Ġ: ĠState < K >>( val Ġstart State : ĠT , Ġinitialize State Map : ĠMap < K , ĠT > Ġ= Ġempty Map ()) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLogger Manager . getLogger ( State Map :: class ) ĊĊĠĠĠĠĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġ< K > Ġprint State ( start State : ĠState < K >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" key :% s , Ġname :% s ", Ġstart State . key , Ġstart State . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( start State . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext State Key Set Ġ= Ġstart State . next Key Set ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( next Key Ġin Ġnext State Key Set ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext State Ġ= Ġstart State . next ( next Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint State ( next State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġstate Map Ġ= ĠConcurrent HashMap < K , ĠT >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġinitialize State Map . forEach Ġ{ Ġ( key , Ġstate ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Map [ key ] Ġ= Ġstate ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtravel All Next State To State Map ( this . start State ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġprivate Ġfun Ġtravel All Next State To State Map ( state : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġqueue Ġ= ĠConcurrent Linked Queue < T >() ĊĠĠĠĠĠĠĠ Ġqueue Ġ+= Ġstate ĊĠĠĠĠĠĠĠ Ġthis . state Map [ state . key ] Ġ= Ġstate ĊĠĠĠĠĠĠĠ Ġwhile Ġ( queue . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent State Ġ= Ġqueue . poll () !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentState . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext State Key Set Ġ= Ġcurrent State . next Key Set ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( next Key Ġin Ġnext State Key Set ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext State Ġ= Ġcurrent State . next ( next Key ) Ġas ĠT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! this . state Map . containsKey ( next State . key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Map [ next State . key ] Ġ= Ġnext State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue Ġ+= Ġnext State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetState ( key : ĠK ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . state Map . containsKey ( key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . state Map [ key ] !! ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠState . State NotFoundException (" state Ġkey :% s Ġis Ġnot Ġexist :% s ". format ( key )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Next State ( key : ĠK , Ġnext State : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . state Map . containsKey ( key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious State Ġ= Ġthis . state Map [ key ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious State . add Next State ( next State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Map [ next State . key ] Ġ= Ġnext State ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" state Ġkey :% s Ġis Ġnot Ġexist ", Ġkey ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġcheck Ġprevious ĊĠĠĠĠ Ġ* Ġ@ param Ġkey ĊĠĠĠĠ Ġ* Ġ@ param Ġprevious Key ĊĠĠĠĠ Ġ* Ġ@ return ĠBoolean ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcheck Previous ( key : ĠK , Ġprevious Key : ĠK ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . state Map . containsKey ( key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . state Map [ key ]?. check Previous ( previous Key ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġcheck Ġnext ĊĠĠĠĠ Ġ* Ġ@ param Ġkey ĊĠĠĠĠ Ġ* Ġ@ param Ġnext Key ĊĠĠĠĠ Ġ* Ġ@ return ĠBoolean ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcheck Next ( key : ĠK , Ġnext Key : ĠK ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . state Map . containsKey ( key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . state Map [ key ]?. check Next ( next Key ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprint State () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint State ( this . start State ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" state Ġnot Ġfound ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ