// Path: src/main/java/net/datenwerke/sandbox/jvm/exceptions/JvmInstantiatonException.java
// public class JvmInstantiatonException extends RuntimeException {
// 
// 	/**
// 	 * 
// 	 */
// 	private static final long serialVersionUID = 4366122700205470989L;
// 
// 	public JvmInstantiatonException(){
// 		super();
// 	}
// 	
// 	public JvmInstantiatonException(Throwable e) {
// 		super(e);
// 	}
// 
// }
// 
// Path: src/main/java/net/datenwerke/sandbox/jvm/server/SandboxJvmServer.java
// public class SandboxJvmServer extends UnicastRemoteObject implements SandboxRemoteServer {
// 
// 	/**
// 	 * 
// 	 */
// 	private static final long serialVersionUID = 3625471545043099538L;
// 	
// 	private final Logger logger = Logger.getLogger(getClass().getName());
// 	
// 	private final  String name;
// 
// 	private SandboxContext context;
// 
// 	private SandboxLoader classloader;
// 
// 	public SandboxJvmServer(String namePrefix)  throws RemoteException {
// 		this.name = NAME + namePrefix;
// 		
// 		logger.log(Level.INFO, "started sandbox server: " + getName());
// 	}
// 	
// 	@Override
// 	public String getName() {
// 		return name;
// 	}
// 	
// 	@Override
// 	public boolean isAlive() {
// 		return true;
// 	}
// 	
// 	@Override
// 	public SandboxedCallResult execute(JvmTask task) throws RemoteException {
// 		try {
// 			return task.call();
// 		} catch(JvmKilledUnsafeThreadRuntimeException e){
// 			throw new JvmKilledUnsafeThreadException();
// 		} catch (Exception e) {
// 			throw new RemoteException(e.getMessage(), e);
// 		}
// 	}
// 	
// 	@Override
// 	public void destroy() {
// 		System.exit(0);
// 	}
// 	
// 	@Override
// 	public void init(SandboxContext context) throws RemoteException {
// 		if(null != this.context)
// 			throw new JvmInitializedTwiceException();
// 		
// 		this.context = context;
// 		this.classloader = SandboxServiceImpl.getInstance().initClassLoader(context);
// 	}
// 	
// 	@Override
// 	public void reset() throws RemoteException {
// 		this.context = null;
// 		this.classloader = null;
// 	}
// 	
// 	@Override
// 	public SandboxedCallResult runInContext(
// 			Class<? extends SandboxedEnvironment> call, Object... args) throws RemoteException {
// 		if(null == context)
// 			throw new JvmNotInitializedException();
// 		
// 		try{
// 			return SandboxServiceImpl.getInstance().runInContext(call, context, classloader, args);
// 		} catch(JvmKilledUnsafeThreadRuntimeException e){
// 			throw new JvmKilledUnsafeThreadException();
// 		}
// 	}
// 	
// 	@Override
// 	public SandboxedCallResult runSandboxed(
// 			Class<? extends SandboxedEnvironment> call, Object... args) throws RemoteException {
// 		if(null == context)
// 			throw new JvmNotInitializedException();
// 		
// 		try{
// 			return SandboxServiceImpl.getInstance().runSandboxed(call, context, classloader, args);
// 		} catch(JvmKilledUnsafeThreadRuntimeException e){
// 			throw new JvmKilledUnsafeThreadException();
// 		}
// 	}
// 	
// 	@Override
// 	public void registerContext(String name, SandboxContext context)
// 			throws RemoteException {
// 		 SandboxServiceImpl.getInstance().registerContext(name, context);
// 	}
// 
// 	public static void main(String[] args) {
// 		if(args.length < 2)
// 			System.exit(-1);
// 		
// 		String namePrefix = args[0];
// 		String host = "localhost";
// 		int port = Integer.parseInt(args[1]);
// 		try {
// 			SandboxJvmServer server = new SandboxJvmServer(namePrefix);
// 			
// 			new SandboxRemoteServiceImpl();
// 			
// 			LocateRegistry.createRegistry(port);
// 			Naming.rebind("//" + host + ":" + port + "/" + server.getName(), server);
// 		} catch (Exception e) {
// 			e.printStackTrace();
// 			System.exit(-1);
// 		}
// 	}
// 
// 	
// 
// 	
// }


