
import com.objy.db.*;
import com.objy.db.app.*;
import java.util.Date;
import java.util.Enumeration;
import java.util.Properties;
import java.io.*;

public class FillDetector {
    Connection conn;
    Session session;
    ooFDObj fd;
    ooDBObj db;

    public static void main (String args[]) {
	(new FillDetector()).go(args);
    }

    void go(String[] args) {
	try {
	    conn = Connection.open ("RPC", oo.openReadWrite);
	    System.out.println ("Connection to RPC-database opened");
	    session  = new Session();
	    session.begin();
	    conn.getSchemaPolicy().setChangeClassAllowed(false);
	    conn.getSchemaPolicy().setFieldAccessControlEnforced(false);
	    conn.setSchemaClassName("Bakelite","Bakelite");
	    conn.getSchemaPolicy().setFieldAccessControlEnforced(false);
	    
	    checkDB("RPCdata");
	    checkCont();
	    if (checkBakelite())
		System.out.println("Bakelite plates objects already exist");
	    else {
		System.out.print("Adding Bakelite plates objects ...");
		addBakelite();
		System.out.println(" done");
		session.checkpoint();
	    }


	    session.commit();
	    session.terminate();
	    conn.close();
	} catch (DatabaseNotFoundException exception) {
	    System.out.println("Federated database \"Detector\" not found.");
	} catch (Exception e) {
	    System.out.println("Exception in FillDetector: " + e.getMessage());
	    e.printStackTrace();
	}
    }
  
    void checkDB(String db_name) {
	/* check if the CMS database exists, otherwise create it */
	fd = session.getFD();
	if (fd.hasDB(db_name)) {
	    System.out.println("Database " + db_name + " exists");
	    db = fd.lookupDB(db_name);
	} else {
	    db = fd.newDB(db_name);
	    System.out.println("Database " + db_name + " created");
	}
    }

    void checkCont() {
	/* check if the Wheel<-2..2> containers exist, otherwise create them */
	for (int i=2; i<3; i++) {
	    String contName = "Wheel" + (i-2 <= 0 ?
					 String.valueOf(i-2) :
					 "+" + String.valueOf(i-2));
	    if (db.hasContainer(contName)) {
		System.out.println(contName + " container exists");
	    } else {
		Wheel cont = new Wheel();
		db.addContainer(cont, contName, 0, 500, 20);
		System.out.println(contName + " container created");
	    }
	}
    }

    boolean checkBakelite() {
	/* check if there are some bakelite plates around */
	Iterator itr = db.scan ("Bakelite");
	return itr.hasMoreElements();
    }

    void addBakelite() {
	/* add some random chambers to the Detector database */
	for (int i=2; i<3; i++) {
	    String contName = "Wheel" + (i-2 <= 0 ?
					 String.valueOf(i-2) :
					 "+" + String.valueOf(i-2));
	    Wheel cont = (Wheel)db.lookupContainer(contName);
	/*    for (int j=0; j<4; j++) {
		String mb_type = "MB" + String.valueOf(j%4+1); */
		for (int k = 0; k < 10000; k++) {
		    Bakelite c = new Bakelite (k,"Codicexx",Math.random()*10000,
						Math.random()*10000,
						Math.random()*10000);
		    cont.cluster(c);
		}
	   }
    }
 }
