// // $Id: DObject.java,v 1.6 2001/06/01 05:17:16 mdb Exp $ package com.threerings.cocktail.cher.dobj; import java.util.ArrayList; /** * The distributed object forms the foundation of the cocktail system. All * information shared among users of the system is done via distributed * objects. A distributed object has a set of subscribers. These * subscribers have access to the object or a proxy of the object and * therefore have access to the data stored in the object's members at all * times. * *

When there is any change to that data, initiated by one of the * subscribers, an event is generated which is dispatched to all * subscribers of the object, notifying them of that change and affecting * that change to the copy of the object maintained at each client. In * this way, both a respository of shared information and a mechanism for * asynchronous notification are made available as a fundamental * application building blocks. * *

To define what information is shared, an application creates a * distributed object declaration which is much like a class declaration * except that it is transformed into a proper derived class of * DObject by a script. A declaration looks something like * this: * *

 * public dclass RoomObject
 * {
 *     public String description;
 *     public int[] occupants;
 * }
 * 
* * which is converted into an actual Java class that looks like this: * *
 * public class RoomObject extends DObject
 * {
 *     public String getDescription ()
 *     {
 *         // ...
 *     }
 *
 *     public void setDescription (String description)
 *     {
 *         // ...
 *     }
 *
 *     public int[] getOccupants ()
 *     {
 *         // ...
 *     }
 *
 *     public void setOccupants (int[] occupants)
 *     {
 *         // ...
 *     }
 *
 *     public void setOccupantsAt (int index, int value)
 *     {
 *         // ...
 *     }
 * }
 * 
* * These method calls on the actual distributed object will result in the * proper attribute change events being generated and dispatched. */ public class DObject { /** * Constructs a new distributed object with the supplied object id. * This should not be called directly, rather objects should be * created via the distributed object manager. * * @see DObjectManager.createObject */ public DObject (int oid, DObjectManager manager) { _oid = oid; _mgr = manager; _subscribers = new ArrayList(); } /** * Returns the object id of this object. All objects in the system * have a unique object id. */ public int getOid () { return _oid; } /** * Adds the supplied subscriber to the subscriber list for this * object. This is done automatically when an object is requested for * subscription by the distributed object manager, thus this function * should not be called directly except in circumstances where one * subscriber has already obtained a subscription to an object and * wishes to include a subordinate subscriber in on the fun. * *

If the specified subscriber is already subscribed to this * object, they will not be added to the list a second time. */ public void addSubscriber (Subscriber subscriber) { if (!_subscribers.contains(subscriber)) { _subscribers.add(subscriber); } } /** * Removes the specified subscriber from the subscriber list for this * object. This is done automatically when a subscriber returns false * from handleEvent, but can also be done directly * through a call to removeSubscriber. If the specified * subscriber is not currently on the list of subscribers for this * object, nothing happens. */ public void removeSubscriber (Subscriber subscriber) { _subscribers.remove(subscriber); } protected int _oid; protected DObjectManager _mgr; protected ArrayList _subscribers; }