import net.datenwerke.sandbox.jvm.server.SandboxJvmServer;
import java.io.IOException;
import java.lang.ProcessBuilder.Redirect;
import java.net.ServerSocket;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.datenwerke.sandbox.jvm.exceptions.JvmInstantiatonException;
	public Jvm spawnJvm() {
		String separator = System.getProperty("file.separator");
		String classpath = System.getProperty("java.class.path");
		String path = System.getProperty("java.home")
	                + separator + "bin" + separator + "java";
		
		String namePrefix = initNamePrefix();
		int portNumber = initPortNumber(0);
		
		ProcessBuilder processBuilder = null;
		if(null != jvmArgs){
			processBuilder =
		                new ProcessBuilder(path, "-cp", 
		                classpath, jvmArgs, 
		                SandboxJvmServer.class.getName(),
		                namePrefix, String.valueOf(portNumber));
		} else {
			processBuilder =
	                new ProcessBuilder(path, "-cp", 
	                classpath, SandboxJvmServer.class.getName(),
	                namePrefix, String.valueOf(portNumber));
		}
		
		processBuilder.redirectError(Redirect.INHERIT);
		processBuilder.redirectOutput(Redirect.INHERIT);
		try {
			Process process = processBuilder.start();
			
			return new JvmImpl(namePrefix, portNumber, process);
		} catch (IOException e) {
// Path: src/main/java/net/datenwerke/sandbox/jvm/exceptions/JvmInstantiatonException.java
// public class JvmInstantiatonException extends RuntimeException {
// 
// 	/**
// 	 * 
// 	 */
// 	private static final long serialVersionUID = 4366122700205470989L;
// 
// 	public JvmInstantiatonException(){
// 		super();
// 	}
// 	
// 	public JvmInstantiatonException(Throwable e) {
// 		super(e);
// 	}
// 
// }
// 
// Path: src/main/java/net/datenwerke/sandbox/jvm/server/SandboxJvmServer.java
// public class SandboxJvmServer extends UnicastRemoteObject implements SandboxRemoteServer {
// 
// 	/**
// 	 * 
// 	 */
// 	private static final long serialVersionUID = 3625471545043099538L;
// 	
// 	private final Logger logger = Logger.getLogger(getClass().getName());
// 	
// 	private final  String name;
// 
// 	private SandboxContext context;
// 
// 	private SandboxLoader classloader;
// 
// 	public SandboxJvmServer(String namePrefix)  throws RemoteException {
// 		this.name = NAME + namePrefix;
// 		
// 		logger.log(Level.INFO, "started sandbox server: " + getName());
// 	}
// 	
// 	@Override
// 	public String getName() {
// 		return name;
// 	}
// 	
// 	@Override
// 	public boolean isAlive() {
// 		return true;
// 	}
// 	
// 	@Override
// 	public SandboxedCallResult execute(JvmTask task) throws RemoteException {
// 		try {
// 			return task.call();
// 		} catch(JvmKilledUnsafeThreadRuntimeException e){
// 			throw new JvmKilledUnsafeThreadException();
// 		} catch (Exception e) {
// 			throw new RemoteException(e.getMessage(), e);
// 		}
// 	}
// 	
// 	@Override
// 	public void destroy() {
// 		System.exit(0);
// 	}
// 	
// 	@Override
// 	public void init(SandboxContext context) throws RemoteException {
// 		if(null != this.context)
// 			throw new JvmInitializedTwiceException();
// 		
// 		this.context = context;
// 		this.classloader = SandboxServiceImpl.getInstance().initClassLoader(context);
// 	}
// 	
// 	@Override
// 	public void reset() throws RemoteException {
// 		this.context = null;
// 		this.classloader = null;
// 	}
// 	
// 	@Override
// 	public SandboxedCallResult runInContext(
// 			Class<? extends SandboxedEnvironment> call, Object... args) throws RemoteException {
// 		if(null == context)
// 			throw new JvmNotInitializedException();
// 		
// 		try{
// 			return SandboxServiceImpl.getInstance().runInContext(call, context, classloader, args);
// 		} catch(JvmKilledUnsafeThreadRuntimeException e){
// 			throw new JvmKilledUnsafeThreadException();
// 		}
// 	}
// 	
// 	@Override
// 	public SandboxedCallResult runSandboxed(
// 			Class<? extends SandboxedEnvironment> call, Object... args) throws RemoteException {
// 		if(null == context)
// 			throw new JvmNotInitializedException();
// 		
// 		try{
// 			return SandboxServiceImpl.getInstance().runSandboxed(call, context, classloader, args);
// 		} catch(JvmKilledUnsafeThreadRuntimeException e){
// 			throw new JvmKilledUnsafeThreadException();
// 		}
// 	}
// 	
// 	@Override
// 	public void registerContext(String name, SandboxContext context)
// 			throws RemoteException {
// 		 SandboxServiceImpl.getInstance().registerContext(name, context);
// 	}
// 
// 	public static void main(String[] args) {
// 		if(args.length < 2)
// 			System.exit(-1);
// 		
// 		String namePrefix = args[0];
// 		String host = "localhost";
// 		int port = Integer.parseInt(args[1]);
// 		try {
// 			SandboxJvmServer server = new SandboxJvmServer(namePrefix);
// 			
// 			new SandboxRemoteServiceImpl();
// 			
// 			LocateRegistry.createRegistry(port);
// 			Naming.rebind("//" + host + ":" + port + "/" + server.getName(), server);
// 		} catch (Exception e) {
// 			e.printStackTrace();
// 			System.exit(-1);
// 		}
// 	}
// 
// 	
// 
// 	
// }


// Path: src/main/java/net/datenwerke/sandbox/jvm/JvmInstantiatorImpl.java
import net.datenwerke.sandbox.jvm.server.SandboxJvmServer;
import java.io.IOException;
import java.lang.ProcessBuilder.Redirect;
import java.net.ServerSocket;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.datenwerke.sandbox.jvm.exceptions.JvmInstantiatonException;

	public Jvm spawnJvm() {
		String separator = System.getProperty("file.separator");
		String classpath = System.getProperty("java.class.path");
		String path = System.getProperty("java.home")
	                + separator + "bin" + separator + "java";
		
		String namePrefix = initNamePrefix();
		int portNumber = initPortNumber(0);
		
		ProcessBuilder processBuilder = null;
		if(null != jvmArgs){
			processBuilder =
		                new ProcessBuilder(path, "-cp", 
		                classpath, jvmArgs, 
		                SandboxJvmServer.class.getName(),
		                namePrefix, String.valueOf(portNumber));
		} else {
			processBuilder =
	                new ProcessBuilder(path, "-cp", 
	                classpath, SandboxJvmServer.class.getName(),
	                namePrefix, String.valueOf(portNumber));
		}
		
		processBuilder.redirectError(Redirect.INHERIT);
		processBuilder.redirectOutput(Redirect.INHERIT);
		try {
			Process process = processBuilder.start();
			
			return new JvmImpl(namePrefix, portNumber, process);
		} catch (IOException e) {
			throw new JvmInstantiatonException(e);