package engine;

import compute.*;
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.Naming;
import java.rmi.server.UnicastRemoteObject;
import java.io.FileOutputStream;

public class ComputeEngine extends UnicastRemoteObject
                           implements Compute
{
    public ComputeEngine() throws RemoteException {
        super();
    }

    public <E> E executeTask(Task<E> t) {
        return t.execute();
    }

    public static void main(String[] args) {
	// zur Information über vorhandenen Security-Manager
	System.out.println(System.getSecurityManager());
	
	// diesen Bereich eventuell auskommentieren
	if (System.getSecurityManager() == null) {
            System.setSecurityManager(new RMISecurityManager());
	}
	System.out.println(System.getSecurityManager());
	// auskommentieren bis hier

        String name = "Compute";   // oder "//Servername/Compute"
        try {
	    ComputeEngine derServer = new ComputeEngine();
	    Compute engine = derServer;

	    // nun neue Registry nur erzeugen, wenn nicht schon vorhanden
	    try {
		Registry reg = LocateRegistry.getRegistry();
		String[] liste = reg.list();
		System.out.println("Schon vorhandene Dienste:");
		for (String dienst : liste) System.out.println(dienst);
	    } catch (RemoteException e) {
		LocateRegistry.createRegistry(1099);
		System.out.println("Registry erzeugt");
	    }

	    // nun sicher Registry vorhanden
            Naming.rebind(name, engine);
            System.out.println("ComputeEngine bound");

	    // in Registry befindliche Dienste auflisten
	    System.out.println("Nun vorhandene Dienste:");
	    for (String dienst : Naming.list("//localhost")) // oder auch ""
	    System.out.println(dienst);

	    // alle RMI-Aufrufe in Log-Datei schreiben
	    // diesen Bereich eventuell auskommentieren
	    FileOutputStream hinaus = new FileOutputStream("rmi.log");
	    derServer.setLog(hinaus);
	    //  auskommentieren bis hier

        } catch (Exception e) {
            System.err.println("ComputeEngine exception: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

