package mit.rmi ;

public class Setup
{
	private String policyProp = "java.security.policy" ;
	private String policy = "./mit/rmi/policy" ;
	private String location = "file://./" ;
	private String server = "mit.rmi.Server" ;
	private java.rmi.MarshalledObject data = null ;

	public Setup( byte[] srvtab )
	{
		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" ) ;
                       
                        // Any other Setup will exit, but this one needs to be up or else client dies saying pipe has been broken!

		}
		catch( Exception ex )
		{
			ex.printStackTrace() ;
		}
                System.exit(0);
	}
	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() ;
				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() ;
		}
	}
}
