package saver;

import java.rmi.RMISecurityManager;
import net.jini.discovery.LookupDiscovery;
import net.jini.core.lookup.ServiceTemplate;
import net.jini.discovery.LookupDiscoveryManager;
import net.jini.lookup.ServiceDiscoveryManager;
import net.jini.lookup.LookupCache;
import net.jini.core.lookup.ServiceItem;
import net.jini.lease.LeaseRenewalManager;
import net.jini.core.lookup.ServiceID;
import java.rmi.server.UnicastRemoteObject;
import net.jini.lookup.JoinManager;
import net.jini.lookup.ServiceIDListener;
import java.rmi.RemoteException;
import java.awt.event.*;

/**
 * Saver.java
 */

public class Saver  
    extends KeyAdapter
    implements ServiceIDListener {

    public static final boolean debug = true;

    protected ScreenImpl screen;
    protected NextScreenImpl next;
    protected JoinManager joinMgr;

    private static final long WAITFOR = 100000L;

    public static void main(String argv[]) {
        new Saver(argv);

        // stay around long enough to receive replies
        try {
            Thread.currentThread().sleep(WAITFOR);
        } catch(java.lang.InterruptedException e) {
            // do nothing
        }
    }

    public Saver(String[] argv) {
        System.setSecurityManager(new RMISecurityManager());
	if (argv.length == 0) {
	    System.err.println("usage: java saver drawable-name");
	    System.exit(2);
	}
	String drawableClassName = argv[0];
	// next = null;
	next = new NextScreenImpl();
	createScreen(next, drawableClassName);
	registerScreen();
	new Animator(screen).start();
    }

    protected void createScreen(NextScreenImpl next, String drawableClass) {
	screen = new ScreenImpl(next);
	next.setThisScreen(screen);
	screen.populate(drawableClass);
	try {
	    UnicastRemoteObject.exportObject(screen);
	} catch(RemoteException e) {
	    System.err.println("Can't export object");
	    System.exit(1);
	}
	screen.addKeyListener(this);
    }

    public void registerScreen() {
	
        try {
            LookupDiscoveryManager mgr = 
                new LookupDiscoveryManager(LookupDiscovery.ALL_GROUPS,
                                           null /* unicast locators */,
                                           null /* DiscoveryListener */);
	    // register with all available LUS
	    // also, get a LUS-assigned serviceID, so
	    // we have a sort of random id to compare
	    // with other sccreen savers
            joinMgr = new JoinManager(screen, /* service */
                                      null /* attr sets */,
                                      this /* ServiceIDListener*/,
                                      mgr /* DiscoveryManagement */,
                                      new LeaseRenewalManager());
        } catch(Exception e) {
            e.printStackTrace();
            System.exit(1);
        }	
    }

    public void serviceIDNotify(ServiceID serviceID) {
	next.setServiceID(serviceID);
	if (debug) System.out.println("Got service ID " + serviceID);
    }

    public void keyTyped(KeyEvent e) {
	if (debug) {
	    System.out.println("Exiting and cleaning up");
	}
	joinMgr.terminate();
	System.exit(0);
    }
} // Saver
