Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: edu/emory/mathcs/util/concurrent/DelegatedRunnable.java


1   /* ***** BEGIN LICENSE BLOCK *****
2    * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3    *
4    * The contents of this file are subject to the Mozilla Public License Version
5    * 1.1 (the "License"); you may not use this file except in compliance with
6    * the License. You may obtain a copy of the License at
7    * http://www.mozilla.org/MPL/
8    *
9    * Software distributed under the License is distributed on an "AS IS" basis,
10   * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11   * for the specific language governing rights and limitations under the
12   * License.
13   *
14   * The Original Code is the Emory Utilities.
15   *
16   * The Initial Developer of the Original Code is
17   * The Distributed Computing Laboratory, Emory University.
18   * Portions created by the Initial Developer are Copyright (C) 2002
19   * the Initial Developer. All Rights Reserved.
20   *
21   * Alternatively, the contents of this file may be used under the terms of
22   * either the GNU General Public License Version 2 or later (the "GPL"), or
23   * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
24   * in which case the provisions of the GPL or the LGPL are applicable instead
25   * of those above. If you wish to allow use of your version of this file only
26   * under the terms of either the GPL or the LGPL, and not to allow others to
27   * use your version of this file under the terms of the MPL, indicate your
28   * decision by deleting the provisions above and replace them with the notice
29   * and other provisions required by the GPL or the LGPL. If you do not delete
30   * the provisions above, a recipient may use your version of this file under
31   * the terms of any one of the MPL, the GPL or the LGPL.
32   *
33   * ***** END LICENSE BLOCK ***** */
34  
35  package edu.emory.mathcs.util.concurrent;
36  
37  import java.security.*;
38  
39  /**
40   * Wrapper for a runnable that ensures that further executions
41   * (even if performed by different threads) inherit current access control
42   * context and {@link ThreadContext}. In particular, the task will always
43   * run with the same access permissions,
44   * {@link DelegatableThreadLocal delegatable thread locals},
45   * and context class loader, determined
46   * at the time of creation of this DelegatedRunnable.
47   *
48   * @author Dawid Kurzyniec
49   * @version 1.0
50   */
51  public class DelegatedRunnable implements Runnable {
52      final Runnable runnable;
53      final AccessControlContext acc;
54      final ThreadContext tc;
55  
56      /**
57       * Construct new DelegatedRunnable wrapper for a given task.
58       * @param runnable the task to wrap
59       */
60      public DelegatedRunnable(Runnable runnable) {
61          this.runnable = runnable;
62          this.acc = AccessController.getContext();
63          this.tc = ThreadContext.getContext();
64      }
65  
66      /**
67       * Execute wrapped runnable within access control
68       * context and {@link ThreadContext} associated to this object at
69       * the creation time. In particular, the task will run with the same
70       * access permissions,
71       * {@link DelegatableThreadLocal delegatable thread locals},
72       * and context class loader, as seen when this object was created.
73       */
74      public void run() {
75          AccessController.doPrivileged(new PrivilegedAction() {
76              public Object run() {
77                  tc.perform(runnable);
78                  return null;
79              }
80          }, acc);
81      }
82  }