<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<title>Source code</title>
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
</head>
<body>
<div class="sourceContainer">
<pre><span class="sourceLineNo">001</span>/*<a name="line.1"></a>
<span class="sourceLineNo">002</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
<span class="sourceLineNo">003</span> * or more contributor license agreements.  See the NOTICE file<a name="line.3"></a>
<span class="sourceLineNo">004</span> * distributed with this work for additional information<a name="line.4"></a>
<span class="sourceLineNo">005</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.5"></a>
<span class="sourceLineNo">006</span> * to you under the Apache License, Version 2.0 (the<a name="line.6"></a>
<span class="sourceLineNo">007</span> * "License"); you may not use this file except in compliance<a name="line.7"></a>
<span class="sourceLineNo">008</span> * with the License.  You may obtain a copy of the License at<a name="line.8"></a>
<span class="sourceLineNo">009</span> *<a name="line.9"></a>
<span class="sourceLineNo">010</span> *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.10"></a>
<span class="sourceLineNo">011</span> *<a name="line.11"></a>
<span class="sourceLineNo">012</span> * Unless required by applicable law or agreed to in writing,<a name="line.12"></a>
<span class="sourceLineNo">013</span> * software distributed under the License is distributed on an<a name="line.13"></a>
<span class="sourceLineNo">014</span> * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY<a name="line.14"></a>
<span class="sourceLineNo">015</span> * KIND, either express or implied.  See the License for the<a name="line.15"></a>
<span class="sourceLineNo">016</span> * specific language governing permissions and limitations<a name="line.16"></a>
<span class="sourceLineNo">017</span> * under the License.<a name="line.17"></a>
<span class="sourceLineNo">018</span> */<a name="line.18"></a>
<span class="sourceLineNo">019</span>package org.apache.shiro.concurrent;<a name="line.19"></a>
<span class="sourceLineNo">020</span><a name="line.20"></a>
<span class="sourceLineNo">021</span>import org.apache.shiro.SecurityUtils;<a name="line.21"></a>
<span class="sourceLineNo">022</span>import org.apache.shiro.subject.Subject;<a name="line.22"></a>
<span class="sourceLineNo">023</span><a name="line.23"></a>
<span class="sourceLineNo">024</span>import java.util.concurrent.Executor;<a name="line.24"></a>
<span class="sourceLineNo">025</span><a name="line.25"></a>
<span class="sourceLineNo">026</span>/**<a name="line.26"></a>
<span class="sourceLineNo">027</span> * {@code Executor} implementation that will automatically first associate any argument<a name="line.27"></a>
<span class="sourceLineNo">028</span> * {@link Runnable} instances with the currently available {@link Subject} and then<a name="line.28"></a>
<span class="sourceLineNo">029</span> * dispatch the Subject-enabled runnable to an underlying delegate {@link Executor}<a name="line.29"></a>
<span class="sourceLineNo">030</span> * instance.<a name="line.30"></a>
<span class="sourceLineNo">031</span> * &lt;p/&gt;<a name="line.31"></a>
<span class="sourceLineNo">032</span> * This is a simplification for applications that want to execute code as the currently<a name="line.32"></a>
<span class="sourceLineNo">033</span> * executing {@code Subject} on another thread, but don't want or need to call the<a name="line.33"></a>
<span class="sourceLineNo">034</span> * {@link Subject#associateWith(Runnable)} method and dispatch to a Thread manually.  This<a name="line.34"></a>
<span class="sourceLineNo">035</span> * simplifies code and reduces Shiro dependencies across application source code.<a name="line.35"></a>
<span class="sourceLineNo">036</span> * &lt;p/&gt;<a name="line.36"></a>
<span class="sourceLineNo">037</span> * Consider this code that could be repeated in many places across an application:<a name="line.37"></a>
<span class="sourceLineNo">038</span> * &lt;pre&gt;<a name="line.38"></a>
<span class="sourceLineNo">039</span> * {@link Runnable Runnable} applicationWork = //instantiate or acquire Runnable from somewhere<a name="line.39"></a>
<span class="sourceLineNo">040</span> * {@link Subject Subject} subject = {@link SecurityUtils SecurityUtils}.{@link SecurityUtils#getSubject() getSubject()};<a name="line.40"></a>
<span class="sourceLineNo">041</span> * {@link Runnable Runnable} work = subject.{@link Subject#associateWith(Runnable) associateWith(applicationWork)};<a name="line.41"></a>
<span class="sourceLineNo">042</span> * {@link Executor anExecutor}.{@link Executor#execute(Runnable) execute(work)};<a name="line.42"></a>
<span class="sourceLineNo">043</span> * &lt;/pre&gt;<a name="line.43"></a>
<span class="sourceLineNo">044</span> * Instead, if the {@code Executor} instance used in application code is an instance of this class (which delegates<a name="line.44"></a>
<span class="sourceLineNo">045</span> * to the target Executor that you want), all places in code like the above reduce to this:<a name="line.45"></a>
<span class="sourceLineNo">046</span> * &lt;pre&gt;<a name="line.46"></a>
<span class="sourceLineNo">047</span> * {@link Runnable Runnable} applicationWork = //instantiate or acquire Runnable from somewhere<a name="line.47"></a>
<span class="sourceLineNo">048</span> * {@link Executor anExecutor}.{@link Executor#execute(Runnable) execute(work)};<a name="line.48"></a>
<span class="sourceLineNo">049</span> * &lt;/pre&gt;<a name="line.49"></a>
<span class="sourceLineNo">050</span> * Notice there is no use of the Shiro API in the 2nd code block, encouraging the principle of loose coupling across<a name="line.50"></a>
<span class="sourceLineNo">051</span> * your codebase.<a name="line.51"></a>
<span class="sourceLineNo">052</span> *<a name="line.52"></a>
<span class="sourceLineNo">053</span> * @see SubjectAwareExecutorService<a name="line.53"></a>
<span class="sourceLineNo">054</span> * @since 1.0<a name="line.54"></a>
<span class="sourceLineNo">055</span> */<a name="line.55"></a>
<span class="sourceLineNo">056</span>public class SubjectAwareExecutor implements Executor {<a name="line.56"></a>
<span class="sourceLineNo">057</span><a name="line.57"></a>
<span class="sourceLineNo">058</span>    /**<a name="line.58"></a>
<span class="sourceLineNo">059</span>     * The target Executor instance that will actually execute the subject-associated Runnable instances.<a name="line.59"></a>
<span class="sourceLineNo">060</span>     */<a name="line.60"></a>
<span class="sourceLineNo">061</span>    private Executor targetExecutor;<a name="line.61"></a>
<span class="sourceLineNo">062</span><a name="line.62"></a>
<span class="sourceLineNo">063</span>    public SubjectAwareExecutor() {<a name="line.63"></a>
<span class="sourceLineNo">064</span>    }<a name="line.64"></a>
<span class="sourceLineNo">065</span><a name="line.65"></a>
<span class="sourceLineNo">066</span>    public SubjectAwareExecutor(Executor targetExecutor) {<a name="line.66"></a>
<span class="sourceLineNo">067</span>        if (targetExecutor == null) {<a name="line.67"></a>
<span class="sourceLineNo">068</span>            throw new NullPointerException("target Executor instance cannot be null.");<a name="line.68"></a>
<span class="sourceLineNo">069</span>        }<a name="line.69"></a>
<span class="sourceLineNo">070</span>        this.targetExecutor = targetExecutor;<a name="line.70"></a>
<span class="sourceLineNo">071</span>    }<a name="line.71"></a>
<span class="sourceLineNo">072</span><a name="line.72"></a>
<span class="sourceLineNo">073</span>    /**<a name="line.73"></a>
<span class="sourceLineNo">074</span>     * Returns the target Executor instance that will actually execute the subject-associated Runnable instances.<a name="line.74"></a>
<span class="sourceLineNo">075</span>     *<a name="line.75"></a>
<span class="sourceLineNo">076</span>     * @return target Executor instance that will actually execute the subject-associated Runnable instances.<a name="line.76"></a>
<span class="sourceLineNo">077</span>     */<a name="line.77"></a>
<span class="sourceLineNo">078</span>    public Executor getTargetExecutor() {<a name="line.78"></a>
<span class="sourceLineNo">079</span>        return targetExecutor;<a name="line.79"></a>
<span class="sourceLineNo">080</span>    }<a name="line.80"></a>
<span class="sourceLineNo">081</span><a name="line.81"></a>
<span class="sourceLineNo">082</span>    /**<a name="line.82"></a>
<span class="sourceLineNo">083</span>     * Sets target Executor instance that will actually execute the subject-associated Runnable instances.<a name="line.83"></a>
<span class="sourceLineNo">084</span>     *<a name="line.84"></a>
<span class="sourceLineNo">085</span>     * @param targetExecutor the target Executor instance that will actually execute the subject-associated Runnable<a name="line.85"></a>
<span class="sourceLineNo">086</span>     *                       instances.<a name="line.86"></a>
<span class="sourceLineNo">087</span>     */<a name="line.87"></a>
<span class="sourceLineNo">088</span>    public void setTargetExecutor(Executor targetExecutor) {<a name="line.88"></a>
<span class="sourceLineNo">089</span>        this.targetExecutor = targetExecutor;<a name="line.89"></a>
<span class="sourceLineNo">090</span>    }<a name="line.90"></a>
<span class="sourceLineNo">091</span><a name="line.91"></a>
<span class="sourceLineNo">092</span>    /**<a name="line.92"></a>
<span class="sourceLineNo">093</span>     * Returns the currently Subject instance that should be associated with Runnable or Callable instances before<a name="line.93"></a>
<span class="sourceLineNo">094</span>     * being dispatched to the target {@code Executor} instance.  This implementation merely defaults to returning<a name="line.94"></a>
<span class="sourceLineNo">095</span>     * {@code SecurityUtils}.{@link SecurityUtils#getSubject() getSubject()}.<a name="line.95"></a>
<span class="sourceLineNo">096</span>     *<a name="line.96"></a>
<span class="sourceLineNo">097</span>     * @return the currently Subject instance that should be associated with Runnable or Callable instances before<a name="line.97"></a>
<span class="sourceLineNo">098</span>     *         being dispatched to the target {@code Executor} instance.<a name="line.98"></a>
<span class="sourceLineNo">099</span>     */<a name="line.99"></a>
<span class="sourceLineNo">100</span>    protected Subject getSubject() {<a name="line.100"></a>
<span class="sourceLineNo">101</span>        return SecurityUtils.getSubject();<a name="line.101"></a>
<span class="sourceLineNo">102</span>    }<a name="line.102"></a>
<span class="sourceLineNo">103</span><a name="line.103"></a>
<span class="sourceLineNo">104</span>    /**<a name="line.104"></a>
<span class="sourceLineNo">105</span>     * Utility method for subclasses to associate the argument {@code Runnable} with the currently executing subject<a name="line.105"></a>
<span class="sourceLineNo">106</span>     * and then return the associated Runnable.  The default implementation merely defaults to<a name="line.106"></a>
<span class="sourceLineNo">107</span>     * &lt;pre&gt;<a name="line.107"></a>
<span class="sourceLineNo">108</span>     * Subject subject = {@link #getSubject() getSubject()};<a name="line.108"></a>
<span class="sourceLineNo">109</span>     * return subject.{@link Subject#associateWith(Runnable) associateWith(r)};<a name="line.109"></a>
<span class="sourceLineNo">110</span>     * &lt;/pre&gt;<a name="line.110"></a>
<span class="sourceLineNo">111</span>     *<a name="line.111"></a>
<span class="sourceLineNo">112</span>     * @param r the argument runnable to be associated with the current subject<a name="line.112"></a>
<span class="sourceLineNo">113</span>     * @return the associated runnable instance reflecting the current subject<a name="line.113"></a>
<span class="sourceLineNo">114</span>     */<a name="line.114"></a>
<span class="sourceLineNo">115</span>    protected Runnable associateWithSubject(Runnable r) {<a name="line.115"></a>
<span class="sourceLineNo">116</span>        Subject subject = getSubject();<a name="line.116"></a>
<span class="sourceLineNo">117</span>        return subject.associateWith(r);<a name="line.117"></a>
<span class="sourceLineNo">118</span>    }<a name="line.118"></a>
<span class="sourceLineNo">119</span><a name="line.119"></a>
<span class="sourceLineNo">120</span>    /**<a name="line.120"></a>
<span class="sourceLineNo">121</span>     * Executes the specified runnable by first associating it with the currently executing {@code Subject} and then<a name="line.121"></a>
<span class="sourceLineNo">122</span>     * dispatches the associated Runnable to the underlying target {@link Executor} instance.<a name="line.122"></a>
<span class="sourceLineNo">123</span>     *<a name="line.123"></a>
<span class="sourceLineNo">124</span>     * @param command the runnable to associate with the currently executing subject and then to execute via the target<a name="line.124"></a>
<span class="sourceLineNo">125</span>     *                {@code Executor} instance.<a name="line.125"></a>
<span class="sourceLineNo">126</span>     */<a name="line.126"></a>
<span class="sourceLineNo">127</span>    public void execute(Runnable command) {<a name="line.127"></a>
<span class="sourceLineNo">128</span>        Runnable associated = associateWithSubject(command);<a name="line.128"></a>
<span class="sourceLineNo">129</span>        getTargetExecutor().execute(associated);<a name="line.129"></a>
<span class="sourceLineNo">130</span>    }<a name="line.130"></a>
<span class="sourceLineNo">131</span>}<a name="line.131"></a>




























































</pre>
</div>
</body>
</html>

