View Javadoc
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    * A delegating runnable that copies the thread local state into the executing thread.
9    *
10   * @since 2.0
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       * @param manager  The manager to get the context from
20       * @param delegate The runnable to delegate to
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  }