import java.awt.*;
import java.io.*;
import java.net.*;
import java.lang.reflect.*;
import java.rmi.*;

// Command format: classname\n bindingname\n arg1\n arg2\n ...
// where all args are of type String.
class Handler {
   Socket incoming;
   String classname, bindingname, arg;

   Handler(Socket socket) {  incoming = socket;  }

   public void doit () {
      int nargs = 0;
      String arg[] = new String[10];
      Class arglst[] = null;
      Object objlst[] = null;

      try {
         InputStream is = incoming.getInputStream();
         ObjectInputStream in = new ObjectInputStream(is);
         PrintStream out = new PrintStream(incoming.getOutputStream());

         classname = (String)in.readObject();   // Get classname
         bindingname = (String)in.readObject(); // Get bindingname
         arglst = (Class [])in.readObject();    // Get argument types
         objlst = (Object [])in.readObject();   // Get arguments

         Class <?> cls = Class.forName(classname);
         Constructor ct = cls.getConstructor(arglst);
         Stream stream = (Stream)ct.newInstance(objlst);
         Naming.rebind(bindingname, stream);
         System.out.println(bindingname+" Serving");
         out.println();
      } catch (Exception e)  {  
         System.out.println(e.toString());  
      } 
   } 
}

public class Server {
   public static void main (String args[]) {
      try {
         ServerSocket s = new ServerSocket(8699);
         System.out.println("Server listening on port 8699");
         
         while (true) {
            Socket incoming = s.accept( );
            new Handler(incoming).doit();
         }
      }
      catch (Exception f) {
         System.out.println("Server: Error:"+f.toString());
      }
   }
}
