diff --git a/src/java/com/threerings/presents/client/ClientDObjectMgr.java b/src/java/com/threerings/presents/client/ClientDObjectMgr.java index 86aa05ef1..d728d8ac4 100644 --- a/src/java/com/threerings/presents/client/ClientDObjectMgr.java +++ b/src/java/com/threerings/presents/client/ClientDObjectMgr.java @@ -1,5 +1,5 @@ // -// $Id: ClientDObjectMgr.java,v 1.15 2002/07/17 01:54:16 mdb Exp $ +// $Id: ClientDObjectMgr.java,v 1.16 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.client; @@ -77,13 +77,8 @@ public class ClientDObjectMgr // inherit documentation from the interface public void postEvent (DEvent event) { - // we can cast the event to a typed event because only typed - // events will be kicking around on the client; bare DEvent - // instances are only used for internal messages on the server - TypedEvent tevent = (TypedEvent)event; - // send a forward event request to the server - _comm.postMessage(new ForwardEventRequest(tevent)); + _comm.postMessage(new ForwardEventRequest(event)); } // inherit documentation from the interface diff --git a/src/java/com/threerings/presents/client/Communicator.java b/src/java/com/threerings/presents/client/Communicator.java index 89ed7a137..4b232022e 100644 --- a/src/java/com/threerings/presents/client/Communicator.java +++ b/src/java/com/threerings/presents/client/Communicator.java @@ -1,19 +1,28 @@ // -// $Id: Communicator.java,v 1.20 2002/07/12 03:49:02 mdb Exp $ +// $Id: Communicator.java,v 1.21 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.client; -import java.io.*; -import java.net.Socket; -import java.net.InetAddress; +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InterruptedIOException; +import java.io.OutputStream; +import java.net.InetAddress; +import java.net.Socket; + +import com.samskivert.io.NestableIOException; import com.samskivert.util.LoopingThread; import com.samskivert.util.Queue; +import com.threerings.io.FramedInputStream; +import com.threerings.io.FramingOutputStream; +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; + import com.threerings.presents.Log; import com.threerings.presents.dobj.DObjectManager; -import com.threerings.presents.io.*; -import com.threerings.presents.io.ObjectStreamException; import com.threerings.presents.net.*; /** @@ -166,6 +175,7 @@ public class Communicator } Log.info("Connection failed: " + ioe); + Log.logStackTrace(ioe); // let the client know that things went south _client.notifyObservers(Client.CLIENT_CONNECTION_FAILED, ioe); @@ -226,6 +236,10 @@ public class Communicator } _socket = null; + // clear these out because they are probably large and in charge + _oin = null; + _oout = null; + // let the client observers know that we're logged off _client.notifyObservers(Client.CLIENT_DID_LOGOFF, null); @@ -241,8 +255,12 @@ public class Communicator protected void sendMessage (UpstreamMessage msg) throws IOException { - // first we flatten the message so that we can measure it's length - TypedObjectFactory.writeTo(_dout, msg); +// Log.info("Sending message " + msg + "."); + + // first we write the message so that we can measure it's length + _oout.writeObject(msg); + _oout.flush(); + // then write the framed message to actual output stream _fout.writeFrameAndReset(_out); } @@ -261,9 +279,15 @@ public class Communicator // hits EOF or if something goes awry) while (!_fin.readFrame(_in)); - // then use the typed object factory to read and decode the - // proper downstream message instance - return (DownstreamMessage)TypedObjectFactory.readFrom(_din); + try { + DownstreamMessage msg = (DownstreamMessage)_oin.readObject(); +// Log.info("Received message " + msg + "."); + return msg; + + } catch (ClassNotFoundException cnfe) { + throw new NestableIOException( + "Unable to decode incoming message.", cnfe); + } } /** @@ -328,9 +352,11 @@ public class Communicator // our messages are framed (preceded by their length), so we // use these helper streams to manage the framing _fin = new FramedInputStream(); - _din = new DataInputStream(_fin); _fout = new FramingOutputStream(); - _dout = new DataOutputStream(_fout); + + // create our object input and output streams + _oin = new ObjectInputStream(_fin); + _oout = new ObjectOutputStream(_fout); } protected void logon () @@ -370,10 +396,6 @@ public class Communicator // process the message processMessage(msg); - } catch (ObjectStreamException ose) { - Log.warning("Error decoding message: " + ose); - Log.logStackTrace(ose); - } catch (InterruptedIOException iioe) { // somebody set up us the bomb! we've been interrupted // which means that we're being shut down, so we just @@ -474,10 +496,6 @@ public class Communicator /** This is used to terminate the writer thread. */ protected static class TerminationMessage extends UpstreamMessage { - public short getType () - { - return -1; - } } protected Client _client; @@ -491,11 +509,11 @@ public class Communicator /** We use this to frame our upstream messages. */ protected FramingOutputStream _fout; - protected DataOutputStream _dout; + protected ObjectOutputStream _oout; /** We use this to frame our downstream messages. */ protected FramedInputStream _fin; - protected DataInputStream _din; + protected ObjectInputStream _oin; protected ClientDObjectMgr _omgr; } diff --git a/src/java/com/threerings/presents/dobj/AttributeChangedEvent.java b/src/java/com/threerings/presents/dobj/AttributeChangedEvent.java index df2332694..ee98596ca 100644 --- a/src/java/com/threerings/presents/dobj/AttributeChangedEvent.java +++ b/src/java/com/threerings/presents/dobj/AttributeChangedEvent.java @@ -1,14 +1,15 @@ // -// $Id: AttributeChangedEvent.java,v 1.11 2002/02/01 23:32:37 mdb Exp $ +// $Id: AttributeChangedEvent.java,v 1.12 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.dobj; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; import java.lang.reflect.Method; -import com.threerings.presents.io.ValueMarshaller; +import com.samskivert.util.StringUtil; + +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; /** * An attribute changed event is dispatched when a single attribute of a @@ -17,11 +18,8 @@ import com.threerings.presents.io.ValueMarshaller; * * @see DObjectManager#postEvent */ -public class AttributeChangedEvent extends TypedEvent +public class AttributeChangedEvent extends DEvent { - /** The typed object code for this event. */ - public static final short TYPE = TYPE_BASE + 1; - /** * Constructs a new attribute changed event on the specified target * object with the supplied attribute name and value. @@ -121,28 +119,26 @@ public class AttributeChangedEvent extends TypedEvent return true; } - // documentation inherited - public short getType () - { - return TYPE; - } - - // documentation inherited - public void writeTo (DataOutputStream out) + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) throws IOException { - super.writeTo(out); + super.writeObject(out); out.writeUTF(_name); - ValueMarshaller.writeTo(out, _value); + out.writeObject(_value); } - // documentation inherited - public void readFrom (DataInputStream in) - throws IOException + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException { - super.readFrom(in); + super.readObject(in); _name = in.readUTF(); - _value = ValueMarshaller.readFrom(in); + _value = in.readObject(); } // documentation inherited @@ -159,7 +155,8 @@ public class AttributeChangedEvent extends TypedEvent buf.append("CHANGE:"); super.toString(buf); buf.append(", name=").append(_name); - buf.append(", value=").append(_value); + buf.append(", value="); + StringUtil.toString(buf, _value); } protected String _name; diff --git a/src/java/com/threerings/presents/dobj/AttributesChangedEvent.java b/src/java/com/threerings/presents/dobj/AttributesChangedEvent.java index 33d8d163a..fbf8cb1aa 100644 --- a/src/java/com/threerings/presents/dobj/AttributesChangedEvent.java +++ b/src/java/com/threerings/presents/dobj/AttributesChangedEvent.java @@ -1,14 +1,14 @@ // -// $Id: AttributesChangedEvent.java,v 1.9 2002/02/01 23:32:37 mdb Exp $ +// $Id: AttributesChangedEvent.java,v 1.10 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.dobj; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; + import com.samskivert.util.StringUtil; -import com.threerings.presents.io.ValueMarshaller; /** * An attributes changed event is dispatched when multiple @@ -17,11 +17,8 @@ import com.threerings.presents.io.ValueMarshaller; * * @see DObjectManager#postEvent */ -public class AttributesChangedEvent extends TypedEvent +public class AttributesChangedEvent extends DEvent { - /** The typed object code for this event. */ - public static final short TYPE = TYPE_BASE + 2; - /** * Constructs a new attribute changed event on the specified target * object with the supplied attribute name and value. @@ -170,32 +167,33 @@ public class AttributesChangedEvent extends TypedEvent return true; } - public short getType () - { - return TYPE; - } - - public void writeTo (DataOutputStream out) + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) throws IOException { - super.writeTo(out); + super.writeObject(out); out.writeInt(_count); - for (int i = 0; i < _count; i++) { - out.writeUTF(_names[i]); - ValueMarshaller.writeTo(out, _values[i]); + for (int ii = 0; ii < _count; ii++) { + out.writeUTF(_names[ii]); + out.writeObject(_values[ii]); } } - public void readFrom (DataInputStream in) - throws IOException + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException { - super.readFrom(in); + super.readObject(in); _count = in.readInt(); _names = new String[_count]; _values = new Object[_count]; - for (int i = 0; i < _count; i++) { - _names[i] = in.readUTF(); - _values[i] = ValueMarshaller.readFrom(in); + for (int ii = 0; ii < _count; ii++) { + _names[ii] = in.readUTF(); + _values[ii] = in.readObject(); } } @@ -203,8 +201,10 @@ public class AttributesChangedEvent extends TypedEvent { buf.append("CHANGES:"); super.toString(buf); - buf.append(", names=").append(StringUtil.toString(_names)); - buf.append(", values=").append(StringUtil.toString(_values)); + buf.append(", names="); + StringUtil.toString(buf, _names); + buf.append(", values="); + StringUtil.toString(buf, _values); } protected int _count; diff --git a/src/java/com/threerings/presents/dobj/CompoundEvent.java b/src/java/com/threerings/presents/dobj/CompoundEvent.java index 1fc9fe7b8..dd66a525c 100644 --- a/src/java/com/threerings/presents/dobj/CompoundEvent.java +++ b/src/java/com/threerings/presents/dobj/CompoundEvent.java @@ -1,16 +1,15 @@ // -// $Id: CompoundEvent.java,v 1.4 2002/03/21 01:58:10 mdb Exp $ +// $Id: CompoundEvent.java,v 1.5 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.dobj; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; - import java.util.ArrayList; import java.util.List; -import com.threerings.presents.io.TypedObjectFactory; +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; +import com.threerings.util.StreamableArrayList; /** * Used to manage and submit groups of events on a collection of @@ -18,11 +17,8 @@ import com.threerings.presents.io.TypedObjectFactory; * * @see DObject#startTransaction */ -public class CompoundEvent extends TypedEvent +public class CompoundEvent extends DEvent { - /** The typed object code for this event. */ - public static final short TYPE = TYPE_BASE + 50; - /** * Constructs a blank compound event in preparation for * unserialization. @@ -38,6 +34,7 @@ public class CompoundEvent extends TypedEvent { super(0); // we don't have a single target object oid _omgr = omgr; + _events = new StreamableArrayList(); } /** @@ -58,7 +55,7 @@ public class CompoundEvent extends TypedEvent * part of the entire transaction if it is committed or discarded if * the transaction is cancelled. */ - public void postEvent (TypedEvent event) + public void postEvent (DEvent event) { _events.add(event); } @@ -123,34 +120,24 @@ public class CompoundEvent extends TypedEvent return false; } - // documentation inherited - public short getType () - { - return TYPE; - } - - // documentation inherited - public void writeTo (DataOutputStream out) + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) throws IOException { - super.writeTo(out); - int ecount = _events.size(); - out.writeInt(ecount); - for (int i = 0; i < ecount; i++) { - TypedEvent event = (TypedEvent)_events.get(i); - TypedObjectFactory.writeTo(out, event); - } + super.writeObject(out); + out.writeObject(_events); } - // documentation inherited - public void readFrom (DataInputStream in) - throws IOException + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException { - super.readFrom(in); - int ecount = in.readInt(); - for (int i = 0; i < ecount; i++) { - _events.add(TypedObjectFactory.readFrom(in)); - } + super.readObject(in); + _events = (StreamableArrayList)in.readObject(); } /** @@ -181,13 +168,13 @@ public class CompoundEvent extends TypedEvent /** The object manager that we'll post ourselves to when we're * committed. */ - protected DObjectManager _omgr; - - /** A list of the events associated with this compound event. */ - protected ArrayList _events = new ArrayList(); + protected transient DObjectManager _omgr; /** A list of the dobject participants in this transaction. They will * be notified when we are committed or cancelled so that they can * stop posting their events to us. */ - protected ArrayList _participants; + protected transient ArrayList _participants; + + /** A list of the events associated with this compound event. */ + protected StreamableArrayList _events; } diff --git a/src/java/com/threerings/presents/dobj/DEvent.java b/src/java/com/threerings/presents/dobj/DEvent.java index 662c798ff..69349e154 100644 --- a/src/java/com/threerings/presents/dobj/DEvent.java +++ b/src/java/com/threerings/presents/dobj/DEvent.java @@ -1,16 +1,38 @@ // -// $Id: DEvent.java,v 1.10 2002/03/20 19:06:55 mdb Exp $ +// $Id: DEvent.java,v 1.11 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.dobj; +import java.io.IOException; + +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; +import com.threerings.io.Streamable; + /** * A distributed object event is dispatched whenever any modification is * made to a distributed object. It can also be dispatched purely for * notification purposes, without making any modifications to the object * that defines the delivery group (the object's subscribers). */ -public abstract class DEvent +public abstract class DEvent implements Streamable { + /** + * A zero argument constructor for unserialization from yon network. + */ + public DEvent () + { + } + + /** + * Constructs a new distributed object event that pertains to the + * specified distributed object. + */ + public DEvent (int targetOid) + { + _toid = targetOid; + } + /** * Returns the oid of the object that is the target of this event. */ @@ -57,15 +79,6 @@ public abstract class DEvent _soid = sourceOid; } - /** - * Constructs a new distributed object event that pertains to the - * specified distributed object. - */ - protected DEvent (int targetOid) - { - _toid = targetOid; - } - /** * Events with associated listener interfaces should implement this * function and notify the supplied listener if it implements their @@ -78,6 +91,26 @@ public abstract class DEvent // the default is to do nothing } + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) + throws IOException + { + out.defaultWriteObject(); + out.writeInt(_toid); + } + + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException + { + in.defaultReadObject(); + _toid = in.readInt(); + } + /** * Constructs and returns a string representation of this event. */ @@ -105,5 +138,5 @@ public abstract class DEvent protected int _toid; /** The oid of the client that generated this event. */ - protected int _soid = -1; + protected transient int _soid = -1; } diff --git a/src/java/com/threerings/presents/dobj/DObject.java b/src/java/com/threerings/presents/dobj/DObject.java index 538da67c8..99068e1b1 100644 --- a/src/java/com/threerings/presents/dobj/DObject.java +++ b/src/java/com/threerings/presents/dobj/DObject.java @@ -1,13 +1,19 @@ // -// $Id: DObject.java,v 1.45 2002/07/18 00:41:59 mdb Exp $ +// $Id: DObject.java,v 1.46 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.dobj; +import java.io.IOException; import java.lang.reflect.Field; import java.util.ArrayList; import com.samskivert.util.ListUtil; import com.samskivert.util.StringUtil; + +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; +import com.threerings.io.Streamable; + import com.threerings.presents.Log; /** @@ -84,7 +90,7 @@ import com.threerings.presents.Log; * byte[], short[], int[], long[], float[], double[], String[] * */ -public class DObject +public class DObject implements Streamable { /** * Returns the object id of this object. All objects in the system @@ -473,8 +479,12 @@ public class DObject public String toString () { StringBuffer buf = new StringBuffer(); - buf.append("[oid=").append(_oid).append(", "); StringUtil.fieldsToString(buf, this); + if (buf.length() > 0) { + buf.insert(0, ", "); + } + buf.insert(0, _oid); + buf.insert(0, "[oid="); return buf.append("]").toString(); } @@ -482,7 +492,7 @@ public class DObject * Posts the specified event either to our dobject manager or to the * compound event for which we are currently transacting. */ - public void postEvent (TypedEvent event) + public void postEvent (DEvent event) { if (_tevent != null) { _tevent.postEvent(event); @@ -592,6 +602,26 @@ public class DObject _tevent.cancel(); } + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) + throws IOException + { + out.defaultWriteObject(); + out.writeInt(_oid); + } + + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException + { + in.defaultReadObject(); + _oid = in.readInt(); + } + /** * Removes this object from participation in any transaction in which * it might be taking part. @@ -647,8 +677,7 @@ public class DObject try { DSet set = (DSet)getAttribute(name); // dispatch an entry added event - postEvent(new EntryAddedEvent( - _oid, name, entry, !set.homogenous())); + postEvent(new EntryAddedEvent(_oid, name, entry)); } catch (ObjectAccessException oae) { Log.warning("Unable to request entryAdd [name=" + name + @@ -673,8 +702,7 @@ public class DObject try { DSet set = (DSet)getAttribute(name); // dispatch an entry updated event - postEvent(new EntryUpdatedEvent( - _oid, name, entry, !set.homogenous())); + postEvent(new EntryUpdatedEvent(_oid, name, entry)); } catch (ObjectAccessException oae) { Log.warning("Unable to request entryUpdate [name=" + name + @@ -683,7 +711,7 @@ public class DObject } /** Our object id. */ - protected transient int _oid; + protected int _oid; /** A reference to our object manager. */ protected transient DObjectManager _omgr; diff --git a/src/java/com/threerings/presents/dobj/DSet.java b/src/java/com/threerings/presents/dobj/DSet.java index 1e7b73ef2..a2c3270c5 100644 --- a/src/java/com/threerings/presents/dobj/DSet.java +++ b/src/java/com/threerings/presents/dobj/DSet.java @@ -1,17 +1,18 @@ // -// $Id: DSet.java,v 1.16 2002/03/18 23:21:26 mdb Exp $ +// $Id: DSet.java,v 1.17 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.dobj; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; import java.util.Iterator; import com.samskivert.util.StringUtil; +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; +import com.threerings.io.Streamable; + import com.threerings.presents.Log; -import com.threerings.presents.io.Streamable; /** * The distributed set class provides a means by which an unordered set of @@ -19,24 +20,17 @@ import com.threerings.presents.io.Streamable; * added to and removed from the set, requests for which will generate * events much like other distributed object fields. * - *

