From d3b227a13bf8393687e62f9d8c420554614b343d Mon Sep 17 00:00:00 2001 From: Michael Bayne Date: Sun, 29 Jun 2008 14:18:10 +0000 Subject: [PATCH] Have the ZoneRegistry implement ZoneService instead of using a concrete provider. Other injection and cleanup. git-svn-id: svn+ssh://src.earth.threerings.net/vilya/trunk@640 c613c5cb-e716-0410-b11b-feb51c14d237 --- .../whirled/zone/server/ZoneMoveHandler.java | 13 +- .../whirled/zone/server/ZoneProvider.java | 142 +----------------- .../whirled/zone/server/ZoneRegistry.java | 124 +++++++++++++-- 3 files changed, 126 insertions(+), 153 deletions(-) diff --git a/src/java/com/threerings/whirled/zone/server/ZoneMoveHandler.java b/src/java/com/threerings/whirled/zone/server/ZoneMoveHandler.java index 2e771db6..d2addc4c 100644 --- a/src/java/com/threerings/whirled/zone/server/ZoneMoveHandler.java +++ b/src/java/com/threerings/whirled/zone/server/ZoneMoveHandler.java @@ -25,6 +25,7 @@ import com.threerings.presents.server.InvocationException; import com.threerings.crowd.data.BodyObject; import com.threerings.crowd.data.PlaceConfig; +import com.threerings.crowd.server.LocationManager; import com.threerings.whirled.client.SceneService; import com.threerings.whirled.data.SceneModel; @@ -33,7 +34,6 @@ import com.threerings.whirled.server.AbstractSceneMoveHandler; import com.threerings.whirled.server.SceneManager; import com.threerings.whirled.server.SceneMoveHandler; import com.threerings.whirled.server.SceneRegistry; -import com.threerings.whirled.server.WhirledServer; import com.threerings.whirled.zone.client.ZoneService; import com.threerings.whirled.zone.data.ZoneCodes; @@ -48,11 +48,13 @@ import static com.threerings.whirled.zone.Log.log; public class ZoneMoveHandler extends AbstractSceneMoveHandler implements ZoneManager.ResolutionListener { - public ZoneMoveHandler (ZoneManager zmgr, BodyObject body, int sceneId, int sceneVer, + public ZoneMoveHandler (LocationManager locmgr, ZoneManager zmgr, SceneRegistry screg, + BodyObject body, int sceneId, int sceneVer, ZoneService.ZoneMoveListener listener) { - super(body, listener); + super(locmgr, body, listener); _zmgr = zmgr; + _screg = screg; _sceneId = sceneId; _version = sceneVer; } @@ -69,7 +71,7 @@ public class ZoneMoveHandler extends AbstractSceneMoveHandler _summary = summary; // now resolve the target scene - WhirledServer.screg.resolveScene(_sceneId, this); + _screg.resolveScene(_sceneId, this); } // from interface ZoneManager.ResolutionListener @@ -85,7 +87,7 @@ public class ZoneMoveHandler extends AbstractSceneMoveHandler { // move to the place object associated with this scene int ploid = scmgr.getPlaceObject().getOid(); - PlaceConfig config = WhirledServer.locman.moveTo(_body, ploid); + PlaceConfig config = _locman.moveTo(_body, ploid); // now that we've moved, we can update the user object with the new scene and zone ids _body.startTransaction(); @@ -114,6 +116,7 @@ public class ZoneMoveHandler extends AbstractSceneMoveHandler } protected ZoneManager _zmgr; + protected SceneRegistry _screg; protected int _sceneId, _version; protected ZoneSummary _summary; } diff --git a/src/java/com/threerings/whirled/zone/server/ZoneProvider.java b/src/java/com/threerings/whirled/zone/server/ZoneProvider.java index 94ba4add..86f7b202 100644 --- a/src/java/com/threerings/whirled/zone/server/ZoneProvider.java +++ b/src/java/com/threerings/whirled/zone/server/ZoneProvider.java @@ -22,148 +22,18 @@ package com.threerings.whirled.zone.server; import com.threerings.presents.data.ClientObject; -import com.threerings.presents.data.InvocationMarshaller; import com.threerings.presents.server.InvocationException; import com.threerings.presents.server.InvocationProvider; - -import com.threerings.crowd.data.BodyObject; -import com.threerings.crowd.data.PlaceConfig; -import com.threerings.crowd.data.PlaceObject; -import com.threerings.crowd.server.LocationProvider; - -import com.threerings.whirled.data.SceneModel; -import com.threerings.whirled.data.SceneUpdate; -import com.threerings.whirled.server.SceneManager; -import com.threerings.whirled.server.SceneRegistry; - -import com.threerings.whirled.zone.client.ZoneService.ZoneMoveListener; -import com.threerings.whirled.zone.data.ZoneCodes; -import com.threerings.whirled.zone.data.ZoneSummary; -import com.threerings.whirled.zone.data.ZonedBodyObject; - -import static com.threerings.whirled.zone.Log.log; +import com.threerings.whirled.zone.client.ZoneService; /** - * Provides zone related services which are presently the ability to move from zone to zone. + * Defines the server-side of the {@link ZoneService}. */ -public class ZoneProvider - implements ZoneCodes, InvocationProvider +public interface ZoneProvider extends InvocationProvider { /** - * Constructs a zone provider that will interoperate with the supplied zone and scene - * registries. The zone provider will automatically be constructed and registered by the {@link - * ZoneRegistry}, which a zone-using system must create and initialize in their server. + * Handles a {@link ZoneService#moveTo} request. */ - public ZoneProvider (LocationProvider locprov, ZoneRegistry zonereg, SceneRegistry screg) - { - _locprov = locprov; - _zonereg = zonereg; - _screg = screg; - } - - /** - * Processes a request from a client to move to a scene in a new zone. - * - * @param caller the user requesting the move. - * @param zoneId the qualified zone id of the new zone. - * @param sceneId the identifier of the new scene. - * @param sceneVer the version of the scene model currently held by the client. - * @param listener the entity to inform of success or failure. - */ - public void moveTo (ClientObject caller, int zoneId, int sceneId, - int sceneVer, ZoneMoveListener listener) - throws InvocationException - { - if (!(caller instanceof ZonedBodyObject)) { - log.warning("Request to switch zones by non-ZonedBodyObject " + - "[clobj=" + caller.getClass() + "]."); - throw new InvocationException(INTERNAL_ERROR); - } - - // look up the caller's current zone id and make sure it is happy about their departure - // from the current zone - BodyObject body = (BodyObject)caller; - ZoneManager ozmgr = _zonereg.getZoneManager(((ZonedBodyObject)caller).getZoneId()); - if (ozmgr != null) { - String msg = ozmgr.ratifyBodyExit(body); - if (msg != null) { - throw new InvocationException(msg); - } - } - - // look up the zone manager for the zone - ZoneManager zmgr = _zonereg.getZoneManager(zoneId); - if (zmgr == null) { - log.warning("Requested to enter a zone for which we have no manager " + - "[user=" + body.who() + ", zoneId=" + zoneId + "]."); - throw new InvocationException(NO_SUCH_ZONE); - } - - // resolve the zone and move the user - zmgr.resolveZone(zoneId, new ZoneMoveHandler( - zmgr, (BodyObject)caller, sceneId, sceneVer, listener)); - } - - /** - * Ejects the specified body from their current scene and sends them a request to move to the - * specified new zone and scene. This is the zone-equivalent to {@link - * LocationProvider#moveBody}. - * - * @return null if the user was forcibly moved, or a string indicating the reason for denial of - * departure of their current zone (from {@link ZoneManager#ratifyBodyExit}). - */ - public String moveBody (ZonedBodyObject source, int zoneId, int sceneId) - { - if (source.getZoneId() == zoneId) { - // handle the case of moving somewhere in the same zone - _screg.moveBody((BodyObject) source, sceneId); - - } else { - // first remove them from their old location - String reason = leaveOccupiedZone(source); - if (reason != null) { - return reason; - } - - // then send a forced move notification - ZoneSender.forcedMove((BodyObject)source, zoneId, sceneId); - } - return null; - } - - /** - * Ejects the specified body from their current scene and zone. This is the zone equivalent to - * {@link LocationProvider#leaveOccupiedPlace}. - * - * @return null if the user was forcibly moved, or a string indicating the reason for denial of - * departure of their current zone (from {@link ZoneManager#ratifyBodyExit}). - */ - public String leaveOccupiedZone (ZonedBodyObject source) - { - // look up the caller's current zone id and make sure it is happy about their departure - // from the current zone - ZoneManager zmgr = _zonereg.getZoneManager(source.getZoneId()); - String msg; - if (zmgr != null && - (msg = zmgr.ratifyBodyExit((BodyObject)source)) != null) { - return msg; - } - - // remove them from their occupied scene - _screg.leaveOccupiedScene((BodyObject)source); - - // and clear out their zone information - source.setZoneId(-1); - - return null; - } - - /** The entity that handles basic location changes. */ - protected LocationProvider _locprov; - - /** The zone registry with which we communicate. */ - protected ZoneRegistry _zonereg; - - /** The scene registry with which we communicate. */ - protected SceneRegistry _screg; + public void moveTo (ClientObject caller, int arg1, int arg2, int arg3, ZoneService.ZoneMoveListener arg4) + throws InvocationException; } diff --git a/src/java/com/threerings/whirled/zone/server/ZoneRegistry.java b/src/java/com/threerings/whirled/zone/server/ZoneRegistry.java index b0308cfb..3a5e5e47 100644 --- a/src/java/com/threerings/whirled/zone/server/ZoneRegistry.java +++ b/src/java/com/threerings/whirled/zone/server/ZoneRegistry.java @@ -21,14 +21,23 @@ package com.threerings.whirled.zone.server; -import com.samskivert.util.HashIntMap; +import com.google.inject.Inject; +import com.google.inject.Singleton; +import com.samskivert.util.IntMap; +import com.samskivert.util.IntMaps; + +import com.threerings.presents.data.ClientObject; +import com.threerings.presents.server.InvocationException; import com.threerings.presents.server.InvocationManager; +import com.threerings.crowd.data.BodyObject; import com.threerings.crowd.server.LocationManager; import com.threerings.whirled.server.SceneRegistry; +import com.threerings.whirled.zone.client.ZoneService; import com.threerings.whirled.zone.data.ZoneCodes; +import com.threerings.whirled.zone.data.ZonedBodyObject; import com.threerings.whirled.zone.util.ZoneUtil; import static com.threerings.whirled.zone.Log.log; @@ -37,19 +46,16 @@ import static com.threerings.whirled.zone.Log.log; * The zone registry takes care of mapping zone requests to the appropriate registered zone * manager. */ +@Singleton public class ZoneRegistry + implements ZoneProvider { - /** Implements the server-side of the zone-related services. */ - public ZoneProvider zoneprov; - /** * Creates a zone manager with the supplied configuration. */ - public ZoneRegistry (InvocationManager invmgr, LocationManager locman, SceneRegistry screg) + @Inject public ZoneRegistry (InvocationManager invmgr) { - // create a zone provider and register it with the invocation services - zoneprov = new ZoneProvider(locman, this, screg); - invmgr.registerDispatcher(new ZoneDispatcher(zoneprov), ZoneCodes.WHIRLED_GROUP); + invmgr.registerDispatcher(new ZoneDispatcher(this), ZoneCodes.WHIRLED_GROUP); } /** @@ -60,7 +66,7 @@ public class ZoneRegistry */ public void registerZoneManager (byte zoneType, ZoneManager manager) { - ZoneManager old = (ZoneManager)_managers.get(zoneType); + ZoneManager old = _managers.get(zoneType); if (old != null) { log.warning("Zone manager already registered with requested type [type=" + zoneType + ", old=" + old + ", new=" + manager + "]."); @@ -76,10 +82,104 @@ public class ZoneRegistry */ public ZoneManager getZoneManager (int qualifiedZoneId) { - int zoneType = ZoneUtil.zoneType(qualifiedZoneId); - return (ZoneManager)_managers.get(zoneType); + return _managers.get(ZoneUtil.zoneType(qualifiedZoneId)); + } + + /** + * Ejects the specified body from their current scene and sends them a request to move to the + * specified new zone and scene. This is the zone-equivalent to {@link + * LocationProvider#moveBody}. + * + * @return null if the user was forcibly moved, or a string indicating the reason for denial of + * departure of their current zone (from {@link ZoneManager#ratifyBodyExit}). + */ + public String moveBody (ZonedBodyObject source, int zoneId, int sceneId) + { + if (source.getZoneId() == zoneId) { + // handle the case of moving somewhere in the same zone + _screg.moveBody((BodyObject) source, sceneId); + + } else { + // first remove them from their old location + String reason = leaveOccupiedZone(source); + if (reason != null) { + return reason; + } + + // then send a forced move notification + ZoneSender.forcedMove((BodyObject)source, zoneId, sceneId); + } + return null; + } + + /** + * Ejects the specified body from their current scene and zone. This is the zone equivalent to + * {@link LocationProvider#leaveOccupiedPlace}. + * + * @return null if the user was forcibly moved, or a string indicating the reason for denial of + * departure of their current zone (from {@link ZoneManager#ratifyBodyExit}). + */ + public String leaveOccupiedZone (ZonedBodyObject source) + { + // look up the caller's current zone id and make sure it is happy about their departure + // from the current zone + ZoneManager zmgr = getZoneManager(source.getZoneId()); + String msg; + if (zmgr != null && + (msg = zmgr.ratifyBodyExit((BodyObject)source)) != null) { + return msg; + } + + // remove them from their occupied scene + _screg.leaveOccupiedScene((BodyObject)source); + + // and clear out their zone information + source.setZoneId(-1); + + return null; + } + + // from interface ZoneProvider + public void moveTo (ClientObject caller, int zoneId, int sceneId, + int sceneVer, ZoneService.ZoneMoveListener listener) + throws InvocationException + { + if (!(caller instanceof ZonedBodyObject)) { + log.warning("Request to switch zones by non-ZonedBodyObject " + + "[clobj=" + caller.getClass() + "]."); + throw new InvocationException(ZoneCodes.INTERNAL_ERROR); + } + + // look up the caller's current zone id and make sure it is happy about their departure + // from the current zone + BodyObject body = (BodyObject)caller; + ZoneManager ozmgr = getZoneManager(((ZonedBodyObject)caller).getZoneId()); + if (ozmgr != null) { + String msg = ozmgr.ratifyBodyExit(body); + if (msg != null) { + throw new InvocationException(msg); + } + } + + // look up the zone manager for the zone + ZoneManager zmgr = getZoneManager(zoneId); + if (zmgr == null) { + log.warning("Requested to enter a zone for which we have no manager " + + "[user=" + body.who() + ", zoneId=" + zoneId + "]."); + throw new InvocationException(ZoneCodes.NO_SUCH_ZONE); + } + + // resolve the zone and move the user + zmgr.resolveZone(zoneId, new ZoneMoveHandler(_locman, zmgr, _screg, (BodyObject)caller, + sceneId, sceneVer, listener)); } /** A table of zone managers. */ - protected HashIntMap _managers = new HashIntMap(); + protected IntMap _managers = IntMaps.newHashIntMap(); + + /** Provides access to scene managers by scene. */ + @Inject protected SceneRegistry _screg; + + /** Provides location services. */ + @Inject protected LocationManager _locman; }