/*********JiniMeetingFactoryServerThinProxies**********/

package thinProxies;

import JiniRoomBooking.*;
import corba.RoomBooking.*; // JN
import net.jini.lookup.JoinManager;
import net.jini.core.lookup.ServiceID;
import net.jini.lookup.ServiceIDListener;
import net.jini.lease.LeaseRenewalManager;
import net.jini.discovery.LookupDiscovery;
import net.jini.discovery.LookupDiscoveryManager;
import org.omg.CORBA.*; // JN
import org.omg.CosNaming.*; // JN

/**
 * JiniMeetingFactoryServerThinProxies.java
 */

public class JiniMeetingFactoryServerThinProxies implements 
						ServiceIDListener {
    
	protected /* static JN */ MeetingFactory corbaMeetingFactoryRef;
	protected JiniMeetingFactory jMeetingFactory;
	protected ORB orb = null; // JN

	private String argv;
		
	public static void main(String argv[]) {
		new JiniMeetingFactoryServerThinProxies (argv);
	
        	// keep server running forever to
        	// - allow time for locator discovery and
        	// - keep re-registering the lease
        	java.lang.Object keepAlive = new java.lang.Object(); // JN
	        synchronized(keepAlive) {
        		try {
               			keepAlive.wait();
            		} catch(	java.lang.InterruptedException e) {
                	// do nothing
			} // JN	
            	}	
        }// End main
   	
	private MeetingFactory getCORBAMeetingFactoryRef(
							String[] argv){
		// Act like a CORBA client
		try {

		    // find the CORBA name server
		    org.omg.CORBA.Object objRef = 
		    orb.resolve_initial_references("NameService");
		    NamingContext ncRef = 
				NamingContextHelper.narrow(objRef);

	 	    // find the CORBA MeetingFactory proxy
		    NameComponent nc = 
			new NameComponent("MeetingFactory", "");
		    NameComponent path[] = {nc};
		    org.omg.CORBA.Object obj = ncRef.resolve(path);
		    /* MeetingFactory JN */ corbaMeetingFactoryRef = 
				MeetingFactoryHelper.narrow(obj);
		    return corbaMeetingFactoryRef;
		} catch(Exception e) {
	   		e.printStackTrace();
			return null;
		}
	}// End getCORBAMeetingFactoryRef

	public JiniMeetingFactoryServerThinProxies (String[] argv) {
		orb = ORB.init(argv, null); // JN
		
		if(corbaMeetingFactoryRef == null){
			corbaMeetingFactoryRef = 
				getCORBAMeetingFactoryRef(argv);
		}	
		
		if(jMeetingFactory == null){
			try { // JN
			    jMeetingFactory = 
			        new JiniMeetingFactoryImpl(corbaMeetingFactoryRef, orb);
			} catch(java.rmi.RemoteException e) {
			}
		}
	
		JoinManager joinMgr = null;
		try {
	    	LookupDiscoveryManager mgr = 
	new LookupDiscoveryManager( 
			LookupDiscovery.ALL_GROUPS,
					null /* unicast locators */,
					null /* DiscoveryListener */);
	
		joinMgr = new JoinManager(jMeetingFactory,
	 	  			   null,
	  				   this,
					   mgr,
					   new LeaseRenewalManager());
		
		} catch(Exception e) {
			e.printStackTrace();
	    		System.exit(1);
		}
    	}// End JiniMeetingFactoryServerThinProxies

	public void serviceIDNotify(ServiceID serviceID) {
	System.out.println("got service ID " + 
				serviceID.toString());
    	}// End serviceIDNotify
    
} // JiniMeetingFactoryServerThinProxies
