FileDocCategorySizeDatePackage
StockServer.javaAPI DocExample7503Wed Apr 19 11:20:38 BST 2000examples.stock

StockServer

public class StockServer extends UnicastRemoteObject implements StockWatch, Runnable

Fields Summary
private Hashtable
notifyTable
table that maps StockNotify objects to a vector of stocks
private Hashtable
stockTable
table that maps stock names to stock update info
private Thread
notifier
thread for notifying watchers of stock updates
private static String[]
name
Constructors Summary
public StockServer()
Construct the stock server

exception
RemoteException if remote object cannot be exported

                     
        
    
	for (int i=0; i<name.length; i++) {
	    stockTable.put(name[i], new Stock(name[i]));
	}
    
Methods Summary
public voidcancel(java.lang.String stock, StockNotify obj)
Cancel request for stock updates for a particular stock.

param
stock the stock name
param
obj the remote object canceling the notification

	Vector stocks = (Vector)notifyTable.get(obj);
	stocks.removeElement(stock);
    
public synchronized voidcancelAll(StockNotify obj)
Cancel all requests for stock updates for the remote object.

param
obj the remote object canceling the request
exception
RemoteException if some communication failure occurs

	notifyTable.remove(obj);
    
private voidgenerateUpdates()
Private method to generate random stock updates

	Enumeration enum = stockTable.elements();
	while (enum.hasMoreElements()) {
	    Stock stock = (Stock)enum.nextElement();
	    stock.update();
	}
    
public Stock[]list(StockNotify obj)
Returns an array of stock update information for the stocks already registered by the remote object.

param
obj the remote object
return
the list of stocks, or null if obj is not watching any stocks
exception
RemoteException if some communication failure occurs

	Vector stocks = (Vector)notifyTable.get(obj);
	Stock[] stockList = null;
	
	if (stocks != null) {
	    Enumeration enum = stocks.elements();
	    stockList = new Stock[stocks.size()];
	    int i=0;
	    // collect updates to the stocks this watcher is
	    // interested in
	    while (enum.hasMoreElements()) {
		String stockname = (String)enum.nextElement();
		stockList[i++] = (Stock)stockTable.get(stockname);
	    }
	}
	return stockList;
    
public static voidmain(java.lang.String[] args)
Start up the stock server; also creates a registry so that the StockApplet can lookup the server.

	// Create and install the security manager
	System.setSecurityManager(new RMISecurityManager());

	try {
	    System.out.println("StockServer.main: creating registry");
	    LocateRegistry.createRegistry(2005);
	    System.out.println("StockServer.main: creating server");
	    StockServer server = new StockServer();
	    System.out.println("StockServer.main: binding server ");
	    Naming.rebind("//:2005/example.stock.StockServer", server);
	    System.out.println("StockServer.main: done");

	    // Note: this application will exit when all remote stock
	    // watchers drop their references to the remote server
	    // object and unregister their interest in watching stock
	    // reports.

	} catch (Exception e) {
	    System.out.println("StockServer.main: an exception occurred: " +
			       e.getMessage());
	    e.printStackTrace();
	}
    
public voidrun()
The run method (called from the notifier thread) sends out stock updates periodically to those remote objects that have registered interest in being notified.

	boolean done = false;

	do {
  
	    try {
		// wait for a few seconds between updates
		Thread.currentThread().sleep(2000);
	    } catch (InterruptedException e) {
	    }

	    Date date = new Date();
	    // update stocks in table
	    generateUpdates();
	    
	    // enumerate through each watcher...
	    Enumeration enum = notifyTable.keys();
	    while (enum.hasMoreElements()) {
		StockNotify obj = (StockNotify)enum.nextElement();
		Stock[] stockList = list(obj);
		if (stockList != null) {
		    // send update
		    try {
			System.out.println("StockServer.run: sending update " +
					   date);
			obj.update(date, stockList);
		    } catch (RemoteException e) {
			// can't reach watcher; cancel notification request
			System.out.println("StockServer.run: exception");
			e.printStackTrace();
			cancelAll(obj);
		    }
		}
	    }

	    // check to see if the update thread should exit
	    synchronized (this) {
		if (notifyTable.isEmpty()) {
		    notifier = null;
		    done = true;
		}
	    }

	} while (!done);
    
public synchronized Stockwatch(java.lang.String stock, StockNotify obj)
Request notification of stock updates.

param
stock the stock name
param
obj the remote object to be notified
return
the latest update of the stock
exception
StockNotFoundException if stock is not known

	System.out.println("StockServer.watch: " + stock );
	
	if (!stockTable.containsKey(stock)) {
	    throw new StockNotFoundException(stock);
	}
	
	Vector stocks = (Vector)notifyTable.get(obj);

	// register interested party...
	if (stocks == null) {
	    stocks = new Vector();
	    notifyTable.put(obj, stocks);
	}

	// add stock to list
	if (!stocks.contains(stock)) {
	    stocks.addElement(stock);
	}
	
	// start thread to notify watchers...
	if (notifier == null) {
	    notifier = new Thread(this, "StockNotifier");
	    notifier.start();
	}
	return (Stock)stockTable.get(stock);