From ad3202508067802027dac85b508bbfd51013f519 Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Thu, 2 Aug 2012 12:13:55 +0000 Subject: [PATCH] Working on drafts. --- .../gempukku/lotro/draft/DefaultDraft.java | 10 +++- .../java/com/gempukku/lotro/draft/Draft.java | 2 + .../gempukku/lotro/draft/DraftCallback.java | 2 +- .../com/gempukku/lotro/draft/DraftServer.java | 52 +++++++++++++++++++ .../gempukku/lotro/hall/HallInfoVisitor.java | 2 + .../com/gempukku/lotro/hall/HallServer.java | 38 +++++++------- .../tournament/TournamentQueueCallback.java | 4 ++ .../lotro/server/provider/ServerProvider.java | 23 +++++++- 8 files changed, 110 insertions(+), 23 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft/DraftServer.java diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft/DefaultDraft.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft/DefaultDraft.java index ca371282c..6cf629f58 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft/DefaultDraft.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft/DefaultDraft.java @@ -38,6 +38,7 @@ public class DefaultDraft implements Draft { private int _playerCount; private boolean _deckBuildingStarted; + private boolean _tournamentStarted; private long _lastPickStart; private long _deckBuildStart; @@ -156,6 +157,11 @@ public class DefaultDraft implements Draft { return false; } + @Override + public boolean isFinished() { + return _tournamentStarted; + } + private void startTournament(DraftCallback draftCallback) { String parameters = _format + "," + _collectionType.getCode() + "," + _collectionType.getFullName() + "," + _tournamentName; @@ -164,7 +170,9 @@ public class DefaultDraft implements Draft { Tournament tournament = _tournamentService.addTournament(_tournamentId, SingleEliminationTournament.class.getName(), parameters, new Date()); - draftCallback.convertToTournament(tournament); + draftCallback.createTournament(tournament); + + _tournamentStarted = true; } private boolean haveAllPlayersSubmittedDecks() { diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft/Draft.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft/Draft.java index ca925a520..dc9b5617d 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft/Draft.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft/Draft.java @@ -14,4 +14,6 @@ public interface Draft { public boolean isPlayerInDraft(String player); public DraftCardChoice getCardChoice(String playerName); + + public boolean isFinished(); } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft/DraftCallback.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft/DraftCallback.java index 01c116564..9297ab57a 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft/DraftCallback.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft/DraftCallback.java @@ -3,5 +3,5 @@ package com.gempukku.lotro.draft; import com.gempukku.lotro.tournament.Tournament; public interface DraftCallback { - public void convertToTournament(Tournament tournament); + public void createTournament(Tournament tournament); } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft/DraftServer.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft/DraftServer.java new file mode 100644 index 000000000..28240b26e --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft/DraftServer.java @@ -0,0 +1,52 @@ +package com.gempukku.lotro.draft; + +import com.gempukku.lotro.AbstractServer; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +public class DraftServer extends AbstractServer { + private Map _draftCallbackMap = new HashMap(); + + private ReadWriteLock _lock = new ReentrantReadWriteLock(); + + public void addDraft(Draft draft, DraftCallback draftCallback) { + _lock.writeLock().lock(); + try { + _draftCallbackMap.put(draft, draftCallback); + } finally { + _lock.writeLock().unlock(); + } + } + + public boolean isPlayerDrafting(String playerId) { + _lock.readLock().lock(); + try { + for (Draft draft : _draftCallbackMap.keySet()) { + if (draft.isPlayerInDraft(playerId)) + return true; + } + return false; + } finally { + _lock.readLock().unlock(); + } + } + + @Override + protected void cleanup() { + _lock.writeLock().lock(); + try { + Map draftCallbackMap = new HashMap(_draftCallbackMap); + for (Map.Entry draftDraftCallbackEntry : draftCallbackMap.entrySet()) { + Draft draft = draftDraftCallbackEntry.getKey(); + draft.advanceDraft(draftDraftCallbackEntry.getValue()); + if (draft.isFinished()) + _draftCallbackMap.remove(draft); + } + } finally { + _lock.writeLock().unlock(); + } + } +} diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallInfoVisitor.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallInfoVisitor.java index 998feec70..0a3ce6934 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallInfoVisitor.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallInfoVisitor.java @@ -9,6 +9,8 @@ public interface HallInfoVisitor { public void visitTable(String tableId, String gameId, boolean watchable, String tableStatus, String formatName, String tournamentName, Set playerIds, String winner); + public void runningPlayerDraft(String draftId); + public void runningPlayerGame(String gameId); public void visitTournamentQueue(String tournamentQueueKey, int cost, String collectionName, String formatName, String tournamentQueueName, int playerCount, boolean playerSignedUp); 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 8d20b296d..c0cd5e374 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 @@ -9,6 +9,7 @@ import com.gempukku.lotro.db.vo.CollectionType; import com.gempukku.lotro.db.vo.League; import com.gempukku.lotro.draft.Draft; import com.gempukku.lotro.draft.DraftCallback; +import com.gempukku.lotro.draft.DraftServer; import com.gempukku.lotro.game.*; import com.gempukku.lotro.game.formats.LotroFormatLibrary; import com.gempukku.lotro.league.LeagueSerieData; @@ -30,6 +31,7 @@ public class HallServer extends AbstractServer { private LotroFormatLibrary _formatLibrary; private CollectionsManager _collectionsManager; private LotroServer _lotroServer; + private DraftServer _draftServer; private CollectionType _allCardsCollectionType = new CollectionType("default", "All cards"); @@ -49,13 +51,13 @@ public class HallServer extends AbstractServer { private Map _lastVisitedPlayers = new HashMap(); private List _runningTournaments = new ArrayList(); - private List _runningDrafts = new ArrayList(); private Map _tournamentQueues = new HashMap(); private final ChatRoomMediator _hallChat; - public HallServer(LotroServer lotroServer, ChatServer chatServer, LeagueService leagueService, TournamentService tournamentService, LotroCardBlueprintLibrary library, + public HallServer(LotroServer lotroServer, DraftServer draftServer, ChatServer chatServer, LeagueService leagueService, TournamentService tournamentService, LotroCardBlueprintLibrary library, LotroFormatLibrary formatLibrary, CollectionsManager collectionsManager, boolean test) { _lotroServer = lotroServer; + _draftServer = draftServer; _chatServer = chatServer; _leagueService = leagueService; _tournamentService = tournamentService; @@ -450,10 +452,8 @@ public class HallServer extends AbstractServer { return true; } - for (Draft runningDraft : _runningDrafts) { - if (runningDraft.isPlayerInDraft(playerId)) - return true; - } + if (_draftServer.isPlayerDrafting(playerId)) + return true; return false; } @@ -497,27 +497,20 @@ public class HallServer extends AbstractServer { } } - List runningDrafts = new ArrayList(_runningDrafts); - for (Draft runningDraft : runningDrafts) { - runningDraft.advanceDraft(new HallDraftCallback(runningDraft)); - } - } finally { _hallDataAccessLock.writeLock().unlock(); } } private class HallDraftCallback implements DraftCallback { - private Draft _draft; - - private HallDraftCallback(Draft draft) { - _draft = draft; - } - @Override - public void convertToTournament(Tournament tournament) { - _runningTournaments.add(tournament); - _runningDrafts.remove(_draft); + public void createTournament(Tournament tournament) { + _hallDataAccessLock.writeLock().lock(); + try { + _runningTournaments.add(tournament); + } finally { + _hallDataAccessLock.writeLock().unlock(); + } } } @@ -526,6 +519,11 @@ public class HallServer extends AbstractServer { public void createTournament(Tournament tournament) { _runningTournaments.add(tournament); } + + @Override + public void createDraft(Draft draft) { + _draftServer.addDraft(draft, new HallDraftCallback()); + } } private class HallTournamentCallback implements TournamentCallback { diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/TournamentQueueCallback.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/TournamentQueueCallback.java index 6af603577..7e1a55100 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/TournamentQueueCallback.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/TournamentQueueCallback.java @@ -1,5 +1,9 @@ package com.gempukku.lotro.tournament; +import com.gempukku.lotro.draft.Draft; + public interface TournamentQueueCallback { public void createTournament(Tournament tournament); + + public void createDraft(Draft draft); } diff --git a/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/provider/ServerProvider.java b/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/provider/ServerProvider.java index 18829c8a2..2169db619 100644 --- a/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/provider/ServerProvider.java +++ b/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/provider/ServerProvider.java @@ -4,6 +4,7 @@ import com.gempukku.lotro.chat.ChatServer; import com.gempukku.lotro.collection.CollectionsManager; import com.gempukku.lotro.collection.DeliveryService; import com.gempukku.lotro.db.*; +import com.gempukku.lotro.draft.DraftServer; import com.gempukku.lotro.game.GameHistoryService; import com.gempukku.lotro.game.GameRecorder; import com.gempukku.lotro.game.LotroCardBlueprintLibrary; @@ -35,6 +36,7 @@ public class ServerProvider implements InjectableProvider { private Injectable _tournamentServiceInjectable; private Injectable _hallServerInjectable; private Injectable _lotroServerInjectable; + private Injectable _draftServerInjectable; private Injectable _collectionsManagerInjectable; private Injectable _deliveryServiceInjectable; private Injectable _lotroFormatLibraryInjectable; @@ -71,6 +73,8 @@ public class ServerProvider implements InjectableProvider { return getChatServerInjectable(); if (type.equals(LotroServer.class)) return getLotroServerInjectable(); + if (type.equals(DraftServer.class)) + return getDraftServerInjectable(); if (type.equals(HallServer.class)) return getHallServerInjectable(); if (type.equals(LeagueService.class)) @@ -193,7 +197,10 @@ public class ServerProvider implements InjectableProvider { private synchronized Injectable getHallServerInjectable() { if (_hallServerInjectable == null) { - final HallServer hallServer = new HallServer(getLotroServerInjectable().getValue(), getChatServerInjectable().getValue(), getLeagueServiceInjectable().getValue(), + final HallServer hallServer = new HallServer( + getLotroServerInjectable().getValue(), + getDraftServerInjectable().getValue(), + getChatServerInjectable().getValue(), getLeagueServiceInjectable().getValue(), getTournamentServiceInjectable().getValue(), _library, getLotroFormatLibraryInjectable().getValue(), getCollectionsManagerInjectable().getValue(), false); hallServer.startServer(); @@ -237,6 +244,20 @@ public class ServerProvider implements InjectableProvider { return _lotroServerInjectable; } + private synchronized Injectable getDraftServerInjectable() { + if (_lotroServerInjectable == null) { + final DraftServer draftServer = new DraftServer(); + draftServer.startServer(); + _draftServerInjectable = new Injectable() { + @Override + public DraftServer getValue() { + return draftServer; + } + }; + } + return _draftServerInjectable; + } + private synchronized Injectable getChatServerInjectable() { if (_chatServerInjectable == null) { final ChatServer chatServer = new ChatServer();