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 {
14 private final C context;
15 private final Runnable delegate;
16 private final ThreadLocalContextManager<C> manager;
17 private final ClassLoader contextClassLoader;
18
19
20
21
22
23 ThreadLocalDelegateRunnable(ThreadLocalContextManager<C> manager, Runnable delegate)
24 {
25 this.delegate = checkNotNull(delegate);
26 this.manager = checkNotNull(manager);
27 this.context = manager.getThreadLocalContext();
28 this.contextClassLoader = Thread.currentThread().getContextClassLoader();
29 }
30
31 public void run()
32 {
33 ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader();
34 try
35 {
36 Thread.currentThread().setContextClassLoader(contextClassLoader);
37 manager.setThreadLocalContext(context);
38 delegate.run();
39 }
40 finally
41 {
42 Thread.currentThread().setContextClassLoader(oldContextClassLoader);
43 manager.clearThreadLocalContext();
44 }
45 }
46 }