Inject the SceneRegistry; nix implicit depends.
git-svn-id: svn+ssh://src.earth.threerings.net/vilya/trunk@639 c613c5cb-e716-0410-b11b-feb51c14d237
This commit is contained in:
@@ -26,6 +26,7 @@ import com.threerings.presents.data.InvocationMarshaller;
|
|||||||
import com.threerings.presents.server.InvocationException;
|
import com.threerings.presents.server.InvocationException;
|
||||||
|
|
||||||
import com.threerings.crowd.data.BodyObject;
|
import com.threerings.crowd.data.BodyObject;
|
||||||
|
import com.threerings.crowd.server.LocationManager;
|
||||||
|
|
||||||
import com.threerings.whirled.client.SceneService;
|
import com.threerings.whirled.client.SceneService;
|
||||||
import com.threerings.whirled.data.SceneCodes;
|
import com.threerings.whirled.data.SceneCodes;
|
||||||
@@ -40,8 +41,10 @@ import static com.threerings.whirled.Log.log;
|
|||||||
public abstract class AbstractSceneMoveHandler
|
public abstract class AbstractSceneMoveHandler
|
||||||
implements SceneRegistry.ResolutionListener
|
implements SceneRegistry.ResolutionListener
|
||||||
{
|
{
|
||||||
public AbstractSceneMoveHandler (BodyObject body, InvocationService.InvocationListener listener)
|
public AbstractSceneMoveHandler (LocationManager locman, BodyObject body,
|
||||||
|
InvocationService.InvocationListener listener)
|
||||||
{
|
{
|
||||||
|
_locman = locman;
|
||||||
_body = body;
|
_body = body;
|
||||||
_listener = listener;
|
_listener = listener;
|
||||||
}
|
}
|
||||||
@@ -80,6 +83,7 @@ public abstract class AbstractSceneMoveHandler
|
|||||||
protected abstract void effectSceneMove (SceneManager scmgr)
|
protected abstract void effectSceneMove (SceneManager scmgr)
|
||||||
throws InvocationException;
|
throws InvocationException;
|
||||||
|
|
||||||
|
protected LocationManager _locman;
|
||||||
protected BodyObject _body;
|
protected BodyObject _body;
|
||||||
protected InvocationService.InvocationListener _listener;
|
protected InvocationService.InvocationListener _listener;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,11 +21,14 @@
|
|||||||
|
|
||||||
package com.threerings.whirled.server;
|
package com.threerings.whirled.server;
|
||||||
|
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
|
||||||
import com.samskivert.jdbc.WriteOnlyUnit;
|
import com.samskivert.jdbc.WriteOnlyUnit;
|
||||||
import com.samskivert.util.Invoker;
|
import com.samskivert.util.Invoker;
|
||||||
|
|
||||||
|
import com.threerings.presents.annotation.MainInvoker;
|
||||||
|
|
||||||
import com.threerings.crowd.data.Place;
|
import com.threerings.crowd.data.Place;
|
||||||
import com.threerings.crowd.server.CrowdServer;
|
|
||||||
import com.threerings.crowd.server.PlaceManager;
|
import com.threerings.crowd.server.PlaceManager;
|
||||||
|
|
||||||
import com.threerings.whirled.data.Scene;
|
import com.threerings.whirled.data.Scene;
|
||||||
@@ -118,7 +121,7 @@ public class SceneManager extends PlaceManager
|
|||||||
|
|
||||||
// Wait until us and all of our subclasses have completely finished running didStartup
|
// Wait until us and all of our subclasses have completely finished running didStartup
|
||||||
// prior to registering the scene as being ready.
|
// prior to registering the scene as being ready.
|
||||||
CrowdServer.omgr.postRunnable(new Runnable() {
|
_omgr.postRunnable(new Runnable() {
|
||||||
public void run () {
|
public void run () {
|
||||||
_screg.sceneManagerDidStart(SceneManager.this);
|
_screg.sceneManagerDidStart(SceneManager.this);
|
||||||
}
|
}
|
||||||
@@ -157,7 +160,7 @@ public class SceneManager extends PlaceManager
|
|||||||
|
|
||||||
// and apply and store it in the repository
|
// and apply and store it in the repository
|
||||||
if (isPersistent()) {
|
if (isPersistent()) {
|
||||||
WhirledServer.invoker.postUnit(new WriteOnlyUnit("recordUpdate(" + update + ")") {
|
_invoker.postUnit(new WriteOnlyUnit("recordUpdate(" + update + ")") {
|
||||||
public void invokePersist () throws Exception {
|
public void invokePersist () throws Exception {
|
||||||
_screg.getSceneRepository().applyAndRecordUpdate(_scene.getSceneModel(), update);
|
_screg.getSceneRepository().applyAndRecordUpdate(_scene.getSceneModel(), update);
|
||||||
}
|
}
|
||||||
@@ -193,4 +196,7 @@ public class SceneManager extends PlaceManager
|
|||||||
/** A reference to the scene registry so that we can call back to it when we're fully
|
/** A reference to the scene registry so that we can call back to it when we're fully
|
||||||
* initialized. */
|
* initialized. */
|
||||||
protected SceneRegistry _screg;
|
protected SceneRegistry _screg;
|
||||||
|
|
||||||
|
/** The invoker on which we'll do our database operations. */
|
||||||
|
@Inject protected @MainInvoker Invoker _invoker;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ import com.threerings.presents.server.InvocationException;
|
|||||||
|
|
||||||
import com.threerings.crowd.data.BodyObject;
|
import com.threerings.crowd.data.BodyObject;
|
||||||
import com.threerings.crowd.data.PlaceConfig;
|
import com.threerings.crowd.data.PlaceConfig;
|
||||||
import com.threerings.crowd.server.CrowdServer;
|
import com.threerings.crowd.server.LocationManager;
|
||||||
|
|
||||||
import com.threerings.whirled.client.SceneService;
|
import com.threerings.whirled.client.SceneService;
|
||||||
import com.threerings.whirled.data.SceneCodes;
|
import com.threerings.whirled.data.SceneCodes;
|
||||||
@@ -38,9 +38,10 @@ import com.threerings.whirled.data.SceneUpdate;
|
|||||||
*/
|
*/
|
||||||
public class SceneMoveHandler extends AbstractSceneMoveHandler
|
public class SceneMoveHandler extends AbstractSceneMoveHandler
|
||||||
{
|
{
|
||||||
public SceneMoveHandler (BodyObject body, int sceneVer, SceneService.SceneMoveListener listener)
|
public SceneMoveHandler (LocationManager locman, BodyObject body, int sceneVer,
|
||||||
|
SceneService.SceneMoveListener listener)
|
||||||
{
|
{
|
||||||
super(body, listener);
|
super(locman, body, listener);
|
||||||
_version = sceneVer;
|
_version = sceneVer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,7 +51,7 @@ public class SceneMoveHandler extends AbstractSceneMoveHandler
|
|||||||
{
|
{
|
||||||
// move to location associated with this scene
|
// move to location associated with this scene
|
||||||
int ploid = scmgr.getPlaceObject().getOid();
|
int ploid = scmgr.getPlaceObject().getOid();
|
||||||
PlaceConfig config = CrowdServer.locman.moveTo(_body, ploid);
|
PlaceConfig config = _locman.moveTo(_body, ploid);
|
||||||
|
|
||||||
// check to see if they need a newer version of the scene data
|
// check to see if they need a newer version of the scene data
|
||||||
SceneService.SceneMoveListener listener = (SceneService.SceneMoveListener)_listener;
|
SceneService.SceneMoveListener listener = (SceneService.SceneMoveListener)_listener;
|
||||||
|
|||||||
@@ -21,11 +21,18 @@
|
|||||||
|
|
||||||
package com.threerings.whirled.server;
|
package com.threerings.whirled.server;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
import com.google.inject.Singleton;
|
||||||
|
|
||||||
import com.samskivert.jdbc.RepositoryUnit;
|
import com.samskivert.jdbc.RepositoryUnit;
|
||||||
import com.samskivert.util.HashIntMap;
|
import com.samskivert.util.IntMaps;
|
||||||
|
import com.samskivert.util.IntMap;
|
||||||
|
import com.samskivert.util.Invoker;
|
||||||
|
|
||||||
|
import com.threerings.presents.annotation.MainInvoker;
|
||||||
import com.threerings.presents.data.ClientObject;
|
import com.threerings.presents.data.ClientObject;
|
||||||
import com.threerings.presents.data.InvocationMarshaller;
|
import com.threerings.presents.data.InvocationMarshaller;
|
||||||
import com.threerings.presents.server.InvocationException;
|
import com.threerings.presents.server.InvocationException;
|
||||||
@@ -33,7 +40,7 @@ import com.threerings.presents.server.InvocationManager;
|
|||||||
|
|
||||||
import com.threerings.crowd.data.BodyObject;
|
import com.threerings.crowd.data.BodyObject;
|
||||||
import com.threerings.crowd.data.PlaceConfig;
|
import com.threerings.crowd.data.PlaceConfig;
|
||||||
import com.threerings.crowd.server.CrowdServer;
|
import com.threerings.crowd.server.LocationManager;
|
||||||
import com.threerings.crowd.server.PlaceManager;
|
import com.threerings.crowd.server.PlaceManager;
|
||||||
import com.threerings.crowd.server.PlaceRegistry;
|
import com.threerings.crowd.server.PlaceRegistry;
|
||||||
|
|
||||||
@@ -61,6 +68,7 @@ import static com.threerings.whirled.Log.log;
|
|||||||
*
|
*
|
||||||
* <p><em>Note:</em> All access to the scene registry should take place from the dobjmgr thread.
|
* <p><em>Note:</em> All access to the scene registry should take place from the dobjmgr thread.
|
||||||
*/
|
*/
|
||||||
|
@Singleton
|
||||||
public class SceneRegistry
|
public class SceneRegistry
|
||||||
implements SceneCodes, SceneProvider
|
implements SceneCodes, SceneProvider
|
||||||
{
|
{
|
||||||
@@ -97,16 +105,10 @@ public class SceneRegistry
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a scene registry, instructing it to load and store scenes using the supplied
|
* Constructs a scene registry.
|
||||||
* scene repository.
|
|
||||||
*/
|
*/
|
||||||
public SceneRegistry (InvocationManager invmgr, SceneRepository screp,
|
@Inject public SceneRegistry (InvocationManager invmgr)
|
||||||
SceneFactory scfact, ConfigFactory confact)
|
|
||||||
{
|
{
|
||||||
_screp = screp;
|
|
||||||
_scfact = scfact;
|
|
||||||
_confact = confact;
|
|
||||||
|
|
||||||
// register our scene service
|
// register our scene service
|
||||||
invmgr.registerDispatcher(new SceneDispatcher(this), SceneCodes.WHIRLED_GROUP);
|
invmgr.registerDispatcher(new SceneDispatcher(this), SceneCodes.WHIRLED_GROUP);
|
||||||
}
|
}
|
||||||
@@ -166,7 +168,7 @@ public class SceneRegistry
|
|||||||
|
|
||||||
// otherwise we have to load the scene from the repository
|
// otherwise we have to load the scene from the repository
|
||||||
final int fsceneId = sceneId;
|
final int fsceneId = sceneId;
|
||||||
WhirledServer.invoker.postUnit(new RepositoryUnit("resolveScene(" + sceneId + ")") {
|
_invoker.postUnit(new RepositoryUnit("resolveScene(" + sceneId + ")") {
|
||||||
public void invokePersist () throws Exception {
|
public void invokePersist () throws Exception {
|
||||||
_model = _screp.loadSceneModel(fsceneId);
|
_model = _screp.loadSceneModel(fsceneId);
|
||||||
_updates = _screp.loadUpdates(fsceneId);
|
_updates = _screp.loadUpdates(fsceneId);
|
||||||
@@ -187,7 +189,7 @@ public class SceneRegistry
|
|||||||
SceneService.SceneMoveListener listener)
|
SceneService.SceneMoveListener listener)
|
||||||
{
|
{
|
||||||
BodyObject body = (BodyObject)caller;
|
BodyObject body = (BodyObject)caller;
|
||||||
resolveScene(sceneId, new SceneMoveHandler(body, sceneVer, listener));
|
resolveScene(sceneId, new SceneMoveHandler(_locman, body, sceneVer, listener));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -197,7 +199,7 @@ public class SceneRegistry
|
|||||||
public void moveBody (BodyObject source, int sceneId)
|
public void moveBody (BodyObject source, int sceneId)
|
||||||
{
|
{
|
||||||
// first remove them from their old place
|
// first remove them from their old place
|
||||||
CrowdServer.locman.leaveOccupiedPlace(source);
|
_locman.leaveOccupiedPlace(source);
|
||||||
|
|
||||||
// then send a forced move notification
|
// then send a forced move notification
|
||||||
SceneSender.forcedMove(source, sceneId);
|
SceneSender.forcedMove(source, sceneId);
|
||||||
@@ -210,7 +212,7 @@ public class SceneRegistry
|
|||||||
public void leaveOccupiedScene (BodyObject source)
|
public void leaveOccupiedScene (BodyObject source)
|
||||||
{
|
{
|
||||||
// remove them from their occupied place (clears out scene info as well)
|
// remove them from their occupied place (clears out scene info as well)
|
||||||
CrowdServer.locman.leaveOccupiedPlace(source);
|
_locman.leaveOccupiedPlace(source);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -220,11 +222,11 @@ public class SceneRegistry
|
|||||||
*/
|
*/
|
||||||
protected boolean addResolutionListener (int sceneId, ResolutionListener rl)
|
protected boolean addResolutionListener (int sceneId, ResolutionListener rl)
|
||||||
{
|
{
|
||||||
ArrayList<ResolutionListener> penders = _penders.get(sceneId);
|
List<ResolutionListener> penders = _penders.get(sceneId);
|
||||||
boolean newList = false;
|
boolean newList = false;
|
||||||
|
|
||||||
if (penders == null) {
|
if (penders == null) {
|
||||||
_penders.put(sceneId, penders = new ArrayList<ResolutionListener>());
|
_penders.put(sceneId, penders = Lists.newArrayList());
|
||||||
newList = true;
|
newList = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -247,8 +249,7 @@ public class SceneRegistry
|
|||||||
final Scene scene = _scfact.createScene(model, _confact.createPlaceConfig(model));
|
final Scene scene = _scfact.createScene(model, _confact.createPlaceConfig(model));
|
||||||
|
|
||||||
// now create our scene manager
|
// now create our scene manager
|
||||||
CrowdServer.plreg.createPlace(
|
_plreg.createPlace(scene.getPlaceConfig(), new PlaceRegistry.PreStartupHook() {
|
||||||
scene.getPlaceConfig(), new PlaceRegistry.PreStartupHook() {
|
|
||||||
public void invoke (PlaceManager pmgr) {
|
public void invoke (PlaceManager pmgr) {
|
||||||
((SceneManager)pmgr).setSceneData(scene, updates, SceneRegistry.this);
|
((SceneManager)pmgr).setSceneData(scene, updates, SceneRegistry.this);
|
||||||
}
|
}
|
||||||
@@ -274,7 +275,7 @@ public class SceneRegistry
|
|||||||
}
|
}
|
||||||
|
|
||||||
// alas things didn't work out, notify our penders
|
// alas things didn't work out, notify our penders
|
||||||
ArrayList<ResolutionListener> penders = _penders.remove(sceneId);
|
List<ResolutionListener> penders = _penders.remove(sceneId);
|
||||||
if (penders != null) {
|
if (penders != null) {
|
||||||
for (ResolutionListener rl : penders) {
|
for (ResolutionListener rl : penders) {
|
||||||
try {
|
try {
|
||||||
@@ -299,7 +300,7 @@ public class SceneRegistry
|
|||||||
log.debug("Registering scene manager", "scid", sceneId, "scmgr", scmgr);
|
log.debug("Registering scene manager", "scid", sceneId, "scmgr", scmgr);
|
||||||
|
|
||||||
// now notify any penders
|
// now notify any penders
|
||||||
ArrayList<ResolutionListener> penders = _penders.remove(sceneId);
|
List<ResolutionListener> penders = _penders.remove(sceneId);
|
||||||
if (penders != null) {
|
if (penders != null) {
|
||||||
for (ResolutionListener rl : penders) {
|
for (ResolutionListener rl : penders) {
|
||||||
try {
|
try {
|
||||||
@@ -325,18 +326,26 @@ public class SceneRegistry
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** The entity from which we load scene models. */
|
/** The entity from which we load scene models. */
|
||||||
protected SceneRepository _screp;
|
@Inject protected SceneRepository _screp;
|
||||||
|
|
||||||
/** Used to generate place configs for our scenes. */
|
/** Used to generate place configs for our scenes. */
|
||||||
protected ConfigFactory _confact;
|
@Inject protected ConfigFactory _confact;
|
||||||
|
|
||||||
/** The entity via which we create scene instances from scene models. */
|
/** The entity via which we create scene instances from scene models. */
|
||||||
protected SceneFactory _scfact;
|
@Inject protected SceneFactory _scfact;
|
||||||
|
|
||||||
|
/** The invoker on which we do database operations. */
|
||||||
|
@Inject protected @MainInvoker Invoker _invoker;
|
||||||
|
|
||||||
|
/** Provides access to place managers. */
|
||||||
|
@Inject protected PlaceRegistry _plreg;
|
||||||
|
|
||||||
|
/** Provides location services. */
|
||||||
|
@Inject protected LocationManager _locman;
|
||||||
|
|
||||||
/** A mapping from scene ids to scene managers. */
|
/** A mapping from scene ids to scene managers. */
|
||||||
protected HashIntMap<SceneManager> _scenemgrs = new HashIntMap<SceneManager>();
|
protected IntMap<SceneManager> _scenemgrs = IntMaps.newHashIntMap();
|
||||||
|
|
||||||
/** The table of pending resolution listeners. */
|
/** The table of pending resolution listeners. */
|
||||||
protected HashIntMap<ArrayList<ResolutionListener>> _penders =
|
protected IntMap<List<ResolutionListener>> _penders = IntMaps.newHashIntMap();
|
||||||
new HashIntMap<ArrayList<ResolutionListener>>();
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
package com.threerings.whirled.server;
|
package com.threerings.whirled.server;
|
||||||
|
|
||||||
|
import com.google.inject.Inject;
|
||||||
import com.google.inject.Injector;
|
import com.google.inject.Injector;
|
||||||
|
|
||||||
import com.threerings.util.Name;
|
import com.threerings.util.Name;
|
||||||
@@ -52,9 +53,6 @@ public abstract class WhirledServer extends CrowdServer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** The scene registry. */
|
|
||||||
public static SceneRegistry screg;
|
|
||||||
|
|
||||||
@Override // from CrowdServer
|
@Override // from CrowdServer
|
||||||
public void init (Injector injector)
|
public void init (Injector injector)
|
||||||
throws Exception
|
throws Exception
|
||||||
@@ -62,7 +60,7 @@ public abstract class WhirledServer extends CrowdServer
|
|||||||
super.init(injector);
|
super.init(injector);
|
||||||
|
|
||||||
// configure the client to use our whirled client
|
// configure the client to use our whirled client
|
||||||
clmgr.setClientFactory(new ClientFactory() {
|
_clmgr.setClientFactory(new ClientFactory() {
|
||||||
public Class<? extends PresentsClient> getClientClass (AuthRequest areq) {
|
public Class<? extends PresentsClient> getClientClass (AuthRequest areq) {
|
||||||
return WhirledClient.class;
|
return WhirledClient.class;
|
||||||
}
|
}
|
||||||
@@ -70,14 +68,5 @@ public abstract class WhirledServer extends CrowdServer
|
|||||||
return ClientResolver.class;
|
return ClientResolver.class;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// create our scene registry
|
|
||||||
screg = createSceneRegistry();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates the scene registry to be used on this server.
|
|
||||||
*/
|
|
||||||
protected abstract SceneRegistry createSceneRegistry ()
|
|
||||||
throws Exception;
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user