package jenkins.util; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; /** * {@link ExecutorService} wrapper that resets the context classloader. * * This protects an executor service from poorly written callable that doesn't restore * thread states correctly. * * @author Kohsuke Kawaguchi */ public class ContextResettingExecutorService extends InterceptingExecutorService { public ContextResettingExecutorService(ExecutorService base) { super(base); } @Override protected Runnable wrap(final Runnable r) { return new Runnable() { @Override public void run() { Thread t = Thread.currentThread(); String name = t.getName(); ClassLoader cl = t.getContextClassLoader(); try { r.run(); } finally { t.setName(name); t.setContextClassLoader(cl); } } }; } @Override protected <V> Callable<V> wrap(final Callable<V> r) { return new Callable<V>() { @Override public V call() throws Exception { Thread t = Thread.currentThread(); String name = t.getName(); ClassLoader cl = t.getContextClassLoader(); try { return r.call(); } finally { t.setName(name); t.setContextClassLoader(cl); } } }; } }