// Path: src/main/java/net/datenwerke/sandbox/SandboxedCallResult.java
// public interface SandboxedCallResult<V> extends Serializable {
// 	
// 	/**
// 	 * Returns the raw object 
// 	 * 
// 	 * @return
// 	 */
// 	Object getRaw();
// 	
// 	/**
// 	 * Returns the object in the scope of the classloader that has loaded this instance
// 	 * of {@link SandboxedCallResult}
// 	 * 
// 	 * @return
// 	 */
// 	V get();
// 	
// 	/**
// 	 * Returns the object in the scope of the given classloader.
// 	 * 
// 	 * @param  loader
// 	 * @return
// 	 */
// 	Object get(ClassLoader loader);
// 	
// 	/**
// 	 * Returns the wrapped object in the scope of the classloader that has loaded object obj.
// 	 * 
// 	 * @param obj
// 	 * @return
// 	 */
// 	Object get(Object obj);
// 
// 	
// }
// 
// Path: src/main/java/net/datenwerke/sandbox/SandboxedCallResultImpl.java
// public class SandboxedCallResultImpl<V> implements SandboxedCallResult<V> {
// 	
// 	/**
// 	 * 
// 	 */
// 	private static final long serialVersionUID = 2221868658839523140L;
// 	
// 	/**
// 	 * 
// 	 */
// 	public final Object raw;
// 	
// 	public SandboxedCallResultImpl(Object raw) {
// 		this.raw = raw;
// 	}
// 	
// 	@Override
// 	public Object getRaw() {
// 		return raw;
// 	}
// 	
// 	@Override
// 	public V get(){
// 		return (V) get(getClass().getClassLoader());
// 	}
// 	
// 	@Override
// 	public Object get(Object obj){
// 		return get(obj.getClass().getClassLoader());
// 	}
// 	
// 	@Override
// 	public Object get(ClassLoader loader){
// 		return SandboxServiceImpl.getInstance().bridge(raw, null != loader ? loader : ClassLoader.getSystemClassLoader());
// 	}
// 
// 	
// }
// 
// Path: src/main/java/net/datenwerke/sandbox/jvm/exceptions/JvmKilledUnsafeThreadException.java
// public class JvmKilledUnsafeThreadException extends RemoteException {
// 
// 	/**
// 	 * 
// 	 */
// 	private static final long serialVersionUID = -5420515201162587892L;
// 
// 
// 
// }
// 
// Path: src/main/java/net/datenwerke/sandbox/jvm/exceptions/JvmPoolInstantiationException.java
// public class JvmPoolInstantiationException extends RuntimeException {
// 
// 	/**
// 	 * 
// 	 */
// 	private static final long serialVersionUID = 1764438816801841440L;
// 
// 	public JvmPoolInstantiationException(Throwable e) {
// 		super(e);
// 	}
// }
// 
// Path: src/main/java/net/datenwerke/sandbox/jvm/exceptions/JvmServerDeadException.java
// public class JvmServerDeadException extends Exception {
// 
// 	/**
// 	 * 
// 	 */
// 	private static final long serialVersionUID = -8222817806431025268L;
// 
// 	
// 	public JvmServerDeadException(Throwable e){
// 		super(e);
// 	}
// }