A set can be either homogenous, whereby the type of object to be - * contained in the set is configured before the set is used and does not - * change; or heterogenous, whereby a set can contain any type of entry as - * long as it implements {@link Entry}. Homogenous sets take advantage of - * their homogeneity by not transfering the classname of each entry as it - * is sent over the wire. - * *

Classes that wish to act as set entries must implement the {@link * Entry} interface which extends {@link Streamable} and adds the * requirement that the object provide a key which will be used to * identify entry equality. Thus an entry is declared to be in a set of - * the object returned by that entry's geyKey() method is - * equal (using equal()) to the entry returned by the - * getKey() method of some other entry in the set. - * Additionally, in the case of entry removal, only the key for the entry - * to be removed will be transmitted with the removal event to save - * network bandwidth. Lastly, the object returned by getKey() - * must be a valid distributed object type. + * the object returned by that entry's {@link Entry#getKey} method is + * equal (using {@link Object#equal}) to the entry returned by the {@link + * Entry#getKey} method of some other entry in the set. Additionally, in + * the case of entry removal, only the key for the entry to be removed + * will be transmitted with the removal event to save network + * bandwidth. Lastly, the object returned by {@link Entry#getKey} must be + * a {@link Streamable} type. */ public class DSet implements Streamable, Cloneable @@ -54,35 +48,6 @@ public class DSet public Object getKey (); } - /** - * Constructs a distributed set that will contain the specified entry - * type. - */ - public DSet (Class entryType) - { - setEntryType(entryType); - } - - /** - * Creates a distributed set and populates it with values from the - * supplied iterator. This should be done before the set is unleashed - * into the wild distributed object world because no associated entry - * added events will be generated. Additionally, this operation does - * not check for duplicates when adding entries, so one should be sure - * that the iterator contains only unique entries. - * - * @param entryType the type of entries that will be stored in this - * set. Only entries of this exact type may be - * stored in the set. - * @param source an iterator from which we will initially populate the - * set. - */ - public DSet (Class entryType, Iterator source) - { - this(source); - setEntryType(entryType); - } - /** * Creates a distributed set and populates it with values from the * supplied iterator. This should be done before the set is unleashed @@ -111,39 +76,12 @@ public class DSet } /** - * Constructs a distributed set without specifying the entry type. The - * set will assume that it is heterogenous, unless a homogenous class - * type is otherwise specified via {@link #setEntryType}. + * Constructs an empty distributed set. */ public DSet () { } - /** - * Returns true if this set contains only entries of exactly the same - * type, false if not. - */ - public boolean homogenous () - { - return _entryType != null; - } - - /** - * Indicates what type of entries will be stored in this set. This can - * be called multiple times before the set is used (in the event that - * one wishes to further specialize the contents of a set that has - * already been configured to use a particular entry type), but once - * the set goes into use, it must not be changed. Also bear in mind - * that the class of entries added to the set are not checked at - * runtime, and adding entries of invalid class will simply result in - * the serialization mechanism failing when an event is dispatched to - * broadcast the addition of an entry. - */ - public void setEntryType (Class entryType) - { - _entryType = entryType; - } - /** * Returns the number of entries in this set. */ @@ -341,113 +279,54 @@ public class DSet return false; } - /** - * Serializes this instance to the supplied output stream. - */ - public void writeTo (DataOutputStream out) - throws IOException - { - if (_entryType == null) { - out.writeUTF(""); - } else { - out.writeUTF(_entryType.getName()); - } - out.writeInt(_size); - int elength = _entries.length; - for (int i = 0; i < elength; i++) { - Entry elem = _entries[i]; - if (elem != null) { - if (_entryType == null) { - out.writeUTF(elem.getClass().getName()); - } - elem.writeTo(out); - } - } - } - - /** - * Unserializes this instance from the supplied input stream. - */ - public void readFrom (DataInputStream in) - throws IOException - { - // read our entry class and forName() it (if we read an entry - // class, we're a homogenous set; otherwise we're heterogenous) - String eclass = in.readUTF(); - try { - if (!StringUtil.blank(eclass)) { - _entryType = Class.forName(eclass); - } - - } catch (Exception e) { - String err = "Unable to instantiate entry class [err=" + e + "]"; - throw new IOException(err); - } - - // find out how many entries we'll be reading - _size = in.readInt(); - - // make sure we can fit _size entries - expand(_size); - - for (int i = 0; i < _size; i++) { - _entries[i] = readEntry(in); - } - } - - /** - * Reads an entry from the wire and unserializes it. Takes into - * account whether or not we're a homogenous set. - */ - public Entry readEntry (DataInputStream in) - throws IOException - { - try { - Entry elem = null; - - // instantiate the appropriate entry instance - if (_entryType != null) { - elem = (Entry)_entryType.newInstance(); - } else { - elem = (Entry)Class.forName(in.readUTF()).newInstance(); - } - - // unserialize it and return it - elem.readFrom(in); - return elem; - - } catch (Exception e) { - Log.warning("Unable to unserialize set entry " + - "[set=" + this + "]."); - Log.logStackTrace(e); - return null; - } - } - /** * Generates a shallow copy of this object. */ public Object clone () { - DSet nset = new DSet(_entryType); + DSet nset = new DSet(); nset._entries = new Entry[_entries.length]; System.arraycopy(_entries, 0, nset._entries, 0, _entries.length); nset._size = _size; return nset; } + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) + throws IOException + { + out.defaultWriteObject(); + out.writeInt(_size); + int ecount = _entries.length; + for (int ii = 0; ii < ecount; ii++) { + if (_entries[ii] != null) { + out.writeObject(_entries[ii]); + } + } + } + + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException + { + in.defaultReadObject(); + _size = in.readInt(); + _entries = new Entry[Math.max(_size, INITIAL_CAPACITY)]; + for (int ii = 0; ii < _size; ii++) { + _entries[ii] = (Entry)in.readObject(); + } + } + /** * Generates a string representation of this set instance. */ public String toString () { - StringBuffer buf = new StringBuffer("["); - if (_entryType == null) { - buf.append("etype=NONE"); - } else { - buf.append("etype=").append(_entryType.getName()); - } - buf.append(", elems=("); + StringBuffer buf = new StringBuffer("("); String prefix = ""; for (int i = 0; i < _entries.length; i++) { Entry elem = _entries[i]; @@ -457,14 +336,14 @@ public class DSet buf.append(elem); } } - buf.append(")]"); + buf.append(")"); return buf.toString(); } protected void expand (int index) { // sanity check - if (index < 0) { + if (index < 0 || index > Short.MAX_VALUE) { Log.warning("Requested to expand to accomodate bogus index! " + "[index=" + index + "]."); Thread.dumpStack(); @@ -490,9 +369,6 @@ public class DSet _entries = elems; } - /** The type of entry this set holds. */ - protected Class _entryType; - /** The entries of the set (in a sparse array). */ protected Entry[] _entries = new Entry[INITIAL_CAPACITY]; diff --git a/src/java/com/threerings/presents/dobj/ElementUpdatedEvent.java b/src/java/com/threerings/presents/dobj/ElementUpdatedEvent.java index 215bd1225..68fdfb350 100644 --- a/src/java/com/threerings/presents/dobj/ElementUpdatedEvent.java +++ b/src/java/com/threerings/presents/dobj/ElementUpdatedEvent.java @@ -1,17 +1,18 @@ // -// $Id: ElementUpdatedEvent.java,v 1.1 2002/03/19 01:10:03 mdb Exp $ +// $Id: ElementUpdatedEvent.java,v 1.2 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.dobj; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; - import java.lang.reflect.Array; import java.lang.reflect.Field; +import com.samskivert.util.StringUtil; + +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; + import com.threerings.presents.Log; -import com.threerings.presents.io.ValueMarshaller; /** * An element updated event is dispatched when an element of an array @@ -20,11 +21,8 @@ import com.threerings.presents.io.ValueMarshaller; * * @see DObjectManager#postEvent */ -public class ElementUpdatedEvent extends TypedEvent +public class ElementUpdatedEvent extends DEvent { - /** The typed object code for this event. */ - public static final short TYPE = TYPE_BASE + 11; - /** * Constructs a new element updated event on the specified target * object with the supplied attribute name, element and index. @@ -153,30 +151,28 @@ public class ElementUpdatedEvent extends TypedEvent } } - // documentation inherited - public short getType () - { - return TYPE; - } - - // documentation inherited - public void writeTo (DataOutputStream out) + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) throws IOException { - super.writeTo(out); + super.writeObject(out); out.writeUTF(_name); + out.writeObject(_value); out.writeInt(_index); - ValueMarshaller.writeTo(out, _value); } - // documentation inherited - public void readFrom (DataInputStream in) - throws IOException + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException { - super.readFrom(in); + super.readObject(in); _name = in.readUTF(); + _value = in.readObject(); _index = in.readInt(); - _value = ValueMarshaller.readFrom(in); } // documentation inherited @@ -193,7 +189,8 @@ public class ElementUpdatedEvent extends TypedEvent buf.append("UPDATE:"); super.toString(buf); buf.append(", name=").append(_name); - buf.append(", value=").append(_value); + buf.append(", value="); + StringUtil.toString(buf, _value); buf.append(", index=").append(_index); } diff --git a/src/java/com/threerings/presents/dobj/EntryAddedEvent.java b/src/java/com/threerings/presents/dobj/EntryAddedEvent.java index 9803a4490..a073d24a2 100644 --- a/src/java/com/threerings/presents/dobj/EntryAddedEvent.java +++ b/src/java/com/threerings/presents/dobj/EntryAddedEvent.java @@ -1,14 +1,16 @@ // -// $Id: EntryAddedEvent.java,v 1.7 2002/03/18 23:21:26 mdb Exp $ +// $Id: EntryAddedEvent.java,v 1.8 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.dobj; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; +import com.samskivert.util.StringUtil; + +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; + import com.threerings.presents.Log; -import com.threerings.presents.dobj.io.EntryUtil; /** * An entry added event is dispatched when an entry is added to a {@link @@ -17,11 +19,8 @@ import com.threerings.presents.dobj.io.EntryUtil; * * @see DObjectManager#postEvent */ -public class EntryAddedEvent extends TypedEvent +public class EntryAddedEvent extends DEvent { - /** The typed object code for this event. */ - public static final short TYPE = TYPE_BASE + 8; - /** * Constructs a new entry added event on the specified target object * with the supplied set attribute name and entry to add. @@ -31,17 +30,12 @@ public class EntryAddedEvent extends TypedEvent * @param name the name of the attribute to which to add the specified * entry. * @param entry the entry to add to the set attribute. - * @param qualified whether or not the entry need be qualified with - * its class when serializing (true for heterogenous sets, false for - * homogenous sets). */ - public EntryAddedEvent (int targetOid, String name, DSet.Entry entry, - boolean qualified) + public EntryAddedEvent (int targetOid, String name, DSet.Entry entry) { super(targetOid); _name = name; _entry = entry; - _qualified = qualified; } /** @@ -76,51 +70,30 @@ public class EntryAddedEvent extends TypedEvent throws ObjectAccessException { DSet set = (DSet)target.getAttribute(_name); - - // now that we have access to our target set, we can unflatten our - // entry (if need be) - if (_entry == null) { - try { - _entry = EntryUtil.unflatten(set, _bytes); - } catch (Exception e) { - Log.warning("Error unflattening entry " + this + "."); - Log.logStackTrace(e); - return false; - } - } - set.add(_entry); return true; } - // documentation inherited - public short getType () - { - return TYPE; - } - - // documentation inherited - public void writeTo (DataOutputStream out) + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) throws IOException { - super.writeTo(out); + super.writeObject(out); out.writeUTF(_name); - EntryUtil.flatten(out, _entry, _qualified); + out.writeObject(_entry); } - // documentation inherited - public void readFrom (DataInputStream in) - throws IOException + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException { - super.readFrom(in); + super.readObject(in); _name = in.readUTF(); - - // we read in the raw entry data now and decode it later when we - // have access to the object and the DSet instance that knows what - // type of entry we need to decode - int bcount = in.readInt(); - _bytes = new byte[bcount]; - in.readFully(_bytes, 0, bcount); + _entry = (DSet.Entry)in.readObject(); } // documentation inherited @@ -137,11 +110,10 @@ public class EntryAddedEvent extends TypedEvent buf.append("ELADD:"); super.toString(buf); buf.append(", name=").append(_name); - buf.append(", entry=").append(_entry); + buf.append(", entry="); + StringUtil.toString(buf, _entry); } protected String _name; - protected byte[] _bytes; protected DSet.Entry _entry; - protected boolean _qualified; } diff --git a/src/java/com/threerings/presents/dobj/EntryRemovedEvent.java b/src/java/com/threerings/presents/dobj/EntryRemovedEvent.java index 912816f83..61b82b31c 100644 --- a/src/java/com/threerings/presents/dobj/EntryRemovedEvent.java +++ b/src/java/com/threerings/presents/dobj/EntryRemovedEvent.java @@ -1,13 +1,12 @@ // -// $Id: EntryRemovedEvent.java,v 1.8 2002/03/18 23:21:26 mdb Exp $ +// $Id: EntryRemovedEvent.java,v 1.9 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.dobj; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; -import com.threerings.presents.io.ValueMarshaller; +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; /** * An entry removed event is dispatched when an entry is removed from a @@ -17,11 +16,8 @@ import com.threerings.presents.io.ValueMarshaller; * * @see DObjectManager#postEvent */ -public class EntryRemovedEvent extends TypedEvent +public class EntryRemovedEvent extends DEvent { - /** The typed object code for this event. */ - public static final short TYPE = TYPE_BASE + 9; - /** * Constructs a new entry removed event on the specified target object * with the supplied set attribute name and entry key to remove. @@ -76,28 +72,26 @@ public class EntryRemovedEvent extends TypedEvent } - // documentation inherited - public short getType () - { - return TYPE; - } - - // documentation inherited - public void writeTo (DataOutputStream out) + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) throws IOException { - super.writeTo(out); + super.writeObject(out); out.writeUTF(_name); - ValueMarshaller.writeTo(out, _key); + out.writeObject(_key); } - // documentation inherited - public void readFrom (DataInputStream in) - throws IOException + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException { - super.readFrom(in); + super.readObject(in); _name = in.readUTF(); - _key = ValueMarshaller.readFrom(in); + _key = in.readObject(); } // documentation inherited diff --git a/src/java/com/threerings/presents/dobj/EntryUpdatedEvent.java b/src/java/com/threerings/presents/dobj/EntryUpdatedEvent.java index deb82947d..2f9f2fafd 100644 --- a/src/java/com/threerings/presents/dobj/EntryUpdatedEvent.java +++ b/src/java/com/threerings/presents/dobj/EntryUpdatedEvent.java @@ -1,14 +1,16 @@ // -// $Id: EntryUpdatedEvent.java,v 1.6 2002/04/18 00:31:26 mdb Exp $ +// $Id: EntryUpdatedEvent.java,v 1.7 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.dobj; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; +import com.samskivert.util.StringUtil; + +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; + import com.threerings.presents.Log; -import com.threerings.presents.dobj.io.EntryUtil; /** * An entry updated event is dispatched when an entry of a {@link DSet} is @@ -17,11 +19,8 @@ import com.threerings.presents.dobj.io.EntryUtil; * * @see DObjectManager#postEvent */ -public class EntryUpdatedEvent extends TypedEvent +public class EntryUpdatedEvent extends DEvent { - /** The typed object code for this event. */ - public static final short TYPE = TYPE_BASE + 10; - /** * Constructs a new entry updated event on the specified target object * for the specified set name and with the supplied updated entry. @@ -31,17 +30,12 @@ public class EntryUpdatedEvent extends TypedEvent * @param name the name of the attribute in which to update the * specified entry. * @param entry the entry to update. - * @param qualified whether or not the entry need be qualified with - * its class when serializing (true for heterogenous sets, false for - * homogenous sets). */ - public EntryUpdatedEvent (int targetOid, String name, DSet.Entry entry, - boolean qualified) + public EntryUpdatedEvent (int targetOid, String name, DSet.Entry entry) { super(targetOid); _name = name; _entry = entry; - _qualified = qualified; } /** @@ -77,18 +71,6 @@ public class EntryUpdatedEvent extends TypedEvent { DSet set = (DSet)target.getAttribute(_name); - // now that we have access to our target set, we can unflatten our - // entry (if need be) - if (_entry == null) { - try { - _entry = EntryUtil.unflatten(set, _bytes); - } catch (Exception e) { - Log.warning("Error unflattening entry " + this + "."); - Log.logStackTrace(e); - return false; - } - } - // update the entry if (!set.update(_entry)) { // complain if we didn't update anything @@ -100,34 +82,26 @@ public class EntryUpdatedEvent extends TypedEvent return true; } - // documentation inherited - public short getType () - { - return TYPE; - } - - // documentation inherited - public void writeTo (DataOutputStream out) + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) throws IOException { - super.writeTo(out); + super.writeObject(out); out.writeUTF(_name); - EntryUtil.flatten(out, _entry, _qualified); + out.writeObject(_entry); } - // documentation inherited - public void readFrom (DataInputStream in) - throws IOException + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException { - super.readFrom(in); + super.readObject(in); _name = in.readUTF(); - - // we read in the raw entry data now and decode it later when we - // have access to the object and the DSet instance that knows what - // type of entry we need to decode - int bcount = in.readInt(); - _bytes = new byte[bcount]; - in.readFully(_bytes, 0, bcount); + _entry = (DSet.Entry)in.readObject(); } // documentation inherited @@ -144,11 +118,10 @@ public class EntryUpdatedEvent extends TypedEvent buf.append("ELUPD:"); super.toString(buf); buf.append(", name=").append(_name); - buf.append(", entry=").append(_entry); + buf.append(", entry="); + StringUtil.toString(buf, _entry); } protected String _name; - protected byte[] _bytes; protected DSet.Entry _entry; - protected boolean _qualified; } diff --git a/src/java/com/threerings/presents/dobj/MessageEvent.java b/src/java/com/threerings/presents/dobj/MessageEvent.java index 2da1bb261..e036c195a 100644 --- a/src/java/com/threerings/presents/dobj/MessageEvent.java +++ b/src/java/com/threerings/presents/dobj/MessageEvent.java @@ -1,15 +1,15 @@ // -// $Id: MessageEvent.java,v 1.8 2002/02/01 23:32:37 mdb Exp $ +// $Id: MessageEvent.java,v 1.9 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.dobj; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; import java.lang.reflect.Method; import com.samskivert.util.StringUtil; -import com.threerings.presents.io.ValueMarshaller; + +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; /** * A message event is used to dispatch a message to all subscribers of a @@ -20,11 +20,8 @@ import com.threerings.presents.io.ValueMarshaller; * * @see DObjectManager#postEvent */ -public class MessageEvent extends TypedEvent +public class MessageEvent extends DEvent { - /** The typed object code for this event. */ - public static final short TYPE = TYPE_BASE + 3; - /** * Constructs a new message event on the specified target object with * the supplied name and arguments. @@ -86,41 +83,26 @@ public class MessageEvent extends TypedEvent return true; } - // documentation inherited - public short getType () - { - return TYPE; - } - - // documentation inherited - public void writeTo (DataOutputStream out) + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) throws IOException { - super.writeTo(out); + super.writeObject(out); out.writeUTF(_name); - if (_args != null) { - out.writeInt(_args.length); - for (int i = 0; i < _args.length; i++) { - ValueMarshaller.writeTo(out, _args[i]); - } - } else { - out.writeInt(0); - } + out.writeObject(_args); } - // documentation inherited - public void readFrom (DataInputStream in) - throws IOException + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException { - super.readFrom(in); + super.readObject(in); _name = in.readUTF(); - int args = in.readInt(); - if (args > 0) { - _args = new Object[args]; - for (int i = 0; i < args; i++) { - _args[i] = ValueMarshaller.readFrom(in); - } - } + _args = (Object[])in.readObject(); } // documentation inherited diff --git a/src/java/com/threerings/presents/dobj/ObjectAddedEvent.java b/src/java/com/threerings/presents/dobj/ObjectAddedEvent.java index db058ea1f..6a89d4f9d 100644 --- a/src/java/com/threerings/presents/dobj/ObjectAddedEvent.java +++ b/src/java/com/threerings/presents/dobj/ObjectAddedEvent.java @@ -1,12 +1,13 @@ // -// $Id: ObjectAddedEvent.java,v 1.6 2001/10/12 00:03:03 mdb Exp $ +// $Id: ObjectAddedEvent.java,v 1.7 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.dobj; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; + /** * An object added event is dispatched when an object is added to an * OidList attribute of a distributed object. It can also be @@ -15,11 +16,8 @@ import java.io.IOException; * * @see DObjectManager#postEvent */ -public class ObjectAddedEvent extends TypedEvent +public class ObjectAddedEvent extends DEvent { - /** The typed object code for this event. */ - public static final short TYPE = TYPE_BASE + 4; - /** * Constructs a new object added event on the specified target object * with the supplied oid list attribute name and object id to add. @@ -73,26 +71,24 @@ public class ObjectAddedEvent extends TypedEvent return true; } - // documentation inherited - public short getType () - { - return TYPE; - } - - // documentation inherited - public void writeTo (DataOutputStream out) + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) throws IOException { - super.writeTo(out); + super.writeObject(out); out.writeUTF(_name); out.writeInt(_oid); } - // documentation inherited - public void readFrom (DataInputStream in) - throws IOException + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException { - super.readFrom(in); + super.readObject(in); _name = in.readUTF(); _oid = in.readInt(); } diff --git a/src/java/com/threerings/presents/dobj/ObjectDestroyedEvent.java b/src/java/com/threerings/presents/dobj/ObjectDestroyedEvent.java index 725b33539..fb0d81dbc 100644 --- a/src/java/com/threerings/presents/dobj/ObjectDestroyedEvent.java +++ b/src/java/com/threerings/presents/dobj/ObjectDestroyedEvent.java @@ -1,13 +1,14 @@ // -// $Id: ObjectDestroyedEvent.java,v 1.3 2001/10/23 23:56:12 mdb Exp $ +// $Id: ObjectDestroyedEvent.java,v 1.4 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.dobj; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; import java.lang.reflect.Method; +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; + /** * An object destroyed event is dispatched when an object has been removed * from the distributed object system. It can also be constructed to @@ -15,11 +16,8 @@ import java.lang.reflect.Method; * * @see DObjectManager#postEvent */ -public class ObjectDestroyedEvent extends TypedEvent +public class ObjectDestroyedEvent extends DEvent { - /** The typed object code for this event. */ - public static final short TYPE = TYPE_BASE + 7; - /** * Constructs a new object destroyed event for the specified * distributed object. @@ -48,12 +46,6 @@ public class ObjectDestroyedEvent extends TypedEvent return true; } - // documentation inherited - public short getType () - { - return TYPE; - } - // documentation inherited protected void notifyListener (Object listener) { diff --git a/src/java/com/threerings/presents/dobj/ObjectRemovedEvent.java b/src/java/com/threerings/presents/dobj/ObjectRemovedEvent.java index 76b2c12ae..d0bb18789 100644 --- a/src/java/com/threerings/presents/dobj/ObjectRemovedEvent.java +++ b/src/java/com/threerings/presents/dobj/ObjectRemovedEvent.java @@ -1,12 +1,13 @@ // -// $Id: ObjectRemovedEvent.java,v 1.6 2001/10/12 00:03:03 mdb Exp $ +// $Id: ObjectRemovedEvent.java,v 1.7 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.dobj; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; + /** * An object removed event is dispatched when an object is removed from an * OidList attribute of a distributed object. It can also be @@ -15,11 +16,8 @@ import java.io.IOException; * * @see DObjectManager#postEvent */ -public class ObjectRemovedEvent extends TypedEvent +public class ObjectRemovedEvent extends DEvent { - /** The typed object code for this event. */ - public static final short TYPE = TYPE_BASE + 5; - /** * Constructs a new object removed event on the specified target * object with the supplied oid list attribute name and object id to @@ -74,30 +72,6 @@ public class ObjectRemovedEvent extends TypedEvent return true; } - // documentation inherited - public short getType () - { - return TYPE; - } - - // documentation inherited - public void writeTo (DataOutputStream out) - throws IOException - { - super.writeTo(out); - out.writeUTF(_name); - out.writeInt(_oid); - } - - // documentation inherited - public void readFrom (DataInputStream in) - throws IOException - { - super.readFrom(in); - _name = in.readUTF(); - _oid = in.readInt(); - } - // documentation inherited protected void notifyListener (Object listener) { @@ -106,6 +80,28 @@ public class ObjectRemovedEvent extends TypedEvent } } + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) + throws IOException + { + super.writeObject(out); + out.writeUTF(_name); + out.writeInt(_oid); + } + + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException + { + super.readObject(in); + _name = in.readUTF(); + _oid = in.readInt(); + } + // documentation inherited protected void toString (StringBuffer buf) { diff --git a/src/java/com/threerings/presents/dobj/OidList.java b/src/java/com/threerings/presents/dobj/OidList.java index 726db5d96..db3410181 100644 --- a/src/java/com/threerings/presents/dobj/OidList.java +++ b/src/java/com/threerings/presents/dobj/OidList.java @@ -1,19 +1,21 @@ // -// $Id: OidList.java,v 1.4 2001/10/11 04:07:52 mdb Exp $ +// $Id: OidList.java,v 1.5 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.dobj; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; +import com.threerings.io.Streamable; + /** * An oid list is used to store lists of object ids. The list will not * allow duplicate ids. This class is not synchronized, with the * expectation that all modifications of instances will take place on the * dobjmgr thread. */ -public class OidList +public class OidList implements Streamable { /** * Creates an empty oid list. @@ -111,6 +113,28 @@ public class OidList return _oids[index]; } + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) + throws IOException + { + out.defaultWriteObject(); + out.writeInt(_size); + out.writeObject(_oids); + } + + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException + { + in.defaultReadObject(); + _size = in.readInt(); + _oids = (int[])in.readObject(); + } + public String toString () { StringBuffer buf = new StringBuffer(); @@ -132,25 +156,6 @@ public class OidList _oids = oids; } - public void writeTo (DataOutputStream out) - throws IOException - { - out.writeInt(_size); - for (int i = 0; i < _size; i++) { - out.writeInt(_oids[i]); - } - } - - public void readFrom (DataInputStream in) - throws IOException - { - _size = in.readInt(); - _oids = new int[Math.max(DEFAULT_SIZE, _size*2)]; - for (int i = 0; i < _size; i++) { - _oids[i] = in.readInt(); - } - } - private int[] _oids; private int _size; diff --git a/src/java/com/threerings/presents/dobj/ReleaseLockEvent.java b/src/java/com/threerings/presents/dobj/ReleaseLockEvent.java index a541f1daa..7013df3a9 100644 --- a/src/java/com/threerings/presents/dobj/ReleaseLockEvent.java +++ b/src/java/com/threerings/presents/dobj/ReleaseLockEvent.java @@ -1,13 +1,14 @@ // -// $Id: ReleaseLockEvent.java,v 1.5 2002/02/01 23:32:37 mdb Exp $ +// $Id: ReleaseLockEvent.java,v 1.6 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.dobj; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; import java.lang.reflect.Method; +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; + /** * A release lock event is dispatched at the end of a chain of events to * release a lock that is intended to prevent some application defined @@ -19,11 +20,8 @@ import java.lang.reflect.Method; * * @see DObjectManager#postEvent */ -public class ReleaseLockEvent extends TypedEvent +public class ReleaseLockEvent extends DEvent { - /** The typed object code for this event. */ - public static final short TYPE = TYPE_BASE + 6; - /** * Constructs a new release lock event for the specified target object * with the supplied lock name. @@ -65,22 +63,23 @@ public class ReleaseLockEvent extends TypedEvent return false; } - public short getType () - { - return TYPE; - } - - public void writeTo (DataOutputStream out) + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) throws IOException { - super.writeTo(out); + super.writeObject(out); out.writeUTF(_name); } - public void readFrom (DataInputStream in) - throws IOException + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException { - super.readFrom(in); + super.readObject(in); _name = in.readUTF(); } diff --git a/src/java/com/threerings/presents/dobj/TypedEvent.java b/src/java/com/threerings/presents/dobj/TypedEvent.java deleted file mode 100644 index 61e3774d9..000000000 --- a/src/java/com/threerings/presents/dobj/TypedEvent.java +++ /dev/null @@ -1,65 +0,0 @@ -// -// $Id: TypedEvent.java,v 1.2 2001/10/11 04:07:52 mdb Exp $ - -package com.threerings.presents.dobj; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; - -import com.threerings.presents.io.TypedObject; - -/** - * A typed event is one that can be transmitted over the network. All - * event classes that will be shared between the client and server should - * derive from this class and be registered with the typed object factory - * so that they can be serialized and unserialized. - */ -public abstract class TypedEvent extends DEvent implements TypedObject -{ - /** - * All event derived classes should base their typed object code on - * this base value. - */ - public static final short TYPE_BASE = 400; - - /** - * Constructs a typed event, passing the target object id on to the - * DEvent constructor. - */ - public TypedEvent (int targetOid) - { - super(targetOid); - } - - /** - * Constructs a blank typed event instance that will be unserialized - * from the network. - */ - public TypedEvent () - { - super(0); - } - - /** - * Derived classes should override this function to write their fields - * out to the supplied data output stream. They must be sure - * to first call super.writeTo(). - */ - public void writeTo (DataOutputStream out) - throws IOException - { - out.writeInt(_toid); - } - - /** - * Derived classes should override this function to read their fields - * from the supplied data input stream. They must be sure to - * first call super.readFrom(). - */ - public void readFrom (DataInputStream in) - throws IOException - { - _toid = in.readInt(); - } -} diff --git a/src/java/com/threerings/presents/dobj/io/DObjectFactory.java b/src/java/com/threerings/presents/dobj/io/DObjectFactory.java deleted file mode 100644 index cad265912..000000000 --- a/src/java/com/threerings/presents/dobj/io/DObjectFactory.java +++ /dev/null @@ -1,65 +0,0 @@ -// -// $Id: DObjectFactory.java,v 1.12 2002/07/18 00:42:30 mdb Exp $ - -package com.threerings.presents.dobj.io; - -import java.io.IOException; -import java.io.DataInputStream; -import java.io.DataOutputStream; - -import com.threerings.presents.Log; -import com.threerings.presents.dobj.DObject; -import com.threerings.presents.io.Marshaller; -import com.threerings.presents.io.ObjectStreamException; - -/** - * The distributed object factory is responsible for marshalling and - * unmarshalling distributed objects to and from streams so that they can - * be communicated between the client and server. - */ -public class DObjectFactory -{ - /** - * Writes the supplied distributed object out to the specified data - * output stream. - */ - public static void writeTo (DataOutputStream out, DObject dobj) - throws IOException - { -// Log.info("Marshalling object: " + dobj); - - // write the class of the object to the stream - out.writeUTF(dobj.getClass().getName()); - // write out the oid - out.writeInt(dobj.getOid()); - // then use the marshaller to write the object itself - Marshaller.writeObject(out, dobj); - } - - /** - * Reads a distributed object from the specified input stream. - */ - public static DObject readFrom (DataInputStream in) - throws IOException - { - try { - // read in the class name and create an instance of that class - Class clazz = Class.forName(in.readUTF()); - DObject dobj = (DObject)clazz.newInstance(); - dobj.setOid(in.readInt()); // read and set the oid - -// Log.info("Unmarshalling object " + -// "[class=" + dobj.getClass().getName() + -// ", object=" + dobj + "]."); - - // use a marshaller to reconstitute the object from the stream - Marshaller.readObject(in, dobj); - - return dobj; - - } catch (Exception e) { - String errmsg = "Failure unserializing dobj"; - throw new ObjectStreamException(errmsg, e); - } - } -} diff --git a/src/java/com/threerings/presents/dobj/io/EntryUtil.java b/src/java/com/threerings/presents/dobj/io/EntryUtil.java deleted file mode 100644 index 59d4cd24d..000000000 --- a/src/java/com/threerings/presents/dobj/io/EntryUtil.java +++ /dev/null @@ -1,89 +0,0 @@ -// -// $Id: EntryUtil.java,v 1.5 2002/03/18 23:21:26 mdb Exp $ - -package com.threerings.presents.dobj.io; - -import java.io.*; - -import com.threerings.presents.Log; -import com.threerings.presents.dobj.DSet; - -/** - * Routines to simplify the process of moving set entries over the wire. - * Because we don't know the type of the entry when the event is - * unserialized (we only know later when the event is applied to the - * object and the event has access to the target set object), then we need - * to do some jockeying. - */ -public class EntryUtil -{ - /** - * Flattens the supplied entry into a byte array, counts the number of - * bytes in the array and writes the count followed by the bytes to - * the supplied data output stream. This method should really only be - * called by the conmgr thread, but we synchronize just in case - * someone decides to write an event out in some other peculiar - * context; uncontested syncs are pretty fast. - */ - public static synchronized void flatten ( - DataOutputStream out, DSet.Entry entry, boolean qualified) - throws IOException - { - // write the entry classname out if requested - if (qualified) { - _dout.writeUTF(entry.getClass().getName()); - } - entry.writeTo(_dout); - _dout.flush(); - out.writeInt(_bout.size()); - _bout.writeTo(out); - _bout.reset(); - } - - /** - * Unflattens an entry given the serialized entry data. We know - * this will always be called on the dobjmgr thread, so we need not - * synchronize. - */ - public static DSet.Entry unflatten (DSet set, byte[] data) - throws IOException - { - _bin.setBytes(data); - return set.readEntry(_din); - } - - /** - * We extend byte array input stream to avoid having to create a new - * input stream every time we unserialize an entry. Our extensions - * allow us to repurpose this input stream to read from a new byte - * array each time we unserialize. - */ - protected static class ReByteArrayInputStream extends ByteArrayInputStream - { - public ReByteArrayInputStream () - { - super(new byte[0]); - } - - public void setBytes (byte[] bytes) - { - buf = bytes; - pos = 0; - count = buf.length; - mark = 0; - } - } - - /** Used when serializing entries. */ - protected static ByteArrayOutputStream _bout = new ByteArrayOutputStream(); - - /** Used when serializing entries. */ - protected static DataOutputStream _dout = new DataOutputStream(_bout); - - /** Used when unserializing entries. */ - protected static ReByteArrayInputStream _bin = - new ReByteArrayInputStream(); - - /** Used when unserializing entries. */ - protected static DataInputStream _din = new DataInputStream(_bin); -} diff --git a/src/java/com/threerings/presents/net/AuthRequest.java b/src/java/com/threerings/presents/net/AuthRequest.java index 5a877b6cb..78daffe4c 100644 --- a/src/java/com/threerings/presents/net/AuthRequest.java +++ b/src/java/com/threerings/presents/net/AuthRequest.java @@ -1,19 +1,15 @@ // -// $Id: AuthRequest.java,v 1.7 2001/10/11 04:07:53 mdb Exp $ +// $Id: AuthRequest.java,v 1.8 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.net; import java.io.IOException; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import com.threerings.presents.io.TypedObjectFactory; +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; public class AuthRequest extends UpstreamMessage { - /** The code for an auth request. */ - public static final short TYPE = TYPE_BASE + 0; - /** * Zero argument constructor used when unserializing an instance. */ @@ -30,28 +26,29 @@ public class AuthRequest extends UpstreamMessage _creds = creds; } - public short getType () - { - return TYPE; - } - public Credentials getCredentials () { return _creds; } - public void writeTo (DataOutputStream out) + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) throws IOException { - super.writeTo(out); - TypedObjectFactory.writeTo(out, _creds); + super.writeObject(out); + out.writeObject(_creds); } - public void readFrom (DataInputStream in) - throws IOException + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException { - super.readFrom(in); - _creds = (Credentials)TypedObjectFactory.readFrom(in); + super.readObject(in); + _creds = (Credentials)in.readObject(); } public String toString () diff --git a/src/java/com/threerings/presents/net/AuthResponse.java b/src/java/com/threerings/presents/net/AuthResponse.java index 56428d740..b05e9772f 100644 --- a/src/java/com/threerings/presents/net/AuthResponse.java +++ b/src/java/com/threerings/presents/net/AuthResponse.java @@ -1,13 +1,12 @@ // -// $Id: AuthResponse.java,v 1.11 2002/03/05 05:39:52 mdb Exp $ +// $Id: AuthResponse.java,v 1.12 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.net; import java.io.IOException; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import com.threerings.presents.dobj.io.DObjectFactory; +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; /** * The auth response communicates authentication success or failure as @@ -18,9 +17,6 @@ import com.threerings.presents.dobj.io.DObjectFactory; */ public class AuthResponse extends DownstreamMessage { - /** The code for an auth response. */ - public static final short TYPE = TYPE_BASE + 0; - /** * Zero argument constructor used when unserializing an instance. */ @@ -42,23 +38,24 @@ public class AuthResponse extends DownstreamMessage return _data; } - public short getType () - { - return TYPE; - } - - public void writeTo (DataOutputStream out) + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) throws IOException { - super.writeTo(out); - DObjectFactory.writeTo(out, _data); + super.writeObject(out); + out.writeObject(_data); } - public void readFrom (DataInputStream in) - throws IOException + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException { - super.readFrom(in); - _data = (AuthResponseData)DObjectFactory.readFrom(in); + super.readObject(in); + _data = (AuthResponseData)in.readObject(); } public String toString () diff --git a/src/java/com/threerings/presents/net/BootstrapNotification.java b/src/java/com/threerings/presents/net/BootstrapNotification.java index cfc8c0cf6..f31d6a9c3 100644 --- a/src/java/com/threerings/presents/net/BootstrapNotification.java +++ b/src/java/com/threerings/presents/net/BootstrapNotification.java @@ -1,13 +1,12 @@ // -// $Id: BootstrapNotification.java,v 1.3 2001/10/11 04:07:53 mdb Exp $ +// $Id: BootstrapNotification.java,v 1.4 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.net; import java.io.IOException; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import com.threerings.presents.dobj.io.DObjectFactory; +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; /** * A bootstrap notification is delivered to the client once the server has @@ -19,9 +18,6 @@ import com.threerings.presents.dobj.io.DObjectFactory; */ public class BootstrapNotification extends DownstreamMessage { - /** The code for a bootstrap notification. */ - public static final short TYPE = TYPE_BASE + 1; - /** * Zero argument constructor used when unserializing an instance. */ @@ -38,28 +34,29 @@ public class BootstrapNotification extends DownstreamMessage _data = data; } - public short getType () - { - return TYPE; - } - public BootstrapData getData () { return _data; } - public void writeTo (DataOutputStream out) + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) throws IOException { - super.writeTo(out); - DObjectFactory.writeTo(out, _data); + super.writeObject(out); + out.writeObject(_data); } - public void readFrom (DataInputStream in) - throws IOException + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException { - super.readFrom(in); - _data = (BootstrapData)DObjectFactory.readFrom(in); + super.readObject(in); + _data = (BootstrapData)in.readObject(); } public String toString () diff --git a/src/java/com/threerings/presents/net/Credentials.java b/src/java/com/threerings/presents/net/Credentials.java index e11bb1e29..d280aed30 100644 --- a/src/java/com/threerings/presents/net/Credentials.java +++ b/src/java/com/threerings/presents/net/Credentials.java @@ -1,14 +1,13 @@ // -// $Id: Credentials.java,v 1.7 2001/10/11 04:07:53 mdb Exp $ +// $Id: Credentials.java,v 1.8 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.net; import java.io.IOException; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import com.threerings.presents.io.TypedObject; -import com.threerings.presents.io.TypedObjectFactory; +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; +import com.threerings.io.Streamable; /** * Credentials are supplied by the client implementation and sent along to @@ -24,14 +23,8 @@ import com.threerings.presents.io.TypedObjectFactory; * that they can be instantiated prior to reconstruction from a data input * stream. */ -public abstract class Credentials implements TypedObject +public abstract class Credentials implements Streamable { - /** - * All credential derived classes should base their typed object code - * on this base value. - */ - public static final short TYPE_BASE = 300; - /** * Constructs a credentials instance with the specified username. */ @@ -54,24 +47,22 @@ public abstract class Credentials implements TypedObject } /** - * Derived classes should override this function to write their fields - * out to the supplied data output stream. They must be sure - * to first call super.writeTo(). + * Writes our custom streamable fields. */ - public void writeTo (DataOutputStream out) + public void writeObject (ObjectOutputStream out) throws IOException { + out.defaultWriteObject(); out.writeUTF(_username); } /** - * Derived classes should override this function to read their fields - * from the supplied data input stream. They must be sure to - * first call super.readFrom(). + * Reads our custom streamable fields. */ - public void readFrom (DataInputStream in) - throws IOException + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException { + in.defaultReadObject(); _username = in.readUTF(); } diff --git a/src/java/com/threerings/presents/net/DownstreamMessage.java b/src/java/com/threerings/presents/net/DownstreamMessage.java index 6cf62b323..7aa680bc6 100644 --- a/src/java/com/threerings/presents/net/DownstreamMessage.java +++ b/src/java/com/threerings/presents/net/DownstreamMessage.java @@ -1,71 +1,49 @@ // -// $Id: DownstreamMessage.java,v 1.8 2001/10/11 04:07:53 mdb Exp $ +// $Id: DownstreamMessage.java,v 1.9 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.net; import java.io.IOException; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import com.threerings.presents.io.TypedObject; +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; +import com.threerings.io.SimpleStreamableObject; /** - * The DownstreamMessage class encapsulates a message in the - * Distributed Object Protocol that flows from the server to the - * client. Downstream messages include object subscription, event - * forwarding and session management. + * This class encapsulates a message in the distributed object protocol + * that flows from the server to the client. Downstream messages include + * object subscription, event forwarding and session management. */ -public abstract class DownstreamMessage implements TypedObject +public abstract class DownstreamMessage extends SimpleStreamableObject { - /** - * All downstream message derived classes should base their typed - * object code on this base value. - */ - public static final short TYPE_BASE = 200; - /** * The message id of the upstream message with which this downstream * message is associated (or -1 if it is not associated with any - * upstream message). Because not every downstream message class cares - * to provide an upstream message id, this field is not serialized - * when the base downstream message class is serialized. Thus derived - * classes that care about message id should take care to initialize, - * serialize and unserialize the value theirselves. + * upstream message). */ public short messageId = -1; /** - * Each downstream message derived class must provide a zero argument - * constructor so that the TypedObjectFactory can create - * a new instance of said class prior to unserializing it. + * Writes our custom streamable fields. */ - public DownstreamMessage () + public void writeObject (ObjectOutputStream out) + throws IOException { - // nothing to do... + out.defaultWriteObject(); } /** - * Derived classes should override this function to write their fields - * out to the supplied data output stream. They must be sure - * to first call super.writeTo(). + * Reads our custom streamable fields. */ - public void writeTo (DataOutputStream out) - throws IOException + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException { - // we don't do anything here, but we may want to some day + in.defaultReadObject(); } /** - * Derived classes should override this function to read their fields - * from the supplied data input stream. They must be sure to - * first call super.readFrom(). + * Generates a string representation of this instance. */ - public void readFrom (DataInputStream in) - throws IOException - { - // we don't do anything here, but we may want to some day - } - public String toString () { return "[msgid=" + messageId + "]"; diff --git a/src/java/com/threerings/presents/net/EventNotification.java b/src/java/com/threerings/presents/net/EventNotification.java index 739fee737..6708d0fef 100644 --- a/src/java/com/threerings/presents/net/EventNotification.java +++ b/src/java/com/threerings/presents/net/EventNotification.java @@ -1,20 +1,17 @@ // -// $Id: EventNotification.java,v 1.10 2001/10/11 04:07:53 mdb Exp $ +// $Id: EventNotification.java,v 1.11 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.net; import java.io.IOException; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import com.threerings.presents.dobj.TypedEvent; -import com.threerings.presents.io.TypedObjectFactory; +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; + +import com.threerings.presents.dobj.DEvent; public class EventNotification extends DownstreamMessage { - /** The code for an event notification. */ - public static final short TYPE = TYPE_BASE + 2; - /** * Zero argument constructor used when unserializing an instance. */ @@ -26,42 +23,41 @@ public class EventNotification extends DownstreamMessage /** * Constructs an event notification for the supplied event. */ - public EventNotification (TypedEvent event) + public EventNotification (DEvent event) { _event = event; } - public short getType () - { - return TYPE; - } - - public TypedEvent getEvent () + public DEvent getEvent () { return _event; } - public void writeTo (DataOutputStream out) + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) throws IOException { - super.writeTo(out); - // write the event out to the stream - TypedObjectFactory.writeTo(out, _event); + super.writeObject(out); + out.writeObject(_event); } - public void readFrom (DataInputStream in) - throws IOException + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException { - super.readFrom(in); - // read the event in from the stream - _event = (TypedEvent)TypedObjectFactory.readFrom(in); + super.readObject(in); + _event = (DEvent)in.readObject(); } public String toString () { - return "[type=EVT, msgid=" + messageId + ", evt=" + _event + "]"; + return "[type=EVT, evt=" + _event + "]"; } /** The event which we are forwarding. */ - protected TypedEvent _event; + protected DEvent _event; } diff --git a/src/java/com/threerings/presents/net/FailureResponse.java b/src/java/com/threerings/presents/net/FailureResponse.java index af6a4b2b6..fca87fd66 100644 --- a/src/java/com/threerings/presents/net/FailureResponse.java +++ b/src/java/com/threerings/presents/net/FailureResponse.java @@ -1,17 +1,15 @@ // -// $Id: FailureResponse.java,v 1.7 2001/10/11 04:07:53 mdb Exp $ +// $Id: FailureResponse.java,v 1.8 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.net; import java.io.IOException; -import java.io.DataInputStream; -import java.io.DataOutputStream; + +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; public class FailureResponse extends DownstreamMessage { - /** The code for a failure notification. */ - public static final short TYPE = TYPE_BASE + 4; - /** * Zero argument constructor used when unserializing an instance. */ @@ -29,27 +27,28 @@ public class FailureResponse extends DownstreamMessage _oid = oid; } - public short getType () - { - return TYPE; - } - public int getOid () { return _oid; } - public void writeTo (DataOutputStream out) + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) throws IOException { - super.writeTo(out); + super.writeObject(out); out.writeInt(_oid); } - public void readFrom (DataInputStream in) - throws IOException + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException { - super.readFrom(in); + super.readObject(in); _oid = in.readInt(); } diff --git a/src/java/com/threerings/presents/net/ForwardEventRequest.java b/src/java/com/threerings/presents/net/ForwardEventRequest.java index 0c341f55c..1dc13250e 100644 --- a/src/java/com/threerings/presents/net/ForwardEventRequest.java +++ b/src/java/com/threerings/presents/net/ForwardEventRequest.java @@ -1,20 +1,17 @@ // -// $Id: ForwardEventRequest.java,v 1.9 2001/10/11 04:07:53 mdb Exp $ +// $Id: ForwardEventRequest.java,v 1.10 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.net; import java.io.IOException; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import com.threerings.presents.dobj.TypedEvent; -import com.threerings.presents.io.TypedObjectFactory; +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; + +import com.threerings.presents.dobj.DEvent; public class ForwardEventRequest extends UpstreamMessage { - /** The code for a forward event request. */ - public static final short TYPE = TYPE_BASE + 4; - /** * Zero argument constructor used when unserializing an instance. */ @@ -26,45 +23,44 @@ public class ForwardEventRequest extends UpstreamMessage /** * Constructs a forward event request for the supplied event. */ - public ForwardEventRequest (TypedEvent event) + public ForwardEventRequest (DEvent event) { _event = event; } - public short getType () - { - return TYPE; - } - /** * Returns the event that we wish to have forwarded. */ - public TypedEvent getEvent () + public DEvent getEvent () { return _event; } - public void writeTo (DataOutputStream out) + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) throws IOException { - super.writeTo(out); - // write the event out to the stream - TypedObjectFactory.writeTo(out, _event); + super.writeObject(out); + out.writeObject(_event); } - public void readFrom (DataInputStream in) - throws IOException + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException { - super.readFrom(in); - // read the event in from the stream - _event = (TypedEvent)TypedObjectFactory.readFrom(in); + super.readObject(in); + _event = (DEvent)in.readObject(); } public String toString () { - return "[type=FWD, msgid=" + messageId + ", evt=" + _event + "]"; + return "[type=FWD, evt=" + _event + "]"; } /** The event which we are forwarding. */ - protected TypedEvent _event; + protected DEvent _event; } diff --git a/src/java/com/threerings/presents/net/LogoffRequest.java b/src/java/com/threerings/presents/net/LogoffRequest.java index ffcc5be22..688cc79d7 100644 --- a/src/java/com/threerings/presents/net/LogoffRequest.java +++ b/src/java/com/threerings/presents/net/LogoffRequest.java @@ -1,13 +1,10 @@ // -// $Id: LogoffRequest.java,v 1.5 2001/10/11 04:07:53 mdb Exp $ +// $Id: LogoffRequest.java,v 1.6 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.net; public class LogoffRequest extends UpstreamMessage { - /** The code for a logoff request. */ - public static final short TYPE = TYPE_BASE + 6; - /** * Zero argument constructor used when unserializing an instance. */ @@ -16,11 +13,6 @@ public class LogoffRequest extends UpstreamMessage super(); } - public short getType () - { - return TYPE; - } - public String toString () { return "[type=LOGOFF, msgid=" + messageId + "]"; diff --git a/src/java/com/threerings/presents/net/ObjectResponse.java b/src/java/com/threerings/presents/net/ObjectResponse.java index 74bb808c0..d05c7affe 100644 --- a/src/java/com/threerings/presents/net/ObjectResponse.java +++ b/src/java/com/threerings/presents/net/ObjectResponse.java @@ -1,20 +1,17 @@ // -// $Id: ObjectResponse.java,v 1.11 2001/10/11 04:07:53 mdb Exp $ +// $Id: ObjectResponse.java,v 1.12 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.net; import java.io.IOException; -import java.io.DataInputStream; -import java.io.DataOutputStream; + +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; import com.threerings.presents.dobj.DObject; -import com.threerings.presents.dobj.io.DObjectFactory; public class ObjectResponse extends DownstreamMessage { - /** The code for an object repsonse. */ - public static final short TYPE = TYPE_BASE + 3; - /** * Zero argument constructor used when unserializing an instance. */ @@ -31,28 +28,29 @@ public class ObjectResponse extends DownstreamMessage _dobj = dobj; } - public short getType () - { - return TYPE; - } - public DObject getObject () { return _dobj; } - public void writeTo (DataOutputStream out) + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) throws IOException { - super.writeTo(out); - DObjectFactory.writeTo(out, _dobj); + super.writeObject(out); + out.writeObject(_dobj); } - public void readFrom (DataInputStream in) - throws IOException + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException { - super.readFrom(in); - _dobj = (DObject)DObjectFactory.readFrom(in); + super.readObject(in); + _dobj = (DObject)in.readObject(); } public String toString () diff --git a/src/java/com/threerings/presents/net/PingRequest.java b/src/java/com/threerings/presents/net/PingRequest.java index 20704675a..23d059fbe 100644 --- a/src/java/com/threerings/presents/net/PingRequest.java +++ b/src/java/com/threerings/presents/net/PingRequest.java @@ -1,17 +1,15 @@ // -// $Id: PingRequest.java,v 1.6 2002/05/28 21:56:38 mdb Exp $ +// $Id: PingRequest.java,v 1.7 2002/07/23 05:52:48 mdb Exp $ package com.threerings.presents.net; import java.io.IOException; -import java.io.DataInputStream; -import java.io.DataOutputStream; + +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; public class PingRequest extends UpstreamMessage { - /** The code for a ping request. */ - public static final short TYPE = TYPE_BASE + 5; - /** * Zero argument constructor used when unserializing an instance. */ @@ -38,33 +36,32 @@ public class PingRequest extends UpstreamMessage return _unpackStamp; } - // documentation inherited - public void writeTo (DataOutputStream out) + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) throws IOException { - super.writeTo(out); + super.writeObject(out); // grab a timestamp noting when we were encoded into a raw buffer // for delivery over the network _packStamp = System.currentTimeMillis(); } - // documentation inherited - public void readFrom (DataInputStream in) - throws IOException + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException { - super.readFrom(in); + super.readObject(in); // grab a timestamp noting when we were decoded from a raw buffer // after being received over the network _unpackStamp = System.currentTimeMillis(); } - public short getType () - { - return TYPE; - } - public String toString () { return "[type=PING, msgid=" + messageId + "]"; diff --git a/src/java/com/threerings/presents/net/PongResponse.java b/src/java/com/threerings/presents/net/PongResponse.java index 34d53dfe2..d6915b6d8 100644 --- a/src/java/com/threerings/presents/net/PongResponse.java +++ b/src/java/com/threerings/presents/net/PongResponse.java @@ -1,19 +1,17 @@ // -// $Id: PongResponse.java,v 1.7 2002/05/28 21:56:38 mdb Exp $ +// $Id: PongResponse.java,v 1.8 2002/07/23 05:52:49 mdb Exp $ package com.threerings.presents.net; import java.io.IOException; -import java.io.DataInputStream; -import java.io.DataOutputStream; + +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; import com.threerings.presents.Log; public class PongResponse extends DownstreamMessage { - /** The code for a pong response. */ - public static final short TYPE = TYPE_BASE + 5; - /** * Zero argument constructor used when unserializing an instance. */ @@ -61,11 +59,13 @@ public class PongResponse extends DownstreamMessage return _unpackStamp; } - // documentation inherited - public void writeTo (DataOutputStream out) + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) throws IOException { - super.writeTo(out); + super.writeObject(out); // make a note of the time at which we were packed _packStamp = System.currentTimeMillis(); @@ -83,11 +83,13 @@ public class PongResponse extends DownstreamMessage out.writeInt(_processDelay); } - // documentation inherited - public void readFrom (DataInputStream in) - throws IOException + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException { - super.readFrom(in); + super.readObject(in); // grab a timestamp noting when we were decoded from a raw buffer // after being received over the network @@ -98,11 +100,6 @@ public class PongResponse extends DownstreamMessage _processDelay = in.readInt(); } - public short getType () - { - return TYPE; - } - public String toString () { return "[type=PONG, msgid=" + messageId + "]"; diff --git a/src/java/com/threerings/presents/net/SubscribeRequest.java b/src/java/com/threerings/presents/net/SubscribeRequest.java index a8483ca74..ef581f128 100644 --- a/src/java/com/threerings/presents/net/SubscribeRequest.java +++ b/src/java/com/threerings/presents/net/SubscribeRequest.java @@ -1,17 +1,15 @@ // -// $Id: SubscribeRequest.java,v 1.5 2001/10/11 04:07:53 mdb Exp $ +// $Id: SubscribeRequest.java,v 1.6 2002/07/23 05:52:49 mdb Exp $ package com.threerings.presents.net; import java.io.IOException; -import java.io.DataInputStream; -import java.io.DataOutputStream; + +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; public class SubscribeRequest extends UpstreamMessage { - /** The code for an object subscription request. */ - public static final short TYPE = TYPE_BASE + 1; - /** * Zero argument constructor used when unserializing an instance. */ @@ -29,11 +27,6 @@ public class SubscribeRequest extends UpstreamMessage _oid = oid; } - public short getType () - { - return TYPE; - } - /** * Returns the oid of the object to which we desire subscription. */ @@ -42,17 +35,23 @@ public class SubscribeRequest extends UpstreamMessage return _oid; } - public void writeTo (DataOutputStream out) + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) throws IOException { - super.writeTo(out); + super.writeObject(out); out.writeInt(_oid); } - public void readFrom (DataInputStream in) - throws IOException + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException { - super.readFrom(in); + super.readObject(in); _oid = in.readInt(); } diff --git a/src/java/com/threerings/presents/net/UnsubscribeRequest.java b/src/java/com/threerings/presents/net/UnsubscribeRequest.java index 6b19d1a47..5fe3fd70a 100644 --- a/src/java/com/threerings/presents/net/UnsubscribeRequest.java +++ b/src/java/com/threerings/presents/net/UnsubscribeRequest.java @@ -1,17 +1,15 @@ // -// $Id: UnsubscribeRequest.java,v 1.6 2001/10/11 04:07:53 mdb Exp $ +// $Id: UnsubscribeRequest.java,v 1.7 2002/07/23 05:52:49 mdb Exp $ package com.threerings.presents.net; import java.io.IOException; -import java.io.DataInputStream; -import java.io.DataOutputStream; + +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; public class UnsubscribeRequest extends UpstreamMessage { - /** The code for an unsubscribe request. */ - public static final short TYPE = TYPE_BASE + 3; - /** * Zero argument constructor used when unserializing an instance. */ @@ -29,11 +27,6 @@ public class UnsubscribeRequest extends UpstreamMessage _oid = oid; } - public short getType () - { - return TYPE; - } - /** * Returns the oid of the object from which we are unsubscribing. */ @@ -42,17 +35,23 @@ public class UnsubscribeRequest extends UpstreamMessage return _oid; } - public void writeTo (DataOutputStream out) + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) throws IOException { - super.writeTo(out); + super.writeObject(out); out.writeInt(_oid); } - public void readFrom (DataInputStream in) - throws IOException + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException { - super.readFrom(in); + super.readObject(in); _oid = in.readInt(); } diff --git a/src/java/com/threerings/presents/net/UpstreamMessage.java b/src/java/com/threerings/presents/net/UpstreamMessage.java index cdb1c17c0..e98420294 100644 --- a/src/java/com/threerings/presents/net/UpstreamMessage.java +++ b/src/java/com/threerings/presents/net/UpstreamMessage.java @@ -1,28 +1,21 @@ // -// $Id: UpstreamMessage.java,v 1.8 2001/10/11 04:07:53 mdb Exp $ +// $Id: UpstreamMessage.java,v 1.9 2002/07/23 05:52:49 mdb Exp $ package com.threerings.presents.net; import java.io.IOException; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import com.threerings.presents.io.TypedObject; +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; +import com.threerings.io.SimpleStreamableObject; /** - * The UpstreamMessage class encapsulates a message in the - * Distributed Object Protocol that flows from the client to the server. - * Upstream messages include object subscription, event forwarding and - * session management. + * This class encapsulates a message in the distributed object protocol + * that flows from the client to the server. Upstream messages include + * object subscription, event forwarding and session management. */ -public abstract class UpstreamMessage implements TypedObject +public abstract class UpstreamMessage extends SimpleStreamableObject { - /** - * All upstream message derived classes should base their typed object - * code on this base value. - */ - public static final short TYPE_BASE = 100; - /** * This is a unique (within the context of a reasonable period of * time) identifier assigned to each upstream message. The message ids @@ -33,8 +26,8 @@ public abstract class UpstreamMessage implements TypedObject /** * Each upstream message derived class must provide a zero argument - * constructor so that the TypedObjectFactory can create - * a new instance of said class prior to unserializing it. + * constructor so that it can be unserialized when read from the + * network. */ public UpstreamMessage () { @@ -45,25 +38,21 @@ public abstract class UpstreamMessage implements TypedObject } /** - * Derived classes should override this function to write their fields - * out to the supplied data output stream. They must be sure - * to first call super.writeTo(). + * Writes our custom streamable fields. */ - public void writeTo (DataOutputStream out) + public void writeObject (ObjectOutputStream out) throws IOException { - out.writeShort(messageId); + out.defaultWriteObject(); } /** - * Derived classes should override this function to read their fields - * from the supplied data input stream. They must be sure to - * first call super.readFrom(). + * Reads our custom streamable fields. */ - public void readFrom (DataInputStream in) - throws IOException + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException { - messageId = in.readShort(); + in.defaultReadObject(); } public String toString () diff --git a/src/java/com/threerings/presents/net/UsernamePasswordCreds.java b/src/java/com/threerings/presents/net/UsernamePasswordCreds.java index 495f4d25f..e2cbd39de 100644 --- a/src/java/com/threerings/presents/net/UsernamePasswordCreds.java +++ b/src/java/com/threerings/presents/net/UsernamePasswordCreds.java @@ -1,16 +1,15 @@ // -// $Id: UsernamePasswordCreds.java,v 1.6 2001/10/11 04:07:53 mdb Exp $ +// $Id: UsernamePasswordCreds.java,v 1.7 2002/07/23 05:52:49 mdb Exp $ package com.threerings.presents.net; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; + public class UsernamePasswordCreds extends Credentials { - public static final short TYPE = TYPE_BASE + 0; - /** * Zero argument constructor used when unserializing an instance. */ @@ -28,27 +27,28 @@ public class UsernamePasswordCreds extends Credentials _password = password; } - public short getType () - { - return TYPE; - } - public String getPassword () { return _password; } - public void writeTo (DataOutputStream out) + /** + * Writes our custom streamable fields. + */ + public void writeObject (ObjectOutputStream out) throws IOException { - super.writeTo(out); + super.writeObject(out); out.writeUTF(_password); } - public void readFrom (DataInputStream in) - throws IOException + /** + * Reads our custom streamable fields. + */ + public void readObject (ObjectInputStream in) + throws IOException, ClassNotFoundException { - super.readFrom(in); + super.readObject(in); _password = in.readUTF(); } diff --git a/src/java/com/threerings/presents/server/ClientManager.java b/src/java/com/threerings/presents/server/ClientManager.java index fa5ecf6dd..b6ce1672c 100644 --- a/src/java/com/threerings/presents/server/ClientManager.java +++ b/src/java/com/threerings/presents/server/ClientManager.java @@ -1,5 +1,5 @@ // -// $Id: ClientManager.java,v 1.20 2002/07/10 01:26:21 mdb Exp $ +// $Id: ClientManager.java,v 1.21 2002/07/23 05:52:49 mdb Exp $ package com.threerings.presents.server; @@ -273,6 +273,7 @@ public class ClientManager implements ConnectionObserver if (client != null) { Log.info("Unmapped failed client [client=" + client + ", conn=" + conn + ", fault=" + fault + "]."); + Log.logStackTrace(fault); // let the client know the connection went away client.wasUnmapped(); // and let the client know things went haywire @@ -297,6 +298,8 @@ public class ClientManager implements ConnectionObserver client.wasUnmapped(); } else { + // TODO: possibly remove this log message, can this happen + // normally? Log.info("Closed unmapped connection? [conn=" + conn + "]."); Thread.dumpStack(); } diff --git a/src/java/com/threerings/presents/server/PresentsClient.java b/src/java/com/threerings/presents/server/PresentsClient.java index c3c9225d7..3cde7a827 100644 --- a/src/java/com/threerings/presents/server/PresentsClient.java +++ b/src/java/com/threerings/presents/server/PresentsClient.java @@ -1,5 +1,5 @@ // -// $Id: PresentsClient.java,v 1.33 2002/07/10 01:25:11 mdb Exp $ +// $Id: PresentsClient.java,v 1.34 2002/07/23 05:52:49 mdb Exp $ package com.threerings.presents.server; @@ -17,7 +17,6 @@ import com.threerings.presents.dobj.DObject; import com.threerings.presents.dobj.EventListener; import com.threerings.presents.dobj.ObjectAccessException; import com.threerings.presents.dobj.Subscriber; -import com.threerings.presents.dobj.TypedEvent; import com.threerings.presents.net.BootstrapData; import com.threerings.presents.net.BootstrapNotification; @@ -450,10 +449,7 @@ public class PresentsClient // forward the event to the client Connection conn = getConnection(); if (conn != null) { - // only typed events will be forwarded to the client, so we - // need not worry that a non-typed event would make it here - TypedEvent tevent = (TypedEvent)event; - conn.postMessage(new EventNotification(tevent)); + conn.postMessage(new EventNotification(event)); } else { Log.info("Dropped event forward notification " + "[client=" + this + ", event=" + event + "]."); diff --git a/src/java/com/threerings/presents/server/net/Connection.java b/src/java/com/threerings/presents/server/net/Connection.java index 70843026e..18a358f47 100644 --- a/src/java/com/threerings/presents/server/net/Connection.java +++ b/src/java/com/threerings/presents/server/net/Connection.java @@ -1,16 +1,25 @@ // -// $Id: Connection.java,v 1.7 2002/07/10 01:23:45 mdb Exp $ +// $Id: Connection.java,v 1.8 2002/07/23 05:52:49 mdb Exp $ package com.threerings.presents.server.net; -import java.io.*; +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + import ninja2.core.io_core.nbio.*; +import com.samskivert.io.NestableIOException; + +import com.threerings.io.FramedInputStream; +import com.threerings.io.FramingOutputStream; +import com.threerings.io.ObjectInputStream; +import com.threerings.io.ObjectOutputStream; + import com.threerings.presents.Log; -import com.threerings.presents.io.FramedInputStream; -import com.threerings.presents.io.TypedObjectFactory; -import com.threerings.presents.net.UpstreamMessage; import com.threerings.presents.net.DownstreamMessage; +import com.threerings.presents.net.UpstreamMessage; /** * The base connection class implements the net event handler interface @@ -27,6 +36,8 @@ public abstract class Connection implements NetEventHandler * @param cmgr The connection manager with which this connection is * associated. * @param socket The socket from which we'll be reading messages. + * @param fout The framing output stream via which we'll write + * serialized messages to the client. */ public Connection (ConnectionManager cmgr, NonblockingSocket socket) throws IOException @@ -38,11 +49,9 @@ public abstract class Connection implements NetEventHandler // the main event polling loop _selitem = new SelectItem(_socket, this, Selectable.READ_READY); - // create our input streams + // get a handle on our socket streams _in = _socket.getInputStream(); _out = _socket.getOutputStream(); - _fin = new FramedInputStream(); - _din = new DataInputStream(_fin); } /** @@ -63,15 +72,6 @@ public abstract class Connection implements NetEventHandler return _selitem; } - /** - * Returns the output stream associated with this connection. This - * should only be used by the connection manager. - */ - public OutputStream getOutputStream () - { - return _out; - } - /** * Returns the non-blocking socket object used to construct this * connection. @@ -130,6 +130,63 @@ public abstract class Connection implements NetEventHandler closeSocket(); } + /** + * Returns the output stream associated with this connection. This + * should only be used by the connection manager. + */ + protected OutputStream getOutputStream () + { + return _out; + } + + /** + * Returns the object input stream associated with this connection. + * This should only be used by the connection manager. + */ + protected ObjectInputStream getObjectInputStream () + { + return _oin; + } + + /** + * Instructs this connection to inherit its streams from the supplied + * connection object. This is called by the connection manager when + * the time comes to pass streams from the authing connection to the + * running connection. + */ + protected void inheritStreams (Connection other) + { + _fin = other._fin; + _oin = other._oin; + _oout = other._oout; + } + + /** + * Returns the object output stream associated with this connection + * (creating it if necessary). This should only be used by the + * connection manager. + */ + protected ObjectOutputStream getObjectOutputStream ( + FramingOutputStream fout) + { + // we're lazy about creating our output stream because we may be + // inheriting it from our authing connection and we don't want to + // unnecessarily create it in that case + if (_oout == null) { + _oout = new ObjectOutputStream(fout); + } + return _oout; + } + + /** + * Sets the object output stream used by this connection. This should + * obly be called by the connection manager. + */ + protected void setObjectOutputStream (ObjectOutputStream oout) + { + _oout = oout; + } + /** * Closes the socket associated with this connection. This happens * when we receive EOF, are requested to close down or when our @@ -156,17 +213,33 @@ public abstract class Connection implements NetEventHandler public void handleEvent (Selectable source, short events) { try { + // we're lazy about creating our input streams because we may + // be inheriting them from our authing connection and we don't + // want to unnecessarily create them in that case + if (_fin == null) { + _fin = new FramedInputStream(); + _oin = new ObjectInputStream(_fin); + } + // read the available data and see if we have a whole frame if (_fin.readFrame(_in)) { // parse the message and pass it on - _handler.handleMessage((UpstreamMessage) - TypedObjectFactory.readFrom(_din)); + UpstreamMessage msg = (UpstreamMessage)_oin.readObject(); +// Log.info("Read message " + msg + "."); + _handler.handleMessage(msg); } } catch (EOFException eofe) { // close down the socket gracefully close(); + } catch (ClassNotFoundException cnfe) { + Log.warning("Error reading message from socket " + + "[socket=" + _socket + ", error=" + cnfe + "]."); + // deal with the failure + handleFailure(new NestableIOException( + "Unable to decode incoming message.", cnfe)); + } catch (IOException ioe) { Log.warning("Error reading message from socket " + "[socket=" + _socket + ", error=" + ioe + "]."); @@ -191,9 +264,11 @@ public abstract class Connection implements NetEventHandler protected SelectItem _selitem; protected InputStream _in; - protected OutputStream _out; protected FramedInputStream _fin; - protected DataInputStream _din; + protected ObjectInputStream _oin; + + protected OutputStream _out; + protected ObjectOutputStream _oout; protected MessageHandler _handler; } diff --git a/src/java/com/threerings/presents/server/net/ConnectionManager.java b/src/java/com/threerings/presents/server/net/ConnectionManager.java index 2005fbeed..367f17148 100644 --- a/src/java/com/threerings/presents/server/net/ConnectionManager.java +++ b/src/java/com/threerings/presents/server/net/ConnectionManager.java @@ -1,21 +1,20 @@ // -// $Id: ConnectionManager.java,v 1.19 2002/07/10 01:23:45 mdb Exp $ +// $Id: ConnectionManager.java,v 1.20 2002/07/23 05:52:49 mdb Exp $ package com.threerings.presents.server.net; -import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayList; import ninja2.core.io_core.nbio.*; import com.samskivert.util.*; +import com.threerings.io.FramingOutputStream; +import com.threerings.io.ObjectOutputStream; + import com.threerings.presents.Log; import com.threerings.presents.client.Client; -import com.threerings.presents.io.FramingOutputStream; -import com.threerings.presents.io.TypedObjectFactory; - import com.threerings.presents.net.AuthRequest; import com.threerings.presents.net.AuthResponse; import com.threerings.presents.net.DownstreamMessage; @@ -61,9 +60,8 @@ public class ConnectionManager extends LoopingThread }; _selset.add(_litem); - // we'll use these for sending messages to clients + // we'll use this for sending messages to clients _framer = new FramingOutputStream(); - _dout = new DataOutputStream(_framer); } /** @@ -196,8 +194,14 @@ public class ConnectionManager extends LoopingThread DownstreamMessage outmsg = (DownstreamMessage)tup.right; try { - // first flatten the message (and frame it) - TypedObjectFactory.writeTo(_dout, outmsg); + // write the message via the connection's object output + // stream (which is configured to write data to our + // framing output stream) + ObjectOutputStream oout = conn.getObjectOutputStream(_framer); +// Log.info("Sending " + outmsg + "."); + oout.writeObject(outmsg); + oout.flush(); + // then write framed message to real output stream _framer.writeFrameAndReset(conn.getOutputStream()); @@ -218,6 +222,10 @@ public class ConnectionManager extends LoopingThread try { RunningConnection rconn = new RunningConnection(this, conn.getSocket()); + // we need to keep using the same object input and output + // streams from the beginning of the session because they + // have contextual state that needs to be preserved + rconn.inheritStreams(conn); // wire this connection up to receive network events _selset.add(rconn.getSelectItem()); @@ -357,7 +365,6 @@ public class ConnectionManager extends LoopingThread protected Queue _outq = new Queue(); protected FramingOutputStream _framer; - protected DataOutputStream _dout; protected Queue _authq = new Queue(); diff --git a/src/java/com/threerings/presents/util/StreamableArrayList.java b/src/java/com/threerings/presents/util/StreamableArrayList.java deleted file mode 100644 index f099c5c29..000000000 --- a/src/java/com/threerings/presents/util/StreamableArrayList.java +++ /dev/null @@ -1,51 +0,0 @@ -// -// $Id: StreamableArrayList.java,v 1.4 2002/03/20 22:58:26 mdb Exp $ - -package com.threerings.presents.util; - -import java.io.IOException; -import java.io.DataInputStream; -import java.io.DataOutputStream; - -import java.util.ArrayList; -import com.threerings.presents.dobj.DSet; -import com.threerings.presents.io.Streamable; -import com.threerings.presents.io.StreamableUtil; - -/** - * Provides a means by which an ordered collection of streamable instances - * (of potentially heterogenous derived classes) can be delivered over the - * network. A streamable array list can be supplied anywhere that a - * distributed object value can be supplied, but bear in mind that once - * the list is created, it's elements cannot be changed without - * rebroadcasting the entire list. It is not like a {@link DSet} which - * allows individual elements to be added or removed, or - * Streamable[] distributed object fields for which elements - * can be individually updated. - */ -public class StreamableArrayList - extends ArrayList implements Streamable -{ - // documentation inherited - public void writeTo (DataOutputStream out) - throws IOException - { - // convert ourselves into an array and use streamable util to - // write it out - Streamable[] values = new Streamable[size()]; - toArray(values); - StreamableUtil.writeStreamables(out, values); - } - - // documentation inherited - public void readFrom (DataInputStream in) - throws IOException - { - // use streamable util to read in our values - Streamable[] values = StreamableUtil.readStreamables(in); - int vcount = values.length; - for (int i = 0; i < vcount; i++) { - add(values[i]); - } - } -}