From 7686000c06beb00d2ecce4c03190927bb3978f13 Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Wed, 16 Jan 2013 20:39:11 +0000 Subject: [PATCH] Added RecurringScheduledQueue. --- .../com/gempukku/lotro/hall/HallServer.java | 12 +-- .../tournament/AbstractTournamentQueue.java | 55 +++++++++++-- ...ueue.java => ImmediateRecurringQueue.java} | 46 +---------- .../tournament/RecurringScheduledQueue.java | 79 +++++++++++++++++++ .../tournament/ScheduledTournamentQueue.java | 37 +-------- .../SingleEliminationRecurringQueueTest.java | 20 ++--- 6 files changed, 149 insertions(+), 100 deletions(-) rename gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/{SingleEliminationRecurringQueue.java => ImmediateRecurringQueue.java} (64%) create mode 100644 gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/RecurringScheduledQueue.java diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallServer.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallServer.java index 71b0cbe32..caa00ecc6 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallServer.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallServer.java @@ -72,15 +72,15 @@ public class HallServer extends AbstractServer { _pairingMechanismRegistry = pairingMechanismRegistry; _hallChat = _chatServer.createChatRoom("Game Hall", true, 10); - _tournamentQueues.put("fotr_queue", new SingleEliminationRecurringQueue(635, "fotr_block", + _tournamentQueues.put("fotr_queue", new ImmediateRecurringQueue(635, "fotr_block", CollectionType.ALL_CARDS, "fotrQueue-", "Fellowship Block", 8, - true, tournamentService, _tournamentPrizeSchemeRegistry.getTournamentPrizes("onDemand"))); - _tournamentQueues.put("movie_queue", new SingleEliminationRecurringQueue(635, "movie", + true, tournamentService, _tournamentPrizeSchemeRegistry.getTournamentPrizes("onDemand"), _pairingMechanismRegistry.getPairingMechanism("singleElimination"))); + _tournamentQueues.put("movie_queue", new ImmediateRecurringQueue(635, "movie", CollectionType.ALL_CARDS, "movieQueue-", "Movie Block", 8, - true, tournamentService, _tournamentPrizeSchemeRegistry.getTournamentPrizes("onDemand"))); - _tournamentQueues.put("expanded_queue", new SingleEliminationRecurringQueue(635, "expanded", + true, tournamentService, _tournamentPrizeSchemeRegistry.getTournamentPrizes("onDemand"), _pairingMechanismRegistry.getPairingMechanism("singleElimination"))); + _tournamentQueues.put("expanded_queue", new ImmediateRecurringQueue(635, "expanded", CollectionType.ALL_CARDS, "expandedQueue-", "Expanded", 8, - true, tournamentService, _tournamentPrizeSchemeRegistry.getTournamentPrizes("onDemand"))); + true, tournamentService, _tournamentPrizeSchemeRegistry.getTournamentPrizes("onDemand"), _pairingMechanismRegistry.getPairingMechanism("singleElimination"))); } @Override diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/AbstractTournamentQueue.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/AbstractTournamentQueue.java index 6beaab1b4..6fcf96426 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/AbstractTournamentQueue.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/AbstractTournamentQueue.java @@ -15,17 +15,41 @@ public abstract class AbstractTournamentQueue implements TournamentQueue { protected Queue _players = new LinkedList(); protected Map _playerDecks = new HashMap(); protected boolean _requiresDeck; - + private CollectionType _currencyCollection = CollectionType.MY_CARDS; - public AbstractTournamentQueue(int cost, boolean requiresDeck) { + protected final PairingMechanism _pairingMechanism; + protected final CollectionType _collectionType; + protected final TournamentPrizes _tournamentPrizes; + protected String _format; + + public AbstractTournamentQueue(int cost, boolean requiresDeck, CollectionType collectionType, TournamentPrizes tournamentPrizes, PairingMechanism pairingMechanism, String format) { _cost = cost; _requiresDeck = requiresDeck; + _collectionType = collectionType; + _tournamentPrizes = tournamentPrizes; + _pairingMechanism = pairingMechanism; + _format = format; } @Override - public synchronized void joinPlayer(CollectionsManager collectionsManager, Player player, LotroDeck deck) { - if (!_players.contains(player.getName())) { + public String getPairingDescription() { + return _pairingMechanism.getPlayOffSystem(); + } + + @Override + public final CollectionType getCollectionType() { + return _collectionType; + } + + @Override + public final String getPrizesDescription() { + return _tournamentPrizes.getPrizeDescription(); + } + + @Override + public final synchronized void joinPlayer(CollectionsManager collectionsManager, Player player, LotroDeck deck) { + if (!_players.contains(player.getName()) && isJoinable()) { if (_cost <= 0 || collectionsManager.removeCurrencyFromPlayerCollection("Joined "+getTournamentQueueName()+" queue", player, _currencyCollection, _cost)) { _players.add(player.getName()); if (_requiresDeck) @@ -35,7 +59,7 @@ public abstract class AbstractTournamentQueue implements TournamentQueue { } @Override - public synchronized void leavePlayer(CollectionsManager collectionsManager, Player player) { + public final synchronized void leavePlayer(CollectionsManager collectionsManager, Player player) { if (_players.contains(player.getName())) { if (_cost > 0) collectionsManager.addCurrencyToPlayerCollection(true, "Return for leaving "+getTournamentQueueName()+" queue", player, _currencyCollection, _cost); @@ -45,7 +69,7 @@ public abstract class AbstractTournamentQueue implements TournamentQueue { } @Override - public synchronized void leaveAllPlayers(CollectionsManager collectionsManager) { + public final synchronized void leaveAllPlayers(CollectionsManager collectionsManager) { if (_cost > 0) { for (String player : _players) collectionsManager.addCurrencyToPlayerCollection(false, "Return for leaving "+getTournamentQueueName()+" queue", player, _currencyCollection, _cost); @@ -55,12 +79,27 @@ public abstract class AbstractTournamentQueue implements TournamentQueue { } @Override - public synchronized int getPlayerCount() { + public final synchronized int getPlayerCount() { return _players.size(); } @Override - public synchronized boolean isPlayerSignedUp(String player) { + public final synchronized boolean isPlayerSignedUp(String player) { return _players.contains(player); } + + @Override + public final int getCost() { + return _cost; + } + + @Override + public final boolean isRequiresDeck() { + return _requiresDeck; + } + + @Override + public final String getFormat() { + return _format; + } } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/SingleEliminationRecurringQueue.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/ImmediateRecurringQueue.java similarity index 64% rename from gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/SingleEliminationRecurringQueue.java rename to gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/ImmediateRecurringQueue.java index 0ac38aa80..4da84402a 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/SingleEliminationRecurringQueue.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/ImmediateRecurringQueue.java @@ -6,43 +6,20 @@ import com.gempukku.lotro.db.vo.CollectionType; import java.util.Date; -public class SingleEliminationRecurringQueue extends AbstractTournamentQueue implements TournamentQueue { - private String _format; - private CollectionType _collectionType; +public class ImmediateRecurringQueue extends AbstractTournamentQueue implements TournamentQueue { private String _tournamentQueueName; - private int _playerCap; - private TournamentService _tournamentService; - private TournamentPrizes _tournamentPrizes; private String _tournamentIdPrefix; - public SingleEliminationRecurringQueue(int cost, String format, CollectionType collectionType, String tournamentIdPrefix, + public ImmediateRecurringQueue(int cost, String format, CollectionType collectionType, String tournamentIdPrefix, String tournamentQueueName, int playerCap, boolean requiresDeck, - TournamentService tournamentService, TournamentPrizes tournamentPrizes) { - super(cost, requiresDeck); - _format = format; - _collectionType = collectionType; + TournamentService tournamentService, TournamentPrizes tournamentPrizes, PairingMechanism pairingMechanism) { + super(cost, requiresDeck, collectionType, tournamentPrizes, pairingMechanism, format); _tournamentQueueName = tournamentQueueName; _playerCap = playerCap; _tournamentIdPrefix = tournamentIdPrefix; _tournamentService = tournamentService; - _tournamentPrizes = tournamentPrizes; - } - - @Override - public int getCost() { - return _cost; - } - - @Override - public String getFormat() { - return _format; - } - - @Override - public CollectionType getCollectionType() { - return _collectionType; } @Override @@ -50,26 +27,11 @@ public class SingleEliminationRecurringQueue extends AbstractTournamentQueue imp return _tournamentQueueName; } - @Override - public String getPrizesDescription() { - return _tournamentPrizes.getPrizeDescription(); - } - - @Override - public String getPairingDescription() { - return "Single elimination"; - } - @Override public String getStartCondition() { return "When "+_playerCap+" players join"; } - @Override - public boolean isRequiresDeck() { - return _requiresDeck; - } - @Override public synchronized boolean process(TournamentQueueCallback tournamentQueueCallback, CollectionsManager collectionsManager) { if (_players.size() >= _playerCap) { diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/RecurringScheduledQueue.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/RecurringScheduledQueue.java new file mode 100644 index 000000000..ed5f0a391 --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/RecurringScheduledQueue.java @@ -0,0 +1,79 @@ +package com.gempukku.lotro.tournament; + +import com.gempukku.lotro.DateUtils; +import com.gempukku.lotro.collection.CollectionsManager; +import com.gempukku.lotro.db.vo.CollectionType; + +import java.util.Date; + +public class RecurringScheduledQueue extends AbstractTournamentQueue implements TournamentQueue { + private static final long _signupTimeBeforeStart = 1000 * 60 * 15; // 15 minutes before start + + private long _repeatEvery; + private long _nextStart; + private String _nextStartText; + + private String _tournamentIdPrefix; + private String _tournamentQueueName; + + private int _minimumPlayers; + private TournamentService _tournamentService; + + public RecurringScheduledQueue(long originalStart, long repeatEvery, String tournamentIdPrefix, + String tournamentQueueName, int cost, boolean requiresDeck, + CollectionType collectionType, + TournamentService tournamentService, TournamentPrizes tournamentPrizes, PairingMechanism pairingMechanism, String format, int minimumPlayers) { + super(cost, requiresDeck, collectionType, tournamentPrizes, pairingMechanism, format); + _repeatEvery = repeatEvery; + _tournamentIdPrefix = tournamentIdPrefix; + _tournamentQueueName = tournamentQueueName; + _tournamentService = tournamentService; + _minimumPlayers = minimumPlayers; + long number = (System.currentTimeMillis() - originalStart) / repeatEvery; + + _nextStart = originalStart + (number + 1) * repeatEvery; + _nextStartText = DateUtils.formatDateWithHour(new Date(_nextStart)); + } + + + @Override + public String getStartCondition() { + return _nextStartText; + } + + @Override + public String getTournamentQueueName() { + return _tournamentQueueName; + } + + @Override + public boolean isJoinable() { + return System.currentTimeMillis() >= _nextStart - _signupTimeBeforeStart; + } + + @Override + public boolean process(TournamentQueueCallback tournamentQueueCallback, CollectionsManager collectionsManager) { + long now = System.currentTimeMillis(); + if (now > _nextStart) { + if (_players.size() >= _minimumPlayers) { + String tournamentId = _tournamentIdPrefix+System.currentTimeMillis(); + String tournamentName = _tournamentQueueName + " - " + DateUtils.getStringDateWithHour(); + + for (String player : _players) + _tournamentService.addPlayer(tournamentId, player, _playerDecks.get(player)); + + Tournament tournament = _tournamentService.addTournament(tournamentId, null, tournamentName, _format, _collectionType, Tournament.Stage.PLAYING_GAMES, + _pairingMechanism.getRegistryRepresentation(), _tournamentPrizes.getRegistryRepresentation(), new Date()); + tournamentQueueCallback.createTournament(tournament); + + _players.clear(); + _playerDecks.clear(); + } else { + leaveAllPlayers(collectionsManager); + } + _nextStart+=_repeatEvery; + _nextStartText = DateUtils.formatDateWithHour(new Date(_nextStart)); + } + return false; + } +} \ No newline at end of file diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/ScheduledTournamentQueue.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/ScheduledTournamentQueue.java index 7d5585049..245b7b347 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/ScheduledTournamentQueue.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/ScheduledTournamentQueue.java @@ -13,43 +13,22 @@ public class ScheduledTournamentQueue extends AbstractTournamentQueue implements private String _startCondition; private TournamentService _tournamentService; private String _tournamentName; - private String _format; private CollectionType _collectionType; private Tournament.Stage _stage; - private PairingMechanism _pairingMechanism; - private TournamentPrizes _prizeScheme; private String _scheduledTournamentId; public ScheduledTournamentQueue(String scheduledTournamentId, int cost, boolean requiresDeck, TournamentService tournamentService, long startTime, String tournamentName, String format, CollectionType collectionType, Tournament.Stage stage, - PairingMechanism pairingMechanism, TournamentPrizes prizeScheme, int minimumPlayers) { - super(cost, requiresDeck); + PairingMechanism pairingMechanism, TournamentPrizes tournamentPrizes, int minimumPlayers) { + super(cost, requiresDeck, collectionType, tournamentPrizes, pairingMechanism, format); _scheduledTournamentId = scheduledTournamentId; _tournamentService = tournamentService; _startTime = startTime; _minimumPlayers = minimumPlayers; _startCondition = DateUtils.formatDateWithHour(new Date(_startTime)); _tournamentName = tournamentName; - _format = format; _collectionType = collectionType; _stage = stage; - _pairingMechanism = pairingMechanism; - _prizeScheme = prizeScheme; - } - - @Override - public int getCost() { - return _cost; - } - - @Override - public String getFormat() { - return _format; - } - - @Override - public CollectionType getCollectionType() { - return _collectionType; } @Override @@ -57,11 +36,6 @@ public class ScheduledTournamentQueue extends AbstractTournamentQueue implements return _tournamentName; } - @Override - public String getPrizesDescription() { - return _prizeScheme.getPrizeDescription(); - } - @Override public String getPairingDescription() { return _pairingMechanism.getPlayOffSystem() + ", minimum players: " + _minimumPlayers; @@ -72,11 +46,6 @@ public class ScheduledTournamentQueue extends AbstractTournamentQueue implements return _startCondition; } - @Override - public boolean isRequiresDeck() { - return _requiresDeck; - } - @Override public synchronized boolean process(TournamentQueueCallback tournamentQueueCallback, CollectionsManager collectionsManager) { long now = System.currentTimeMillis(); @@ -87,7 +56,7 @@ public class ScheduledTournamentQueue extends AbstractTournamentQueue implements _tournamentService.addPlayer(_scheduledTournamentId, player, _playerDecks.get(player)); Tournament tournament = _tournamentService.addTournament(_scheduledTournamentId, null, _tournamentName, _format, _collectionType, _stage, - _pairingMechanism.getRegistryRepresentation(), _prizeScheme.getRegistryRepresentation(), new Date()); + _pairingMechanism.getRegistryRepresentation(), _tournamentPrizes.getRegistryRepresentation(), new Date()); tournamentQueueCallback.createTournament(tournament); } else { _tournamentService.updateScheduledTournamentStarted(_scheduledTournamentId); diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/tournament/SingleEliminationRecurringQueueTest.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/tournament/SingleEliminationRecurringQueueTest.java index 1d5edcf24..b2a14ae82 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/tournament/SingleEliminationRecurringQueueTest.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/tournament/SingleEliminationRecurringQueueTest.java @@ -15,8 +15,8 @@ public class SingleEliminationRecurringQueueTest { public void joiningQueue() { TournamentService tournamentService = Mockito.mock(TournamentService.class); - SingleEliminationRecurringQueue queue = new SingleEliminationRecurringQueue(10, "format", CollectionType.MY_CARDS, - "id-", "name-", 2, false, tournamentService, new NoPrizes()); + ImmediateRecurringQueue queue = new ImmediateRecurringQueue(10, "format", CollectionType.MY_CARDS, + "id-", "name-", 2, false, tournamentService, new NoPrizes(), new SingleEliminationPairing("singleElimination")); Player player = new Player(1, "p1", "u", null); @@ -37,8 +37,8 @@ public class SingleEliminationRecurringQueueTest { public void leavingQueue() { TournamentService tournamentService = Mockito.mock(TournamentService.class); - SingleEliminationRecurringQueue queue = new SingleEliminationRecurringQueue(10, "format", CollectionType.MY_CARDS, - "id-", "name-", 2, false, tournamentService, new NoPrizes()); + ImmediateRecurringQueue queue = new ImmediateRecurringQueue(10, "format", CollectionType.MY_CARDS, + "id-", "name-", 2, false, tournamentService, new NoPrizes(), new SingleEliminationPairing("singleElimination")); Player player = new Player(1, "p1", "u", null); @@ -62,8 +62,8 @@ public class SingleEliminationRecurringQueueTest { public void cancellingQueue() { TournamentService tournamentService = Mockito.mock(TournamentService.class); - SingleEliminationRecurringQueue queue = new SingleEliminationRecurringQueue(10, "format", CollectionType.MY_CARDS, - "id-", "name-", 2, false, tournamentService, new NoPrizes()); + ImmediateRecurringQueue queue = new ImmediateRecurringQueue(10, "format", CollectionType.MY_CARDS, + "id-", "name-", 2, false, tournamentService, new NoPrizes(), new SingleEliminationPairing("singleElimination")); Player player = new Player(1, "p1", "u", null); @@ -92,8 +92,8 @@ public class SingleEliminationRecurringQueueTest { Mockito.eq(CollectionType.MY_CARDS), Mockito.eq(Tournament.Stage.PLAYING_GAMES), Mockito.eq("singleElimination"), Mockito.anyString(), Mockito.any())) .thenReturn(tournament); - SingleEliminationRecurringQueue queue = new SingleEliminationRecurringQueue(10, "format", CollectionType.MY_CARDS, - "id-", "name-", 2, false, tournamentService, new NoPrizes()); + ImmediateRecurringQueue queue = new ImmediateRecurringQueue(10, "format", CollectionType.MY_CARDS, + "id-", "name-", 2, false, tournamentService, new NoPrizes(), new SingleEliminationPairing("singleElimination")); Player player1 = new Player(1, "p1", "u", null); @@ -139,8 +139,8 @@ public class SingleEliminationRecurringQueueTest { Mockito.eq(CollectionType.MY_CARDS), Mockito.eq(Tournament.Stage.PLAYING_GAMES), Mockito.eq("singleElimination"), Mockito.anyString(), Mockito.any())) .thenReturn(tournament); - SingleEliminationRecurringQueue queue = new SingleEliminationRecurringQueue(10, "format", CollectionType.MY_CARDS, - "id-", "name-", 2, false, tournamentService, new NoPrizes()); + ImmediateRecurringQueue queue = new ImmediateRecurringQueue(10, "format", CollectionType.MY_CARDS, + "id-", "name-", 2, false, tournamentService, new NoPrizes(), new SingleEliminationPairing("singleElimination")); Player player1 = new Player(1, "p1", "u", null); Player player2 = new Player(2, "p2", "u", null);