import java.util.logging.Logger;
import net.datenwerke.sandbox.SandboxedCallResult;
import net.datenwerke.sandbox.SandboxedCallResultImpl;
import net.datenwerke.sandbox.jvm.exceptions.JvmKilledUnsafeThreadException;
import net.datenwerke.sandbox.jvm.exceptions.JvmPoolInstantiationException;
import net.datenwerke.sandbox.jvm.exceptions.JvmServerDeadException;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
		public boolean isShutdown() {
			return shutdown;
		}

		public void restartJvm() {
			/* kill jvm */
			jvm.destroy();
			
			/* create new jvm */
			jvm = jvmConfig.getInstantiator().spawnJvm();
		}
		
		@Override
		public void run() {
			while(! shutdown){
				try {
					JvmFuture future = workQueue.take();
					
					if(null != future){
						try{
							JvmTask task = future.getTask();
							SandboxedCallResult result;
							if(null == task)
								result = new SandboxedCallResultImpl(null);
							else 
								result = jvm.execute(task);
							if(null == result)
								 result = new SandboxedCallResultImpl(null);
							
							future.setResult(result);
// Path: src/main/java/net/datenwerke/sandbox/SandboxedCallResult.java
// public interface SandboxedCallResult<V> extends Serializable {
// 	
// 	/**
// 	 * Returns the raw object 
// 	 * 
// 	 * @return
// 	 */
// 	Object getRaw();
// 	
// 	/**
// 	 * Returns the object in the scope of the classloader that has loaded this instance
// 	 * of {@link SandboxedCallResult}
// 	 * 
// 	 * @return
// 	 */
// 	V get();
// 	
// 	/**
// 	 * Returns the object in the scope of the given classloader.
// 	 * 
// 	 * @param  loader
// 	 * @return
// 	 */
// 	Object get(ClassLoader loader);
// 	
// 	/**
// 	 * Returns the wrapped object in the scope of the classloader that has loaded object obj.
// 	 * 
// 	 * @param obj
// 	 * @return
// 	 */
// 	Object get(Object obj);
// 
// 	
// }
// 
// Path: src/main/java/net/datenwerke/sandbox/SandboxedCallResultImpl.java
// public class SandboxedCallResultImpl<V> implements SandboxedCallResult<V> {
// 	
// 	/**
// 	 * 
// 	 */
// 	private static final long serialVersionUID = 2221868658839523140L;
// 	
// 	/**
// 	 * 
// 	 */
// 	public final Object raw;
// 	
// 	public SandboxedCallResultImpl(Object raw) {
// 		this.raw = raw;
// 	}
// 	
// 	@Override
// 	public Object getRaw() {
// 		return raw;
// 	}
// 	
// 	@Override
// 	public V get(){
// 		return (V) get(getClass().getClassLoader());
// 	}
// 	
// 	@Override
// 	public Object get(Object obj){
// 		return get(obj.getClass().getClassLoader());
// 	}
// 	
// 	@Override
// 	public Object get(ClassLoader loader){
// 		return SandboxServiceImpl.getInstance().bridge(raw, null != loader ? loader : ClassLoader.getSystemClassLoader());
// 	}
// 
// 	
// }
// 
// Path: src/main/java/net/datenwerke/sandbox/jvm/exceptions/JvmKilledUnsafeThreadException.java
// public class JvmKilledUnsafeThreadException extends RemoteException {
// 
// 	/**
// 	 * 
// 	 */
// 	private static final long serialVersionUID = -5420515201162587892L;
// 
// 
// 
// }
// 
// Path: src/main/java/net/datenwerke/sandbox/jvm/exceptions/JvmPoolInstantiationException.java
// public class JvmPoolInstantiationException extends RuntimeException {
// 
// 	/**
// 	 * 
// 	 */
// 	private static final long serialVersionUID = 1764438816801841440L;
// 
// 	public JvmPoolInstantiationException(Throwable e) {
// 		super(e);
// 	}
// }
// 
// Path: src/main/java/net/datenwerke/sandbox/jvm/exceptions/JvmServerDeadException.java
// public class JvmServerDeadException extends Exception {
// 
// 	/**
// 	 * 
// 	 */
// 	private static final long serialVersionUID = -8222817806431025268L;
// 
// 	
// 	public JvmServerDeadException(Throwable e){
// 		super(e);
// 	}
// }


// Path: src/main/java/net/datenwerke/sandbox/jvm/JvmPoolImpl.java
import java.util.logging.Logger;
import net.datenwerke.sandbox.SandboxedCallResult;
import net.datenwerke.sandbox.SandboxedCallResultImpl;
import net.datenwerke.sandbox.jvm.exceptions.JvmKilledUnsafeThreadException;
import net.datenwerke.sandbox.jvm.exceptions.JvmPoolInstantiationException;
import net.datenwerke.sandbox.jvm.exceptions.JvmServerDeadException;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;

		public boolean isShutdown() {
			return shutdown;
		}

		public void restartJvm() {
			/* kill jvm */
			jvm.destroy();
			
			/* create new jvm */
			jvm = jvmConfig.getInstantiator().spawnJvm();
		}
		
		@Override
		public void run() {
			while(! shutdown){
				try {
					JvmFuture future = workQueue.take();
					
					if(null != future){
						try{
							JvmTask task = future.getTask();
							SandboxedCallResult result;
							if(null == task)
								result = new SandboxedCallResultImpl(null);
							else 
								result = jvm.execute(task);
							if(null == result)
								 result = new SandboxedCallResultImpl(null);
							
							future.setResult(result);
						} catch(JvmServerDeadException e){