diff --git a/src/java/com/threerings/crowd/client/LocationDirector.java b/src/java/com/threerings/crowd/client/LocationDirector.java index e0e5e0a51..3a2154122 100644 --- a/src/java/com/threerings/crowd/client/LocationDirector.java +++ b/src/java/com/threerings/crowd/client/LocationDirector.java @@ -291,24 +291,14 @@ public class LocationDirector extends BasicDirector // make a note that we're now mostly in the new location _placeId = placeId; - // check whether we should use a custom class loader - ClassLoader loader = getClassLoader(config); - if (loader != null) { - config.setClassLoader(loader); - } - - Class cclass = config.getControllerClass(); - try { - // start up a new place controller to manage the new place - _controller = (PlaceController)cclass.newInstance(); - _controller.init(_ctx, config); - - } catch (Exception e) { - Log.warning("Error creating or initializing place controller " + - "[cclass=" + cclass.getName() + - ", config=" + config + "]."); - Log.logStackTrace(e); + // start up a new place controller to manage the new place + _controller = createController(config); + if (_controller == null) { + Log.warning("Place config returned null controller " + + "[config=" + config + "]."); + return; } + _controller.init(_ctx, config); // subscribe to our new place object to complete the move _ctx.getDObjectManager().subscribeToObject(_placeId, this); @@ -578,15 +568,14 @@ public class LocationDirector extends BasicDirector } /** - * By overriding this method, it is possible to customize the location - * director to cause it to load the classes associated with a - * particular place via a custom class loader. That loader may enforce - * restricted privileges or obtain the classes from some special - * source. + * Called to create our place controller using the supplied place + * configuration. This lives in a separate method so that derived instances + * can do funny class loader business if necessary to load the place + * controller using a sandboxed class loader. */ - protected ClassLoader getClassLoader (PlaceConfig config) + protected PlaceController createController (PlaceConfig config) { - return null; + return config.createController(); } /** The context through which we access needed services. */ diff --git a/src/java/com/threerings/crowd/data/PlaceConfig.java b/src/java/com/threerings/crowd/data/PlaceConfig.java index 2bbf5be98..448e45b72 100644 --- a/src/java/com/threerings/crowd/data/PlaceConfig.java +++ b/src/java/com/threerings/crowd/data/PlaceConfig.java @@ -25,7 +25,7 @@ import com.samskivert.util.StringUtil; import com.threerings.io.SimpleStreamableObject; -import com.threerings.crowd.client.LocationDirector; +import com.threerings.crowd.Log; import com.threerings.crowd.client.PlaceController; /** @@ -35,45 +35,61 @@ import com.threerings.crowd.client.PlaceController; * and place controller are provided with the place config object when the * place is created. * - *
The place config object is also the mechanism used to instantiate - * the appropriate place manager and controller. Every place must have an + *
The place config object is also the mechanism used to instantiate the + * appropriate place manager and controller. Every place must have an * associated place config derived class that overrides {@link - * #getControllerClass} and {@link #getManagerClassName}, returning the + * #createController} and {@link #getManagerClassName}, returning the * appropriate place controller and manager class for that place. */ public abstract class PlaceConfig extends SimpleStreamableObject { + /** + * Returns the class that should be used to create a controller for this + * place. The controller class must derive from {@link PlaceController}. + * + * @deprecated Override {@link #createController} directly. + */ + public Class getControllerClass () + { + return null; + } + /** * Returns the class that should be used to create a controller for * this place. The controller class must derive from {@link * PlaceController}. */ - public abstract Class getControllerClass (); + public PlaceController createController () + { + Class cclass = getControllerClass(); + if (cclass == null) { + throw new RuntimeException( + "PlaceConfig.createController() must be overridden."); + } + + Log.warning("Providing backwards compatibility. PlaceConfig." + + "createController() should be overridden directly."); + try { + return (PlaceController)cclass.newInstance(); + } catch (Exception e) { + Log.warning("Failed to instantiate controller class '" + + cclass + "'."); + Log.logStackTrace(e); + return null; + } + } /** - * Returns the name of the class that should be used to create a - * manager for this place. The manager class must derive from {@link - * com.threerings.crowd.server.PlaceManager}. Note: this - * method differs from {@link #getControllerClass} because we want to - * avoid compile time linkage of the place config object (which is - * used on the client) to server code. This allows a code optimizer - * (DashO Pro, for example) to remove the server code from the client, - * knowing that it is never used. + * Returns the name of the class that should be used to create a manager + * for this place. The manager class must derive from {@link + * com.threerings.crowd.server.PlaceManager}. Note: this method + * differs from {@link #createController} because we want to avoid compile + * time linkage of the place config object (which is used on the client) to + * server code. This allows a code optimizer (DashO Pro, for example) to + * remove the server code from the client, knowing that it is never used. */ public abstract String getManagerClassName (); - /** - * The {@link LocationDirector} may be configured to use a custom - * class loader when loading the classes associated with a certain - * {@link PlaceConfig}, in this case this method will be called prior - * to a call to {@link #getControllerClass} to set {@link #_loader} - * which should then be used for any dynamic class loading. - */ - public void setClassLoader (ClassLoader loader) - { - _loader = loader; - } - // documentation inherited protected void toString (StringBuffer buf) { @@ -81,7 +97,4 @@ public abstract class PlaceConfig extends SimpleStreamableObject buf.append(", "); super.toString(buf); } - - /** The class loader to use when dynamically loading controller classes. */ - protected transient ClassLoader _loader = getClass().getClassLoader(); } diff --git a/src/java/com/threerings/micasa/lobby/LobbyConfig.java b/src/java/com/threerings/micasa/lobby/LobbyConfig.java index 944a0e988..c30dc4791 100644 --- a/src/java/com/threerings/micasa/lobby/LobbyConfig.java +++ b/src/java/com/threerings/micasa/lobby/LobbyConfig.java @@ -27,16 +27,17 @@ import javax.swing.JLabel; import java.util.Properties; import com.samskivert.util.StringUtil; +import com.threerings.crowd.client.PlaceController; import com.threerings.crowd.data.PlaceConfig; -import com.threerings.parlor.game.data.GameConfig; import com.threerings.micasa.util.MiCasaContext; +import com.threerings.parlor.game.data.GameConfig; public class LobbyConfig extends PlaceConfig { // documentation inherited - public Class getControllerClass () + public PlaceController createController () { - return LobbyController.class; + return new LobbyController(); } // documentation inherited @@ -64,7 +65,7 @@ public class LobbyConfig extends PlaceConfig public GameConfig getGameConfig () throws Exception { - return (GameConfig)_loader.loadClass(_gameConfigClass).newInstance(); + return (GameConfig)Class.forName(_gameConfigClass).newInstance(); } /** diff --git a/src/java/com/threerings/parlor/game/data/GameConfig.java b/src/java/com/threerings/parlor/game/data/GameConfig.java index 941bf66fe..cbcf52437 100644 --- a/src/java/com/threerings/parlor/game/data/GameConfig.java +++ b/src/java/com/threerings/parlor/game/data/GameConfig.java @@ -32,20 +32,19 @@ import com.threerings.parlor.game.client.GameConfigurator; /** * The game config class encapsulates the configuration information for a - * particular type of game. The hierarchy of game config objects mimics - * the hierarchy of game managers and controllers. Both the game manager - * and game controller are provided with the game config object when the - * game is created. + * particular type of game. The hierarchy of game config objects mimics the + * hierarchy of game managers and controllers. Both the game manager and game + * controller are provided with the game config object when the game is + * created. * - *
The game config object is also the mechanism used to instantiate - * the appropriate game manager and controller. Every game must have an - * associated game config derived class that overrides {@link - * #getControllerClass} and {@link #getManagerClassName}, returning the - * appropriate game controller and manager class for that game. Thus the - * entire chain of events that causes a particular game to be created is - * the construction of the appropriate game config instance which is - * provided to the server as part of an invitation or via some other - * matchmaking mechanism. + *
The game config object is also the mechanism used to instantiate the + * appropriate game manager and controller. Every game must have an associated + * game config derived class that overrides {@link #createController} and + * {@link #getManagerClassName}, returning the appropriate game controller and + * manager class for that game. Thus the entire chain of events that causes a + * particular game to be created is the construction of the appropriate game + * config instance which is provided to the server as part of an invitation or + * via some other matchmaking mechanism. */ public abstract class GameConfig extends PlaceConfig implements Cloneable { diff --git a/src/java/com/threerings/stage/data/StageSceneConfig.java b/src/java/com/threerings/stage/data/StageSceneConfig.java index ef7f4dff1..8dbc4793b 100644 --- a/src/java/com/threerings/stage/data/StageSceneConfig.java +++ b/src/java/com/threerings/stage/data/StageSceneConfig.java @@ -3,6 +3,7 @@ package com.threerings.stage.data; +import com.threerings.crowd.client.PlaceController; import com.threerings.crowd.data.PlaceConfig; import com.threerings.stage.client.StageSceneController; @@ -13,9 +14,9 @@ import com.threerings.stage.client.StageSceneController; public class StageSceneConfig extends PlaceConfig { // documentation inherited - public Class getControllerClass () + public PlaceController createController () { - return StageSceneController.class; + return new StageSceneController(); } // documentation inherited diff --git a/src/java/com/threerings/whirled/data/DefaultSceneConfig.java b/src/java/com/threerings/whirled/data/DefaultSceneConfig.java index fdc5f98b8..05e28bf3b 100644 --- a/src/java/com/threerings/whirled/data/DefaultSceneConfig.java +++ b/src/java/com/threerings/whirled/data/DefaultSceneConfig.java @@ -1,5 +1,5 @@ // -// $Id: DefaultSceneConfig.java,v 1.2 2004/08/27 02:20:42 mdb Exp $ +// $Id$ // // Narya library - tools for developing networked games // Copyright (C) 2002-2004 Three Rings Design, Inc., All Rights Reserved @@ -36,12 +36,6 @@ import com.threerings.whirled.client.SceneController; */ public class DefaultSceneConfig extends PlaceConfig { - // documentation inherited - public Class getControllerClass () - { - return SceneController.class; - } - // documentation inherited public String getManagerClassName () {