diff --git a/src/java/com/threerings/ezgame/server/EZGameManager.java b/src/java/com/threerings/ezgame/server/EZGameManager.java index 57b1bc79..6d87def1 100644 --- a/src/java/com/threerings/ezgame/server/EZGameManager.java +++ b/src/java/com/threerings/ezgame/server/EZGameManager.java @@ -336,8 +336,7 @@ public class EZGameManager extends GameManager InvocationService.InvocationListener listener) throws InvocationException { - GameCookieManager gcm = getCookieManager(); - if (_gameObj.userCookies.containsKey(playerOid)) { + if (_gameObj.userCookies != null && _gameObj.userCookies.containsKey(playerOid)) { // already loaded: we do nothing return; } @@ -356,7 +355,8 @@ public class EZGameManager extends GameManager // indicate that we're looking up a cookie _cookieLookups.add(playerOid); - gcm.getCookie(_gameconfig.getGameId(), body, new ResultListener() { + int ppId = getPlayerPersistentId(body); + getCookieManager().getCookie(_gameconfig.getGameId(), ppId, new ResultListener() { public void requestCompleted (byte[] result) { // note that we're done with this lookup _cookieLookups.remove(playerOid); @@ -381,34 +381,17 @@ public class EZGameManager extends GameManager { validateUser(caller); - GameCookieManager gcm = getCookieManager(); + // persist this new cookie + getCookieManager().setCookie( + _gameconfig.getGameId(), getPlayerPersistentId((BodyObject)caller), value); + + // and update the distributed object UserCookie cookie = new UserCookie(caller.getOid(), value); if (_gameObj.userCookies.containsKey(cookie.getKey())) { _gameObj.updateUserCookies(cookie); } else { _gameObj.addToUserCookies(cookie); } - - gcm.setCookie(_gameconfig.getGameId(), (BodyObject)caller, value); - } - - /** - * Get the cookie manager, and do a bit of other setup. - */ - protected GameCookieManager getCookieManager () - throws InvocationException - { - GameCookieManager gcm = GameCookieManager.getInstance(); - if (gcm == null) { - log.warning("GameCookieManager not initialized."); - throw new InvocationException(INTERNAL_ERROR); - } - - if (_gameObj.userCookies == null) { - // lazy-init this - _gameObj.setUserCookies(new DSet()); - } - return gcm; } /** @@ -630,6 +613,26 @@ public class EZGameManager extends GameManager return 0; } + /** + * Get the cookie manager, and do a bit of other setup. + */ + protected GameCookieManager getCookieManager () + { + if (_cookMgr == null) { + _cookMgr = createCookieManager(); + _gameObj.setUserCookies(new DSet()); + } + return _cookMgr; + } + + /** + * Creates the cookie manager we'll use to store user cookies. + */ + protected GameCookieManager createCookieManager () + { + return new GameCookieManager(); + } + /** * A timer that fires message events to a game. */ @@ -692,12 +695,12 @@ public class EZGameManager extends GameManager /** Tracks which cookies are currently being retrieved from the db. */ protected ArrayIntSet _cookieLookups = new ArrayIntSet(); -// /** User tokens, lazy-initialized. */ -// protected HashIntMap> _tokens; - /** The array of winner oids, after the user has filled it in. */ protected int[] _winnerIds; + /** Handles the storage of our user cookies; lazily initialized. */ + protected GameCookieManager _cookMgr; + /** The minimum delay a ticker can have. */ protected static final int MIN_TICKER_DELAY = 50; diff --git a/src/java/com/threerings/ezgame/server/GameCookieManager.java b/src/java/com/threerings/ezgame/server/GameCookieManager.java index c190960c..db71a1cd 100644 --- a/src/java/com/threerings/ezgame/server/GameCookieManager.java +++ b/src/java/com/threerings/ezgame/server/GameCookieManager.java @@ -24,7 +24,6 @@ package com.threerings.ezgame.server; import java.util.prefs.Preferences; import com.samskivert.io.PersistenceException; -import com.samskivert.jdbc.ConnectionProvider; import com.samskivert.jdbc.RepositoryListenerUnit; import com.samskivert.util.Invoker; import com.samskivert.util.ResultListener; @@ -41,49 +40,28 @@ import static com.threerings.ezgame.server.Log.log; public class GameCookieManager { /** - * An interface for identifying users. + * Creates a game cookie manager that stores cookies in Java preferences on the local machine. + * This should only be used for developer testing. */ - public interface UserIdentifier + public GameCookieManager () { - /** Return the persistent user id for the specified player, or 0 if they're not a valid - * user, or a guest, or something like that (they'll have no cookies). */ - public int getUserId (BodyObject bodyObj); + _prefs = Preferences.userRoot().node("gameCookieManager"); } /** - * Sets up cookie manager that will store cookie information on the local filesystem using the - * Java preferences system. This should only be used during testing and not in a production - * system. + * Creates a game cookie manager that stores cookies in the supplied repository. */ - public static void init (UserIdentifier ider) - { - _singleton = new GameCookieManager(ider); - } - - /** - * Sets up a cookie manager that will store cookie information in a database table accessed via - * the supplied connection provider. - */ - public static void init (ConnectionProvider conprov, UserIdentifier ider) + public GameCookieManager (GameCookieRepository repo) throws PersistenceException { - _singleton = new GameCookieManager(conprov, ider); - } - - /** - * Get an instance of the GameCookieManager. - */ - public static GameCookieManager getInstance () - { - return _singleton; + _repo = repo; } /** * Get the specified user's cookie. */ - public void getCookie (final int gameId, BodyObject bobj, ResultListener rl) + public void getCookie (final int gameId, final int userId, ResultListener rl) { - final int userId = _identifier.getUserId(bobj); if (userId == 0) { rl.requestCompleted(null); return; @@ -105,9 +83,8 @@ public class GameCookieManager /** * Set the specified user's cookie. */ - public void setCookie (final int gameId, BodyObject bobj, final byte[] cookie) + public void setCookie (final int gameId, final int userId, final byte[] cookie) { - final int userId = _identifier.getUserId(bobj); if (userId == 0) { // fail to save, silently return; @@ -131,37 +108,9 @@ public class GameCookieManager }); } - /** - * Protected constructor. - */ - protected GameCookieManager (UserIdentifier identifier) - { - _identifier = identifier; - if (_identifier == null) { - throw new IllegalArgumentException("UserIdentifier must be non-null"); - } - _prefs = Preferences.userRoot().node("gameCookieManager"); - } - - /** - * Protected constructor. - */ - protected GameCookieManager (ConnectionProvider conprov, UserIdentifier identifier) - throws PersistenceException - { - this(identifier); - _repo = new GameCookieRepository(conprov); - } - - /** The entity we ask to identify users. */ - protected UserIdentifier _identifier; - /** Our database repository, which is used in real operation. */ protected GameCookieRepository _repo; /** Our local store, which is used when testing. */ protected Preferences _prefs; - - /** A reference to the single GameCookieManager instantiated. */ - protected static GameCookieManager _singleton; } diff --git a/src/java/com/threerings/parlor/game/server/GameManager.java b/src/java/com/threerings/parlor/game/server/GameManager.java index 4131f2eb..a9d63dbe 100644 --- a/src/java/com/threerings/parlor/game/server/GameManager.java +++ b/src/java/com/threerings/parlor/game/server/GameManager.java @@ -67,6 +67,26 @@ import com.threerings.util.MessageBundle; public class GameManager extends PlaceManager implements ParlorCodes, GameCodes { + /** + * An interface for identifying users. A larger system using the Parlor game services can + * enable user identification by passing a UserIdentifier to {@link #setUserIdentifier}. + */ + public interface UserIdentifier + { + /** Returns the persistent user id for the specified player, or 0 if they're not a valid + * user, or a guest, or something like that (for whom we'll track no persistent data). */ + public int getUserId (BodyObject bodyObj); + } + + /** + * Configures a means by which the Parlor game services can map users to a persistent user id + * for things like per-game cookies and ratings. + */ + public static void setUserIdentifier (UserIdentifier userIder) + { + _userIder = userIder; + } + /** * Returns the configuration object for the game being managed by this manager. */ @@ -310,6 +330,14 @@ public class GameManager extends PlaceManager return (_playerOids == null) ? -1 : _playerOids[index]; } + /** + * Returns the persistent user id for the supplied body. + */ + public int getPlayerPersistentId (BodyObject bobj) + { + return (bobj == null) ? 0 : _userIder.getUserId(bobj); + } + /** * Returns the number of players in the game. */ @@ -1279,6 +1307,13 @@ public class GameManager extends PlaceManager /** The interval for the game manager tick. */ protected static Interval _tickInterval; + /** Used to map users to persistent integer identifiers. */ + protected static UserIdentifier _userIder = new UserIdentifier() { + public int getUserId (BodyObject bodyObj) { + return 0; // by default no one has persistent info + } + }; + /** We give players 30 seconds to turn up in a game; after that, they're considered a no * show. */ protected static final long NOSHOW_DELAY = 30 * 1000L;