diff --git a/src/java/com/threerings/presents/peer/server/PeerManager.java b/src/java/com/threerings/presents/peer/server/PeerManager.java
index ddad6b287..0145859b9 100644
--- a/src/java/com/threerings/presents/peer/server/PeerManager.java
+++ b/src/java/com/threerings/presents/peer/server/PeerManager.java
@@ -27,13 +27,12 @@ import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import com.google.common.collect.Maps;
import com.google.inject.Inject;
+import com.google.inject.Injector;
import com.samskivert.jdbc.RepositoryUnit;
import com.samskivert.jdbc.WriteOnlyUnit;
@@ -42,16 +41,15 @@ import com.samskivert.util.ArrayIntSet;
import com.samskivert.util.ChainedResultListener;
import com.samskivert.util.Interval;
import com.samskivert.util.Invoker;
-import com.samskivert.util.ObjectUtil;
import com.samskivert.util.ObserverList;
import com.samskivert.util.ResultListener;
import com.samskivert.util.ResultListenerList;
-import com.samskivert.util.StringUtil;
import com.samskivert.util.Tuple;
import com.threerings.io.Streamable;
import com.threerings.util.Name;
+import com.threerings.presents.annotation.MainInvoker;
import com.threerings.presents.data.ClientObject;
import com.threerings.presents.dobj.DObject;
import com.threerings.presents.dobj.EntryAddedEvent;
@@ -63,7 +61,6 @@ import com.threerings.presents.dobj.Subscriber;
import com.threerings.presents.client.Client;
import com.threerings.presents.server.ClientManager;
-import com.threerings.presents.server.InvocationException;
import com.threerings.presents.server.InvocationManager;
import com.threerings.presents.server.PresentsClient;
import com.threerings.presents.server.PresentsDObjectMgr;
@@ -72,7 +69,6 @@ import com.threerings.presents.server.net.ConnectionManager;
import com.threerings.presents.peer.data.ClientInfo;
import com.threerings.presents.peer.data.NodeObject;
-import com.threerings.presents.peer.data.PeerMarshaller;
import com.threerings.presents.peer.net.PeerCreds;
import com.threerings.presents.peer.server.persist.NodeRecord;
import com.threerings.presents.peer.server.persist.NodeRepository;
@@ -197,8 +193,6 @@ public abstract class PeerManager
* bits, so this should not be called until after the main server has set up its
* client factory and authenticator.
*
- * @param ctx used to communicate with the database.
- * @param invoker we will perform all database operations on the supplied invoker thread.
* @param nodeName this node's unique name.
* @param sharedSecret a shared secret used to allow the peers to authenticate with one
* another.
@@ -208,11 +202,10 @@ public abstract class PeerManager
* network than the communication between real clients and the various peer servers).
* @param port the port on which other nodes should connect to us.
*/
- public void init (PersistenceContext ctx, Invoker invoker, String nodeName,
- String sharedSecret, String hostName, String publicHostName, int port)
+ public void init (Injector injector, String nodeName, String sharedSecret,
+ String hostName, String publicHostName, int port)
{
- _invoker = invoker;
- _noderepo = new NodeRepository(ctx);
+ _injector = injector;
_nodeName = nodeName;
_sharedSecret = sharedSecret;
@@ -234,8 +227,7 @@ public abstract class PeerManager
});
// set the invocation service
- _nodeobj.setPeerService(
- (PeerMarshaller)_invmgr.registerDispatcher(new PeerDispatcher(this)));
+ _nodeobj.setPeerService(_invmgr.registerDispatcher(new PeerDispatcher(this)));
// register ourselves as a client observer
_clmgr.addClientObserver(this);
@@ -352,6 +344,7 @@ public abstract class PeerManager
// invoke the action on our local server if appropriate
if (action.isApplicable(_nodeobj)) {
+ _injector.injectMembers(action);
action.invoke();
}
@@ -740,6 +733,7 @@ public abstract class PeerManager
ObjectInputStream oin =
new ObjectInputStream(new ByteArrayInputStream(serializedAction));
action = (NodeAction)oin.readObject();
+ _injector.injectMembers(action);
action.invoke();
} catch (Exception e) {
log.warning("Failed to execute node action [from=" + caller.who() +
@@ -1192,13 +1186,6 @@ public abstract class PeerManager
protected Interval _timeout;
}
- protected String _nodeName, _sharedSecret;
- protected NodeRecord _self;
- protected Invoker _invoker;
- protected NodeRepository _noderepo;
- protected NodeObject _nodeobj;
- protected HashMap _peers = new HashMap();
-
// (this need not use a runqueue as all it will do is post an invoker unit)
protected Interval _peerRefresher = new Interval() {
public void expired () {
@@ -1206,28 +1193,36 @@ public abstract class PeerManager
}
};
+ protected String _nodeName, _sharedSecret;
+ protected NodeRecord _self;
+ protected NodeObject _nodeobj;
+ protected Map _peers = Maps.newHashMap();
+
+ /** Used to resolve dependencies in unserialized {@link NodeAction} instances. */
+ protected Injector _injector;
+
/** The client oids of all peers subscribed to the node object. */
protected ArrayIntSet _suboids = new ArrayIntSet();
/** Contains a mapping of proxied objects to subscriber instances. */
- protected HashMap,Tuple,DObject>> _proxies =
- Maps.newHashMap();
+ protected Map,Tuple,DObject>> _proxies = Maps.newHashMap();
/** Our stale cache observers. */
- protected HashMap> _cacheobs = Maps.newHashMap();
+ protected Map> _cacheobs = Maps.newHashMap();
/** Listeners for dropped locks. */
- protected ObserverList _dropobs =
- new ObserverList(ObserverList.FAST_UNSAFE_NOTIFY);
+ protected ObserverList _dropobs = ObserverList.newFastUnsafe();
/** Locks in the process of resolution. */
- protected HashMap _locks = Maps.newHashMap();
+ protected Map _locks = Maps.newHashMap();
// our service dependencies
@Inject protected ConnectionManager _conmgr;
@Inject protected ClientManager _clmgr;
@Inject protected PresentsDObjectMgr _omgr;
@Inject protected InvocationManager _invmgr;
+ @Inject protected @MainInvoker Invoker _invoker;
+ @Inject protected NodeRepository _noderepo;
/** We wait this long for peer ratification to complete before acquiring/releasing the lock. */
protected static final long LOCK_TIMEOUT = 5000L;