package mit.rmi ;

public class Setup
{
	private String policyProp = "java.security.policy" ;
	private String policy = "./mit/rmi/policy" ;
	//private String location = "file://./" ;
	private String location = "file:/JavaProjects.01.09.11/" ;

	private String server = "mit.rmi.Server" ;
	private java.rmi.MarshalledObject data = null ;

	public Setup( byte[] srvtab )
	{
		//Thread t = new Thread( new Runnable() {

		try
		{
			if( null == System.getSecurityManager() )
			{
				System.setSecurityManager( new java.rmi.RMISecurityManager() ) ;
			}

			data = new java.rmi.MarshalledObject( srvtab ) ;

			java.util.Properties props = new java.util.Properties() ;
			props.put( policyProp , policy ) ;
			java.rmi.activation.ActivationGroupDesc.CommandEnvironment ace = null;
			java.rmi.activation.ActivationGroupDesc group
				= new java.rmi.activation.ActivationGroupDesc( props , ace );

			java.rmi.activation.ActivationGroupID agi
				= java.rmi.activation.ActivationGroup.getSystem().registerGroup( group ) ;

			java.rmi.activation.ActivationGroup.createGroup( agi , group , 0 ) ;

			java.rmi.activation.ActivationDesc desc
				= new java.rmi.activation.ActivationDesc( server , location , data ) ;
//                        java.rmi.activation.ActivationDesc desc
//				= new java.rmi.activation.ActivationDesc(agi, server , location , data ) ;
			java.rmi.Remote mri = java.rmi.activation.Activatable.register( desc ) ;

			java.rmi.Naming.rebind( server , mri ) ;
			System.out.println( "Exported Server" ) ;
                       
    		}
		catch( Exception ex )
		{
			ex.printStackTrace() ;
		}
		//});
	//	t.setDaemon( true );
		//t.start();                
	}

	private static final void bootstrap( final String className, final String location, final java.rmi.MarshalledObject data, 
                                final String exportedName) throws Exception {
    		final java.rmi.activation.ActivationDesc desc = new java.rmi.activation.ActivationDesc(className, location, data);
    		java.rmi.Remote remote = java.rmi.activation.Activatable.register(desc);
    		System.out.println("Got the stub for " + exportedName);
    		System.out.flush();

    		// Bind the stub to a name in the registry running on 1099
    		java.rmi.Naming.rebind(exportedName, remote);
    		System.out.println("Exported " + exportedName + ", exiting . . .");
    		System.out.flush();
	}

	public static void main( String[] args )
	{
		try
		{
			if( 0 < args.length )
			{
				java.io.FileInputStream in = new java.io.FileInputStream( args[ 0 ] ) ;
				byte[] srvtab = new byte[ 0 ] ;
				int length = 0 ;
				int available = 0 ;

				while( 0 != in.available() )
				{
					available = in.available() ;
					byte[] newsrvtab = new byte[ length + available ] ;
					System.arraycopy( srvtab , 0 , newsrvtab , 0 , length ) ;
					in.read( newsrvtab , length , available ) ;
					srvtab = newsrvtab ;
					length += available ;
				}
				in.close() ;
				System.out.println( length + " bytes read.");
				mit.rmi.Setup setup = new mit.rmi.Setup( srvtab ) ;
			}
			else
			{
				System.out.println( "Usage: java mit.rmi.Setup <srvtab_pathname>" ) ;
			}
		}
		catch( Exception ex )
		{
			ex.printStackTrace() ;
		}
		System.exit(0);
	}
}
