package ws;

import net.jini.lookup.JoinManager;
import net.jini.core.lookup.ServiceID;
import net.jini.discovery.LookupDiscovery;
import net.jini.core.lookup.ServiceRegistrar;
import java.rmi.RemoteException;
import net.jini.lookup.ServiceIDListener;
import net.jini.lease.LeaseRenewalManager;
import net.jini.discovery.LookupDiscoveryManager;
import net.jini.discovery.DiscoveryEvent;
import net.jini.discovery.DiscoveryListener;
import java.rmi.RMISecurityManager;
import java.rmi.Remote;
import net.jini.jeri.BasicJeriExporter;
import net.jini.jeri.BasicILFactory;
import net.jini.jeri.tcp.TcpServerEndpoint;
import net.jini.export.*; 
import net.jini.discovery.DiscoveryListener;
import net.jini.discovery.DiscoveryEvent;

public class Server implements ServiceIDListener, DiscoveryListener {

    // explicit proxy for Jini 2.0
    protected Remote proxy;
    protected ConverterImpl impl;
    
    public static void main(String argv[]) throws Exception {
	Server server = new Server();

        // stay around forever
	Object keepAlive = new Object();
	synchronized(keepAlive) {
	    keepAlive.wait();
	}
    }

    public Server() throws Exception {
	// Create a service object
	impl = new ConverterImpl();

	// Specify the transport protocol: Jeri over TCP
	Exporter exporter = 
	    new BasicJeriExporter(TcpServerEndpoint.getInstance(0),
				  new BasicILFactory());
	
	// Export the service object. This creates a socket 
	// endpoint to listen for requests and pass them to 
	// the service
	// proxy = exporter.export(impl);

	// install suitable security manager to protect
	// against downloaded code
	System.setSecurityManager(new RMISecurityManager());

	// Find LUS's and register the service proxy with them
	JoinManager joinMgr = null;
	LookupDiscoveryManager mgr = 
	    new LookupDiscoveryManager(LookupDiscovery.ALL_GROUPS,
				       null,  // unicast locators
				       this); // DiscoveryListener
	joinMgr = new JoinManager(impl, // service proxy
				  null,  // attr sets
				  (ServiceIDListener) this,  // ServiceIDListener
				  mgr,   // DiscoveryManager
				  new LeaseRenewalManager());
    }

    public void serviceIDNotify(ServiceID serviceID) {
	// called as a ServiceIDListener
	// Should save the id to permanent storage
	System.out.println("got service ID " + serviceID.toString());
    }

    public void discovered(DiscoveryEvent e) {
	System.out.println(e);
    }
    public void discarded(DiscoveryEvent e) {
	System.out.println(e);
    }
} // ConverterServer
