package com.flexpoker.game.query.eventsubscribers; import java.util.HashMap; import java.util.Map; import java.util.Timer; import java.util.TimerTask; import javax.inject.Inject; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import com.flexpoker.framework.event.Event; import com.flexpoker.framework.event.EventHandler; import com.flexpoker.framework.event.subscriber.EventSubscriber; import com.flexpoker.framework.event.subscriber.InMemoryThreadSafeEventSubscriberHelper; import com.flexpoker.game.command.events.GameCreatedEvent; import com.flexpoker.game.command.events.GameJoinedEvent; import com.flexpoker.game.command.events.GameMovedToStartingStageEvent; import com.flexpoker.game.command.events.GameStartedEvent; import com.flexpoker.game.command.events.PlayerBustedGameEvent; import com.flexpoker.game.command.framework.GameEvent; @Component("gameEventSubscriber") public class InMemoryAsyncGameEventSubscriber implements EventSubscriber<GameEvent> { private final InMemoryThreadSafeEventSubscriberHelper inMemoryThreadSafeEventSubscriberHelper; private final EventHandler<GameCreatedEvent> gameCreatedEventHandler; private final EventHandler<GameJoinedEvent> gameJoinedEventHandler; private final EventHandler<GameMovedToStartingStageEvent> gameMovedToStartingStageEventHandler; private final EventHandler<GameStartedEvent> gameStartedEventHandler; private final EventHandler<PlayerBustedGameEvent> playerBustedGameEventHandler; @Inject public InMemoryAsyncGameEventSubscriber( InMemoryThreadSafeEventSubscriberHelper inMemoryThreadSafeEventSubscriberHelper, EventHandler<GameCreatedEvent> gameCreatedEventHandler, EventHandler<GameJoinedEvent> gameJoinedEventHandler, EventHandler<GameMovedToStartingStageEvent> gameMovedToStartingStageEventHandler, EventHandler<GameStartedEvent> gameStartedEventHandler, EventHandler<PlayerBustedGameEvent> playerBustedGameEventHandler) { this.inMemoryThreadSafeEventSubscriberHelper = inMemoryThreadSafeEventSubscriberHelper; this.gameCreatedEventHandler = gameCreatedEventHandler; this.gameJoinedEventHandler = gameJoinedEventHandler; this.gameMovedToStartingStageEventHandler = gameMovedToStartingStageEventHandler; this.gameStartedEventHandler = gameStartedEventHandler; this.playerBustedGameEventHandler = playerBustedGameEventHandler; this.inMemoryThreadSafeEventSubscriberHelper.setHandlerMap(createEventHandlerMap()); } @Async @Override public void receive(GameEvent event) { inMemoryThreadSafeEventSubscriberHelper.receive(event); } private Map<Class<? extends Event>, EventHandler<? extends Event>> createEventHandlerMap() { Map<Class<? extends Event>, EventHandler<? extends Event>> eventHandlerMap = new HashMap<>(); eventHandlerMap.put(GameCreatedEvent.class, gameCreatedEventHandler); eventHandlerMap.put(GameJoinedEvent.class, gameJoinedEventHandler); eventHandlerMap.put(GameMovedToStartingStageEvent.class, gameMovedToStartingStageEventHandler); eventHandlerMap.put(GameStartedEvent.class, x -> { final Timer timer = new Timer(); final TimerTask timerTask = new TimerTask() { @Override public void run() { gameStartedEventHandler.handle((GameStartedEvent) x); } }; timer.schedule(timerTask, 10000); }); eventHandlerMap.put(PlayerBustedGameEvent.class, playerBustedGameEventHandler); return eventHandlerMap; } }