package net;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;


public class AutoServer implements Runnable {
  public final static int PORT = 8000;

  public static void main(String args[]) {
    Thread serverThread = new Thread(new AutoServer());
    serverThread.start();
    try {
      Thread.sleep(1000);
    } catch (InterruptedException e) {
    }
  }

  public void run() {
    try {
      ServerSocket ss =
          new ServerSocket(PORT);
      while (true) {
        System.out.println("autoServerThread waiting");
        Socket socket = ss.accept();
        (new AutoServerThread(socket)).start();
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

class AutoServerThread extends
    Thread {
  private ObjectInputStream ois;
  private ObjectOutputStream oos;

  AutoServerThread(Socket s)
      throws IOException {
    oos =
        new ObjectOutputStream(
            s.getOutputStream());

    ois =
        new ObjectInputStream(
            s.getInputStream());
  }

  public void run() {
    try {
      Object o1 = ois.readObject();
      Object o2 = ois.readObject();
      if (o1 instanceof RemoteClassLoader)
        ((RemoteClassLoader) o1).reload();
      if (!(o2 instanceof ComputableObject)) {
        System.out.println("Bad object!");
        return;
      }
      ComputableObject
          co = (ComputableObject) o2;
      Object ans = co.compute();
      oos.writeObject(ans);
      oos.close();
      ois.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public java.io.ObjectInputStream getOis() {
    return ois;
  }

  public void setOis(java.io.ObjectInputStream ois) {
    this.ois = ois;
  }

  public java.io.ObjectOutputStream getOos() {
    return oos;
  }

  public void setOos(java.io.ObjectOutputStream oos) {
    this.oos = oos;
  }
}