
package client;

import rcx.jini.*;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import java.rmi.RMISecurityManager;
import net.jini.discovery.LookupDiscovery;
import net.jini.discovery.DiscoveryListener;
import net.jini.discovery.DiscoveryEvent;
import net.jini.core.lookup.ServiceRegistrar;
import net.jini.core.lookup.ServiceTemplate;
import net.jini.core.event.RemoteEventListener;
import net.jini.core.event.RemoteEvent;
import net.jini.core.event.UnknownEventException;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
import net.jini.core.entry.Entry;
import net.jini.core.lookup.ServiceMatches;
import net.jini.core.lookup.ServiceItem;

import ui.UIFactory;
import ui.AWTFrameFactory;
import ui.SwingFrameFactory;
import ui.UICreationException;

/**
 * TestRCX2.java
 *
 *
 * Created: Wed Mar 17 14:29:15 1999
 *
 * @author Jan Newmarch
 * @version 1.0
 */

public class TestRCX2 implements DiscoveryListener {

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

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

    public TestRCX2() {
	System.setSecurityManager(new RMISecurityManager());

	LookupDiscovery discover = null;
        try {
            discover = new LookupDiscovery(LookupDiscovery.ALL_GROUPS);
        } catch(Exception e) {
            System.err.println(e.toString());
            System.exit(1);
        }

        discover.addDiscoveryListener(this);

    }
    
    public void discovered(DiscoveryEvent evt) {

        ServiceRegistrar[] registrars = evt.getRegistrars();
	Class [] classes = new Class[] {RCXPortInterface.class};
	RCXPortInterface port = null;
	Entry[] entries = {new UIFactory(null, null)};
	ServiceTemplate template = new ServiceTemplate(null, classes, 
						       entries);
 
        for (int n = 0; n < registrars.length; n++) {
	    System.out.println("Service found");
            ServiceRegistrar registrar = registrars[n];
	    ServiceMatches matches = null;
	    try {
		matches = registrar.lookup(template, 10);
	    } catch(java.rmi.RemoteException e) {
		e.printStackTrace();
		System.exit(2);
	    }
	    for (int nn = 0; nn < matches.items.length; nn++) {
		ServiceItem item = matches.items[nn];
		port = (RCXPortInterface) item.service;
		if (port == null) {
		    System.out.println("port null");
		    continue;
		}	

		Entry[] attributes = item.attributeSets;
		for (int m = 0; m < attributes.length; m++) {
		    Entry attr = attributes[m];
		    if (attr instanceof UIFactory) {
			showUI(port, (UIFactory) attr);
		    }
		}
	    }
	


	}
    }

    public void discarded(DiscoveryEvent evt) {
	// empty
    }

    private void showUI(RCXPortInterface port, UIFactory attr) {
	if (attr instanceof AWTFrameFactory) {
	    Frame frame = null;
	    try {
		frame = (Frame) attr.getUI(port);
	    } catch(UICreationException e) {
		e.printStackTrace();
		return;
	    }
	    frame.setVisible(true);
	} else if (attr instanceof SwingFrameFactory) {
	    JFrame frame = null;
	    try {
		frame = (JFrame) attr.getUI(port);
	    } catch(UICreationException e) {
		e.printStackTrace();
		return;
	    }
	    frame.setVisible(true);
	} else {
	    System.out.println("non-gui entry");
	}	
    }
} // TestRCX
