From b838fe36b8d70537d5782ed7f0c2671716683e33 Mon Sep 17 00:00:00 2001 From: BetaSteward Date: Mon, 29 Aug 2011 15:52:36 -0400 Subject: [PATCH] cache tables and matches - refresh every 2 seconds --- .../java/mage/server/game/GamesRoomImpl.java | 62 +++++++++++++++---- 1 file changed, 51 insertions(+), 11 deletions(-) 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 3395e6a0662..7bb473776b6 100644 --- a/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java +++ b/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java @@ -33,9 +33,15 @@ import mage.server.RoomImpl; import mage.game.Table; import java.io.Serializable; import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; import mage.Constants.TableState; import mage.cards.decks.DeckCardLists; import mage.game.GameException; @@ -53,30 +59,57 @@ import org.apache.log4j.Logger; public class GamesRoomImpl extends RoomImpl implements GamesRoom, Serializable { private final static 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 ConcurrentHashMap tables = new ConcurrentHashMap(); - @Override + public GamesRoomImpl() { + updateExecutor.scheduleAtFixedRate(new Runnable() { + @Override + public void run() { + updateTables(); + updateFinished(); + } + }, 2, 2, TimeUnit.SECONDS); + } + + @Override public List getTables() { + return tableView; + } + + private void updateTables() { ArrayList tableList = new ArrayList(); for (Table table: tables.values()) { if (table.getState() != TableState.FINISHED) tableList.add(new TableView(table)); } - return tableList; + tableView = tableList; } - + @Override public List getFinished() { - ArrayList matchList = new ArrayList(); - for (Table table: tables.values()) { - if (table.getState() == TableState.FINISHED) - matchList.add(new MatchView(table.getMatch())); - } - return matchList; + return matchView; } - @Override + private void updateFinished() { + ArrayList matchList = new ArrayList(); + List t = new ArrayList
(tables.values()); + Collections.sort(t, new TimestampSorter()); + for (Table table: t) { + if (table.getState() == TableState.FINISHED) { + matchList.add(new MatchView(table.getMatch())); + if (matchList.size() >= 50) + break; + } + } + matchView = matchList; + } + + @Override public boolean joinTable(UUID userId, UUID tableId, String name, String playerType, int skill, DeckCardLists deckList) throws MageException { if (tables.containsKey(tableId)) { return TableManager.getInstance().joinTable(userId, tableId, name, playerType, skill, deckList); @@ -138,3 +171,10 @@ public class GamesRoomImpl extends RoomImpl implements GamesRoom, Serializable { } } + +class TimestampSorter implements Comparator
{ + @Override + public int compare(Table one, Table two) { + return one.getCreateTime().compareTo(two.getCreateTime()); + } +}