From c7289a381038362cad14566dce70ca4e177b542d Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 20 Feb 2014 17:49:21 +0100 Subject: [PATCH] * Some formatting. Some cleanup for server memory handling. --- Mage.Common/src/mage/view/GameEndView.java | 2 +- Mage.Common/src/mage/view/MatchView.java | 4 +- Mage.Common/src/mage/view/TableView.java | 12 ++-- .../java/mage/server/TableController.java | 61 +++++++++---------- .../java/mage/server/game/GamesRoomImpl.java | 18 +++--- .../src/mage/game/events/EventDispatcher.java | 7 ++- Mage/src/mage/game/events/EventSource.java | 3 + .../game/events/PlayerQueryEventSource.java | 5 ++ .../mage/game/events/TableEventSource.java | 6 ++ Mage/src/mage/game/match/Match.java | 9 +++ Mage/src/mage/game/match/MatchImpl.java | 20 +++++- Mage/src/mage/game/match/MatchPlayer.java | 16 ++++- 12 files changed, 108 insertions(+), 55 deletions(-) diff --git a/Mage.Common/src/mage/view/GameEndView.java b/Mage.Common/src/mage/view/GameEndView.java index 7aab1501c1b..cc0eff99541 100644 --- a/Mage.Common/src/mage/view/GameEndView.java +++ b/Mage.Common/src/mage/view/GameEndView.java @@ -94,7 +94,7 @@ public class GameEndView implements Serializable { } if (mPlayer.getWins() == winsNeeded) { - nameMatchWinner = mPlayer.getPlayer().getName(); + nameMatchWinner = mPlayer.getName(); } } diff --git a/Mage.Common/src/mage/view/MatchView.java b/Mage.Common/src/mage/view/MatchView.java index a7db28cdd6a..86bd43c2bbf 100644 --- a/Mage.Common/src/mage/view/MatchView.java +++ b/Mage.Common/src/mage/view/MatchView.java @@ -73,12 +73,12 @@ public class MatchView implements Serializable { StringBuilder sb1 = new StringBuilder(); StringBuilder sb2 = new StringBuilder(); for (MatchPlayer player: match.getPlayers()) { - sb1.append(player.getPlayer().getName()); + sb1.append(player.getName()); if(player.hasQuit()) { sb1.append(" [quit] "); } sb1.append(", "); - sb2.append(player.getPlayer().getName()).append(" "); + sb2.append(player.getName()).append(" "); sb2.append(player.getWins()).append("-").append(player.getLoses()).append(", "); } players = sb1.substring(0, sb1.length() - 2); diff --git a/Mage.Common/src/mage/view/TableView.java b/Mage.Common/src/mage/view/TableView.java index 2a4a9b01eab..ee885b1940c 100644 --- a/Mage.Common/src/mage/view/TableView.java +++ b/Mage.Common/src/mage/view/TableView.java @@ -39,6 +39,7 @@ import mage.game.Seat; import mage.game.Table; import mage.game.match.MatchPlayer; import mage.game.tournament.TournamentPlayer; +import org.jboss.logging.Logger; /** * @@ -58,10 +59,10 @@ public class TableView implements Serializable { private Date createTime; private TableState tableState; private boolean isTournament; - private List seats = new ArrayList(); - private List games = new ArrayList(); + private List seats = new ArrayList<>(); + private List games = new ArrayList<>(); - public TableView(Table table) { + public TableView(Table table) { this.tableId = table.getId(); this.gameType = table.getGameType(); this.tableName = table.getName(); @@ -92,8 +93,8 @@ public class TableView implements Serializable { if (matchPlayer.getPlayer() == null) { sb.append(", ").append("[unknown]"); sbScore.append("-").append(matchPlayer.getWins()); - } else if (!matchPlayer.getPlayer().getName().equals(table.getControllerName())) { - sb.append(", ").append(matchPlayer.getPlayer().getName()); + } else if (!matchPlayer.getName().equals(table.getControllerName())) { + sb.append(", ").append(matchPlayer.getName()); sbScore.append("-").append(matchPlayer.getWins()); } else { sbScore.insert(0,matchPlayer.getWins()).insert(0,"Score: "); @@ -106,7 +107,6 @@ public class TableView implements Serializable { } else { this.additionalInfo = sbScore.toString(); } - } else { this.wins = table.getTournament().getOptions().getMatchOptions().getWinsNeeded(); if (table.getTournament().getOptions().getNumberRounds() > 0) { diff --git a/Mage.Server/src/main/java/mage/server/TableController.java b/Mage.Server/src/main/java/mage/server/TableController.java index 62f1249a35e..913fabf0190 100644 --- a/Mage.Server/src/main/java/mage/server/TableController.java +++ b/Mage.Server/src/main/java/mage/server/TableController.java @@ -62,7 +62,6 @@ import mage.server.game.DeckValidatorFactory; import mage.server.game.GameFactory; import mage.server.game.GameManager; import mage.server.game.PlayerFactory; -import mage.server.game.ReplayManager; import mage.server.services.LogKeys; import mage.server.services.impl.LogServiceImpl; import mage.server.tournament.TournamentFactory; @@ -85,7 +84,7 @@ public class TableController { private final UUID chatId; private final String controllerName; private final Table table; - private final ConcurrentHashMap userPlayerMap = new ConcurrentHashMap(); + private final ConcurrentHashMap userPlayerMap = new ConcurrentHashMap<>(); private Match match; private MatchOptions options; @@ -494,7 +493,7 @@ public class TableController { if (opponent.length() > 0) { opponent.append(" - "); } - opponent.append(mPlayer.getPlayer().getName()); + opponent.append(mPlayer.getName()); } } ServerMessagesUtil.getInstance().incGamesStarted(); @@ -597,19 +596,13 @@ public class TableController { if (!match.isMatchOver()) { startGame(choosingPlayerId); } else { - this.matchEnd(); - if (!ConfigSettings.getInstance().isSaveGameActivated() || match.getGame().isSimulation()) { - match.getGames().clear(); - } + this.matchEnd(); table.endGame(); } } else { // if match has only one game - this.matchEnd(); - if (!ConfigSettings.getInstance().isSaveGameActivated() || match.getGame().isSimulation()) { - match.getGames().clear(); - } + this.matchEnd(); table.endGame(); } } catch (GameException ex) { @@ -621,29 +614,33 @@ public class TableController { for (Entry entry: userPlayerMap.entrySet()) { MatchPlayer matchPlayer = match.getPlayer(entry.getValue()); // opponent(s) left during sideboarding - if(!matchPlayer.hasQuit()) { - User user = UserManager.getInstance().getUser(entry.getKey()); - if (user != null) { - if (table.getState().equals(TableState.SIDEBOARDING)) { - StringBuilder sb = new StringBuilder(); - if (table.isTournamentSubTable()) { - sb.append("Your tournament match of round "); - sb.append(table.getTournament().getRounds().size()); - sb.append(" is over. "); - } else { - sb.append("Match [").append(match.getName()).append("] is over. "); + if (matchPlayer != null) { + if(!matchPlayer.hasQuit()) { + User user = UserManager.getInstance().getUser(entry.getKey()); + if (user != null) { + if (table.getState().equals(TableState.SIDEBOARDING)) { + StringBuilder sb = new StringBuilder(); + if (table.isTournamentSubTable()) { + sb.append("Your tournament match of round "); + sb.append(table.getTournament().getRounds().size()); + sb.append(" is over. "); + } else { + sb.append("Match [").append(match.getName()).append("] is over. "); + } + if (match.getPlayers().size() > 2) { + sb.append("All your opponents have lost or quit the match."); + } else { + sb.append("Your opponent has quit the match."); + } + user.showUserMessage("Match info", sb.toString()); } - if (match.getPlayers().size() > 2) { - sb.append("All your opponents have lost or quit the match."); - } else { - sb.append("Your opponent has quit the match."); - } - user.showUserMessage("Match info", sb.toString()); + // remove table from user - table manager holds table for display of finished matches + user.removeTable(entry.getValue()); } - // remove table from user - table manager holds table for display of finished matches - user.removeTable(entry.getValue()); - } - } + } + } + // free resources no longer needed + match.cleanUpOnMatchEnd(ConfigSettings.getInstance().isSaveGameActivated()); } } diff --git a/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java b/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java index 45e1264a350..2c2f4e0bb6e 100644 --- a/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java +++ b/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java @@ -62,12 +62,12 @@ public class GamesRoomImpl extends RoomImpl implements GamesRoom, Serializable { private static final Logger logger = Logger.getLogger(GamesRoomImpl.class); - private static ScheduledExecutorService updateExecutor = Executors.newSingleThreadScheduledExecutor(); - private static List tableView = new ArrayList(); - private static List matchView = new ArrayList(); - private static List usersView = new ArrayList(); + private static final ScheduledExecutorService updateExecutor = Executors.newSingleThreadScheduledExecutor(); + private static List tableView = new ArrayList<>(); + private static List matchView = new ArrayList<>(); + private static List usersView = new ArrayList<>(); - private ConcurrentHashMap tables = new ConcurrentHashMap(); + private final ConcurrentHashMap tables = new ConcurrentHashMap<>(); public GamesRoomImpl() { updateExecutor.scheduleAtFixedRate(new Runnable() { @@ -84,9 +84,9 @@ public class GamesRoomImpl extends RoomImpl implements GamesRoom, Serializable { } private void update() { - ArrayList tableList = new ArrayList(); - ArrayList matchList = new ArrayList(); - List t = new ArrayList
(tables.values()); + ArrayList tableList = new ArrayList<>(); + ArrayList matchList = new ArrayList<>(); + List
t = new ArrayList<>(tables.values()); Collections.sort(t, new TimestampSorter()); Collections.reverse(t); for (Table table: t) { @@ -109,7 +109,7 @@ public class GamesRoomImpl extends RoomImpl implements GamesRoom, Serializable { } tableView = tableList; matchView = matchList; - List users = new ArrayList(); + List users = new ArrayList<>(); for (User user : UserManager.getInstance().getUsers()) { StringBuilder sb = new StringBuilder(user.getGameInfo()); if (!user.isConnected()) { diff --git a/Mage/src/mage/game/events/EventDispatcher.java b/Mage/src/mage/game/events/EventDispatcher.java index 25f2b45ea86..1a74b941576 100644 --- a/Mage/src/mage/game/events/EventDispatcher.java +++ b/Mage/src/mage/game/events/EventDispatcher.java @@ -35,10 +35,11 @@ import java.util.concurrent.CopyOnWriteArrayList; /** * * @author BetaSteward_at_googlemail.com + * @param */ public abstract class EventDispatcher implements Serializable { - private List> listeners = new CopyOnWriteArrayList>(); + private final List> listeners = new CopyOnWriteArrayList<>(); public void addListener(Listener listener) { if (!listeners.contains(listener)) { @@ -55,4 +56,8 @@ public abstract class EventDispatcher implements Serial listener.event(event); } } + + public void removeAllListener() { + listeners.clear(); + } } diff --git a/Mage/src/mage/game/events/EventSource.java b/Mage/src/mage/game/events/EventSource.java index 5a46c14be4a..451d1db1b13 100644 --- a/Mage/src/mage/game/events/EventSource.java +++ b/Mage/src/mage/game/events/EventSource.java @@ -33,8 +33,11 @@ import java.io.Serializable; /** * * @author BetaSteward_at_googlemail.com + * @param */ public interface EventSource extends Serializable { void addListener(Listener listener); + + void removeAllListener(); } diff --git a/Mage/src/mage/game/events/PlayerQueryEventSource.java b/Mage/src/mage/game/events/PlayerQueryEventSource.java index c52ad84344c..d24719fc43d 100644 --- a/Mage/src/mage/game/events/PlayerQueryEventSource.java +++ b/Mage/src/mage/game/events/PlayerQueryEventSource.java @@ -50,6 +50,11 @@ public class PlayerQueryEventSource implements EventSource, Se dispatcher.addListener(listener); } + @Override + public void removeAllListener() { + dispatcher.removeAllListener(); + } + public void ask(UUID playerId, String message) { dispatcher.fireEvent(PlayerQueryEvent.askEvent(playerId, message)); } diff --git a/Mage/src/mage/game/events/TableEventSource.java b/Mage/src/mage/game/events/TableEventSource.java index c482a48903c..3e3f1faee87 100644 --- a/Mage/src/mage/game/events/TableEventSource.java +++ b/Mage/src/mage/game/events/TableEventSource.java @@ -52,6 +52,12 @@ public class TableEventSource implements EventSource, Serializable { dispatcher.addListener(listener); } + @Override + public void removeAllListener() { + dispatcher.removeAllListener(); + } + + public void fireTableEvent(EventType eventType) { dispatcher.fireEvent(new TableEvent(eventType)); } diff --git a/Mage/src/mage/game/match/Match.java b/Mage/src/mage/game/match/Match.java index d218b72addb..40256c0ca75 100644 --- a/Mage/src/mage/game/match/Match.java +++ b/Mage/src/mage/game/match/Match.java @@ -83,4 +83,13 @@ public interface Match { */ boolean isReplayAvailable(); void setReplayAvailable(boolean replayAvailable); + + /** + * Free resources no longer needed if match ended and only exists for + * information purpose. + * + * @param isSaveGameActivated + */ + void cleanUpOnMatchEnd(boolean isSaveGameActivated); + } diff --git a/Mage/src/mage/game/match/MatchImpl.java b/Mage/src/mage/game/match/MatchImpl.java index 4a2d802cd65..ee9f6ea97b7 100644 --- a/Mage/src/mage/game/match/MatchImpl.java +++ b/Mage/src/mage/game/match/MatchImpl.java @@ -51,8 +51,8 @@ import mage.players.Player; public abstract class MatchImpl implements Match { protected UUID id = UUID.randomUUID(); - protected List players = new ArrayList(); - protected List games = new ArrayList(); + protected List players = new ArrayList<>(); + protected List games = new ArrayList<>(); protected MatchOptions options; protected TableEventSource tableEventSource = new TableEventSource(); @@ -293,7 +293,7 @@ public abstract class MatchImpl implements Match { StringBuilder sb = new StringBuilder(); sb.append("\nMatch score:\n"); for (MatchPlayer mp :this.getPlayers()) { - sb.append("- ").append(mp.getPlayer().getName()); + sb.append("- ").append(mp.getName()); sb.append(" (").append(mp.getWins()).append(mp.getWins()==1?" win / ":" wins / "); sb.append(mp.getLoses()).append(mp.getLoses()==1?" loss)":" losses)"); if (mp.hasQuit()) { @@ -324,7 +324,21 @@ public abstract class MatchImpl implements Match { return replayAvailable; } + @Override public void setReplayAvailable(boolean replayAvailable) { this.replayAvailable = replayAvailable; } + + @Override + public void cleanUpOnMatchEnd(boolean isSaveGameActivated) { + // this.tableEventSource.removeAllListener(); + // this.tableEventSource = null; + for (MatchPlayer matchPlayer: players) { + matchPlayer.cleanUpOnMatchEnd(); + } + if (!isSaveGameActivated || this.getGame().isSimulation()) { + this.getGames().clear(); + } + } + } diff --git a/Mage/src/mage/game/match/MatchPlayer.java b/Mage/src/mage/game/match/MatchPlayer.java index d3c74f38877..f68308856d3 100644 --- a/Mage/src/mage/game/match/MatchPlayer.java +++ b/Mage/src/mage/game/match/MatchPlayer.java @@ -39,9 +39,11 @@ import mage.players.Player; public class MatchPlayer { private int wins; private int loses; + private Deck deck; - private Player player; + private final String name; + private boolean quit; private boolean doneSideboarding; private int priorityTimeLeft; @@ -53,6 +55,7 @@ public class MatchPlayer { this.loses = 0; this.doneSideboarding = true; this.quit = false; + this.name = player.getName(); } public int getPriorityTimeLeft() { @@ -122,4 +125,15 @@ public class MatchPlayer { this.doneSideboarding = true; this.quit = quit; } + + public void cleanUpOnMatchEnd() { + // Free resources that are not needed after match end + this.deck = null; + // this.player = null; + } + + public String getName() { + return name; + } + }