<HTML>
<BODY BGCOLOR="white">
<PRE>
<FONT color="green">001</FONT>    /*<a name="line.1"></a>
<FONT color="green">002</FONT>     * Licensed to the Apache Software Foundation (ASF) under one or more<a name="line.2"></a>
<FONT color="green">003</FONT>     * contributor license agreements. See the NOTICE file distributed with<a name="line.3"></a>
<FONT color="green">004</FONT>     * this work for additional information regarding copyright ownership.<a name="line.4"></a>
<FONT color="green">005</FONT>     * The ASF licenses this file to You under the Apache license, Version 2.0<a name="line.5"></a>
<FONT color="green">006</FONT>     * (the "License"); you may not use this file except in compliance with<a name="line.6"></a>
<FONT color="green">007</FONT>     * the License. You may obtain a copy of the License at<a name="line.7"></a>
<FONT color="green">008</FONT>     *<a name="line.8"></a>
<FONT color="green">009</FONT>     *      http://www.apache.org/licenses/LICENSE-2.0<a name="line.9"></a>
<FONT color="green">010</FONT>     *<a name="line.10"></a>
<FONT color="green">011</FONT>     * Unless required by applicable law or agreed to in writing, software<a name="line.11"></a>
<FONT color="green">012</FONT>     * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.12"></a>
<FONT color="green">013</FONT>     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.13"></a>
<FONT color="green">014</FONT>     * See the license for the specific language governing permissions and<a name="line.14"></a>
<FONT color="green">015</FONT>     * limitations under the license.<a name="line.15"></a>
<FONT color="green">016</FONT>     */<a name="line.16"></a>
<FONT color="green">017</FONT>    package org.apache.logging.log4j.core.config.plugins;<a name="line.17"></a>
<FONT color="green">018</FONT>    <a name="line.18"></a>
<FONT color="green">019</FONT>    import org.apache.logging.log4j.Logger;<a name="line.19"></a>
<FONT color="green">020</FONT>    import org.apache.logging.log4j.core.helpers.Loader;<a name="line.20"></a>
<FONT color="green">021</FONT>    import org.apache.logging.log4j.status.StatusLogger;<a name="line.21"></a>
<FONT color="green">022</FONT>    <a name="line.22"></a>
<FONT color="green">023</FONT>    import java.io.BufferedInputStream;<a name="line.23"></a>
<FONT color="green">024</FONT>    import java.io.BufferedOutputStream;<a name="line.24"></a>
<FONT color="green">025</FONT>    import java.io.DataInputStream;<a name="line.25"></a>
<FONT color="green">026</FONT>    import java.io.DataOutputStream;<a name="line.26"></a>
<FONT color="green">027</FONT>    import java.io.FileOutputStream;<a name="line.27"></a>
<FONT color="green">028</FONT>    import java.io.InputStream;<a name="line.28"></a>
<FONT color="green">029</FONT>    import java.text.DecimalFormat;<a name="line.29"></a>
<FONT color="green">030</FONT>    import java.util.HashMap;<a name="line.30"></a>
<FONT color="green">031</FONT>    import java.util.Map;<a name="line.31"></a>
<FONT color="green">032</FONT>    import java.util.concurrent.ConcurrentHashMap;<a name="line.32"></a>
<FONT color="green">033</FONT>    import java.util.concurrent.ConcurrentMap;<a name="line.33"></a>
<FONT color="green">034</FONT>    import java.util.concurrent.CopyOnWriteArrayList;<a name="line.34"></a>
<FONT color="green">035</FONT>    <a name="line.35"></a>
<FONT color="green">036</FONT>    /**<a name="line.36"></a>
<FONT color="green">037</FONT>     * Component that loads and manages all the plugins.<a name="line.37"></a>
<FONT color="green">038</FONT>     */<a name="line.38"></a>
<FONT color="green">039</FONT>    public class PluginManager {<a name="line.39"></a>
<FONT color="green">040</FONT>    <a name="line.40"></a>
<FONT color="green">041</FONT>        private static final long NANOS_PER_SECOND = 1000000000L;<a name="line.41"></a>
<FONT color="green">042</FONT>    <a name="line.42"></a>
<FONT color="green">043</FONT>        private static ConcurrentMap&lt;String, ConcurrentMap&lt;String, PluginType&gt;&gt; pluginTypeMap =<a name="line.43"></a>
<FONT color="green">044</FONT>            new ConcurrentHashMap&lt;String, ConcurrentMap&lt;String, PluginType&gt;&gt;();<a name="line.44"></a>
<FONT color="green">045</FONT>    <a name="line.45"></a>
<FONT color="green">046</FONT>        private static CopyOnWriteArrayList&lt;String&gt; packages = new CopyOnWriteArrayList&lt;String&gt;();<a name="line.46"></a>
<FONT color="green">047</FONT>        private static final String PATH = "org/apache/logging/log4j/core/config/plugins/";<a name="line.47"></a>
<FONT color="green">048</FONT>        private static final String FILENAME = "Log4j2Plugins.dat";<a name="line.48"></a>
<FONT color="green">049</FONT>        private static final String LOG4J_PACKAGES = "org.apache.logging.log4j.core";<a name="line.49"></a>
<FONT color="green">050</FONT>    <a name="line.50"></a>
<FONT color="green">051</FONT>        private static final Logger LOGGER = StatusLogger.getLogger();<a name="line.51"></a>
<FONT color="green">052</FONT>    <a name="line.52"></a>
<FONT color="green">053</FONT>        private static String rootDir;<a name="line.53"></a>
<FONT color="green">054</FONT>    <a name="line.54"></a>
<FONT color="green">055</FONT>        private Map&lt;String, PluginType&gt; plugins = new HashMap&lt;String, PluginType&gt;();<a name="line.55"></a>
<FONT color="green">056</FONT>        private final String type;<a name="line.56"></a>
<FONT color="green">057</FONT>        private final Class clazz;<a name="line.57"></a>
<FONT color="green">058</FONT>    <a name="line.58"></a>
<FONT color="green">059</FONT>        /**<a name="line.59"></a>
<FONT color="green">060</FONT>         * Constructor that takes only a type name.<a name="line.60"></a>
<FONT color="green">061</FONT>         * @param type The type name.<a name="line.61"></a>
<FONT color="green">062</FONT>         */<a name="line.62"></a>
<FONT color="green">063</FONT>        public PluginManager(String type) {<a name="line.63"></a>
<FONT color="green">064</FONT>            this.type = type;<a name="line.64"></a>
<FONT color="green">065</FONT>            this.clazz = null;<a name="line.65"></a>
<FONT color="green">066</FONT>        }<a name="line.66"></a>
<FONT color="green">067</FONT>    <a name="line.67"></a>
<FONT color="green">068</FONT>        /**<a name="line.68"></a>
<FONT color="green">069</FONT>         * Constructor that takes a type name and a Class.<a name="line.69"></a>
<FONT color="green">070</FONT>         * @param type The type that must be matched.<a name="line.70"></a>
<FONT color="green">071</FONT>         * @param clazz The Class each match must be an instance of.<a name="line.71"></a>
<FONT color="green">072</FONT>         */<a name="line.72"></a>
<FONT color="green">073</FONT>        public PluginManager(String type, Class clazz) {<a name="line.73"></a>
<FONT color="green">074</FONT>            this.type = type;<a name="line.74"></a>
<FONT color="green">075</FONT>            this.clazz = clazz;<a name="line.75"></a>
<FONT color="green">076</FONT>        }<a name="line.76"></a>
<FONT color="green">077</FONT>    <a name="line.77"></a>
<FONT color="green">078</FONT>        public static void main(String[] args) throws Exception {<a name="line.78"></a>
<FONT color="green">079</FONT>            if (args == null || args.length &lt; 1) {<a name="line.79"></a>
<FONT color="green">080</FONT>                System.err.println("A target directory must be specified");<a name="line.80"></a>
<FONT color="green">081</FONT>                System.exit(-1);<a name="line.81"></a>
<FONT color="green">082</FONT>            }<a name="line.82"></a>
<FONT color="green">083</FONT>            rootDir = args[0].endsWith("/") || args[0].endsWith("\\") ? args[0] : args[0] + "/";<a name="line.83"></a>
<FONT color="green">084</FONT>    <a name="line.84"></a>
<FONT color="green">085</FONT>            PluginManager manager = new PluginManager("Core");<a name="line.85"></a>
<FONT color="green">086</FONT>            manager.collectPlugins(false);<a name="line.86"></a>
<FONT color="green">087</FONT>            encode(pluginTypeMap);<a name="line.87"></a>
<FONT color="green">088</FONT>        }<a name="line.88"></a>
<FONT color="green">089</FONT>    <a name="line.89"></a>
<FONT color="green">090</FONT>        /**<a name="line.90"></a>
<FONT color="green">091</FONT>         * Adds a package name to be scanned for plugins. Must be invoked prior to plugins being collected.<a name="line.91"></a>
<FONT color="green">092</FONT>         * @param p The package name.<a name="line.92"></a>
<FONT color="green">093</FONT>         */<a name="line.93"></a>
<FONT color="green">094</FONT>        public static void addPackage(String p) {<a name="line.94"></a>
<FONT color="green">095</FONT>            packages.addIfAbsent(p);<a name="line.95"></a>
<FONT color="green">096</FONT>        }<a name="line.96"></a>
<FONT color="green">097</FONT>    <a name="line.97"></a>
<FONT color="green">098</FONT>        /**<a name="line.98"></a>
<FONT color="green">099</FONT>         * Returns the type of a specified plugin.<a name="line.99"></a>
<FONT color="green">100</FONT>         * @param name The name of the plugin.<a name="line.100"></a>
<FONT color="green">101</FONT>         * @return The plugin's type.<a name="line.101"></a>
<FONT color="green">102</FONT>         */<a name="line.102"></a>
<FONT color="green">103</FONT>        public PluginType getPluginType(String name) {<a name="line.103"></a>
<FONT color="green">104</FONT>            return plugins.get(name.toLowerCase());<a name="line.104"></a>
<FONT color="green">105</FONT>        }<a name="line.105"></a>
<FONT color="green">106</FONT>    <a name="line.106"></a>
<FONT color="green">107</FONT>        /**<a name="line.107"></a>
<FONT color="green">108</FONT>         * Returns all the matching plugins.<a name="line.108"></a>
<FONT color="green">109</FONT>         * @return A Map containing the name of the plugin and its type.<a name="line.109"></a>
<FONT color="green">110</FONT>         */<a name="line.110"></a>
<FONT color="green">111</FONT>        public Map&lt;String, PluginType&gt; getPlugins() {<a name="line.111"></a>
<FONT color="green">112</FONT>            return plugins;<a name="line.112"></a>
<FONT color="green">113</FONT>        }<a name="line.113"></a>
<FONT color="green">114</FONT>    <a name="line.114"></a>
<FONT color="green">115</FONT>        /**<a name="line.115"></a>
<FONT color="green">116</FONT>         * Locates all the plugins.<a name="line.116"></a>
<FONT color="green">117</FONT>         */<a name="line.117"></a>
<FONT color="green">118</FONT>        public void collectPlugins() {<a name="line.118"></a>
<FONT color="green">119</FONT>            collectPlugins(true);<a name="line.119"></a>
<FONT color="green">120</FONT>        }<a name="line.120"></a>
<FONT color="green">121</FONT>    <a name="line.121"></a>
<FONT color="green">122</FONT>        /**<a name="line.122"></a>
<FONT color="green">123</FONT>         * Collects plugins, optionally obtaining them from a preload map.<a name="line.123"></a>
<FONT color="green">124</FONT>         * @param preLoad if true, plugins will be obtained from the preload map.<a name="line.124"></a>
<FONT color="green">125</FONT>         */<a name="line.125"></a>
<FONT color="green">126</FONT>        public void collectPlugins(boolean preLoad) {<a name="line.126"></a>
<FONT color="green">127</FONT>            if (pluginTypeMap.containsKey(type)) {<a name="line.127"></a>
<FONT color="green">128</FONT>                plugins = pluginTypeMap.get(type);<a name="line.128"></a>
<FONT color="green">129</FONT>                preLoad = false;<a name="line.129"></a>
<FONT color="green">130</FONT>            }<a name="line.130"></a>
<FONT color="green">131</FONT>            long start = System.nanoTime();<a name="line.131"></a>
<FONT color="green">132</FONT>            ResolverUtil&lt;?&gt; r = new ResolverUtil();<a name="line.132"></a>
<FONT color="green">133</FONT>            ClassLoader loader = Loader.getClassLoader();<a name="line.133"></a>
<FONT color="green">134</FONT>            if (loader != null) {<a name="line.134"></a>
<FONT color="green">135</FONT>                r.setClassLoader(loader);<a name="line.135"></a>
<FONT color="green">136</FONT>            }<a name="line.136"></a>
<FONT color="green">137</FONT>            if (preLoad) {<a name="line.137"></a>
<FONT color="green">138</FONT>                ConcurrentMap&lt;String, ConcurrentMap&lt;String, PluginType&gt;&gt; map = decode(loader);<a name="line.138"></a>
<FONT color="green">139</FONT>                if (map != null) {<a name="line.139"></a>
<FONT color="green">140</FONT>                    pluginTypeMap = map;<a name="line.140"></a>
<FONT color="green">141</FONT>                    plugins = map.get(type);<a name="line.141"></a>
<FONT color="green">142</FONT>                } else {<a name="line.142"></a>
<FONT color="green">143</FONT>                    LOGGER.warn("Plugin preloads not available");<a name="line.143"></a>
<FONT color="green">144</FONT>                }<a name="line.144"></a>
<FONT color="green">145</FONT>            }<a name="line.145"></a>
<FONT color="green">146</FONT>            if (plugins.size() == 0) {<a name="line.146"></a>
<FONT color="green">147</FONT>                packages.add(LOG4J_PACKAGES);<a name="line.147"></a>
<FONT color="green">148</FONT>            }<a name="line.148"></a>
<FONT color="green">149</FONT>            ResolverUtil.Test test = new PluginTest(clazz);<a name="line.149"></a>
<FONT color="green">150</FONT>            for (String pkg : packages) {<a name="line.150"></a>
<FONT color="green">151</FONT>                r.findInPackage(test, pkg);<a name="line.151"></a>
<FONT color="green">152</FONT>            }<a name="line.152"></a>
<FONT color="green">153</FONT>            for (Class&lt;?&gt; item : r.getClasses()) {<a name="line.153"></a>
<FONT color="green">154</FONT>                Plugin p = item.getAnnotation(Plugin.class);<a name="line.154"></a>
<FONT color="green">155</FONT>                String pluginType = p.type();<a name="line.155"></a>
<FONT color="green">156</FONT>                if (!pluginTypeMap.containsKey(pluginType)) {<a name="line.156"></a>
<FONT color="green">157</FONT>                    pluginTypeMap.putIfAbsent(pluginType, new ConcurrentHashMap&lt;String, PluginType&gt;());<a name="line.157"></a>
<FONT color="green">158</FONT>                }<a name="line.158"></a>
<FONT color="green">159</FONT>                Map&lt;String, PluginType&gt; map = pluginTypeMap.get(pluginType);<a name="line.159"></a>
<FONT color="green">160</FONT>                String type = p.elementType().equals(Plugin.EMPTY) ? p.name() : p.elementType();<a name="line.160"></a>
<FONT color="green">161</FONT>                map.put(p.name().toLowerCase(), new PluginType(item, type, p.printObject(), p.deferChildren()));<a name="line.161"></a>
<FONT color="green">162</FONT>            }<a name="line.162"></a>
<FONT color="green">163</FONT>            long elapsed = System.nanoTime() - start;<a name="line.163"></a>
<FONT color="green">164</FONT>            plugins = pluginTypeMap.get(type);<a name="line.164"></a>
<FONT color="green">165</FONT>            StringBuilder sb = new StringBuilder("Generated plugins");<a name="line.165"></a>
<FONT color="green">166</FONT>            sb.append(" in ");<a name="line.166"></a>
<FONT color="green">167</FONT>            DecimalFormat numFormat = new DecimalFormat("#0");<a name="line.167"></a>
<FONT color="green">168</FONT>            long seconds = elapsed / NANOS_PER_SECOND;<a name="line.168"></a>
<FONT color="green">169</FONT>            elapsed %= NANOS_PER_SECOND;<a name="line.169"></a>
<FONT color="green">170</FONT>            sb.append(numFormat.format(seconds)).append(".");<a name="line.170"></a>
<FONT color="green">171</FONT>            numFormat = new DecimalFormat("000000000");<a name="line.171"></a>
<FONT color="green">172</FONT>            sb.append(numFormat.format(elapsed)).append(" seconds");<a name="line.172"></a>
<FONT color="green">173</FONT>            LOGGER.debug(sb.toString());<a name="line.173"></a>
<FONT color="green">174</FONT>        }<a name="line.174"></a>
<FONT color="green">175</FONT>    <a name="line.175"></a>
<FONT color="green">176</FONT>        private static ConcurrentMap&lt;String, ConcurrentMap&lt;String, PluginType&gt;&gt; decode(ClassLoader loader) {<a name="line.176"></a>
<FONT color="green">177</FONT>            String resource = PATH + FILENAME;<a name="line.177"></a>
<FONT color="green">178</FONT>            try {<a name="line.178"></a>
<FONT color="green">179</FONT>                InputStream is = loader.getResourceAsStream(resource);<a name="line.179"></a>
<FONT color="green">180</FONT>                BufferedInputStream bis = new BufferedInputStream(is);<a name="line.180"></a>
<FONT color="green">181</FONT>                DataInputStream dis = new DataInputStream(bis);<a name="line.181"></a>
<FONT color="green">182</FONT>                int count = dis.readInt();<a name="line.182"></a>
<FONT color="green">183</FONT>                ConcurrentMap&lt;String, ConcurrentMap&lt;String, PluginType&gt;&gt; map =<a name="line.183"></a>
<FONT color="green">184</FONT>                    new ConcurrentHashMap&lt;String, ConcurrentMap&lt;String, PluginType&gt;&gt;(count);<a name="line.184"></a>
<FONT color="green">185</FONT>                for (int j = 0; j &lt; count; ++j) {<a name="line.185"></a>
<FONT color="green">186</FONT>                    String type = dis.readUTF();<a name="line.186"></a>
<FONT color="green">187</FONT>                    int entries = dis.readInt();<a name="line.187"></a>
<FONT color="green">188</FONT>                    ConcurrentMap&lt;String, PluginType&gt; types = new ConcurrentHashMap&lt;String, PluginType&gt;(count);<a name="line.188"></a>
<FONT color="green">189</FONT>                    for (int i = 0; i &lt; entries; ++i) {<a name="line.189"></a>
<FONT color="green">190</FONT>                        String key = dis.readUTF();<a name="line.190"></a>
<FONT color="green">191</FONT>                        String className = dis.readUTF();<a name="line.191"></a>
<FONT color="green">192</FONT>                        String name = dis.readUTF();<a name="line.192"></a>
<FONT color="green">193</FONT>                        boolean printable = dis.readBoolean();<a name="line.193"></a>
<FONT color="green">194</FONT>                        boolean defer = dis.readBoolean();<a name="line.194"></a>
<FONT color="green">195</FONT>                        Class clazz = Class.forName(className);<a name="line.195"></a>
<FONT color="green">196</FONT>                        types.put(key, new PluginType(clazz, name, printable, defer));<a name="line.196"></a>
<FONT color="green">197</FONT>                    }<a name="line.197"></a>
<FONT color="green">198</FONT>                    map.putIfAbsent(type, types);<a name="line.198"></a>
<FONT color="green">199</FONT>                }<a name="line.199"></a>
<FONT color="green">200</FONT>                dis.close();<a name="line.200"></a>
<FONT color="green">201</FONT>                return map;<a name="line.201"></a>
<FONT color="green">202</FONT>            } catch (Exception ex) {<a name="line.202"></a>
<FONT color="green">203</FONT>                LOGGER.warn("Unable to preload plugins", ex);<a name="line.203"></a>
<FONT color="green">204</FONT>                return null;<a name="line.204"></a>
<FONT color="green">205</FONT>            }<a name="line.205"></a>
<FONT color="green">206</FONT>        }<a name="line.206"></a>
<FONT color="green">207</FONT>    <a name="line.207"></a>
<FONT color="green">208</FONT>        private static void encode(ConcurrentMap&lt;String, ConcurrentMap&lt;String, PluginType&gt;&gt; map) {<a name="line.208"></a>
<FONT color="green">209</FONT>            String fileName = rootDir + PATH + FILENAME;<a name="line.209"></a>
<FONT color="green">210</FONT>            try {<a name="line.210"></a>
<FONT color="green">211</FONT>                FileOutputStream fos = new FileOutputStream(fileName);<a name="line.211"></a>
<FONT color="green">212</FONT>                BufferedOutputStream bos = new BufferedOutputStream(fos);<a name="line.212"></a>
<FONT color="green">213</FONT>                DataOutputStream dos = new DataOutputStream(bos);<a name="line.213"></a>
<FONT color="green">214</FONT>                dos.writeInt(map.size());<a name="line.214"></a>
<FONT color="green">215</FONT>                for (Map.Entry&lt;String, ConcurrentMap&lt;String, PluginType&gt;&gt; outer : map.entrySet()) {<a name="line.215"></a>
<FONT color="green">216</FONT>                    dos.writeUTF(outer.getKey());<a name="line.216"></a>
<FONT color="green">217</FONT>                    dos.writeInt(outer.getValue().size());<a name="line.217"></a>
<FONT color="green">218</FONT>                    for (Map.Entry&lt;String, PluginType&gt; entry : outer.getValue().entrySet()) {<a name="line.218"></a>
<FONT color="green">219</FONT>                        dos.writeUTF(entry.getKey());<a name="line.219"></a>
<FONT color="green">220</FONT>                        PluginType pt = entry.getValue();<a name="line.220"></a>
<FONT color="green">221</FONT>                        dos.writeUTF(pt.getPluginClass().getName());<a name="line.221"></a>
<FONT color="green">222</FONT>                        dos.writeUTF(pt.getElementName());<a name="line.222"></a>
<FONT color="green">223</FONT>                        dos.writeBoolean(pt.isObjectPrintable());<a name="line.223"></a>
<FONT color="green">224</FONT>                        dos.writeBoolean(pt.isDeferChildren());<a name="line.224"></a>
<FONT color="green">225</FONT>                    }<a name="line.225"></a>
<FONT color="green">226</FONT>                }<a name="line.226"></a>
<FONT color="green">227</FONT>                dos.close();<a name="line.227"></a>
<FONT color="green">228</FONT>            } catch (Exception ex) {<a name="line.228"></a>
<FONT color="green">229</FONT>                ex.printStackTrace();<a name="line.229"></a>
<FONT color="green">230</FONT>            }<a name="line.230"></a>
<FONT color="green">231</FONT>        }<a name="line.231"></a>
<FONT color="green">232</FONT>    <a name="line.232"></a>
<FONT color="green">233</FONT>        /**<a name="line.233"></a>
<FONT color="green">234</FONT>         * A Test that checks to see if each class is annotated with a specific annotation. If it<a name="line.234"></a>
<FONT color="green">235</FONT>         * is, then the test returns true, otherwise false.<a name="line.235"></a>
<FONT color="green">236</FONT>         */<a name="line.236"></a>
<FONT color="green">237</FONT>        public static class PluginTest extends ResolverUtil.ClassTest {<a name="line.237"></a>
<FONT color="green">238</FONT>            private final Class isA;<a name="line.238"></a>
<FONT color="green">239</FONT>    <a name="line.239"></a>
<FONT color="green">240</FONT>            /**<a name="line.240"></a>
<FONT color="green">241</FONT>             * Constructs an AnnotatedWith test for the specified annotation type.<a name="line.241"></a>
<FONT color="green">242</FONT>             * @param isA The class to compare against.<a name="line.242"></a>
<FONT color="green">243</FONT>             */<a name="line.243"></a>
<FONT color="green">244</FONT>            public PluginTest(Class isA) {<a name="line.244"></a>
<FONT color="green">245</FONT>                this.isA = isA;<a name="line.245"></a>
<FONT color="green">246</FONT>            }<a name="line.246"></a>
<FONT color="green">247</FONT>    <a name="line.247"></a>
<FONT color="green">248</FONT>            /**<a name="line.248"></a>
<FONT color="green">249</FONT>             * Returns true if the type is annotated with the class provided to the constructor.<a name="line.249"></a>
<FONT color="green">250</FONT>             * @param type The type to check for.<a name="line.250"></a>
<FONT color="green">251</FONT>             * @return true if the Class is of the specified type.<a name="line.251"></a>
<FONT color="green">252</FONT>             */<a name="line.252"></a>
<FONT color="green">253</FONT>            public boolean matches(Class type) {<a name="line.253"></a>
<FONT color="green">254</FONT>                return type != null &amp;&amp; type.isAnnotationPresent(Plugin.class) &amp;&amp;<a name="line.254"></a>
<FONT color="green">255</FONT>                    (isA == null || isA.isAssignableFrom(type));<a name="line.255"></a>
<FONT color="green">256</FONT>            }<a name="line.256"></a>
<FONT color="green">257</FONT>    <a name="line.257"></a>
<FONT color="green">258</FONT>            @Override<a name="line.258"></a>
<FONT color="green">259</FONT>            public String toString() {<a name="line.259"></a>
<FONT color="green">260</FONT>                StringBuilder msg = new StringBuilder("annotated with @" + Plugin.class.getSimpleName());<a name="line.260"></a>
<FONT color="green">261</FONT>                if (isA != null) {<a name="line.261"></a>
<FONT color="green">262</FONT>                    msg.append(" is assignable to " + isA.getSimpleName());<a name="line.262"></a>
<FONT color="green">263</FONT>                }<a name="line.263"></a>
<FONT color="green">264</FONT>                return msg.toString();<a name="line.264"></a>
<FONT color="green">265</FONT>            }<a name="line.265"></a>
<FONT color="green">266</FONT>        }<a name="line.266"></a>
<FONT color="green">267</FONT>    <a name="line.267"></a>
<FONT color="green">268</FONT>    }<a name="line.268"></a>




























































</PRE>
</BODY>
</HTML>
