1 package com.atlassian.sal.core.executor;
2
3 import com.atlassian.sal.api.executor.ThreadLocalContextManager;
4
5 import static com.google.common.base.Preconditions.checkNotNull;
6
7
8
9
10
11
12 class ThreadLocalDelegateRunnable<C> implements Runnable {
13 private final C context;
14 private final Runnable delegate;
15 private final ThreadLocalContextManager<C> manager;
16 private final ClassLoader contextClassLoader;
17
18
19
20
21
22 ThreadLocalDelegateRunnable(ThreadLocalContextManager<C> manager, Runnable delegate) {
23 this.delegate = checkNotNull(delegate);
24 this.manager = checkNotNull(manager);
25 this.context = manager.getThreadLocalContext();
26 this.contextClassLoader = Thread.currentThread().getContextClassLoader();
27 }
28
29 public void run() {
30 ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader();
31 try {
32 Thread.currentThread().setContextClassLoader(contextClassLoader);
33 manager.setThreadLocalContext(context);
34 delegate.run();
35 } finally {
36 Thread.currentThread().setContextClassLoader(oldContextClassLoader);
37 manager.clearThreadLocalContext();
38 }
39 }
40 }