import java.rmi.*;
import java.rmi.server.*;
import java.util.*;
import java.io.*;
import java.rmi.registry.*;
import com.objy.db.*;
import com.objy.db.app.*;

public class Server2 extends UnicastRemoteObject implements Compute2
{
  private String id;
  private int count = 0;
  Session session;
  String db_name;
  Connection conn;
  
  public Server2() throws RemoteException {
    super();
        System.out.println("Proviamo a connetterci");

        try {
            conn = Connection.open("RPC1", oo.openReadWrite);
            conn.setThreadPolicy(oo.THREAD_POLICY_UNRESTRICTED);
            session = new Session();
            System.out.println("Connessione riuscita e sessione aperta");
//            session.setOpenMode(oo.openReadOnly);
//            session.setMrowMode(oo.MROW);
            session.begin();
            System.out.println("Dopo la connessione");
            conn.getSchemaPolicy().setChangeClassAllowed(false);
            conn.getSchemaPolicy().setFieldAccessControlEnforced(false);
            conn.setSchemaClassName("Wheel", "Wheel");
            conn.setSchemaClassName("Bakelite", "Bakelite");
        } catch (DatabaseNotFoundException exception) {
            System.err.println("Federated database \"RPC\" not found.");
            System.exit(1);
        } catch (DatabaseOpenException exception) {
            System.err.println("Federated database \"RPC\" already open.");
            System.exit(1);
        }
  }
  
 
 
   public Record getLocalBakelite(int wheel, int id) throws RemoteException {
        Record d = null;

        java.util.Vector result = new java.util.Vector();


        ooFDObj fd = session.getFD();
        ooDBObj db = fd.lookupDB("RPCdata");
        System.out.println("Proviamo" +fd);
        System.out.println("Prima di lookup");
        ooContObj cont = db.lookupContainer("Wheel0");
        System.out.println("Dopo lookup " +cont);
        Iterator itr = cont.scan("Bakelite","id ==" +id);
                while (itr.hasMoreElements()) {
                        Bakelite bak = (Bakelite) itr.nextElement();
                        System.out.println(bak.getid() + " " + bak.getcodice() + "  " + bak.getdato1());
                        d = bak.getAttrs();
                }
               session.commit();
                return d;
    }

   public void setLocalBakelite(int wheel, int id, Record r) throws RemoteException {

        java.util.Vector result = new java.util.Vector();

        session.begin();

        ooFDObj fd = session.getFD();
        ooDBObj db = fd.lookupDB("RPCdata");
        System.out.println("Proviamo" +fd);
        System.out.println("Prima di lookup");
        ooContObj cont = db.lookupContainer("Wheel0");
        System.out.println("Dopo lookup " +cont);
        Iterator itr = cont.scan("Bakelite","id ==" +id);
                while (itr.hasMoreElements()) {
                        Bakelite bak = (Bakelite) itr.nextElement();
                        System.out.println(bak.getid() + " " + bak.getcodice() + "  " + bak.getdato1());
                        bak.setAttrs(r);
                }
               session.commit();
    }

  public static void main(String[] args) {
    if (System.getSecurityManager() == null) {
      System.setSecurityManager(new RMISecurityManager());
    }
    try {
        Server2 engine1 = new Server2();
        Naming.rebind("Compute32",engine1);
        System.out.println("Server ready");
         while(true) {
		try {
		    Thread.sleep(5000);
		} catch (InterruptedException e) {}
	    }

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