Cher Mk3 Notes -*- outline -*-

* Check into "connection closed by peer" thread exiting on client

* TypedObjectFactory
Maybe modify so that types are assigned automatically even if everything
has to be registered in a single place, since it pretty much does anyway.

* Server components:
  + Connection manager 
  + Client manager
  + Event dispatch thread (DObjectManager)
  + Server side services?
  + Room/Game managers
  + Info repository for shared info?

* Client components:
  + Network client (auth + DObject services)
  + Applet shell
  + Panel management
  + Components: chatbox, occupant info, turn indicator?
  + Room/Game panels, controllers, etc.

* Client detail:
  + Supply credentials (username, password)
  + Establishes, maintains connection: 
    login (connect), logout (disconnect)
  + Creates, manages client-side DObjectManager

* Events in the client will be dispatched on the AWT thread
- Provide pluggable "event dispatcher" on the client
- Allow extension of Event as DispatchableEvent so that event objects
  themselves can extend Runnable and be popped right into
  SwingUtil.invokeLater().

* Client perform all network ops on own thread, will call back to main
  code through Observer interface to notify of state changes in the
  authentication process/connectedness:

  public interface ClientObserver
  {
      public void didConnect ();
      public void connectionFailed ();
      public void didLogon ();
      public void logonFailed ();
      public void didDisconnect ();
      public void didLogoff ();
  }

* Three Rings Client flowlist:

  Instantiate client
  Obtain auth info
  Obtain room info
  Authenticate

* Distributed objects are defined like a class with a set of public data
  members which is then converted into an actual class with get/set
  methods for each member.

  public dclass GameObject
  {
      public int[] players;
      public String description;
  }

  becomes

  public class GameObject extends DObject
  {
       public void setPlayers (int[] players);
       public void setPlayersAt (int index, int value);
       public int[] getPlayers ();
       public int getPlayersAt (int index);

       public void setDescription (String description);
       public String getDescription ();
  }

* Classes:

  DObjectManager
  DObject
  DEvent
  DTransaction
  Subscriber

* Events:

  ATTRIBUTE_CHANGED
  ATTRIBUTES_CHANGED
  ATTRIBUTES_CHANGED_SPLIT
  ELEMENT_CHANGED
  OBJECT_DESTROYED

  ELEMENT_ADDED
  ELEMENT_REMOVED

  OID_ADDED
  OID_REMOVED
