From 12410ee32ca9eb747a52016665a62b95da78586e Mon Sep 17 00:00:00 2001 From: Michael Bayne Date: Fri, 2 Feb 2007 23:49:24 +0000 Subject: [PATCH] Widening. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4527 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../presents/client/ClientDObjectMgr.java | 166 +++++++----------- 1 file changed, 68 insertions(+), 98 deletions(-) diff --git a/src/java/com/threerings/presents/client/ClientDObjectMgr.java b/src/java/com/threerings/presents/client/ClientDObjectMgr.java index 74c436adc..9b6cd7353 100644 --- a/src/java/com/threerings/presents/client/ClientDObjectMgr.java +++ b/src/java/com/threerings/presents/client/ClientDObjectMgr.java @@ -40,10 +40,9 @@ import com.threerings.presents.dobj.*; import com.threerings.presents.net.*; /** - * The client distributed object manager manages a set of proxy objects - * which mirror the distributed objects maintained on the server. - * Requests for modifications, etc. are forwarded to the server and events - * are dispatched from the server to this client for objects to which this + * The client distributed object manager manages a set of proxy objects which mirror the + * distributed objects maintained on the server. Requests for modifications, etc. are forwarded to + * the server and events are dispatched from the server to this client for objects to which this * client is subscribed. */ public class ClientDObjectMgr @@ -52,20 +51,17 @@ public class ClientDObjectMgr /** * Constructs a client distributed object manager. * - * @param comm a communicator instance by which it can communicate - * with the server. - * @param client a reference to the client that is managing this whole - * communications and event dispatch business. + * @param comm a communicator instance by which it can communicate with the server. + * @param client a reference to the client that is managing this whole communications and event + * dispatch business. */ public ClientDObjectMgr (Communicator comm, Client client) { _comm = comm; _client = client; - // register a debug hook for dumping all objects in the - // distributed object table - DebugChords.registerHook( - DUMP_OTABLE_MODMASK, DUMP_OTABLE_KEYCODE, DUMP_OTABLE_HOOK); + // register a debug hook for dumping all objects in the distributed object table + DebugChords.registerHook(DUMP_OTABLE_MODMASK, DUMP_OTABLE_KEYCODE, DUMP_OTABLE_HOOK); // register a flush interval new Interval(client.getRunQueue()) { @@ -83,33 +79,21 @@ public class ClientDObjectMgr } // inherit documentation from the interface - public void subscribeToObject ( - int oid, Subscriber target) + public void subscribeToObject (int oid, Subscriber target) { if (oid <= 0) { - target.requestFailed( - oid, new ObjectAccessException("Invalid oid " + oid + ".")); + target.requestFailed(oid, new ObjectAccessException("Invalid oid " + oid + ".")); } else { queueAction(oid, target, true); } } // inherit documentation from the interface - public void unsubscribeFromObject ( - int oid, Subscriber target) + public void unsubscribeFromObject (int oid, Subscriber target) { queueAction(oid, target, false); } - protected void queueAction ( - int oid, Subscriber target, boolean subscribe) - { - // queue up an action - _actions.append(new ObjectAction(oid, target, subscribe)); - // and queue up the omgr to get invoked on the invoker thread - _client.getRunQueue().postRunnable(this); - } - // inherit documentation from the interface public void postEvent (DEvent event) { @@ -120,16 +104,14 @@ public class ClientDObjectMgr // inherit documentation from the interface public void removedLastSubscriber (DObject obj, boolean deathWish) { - // if this object has a registered flush delay, don't can it just yet, - // just slip it onto the flush queue + // if this object has a registered flush delay, don't can it just yet, just slip it onto + // the flush queue Class oclass = obj.getClass(); for (Class dclass : _delays.keySet()) { if (dclass.isAssignableFrom(oclass)) { - long expire = System.currentTimeMillis() + - _delays.get(dclass).longValue(); + long expire = System.currentTimeMillis() + _delays.get(dclass).longValue(); _flushes.put(obj.getOid(), new FlushRecord(obj, expire)); -// Log.info("Flushing " + obj.getOid() + " at " + -// new java.util.Date(expire)); +// Log.info("Flushing " + obj.getOid() + " at " + new java.util.Date(expire)); return; } } @@ -149,9 +131,8 @@ public class ClientDObjectMgr } /** - * Called by the communicator when a downstream message arrives from - * the network layer. We queue it up for processing and request some - * processing time on the main thread. + * Called by the communicator when a downstream message arrives from the network layer. We + * queue it up for processing and request some processing time on the main thread. */ public void processMessage (DownstreamMessage msg) { @@ -162,8 +143,8 @@ public class ClientDObjectMgr } /** - * Invoked on the main client thread to process any newly arrived - * messages that we have waiting in our queue. + * Invoked on the main client thread to process any newly arrived messages that we have waiting + * in our queue. */ public void run () { @@ -186,8 +167,7 @@ public class ClientDObjectMgr } else if (obj instanceof UnsubscribeResponse) { int oid = ((UnsubscribeResponse)obj).getOid(); if (_dead.remove(oid) == null) { - Log.warning("Received unsub ACK from unknown object " + - "[oid=" + oid + "]."); + Log.warning("Received unsub ACK from unknown object [oid=" + oid + "]."); } } else if (obj instanceof FailureResponse) { @@ -208,14 +188,22 @@ public class ClientDObjectMgr } } + protected void queueAction ( + int oid, Subscriber target, boolean subscribe) + { + // queue up an action + _actions.append(new ObjectAction(oid, target, subscribe)); + // and queue up the omgr to get invoked on the invoker thread + _client.getRunQueue().postRunnable(this); + } + /** - * Called when a new event arrives from the server that should be - * dispatched to subscribers here on the client. + * Called when a new event arrives from the server that should be dispatched to subscribers + * here on the client. */ protected void dispatchEvent (DEvent event) { - // if this is a compound event, we need to process its contained - // events in order + // if this is a compound event, we need to process its contained events in order if (event instanceof CompoundEvent) { List events = ((CompoundEvent)event).getEvents(); int ecount = events.size(); @@ -230,8 +218,7 @@ public class ClientDObjectMgr DObject target = _ocache.get(toid); if (target == null) { if (!_dead.containsKey(toid)) { - Log.warning("Unable to dispatch event on non-proxied " + - "object [event=" + event + "]."); + Log.warning("Unable to dispatch event on non-proxied object " + event + "."); } return; } @@ -240,12 +227,10 @@ public class ClientDObjectMgr // apply the event to the object boolean notify = event.applyToObject(target); - // if this is an object destroyed event, we need to remove the - // object from our object table + // if this is an object destroyed event, we need to remove the object from our table if (event instanceof ObjectDestroyedEvent) { -// Log.info("Pitching destroyed object " + -// "[oid=" + toid + ", class=" + -// StringUtil.shortClassName(target) + "]."); +// Log.info("Pitching destroyed object [oid=" + toid + +// ", class=" + StringUtil.shortClassName(target) + "]."); _ocache.remove(toid); } @@ -255,18 +240,16 @@ public class ClientDObjectMgr } } catch (Exception e) { - Log.warning("Failure processing event [event=" + event + - ", target=" + target + "]."); + Log.warning("Failure processing event [event=" + event + ", target=" + target + "]."); Log.logStackTrace(e); } } /** - * Registers this object in our proxy cache and notifies the - * subscribers that were waiting for subscription to this object. + * Registers this object in our proxy cache and notifies the subscribers that were waiting for + * subscription to this object. */ - protected void registerObjectAndNotify ( - ObjectResponse orsp) + protected void registerObjectAndNotify (ObjectResponse orsp) { // let the object know that we'll be managing it T obj = orsp.getObject(); @@ -278,14 +261,13 @@ public class ClientDObjectMgr // let the penders know that the object is available PendingRequest req = _penders.remove(obj.getOid()); if (req == null) { - Log.warning("Got object, but no one cares?! " + - "[oid=" + obj.getOid() + ", obj=" + obj + "]."); + Log.warning("Got object, but no one cares?! [oid=" + obj.getOid() + + ", obj=" + obj + "]."); return; } for (int i = 0; i < req.targets.size(); i++) { - @SuppressWarnings("unchecked") Subscriber target = - (Subscriber)req.targets.get(i); + @SuppressWarnings("unchecked") Subscriber target = (Subscriber)req.targets.get(i); // add them as a subscriber obj.addSubscriber(target); // and let them know that the object is in @@ -294,16 +276,15 @@ public class ClientDObjectMgr } /** - * Notifies the subscribers that had requested this object (for - * subscription) that it is not available. + * Notifies the subscribers that had requested this object (for subscription) that it is not + * available. */ protected void notifyFailure (int oid) { // let the penders know that the object is not available PendingRequest req = _penders.remove(oid); if (req == null) { - Log.warning("Failed to get object, but no one cares?! " + - "[oid=" + oid + "]."); + Log.warning("Failed to get object, but no one cares?! [oid=" + oid + "]."); return; } @@ -314,8 +295,8 @@ public class ClientDObjectMgr } /** - * This is guaranteed to be invoked via the invoker and can safely do - * main thread type things like call back to the subscriber. + * This is guaranteed to be invoked via the invoker and can safely do main thread type things + * like call back to the subscriber. */ protected void doSubscribe (ObjectAction action) { @@ -338,11 +319,9 @@ public class ClientDObjectMgr } // see if we've already got an outstanding request for this object - @SuppressWarnings("unchecked") PendingRequest req = - (PendingRequest)_penders.get(oid); + @SuppressWarnings("unchecked") PendingRequest req = (PendingRequest)_penders.get(oid); if (req != null) { - // add this subscriber to the list of subscribers to be - // notified when the request is satisfied + // add this subscriber to the list to be notified when the request is satisfied req.addTarget(target); return; } @@ -358,8 +337,8 @@ public class ClientDObjectMgr } /** - * This is guaranteed to be invoked via the invoker and can safely do - * main thread type things like call back to the subscriber. + * This is guaranteed to be invoked via the invoker and can safely do main thread type things + * like call back to the subscriber. */ protected void doUnsubscribe (int oid, Subscriber target) { @@ -368,39 +347,36 @@ public class ClientDObjectMgr dobj.removeSubscriber(target); } else { - Log.info("Requested to remove subscriber from " + - "non-proxied object [oid=" + oid + + Log.info("Requested to remove subscriber from non-proxied object [oid=" + oid + ", sub=" + target + "]."); } } /** - * Flushes a distributed object subscription, issuing an unsubscribe - * request to the server. + * Flushes a distributed object subscription, issuing an unsubscribe request to the server. */ protected void flushObject (DObject obj) { - // move this object into the dead pool so that we don't claim to - // have it around anymore; once our unsubscribe message is - // processed, it'll be 86ed + // move this object into the dead pool so that we don't claim to have it around anymore; + // once our unsubscribe message is processed, it'll be 86ed int ooid = obj.getOid(); _ocache.remove(ooid); _dead.put(ooid, obj); - // ship off an unsubscribe message to the server; we'll remove the - // object from our table when we get the unsub ack + // ship off an unsubscribe message to the server; we'll remove the object from our table + // when we get the unsub ack _comm.postMessage(new UnsubscribeRequest(ooid)); } /** - * Called periodically to flush any objects that have been lingering - * due to a previously enacted flush delay. + * Called periodically to flush any objects that have been lingering due to a previously + * enacted flush delay. */ protected void flushObjects () { long now = System.currentTimeMillis(); - for (Iterator> iter = - _flushes.intEntrySet().iterator(); iter.hasNext(); ) { + for (Iterator> iter = _flushes.intEntrySet().iterator(); + iter.hasNext(); ) { IntMap.IntEntry entry = iter.next(); int oid = entry.getIntKey(); FlushRecord rec = entry.getValue(); @@ -413,8 +389,7 @@ public class ClientDObjectMgr } /** - * The object action is used to queue up a subscribe or unsubscribe - * request. + * The object action is used to queue up a subscribe or unsubscribe request. */ protected static final class ObjectAction { @@ -438,8 +413,7 @@ public class ClientDObjectMgr protected static final class PendingRequest { public int oid; - public ArrayList> targets = - new ArrayList>(); + public ArrayList> targets = new ArrayList>(); public PendingRequest (int oid) { @@ -468,8 +442,7 @@ public class ClientDObjectMgr } } - /** A reference to the communicator that sends and receives messages - * for this client. */ + /** A reference to the communicator that sends and receives messages for this client. */ protected Communicator _comm; /** A reference to our client instance. */ @@ -485,8 +458,7 @@ public class ClientDObjectMgr protected HashIntMap _dead = new HashIntMap(); /** Pending object subscriptions. */ - protected HashIntMap> _penders = - new HashIntMap>(); + protected HashIntMap> _penders = new HashIntMap>(); /** A mapping from distributed object class to flush delay. */ protected HashMap,Long> _delays = new HashMap,Long>(); @@ -494,8 +466,7 @@ public class ClientDObjectMgr /** A set of objects waiting to be flushed. */ protected HashIntMap _flushes = new HashIntMap(); - /** A debug hook that allows the dumping of all objects in the object - * table out to the log. */ + /** A debug hook that allows the dumping of all objects in the object table out to the log. */ protected DebugChords.Hook DUMP_OTABLE_HOOK = new DebugChords.Hook() { public void invoke () { Log.info("Dumping " + _ocache.size() + " objects:"); @@ -506,8 +477,7 @@ public class ClientDObjectMgr }; /** The modifiers for our dump table debug hook (Alt+Shift). */ - protected static int DUMP_OTABLE_MODMASK = - KeyEvent.ALT_DOWN_MASK|KeyEvent.SHIFT_DOWN_MASK; + protected static int DUMP_OTABLE_MODMASK = KeyEvent.ALT_DOWN_MASK|KeyEvent.SHIFT_DOWN_MASK; /** The key code for our dump table debug hook (o). */ protected static int DUMP_OTABLE_KEYCODE = KeyEvent.VK_O;