/*
*/
import java.lang.*;
import java.net.*;
import java.util.*;
import java.lang.reflect.*;
import java.io.*;

/**
 *
 * @author Daniel Ockeloen
 */
public class JPEProcess implements Runnable {

 
	Thread kicker = null;
	JPE jpe;
	String filename,params;

	public JPEProcess(JPE jpe,String filename,String params) {
		this.jpe=jpe;
		this.filename=filename;
		this.params=params;
		init();
	}

	public void init() {
		this.start();	
	}


	/**
	 * Starts the admin Thread.
	 */
	public void start() {
		/* Start up the main thread */
		if (kicker == null) {
			kicker = new Thread(this,"JPEProcess");
			kicker.start();
		}
	}
	
	public void run() {
		try {
			doWork();
		} catch(Exception e) {
			e.printStackTrace();
		}
	}

	public void doWork() {
				JPEClassloader loader=new JPEClassloader();

		String argv[];
		if (params.equals("")) {
			argv = new String[0];
		} else {
			// build up a vector of the params
			StringTokenizer tok=new StringTokenizer(params," \n\r");
			Vector pr=new Vector();
			while (tok.hasMoreTokens()) {
				pr.addElement(tok.nextToken());
			} 
			argv = new String[pr.size()];
			int i=0;
			for (i=0;i<pr.size();i++) {
				argv[i] = (String)pr.elementAt(i);
			}
		}

		Class newclass=loader.loadClass(filename,true);
		Method mets[]=newclass.getMethods();
		for (int i=0;i<mets.length;i++) {
			Method met=mets[i];
			if (met.getName().equals("main")) {
				try {
					Object obs[] = new Object[1];
					obs[0]=argv;
					jpe.say("Run called on : "+filename);
					met.invoke(null,obs);
					jpe.say("Run finished : "+filename);
					return;
				} catch(Exception e) {
					e.printStackTrace();
					jpe.say("A runtime error has happened (crtl-h for error)");
					met=null;
					return;
				}
			}
		}
		jpe.say("Can't find main(argv[]) sure its a java application ?");
	}
}
