[ Team LiB ] Previous Section Next Section

21.5 Remote MUD Interfaces

Example 21-4 is a Mud class that serves as a placeholder for inner classes and interfaces (and one constant) used by the rest of the MUD system. Most importantly, Mud defines three Remote interfaces: RemoteMudServer, RemoteMudPerson, and RemoteMudPlace. These define the remote methods that are implemented by the MudServer, MudPerson, and MudPlace objects, respectively.

Example 21-4. Mud.java
package je3.rmi;
import java.rmi.*;
import java.util.Vector;
import java.io.IOException;

/**
 * This class defines three nested Remote interfaces for use by our MUD game.
 * It also defines a bunch of exception subclasses, and a constant string
 * prefix used to create unique names when registering MUD servers
 **/
public class Mud {
    /**
     * This interface defines the exported methods of the MUD server object
     **/
    public interface RemoteMudServer extends Remote {
        /** Return the name of this MUD */
        public String getMudName( ) throws RemoteException;
        
        /** Return the main entrance place for this MUD */
        public RemoteMudPlace getEntrance( ) throws RemoteException; 
        
        /** Look up and return some other named place in this MUD */
        public RemoteMudPlace getNamedPlace(String name) 
            throws RemoteException, NoSuchPlace;
        
        /** 
         * Dump the state of the server to a file so that it can be restored
         * later. All places, and their exits and things, are dumped, but the
         * "people" in them are not.
         **/
        public void dump(String password, String filename) 
            throws RemoteException, BadPassword, IOException;
    }
    
    /**
     * This interface defines the methods exported by a "person" object that
     * is in the MUD.
     **/
    public interface RemoteMudPerson extends Remote {
        /** Return a full description of the person */
        public String getDescription( ) throws RemoteException;
        
        /** Deliver a message to the person */
        public void tell(String message) throws RemoteException;
    }
    
    /**
     * This is the most important remote interface for the MUD.  It defines the
     * methods exported by the "places" or "rooms" within a MUD.  Each place
     * has a name and a description, and also maintains a list of "people" in
     * the place, things in the place, and exits from the place.  There are
     * methods to get a list of names for these people, things, and exits.
     * There are methods to get the RemoteMudPerson object for a named person,
     * to get a description of a named thing, and to go through a named exit.
     * There are methods for interacting with other people in the MUD.  There
     * are methods for building the MUD by creating and destroying things,
     * adding new places (and new exits to those places), for linking a place
     * through a new exit to some other place (possibly on another MUD server),
     * and for closing down an existing exit.
     **/
    public interface RemoteMudPlace extends Remote {
        /** Look up the name of this place */
        public String getPlaceName( ) throws RemoteException;
        
        /** Get a description of this place */
        public String getDescription( ) throws RemoteException;
        
        /** Find out the names of all people here */
        public Vector getNames( ) throws RemoteException;
        
        /** Get the names of all things here */
        public Vector getThings( ) throws RemoteException;
        
        /** Get the names of all ways out of here */
        public Vector getExits( ) throws RemoteException;
        
        /** Get the RemoteMudPerson object for the named person. */
        public RemoteMudPerson getPerson(String name) 
            throws RemoteException, NoSuchPerson;
        
        /** Get more details about a named thing */
        public String examineThing(String name)
            throws RemoteException,NoSuchThing;
        
        /** Use the named exit */
        public RemoteMudPlace go(RemoteMudPerson who, String direction) 
            throws RemoteException,NotThere,AlreadyThere,NoSuchExit,LinkFailed;
        
        /** Send a message of the form "David: hi everyone" */
        public void speak(RemoteMudPerson speaker, String msg) 
            throws RemoteException, NotThere;
        
        /** Send a message of the form "David laughs loudly" */
        public void act(RemoteMudPerson speaker, String msg) 
            throws RemoteException, NotThere;
        
        /** Add a new thing in this place */
        public void createThing(RemoteMudPerson who, String name, 
                                String description) 
            throws RemoteException, NotThere, AlreadyThere;
        
        /** Remove a thing from this place */
        public void destroyThing(RemoteMudPerson who, String thing) 
            throws RemoteException, NotThere, NoSuchThing;
        
        /**
         * Create a new place, bi-directionally linked to this one by an exit
         **/
        public void createPlace(RemoteMudPerson creator, 
                                String exit, String entrance,
                                String name, String description) 
            throws RemoteException,NotThere,
                   ExitAlreadyExists,PlaceAlreadyExists;

        /** 
         * Link this place (unidirectionally) to some existing place.  The
         * destination place may even be on another server.
         **/
        public void linkTo(RemoteMudPerson who, String exit, 
                           String hostname, String mudname, String placename) 
            throws RemoteException, NotThere, ExitAlreadyExists, NoSuchPlace;
        
        /** Remove an existing exit */
        public void close(RemoteMudPerson who, String exit) 
            throws RemoteException, NotThere, NoSuchExit;
        
        /** 
         * Remove this person from this place, leaving them nowhere.
         * Send the specified message to everyone left in the place.
         **/
        public void exit(RemoteMudPerson who, String message) 
            throws RemoteException, NotThere;
        
        /**
         * Put a person in a place, assigning their name, and sending the 
         * specified message to everyone else in the place.  The client should
         * not make this method available to the user.  They should use go( )
         * instead.
         **/
        public void enter(RemoteMudPerson who, String name, String message) 
            throws RemoteException, AlreadyThere;
        
        /** 
         * Return the server object of the MUD that "contains" this place 
         * This method should not be directly visible to the player
         **/
        public RemoteMudServer getServer( ) throws RemoteException;
    }
    
    /**
     * This is a generic exception class that serves as the superclass
     * for a bunch of more specific exception types 
     **/
    public static class MudException extends Exception {  }
    
    /**
     * These specific exception classes are thrown in various contexts.
     * The exception class name contains all the information about the 
     * exception; no detail messages are provided by these classes.
     **/
    public static class NotThere extends MudException {  }
    public static class AlreadyThere extends MudException {  }
    public static class NoSuchThing extends MudException {  }
    public static class NoSuchPerson extends MudException {  }
    public static class NoSuchExit extends MudException {  }
    public static class NoSuchPlace extends MudException {  }
    public static class ExitAlreadyExists extends MudException {  }
    public static class PlaceAlreadyExists extends MudException {  }
    public static class LinkFailed extends MudException {  }
    public static class BadPassword extends MudException {  }
    
    /**
     * This constant is used as a prefix to the MUD name when the server
     * registers the mud with the RMI Registry, and when the client looks 
     * up the MUD in the registry.  Using this prefix helps prevent the 
     * possibility of name collisions.
     **/
    static final String mudPrefix = "je3.rmi.Mud.";
}
    [ Team LiB ] Previous Section Next Section