<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;<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.Appender;<a name="line.20"></a>
<FONT color="green">021</FONT>    import org.apache.logging.log4j.core.Filter;<a name="line.21"></a>
<FONT color="green">022</FONT>    import org.apache.logging.log4j.core.LogEvent;<a name="line.22"></a>
<FONT color="green">023</FONT>    import org.apache.logging.log4j.core.config.plugins.PluginAttr;<a name="line.23"></a>
<FONT color="green">024</FONT>    import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;<a name="line.24"></a>
<FONT color="green">025</FONT>    import org.apache.logging.log4j.core.config.plugins.PluginFactory;<a name="line.25"></a>
<FONT color="green">026</FONT>    import org.apache.logging.log4j.core.config.plugins.PluginManager;<a name="line.26"></a>
<FONT color="green">027</FONT>    import org.apache.logging.log4j.core.config.plugins.PluginElement;<a name="line.27"></a>
<FONT color="green">028</FONT>    import org.apache.logging.log4j.core.config.plugins.PluginNode;<a name="line.28"></a>
<FONT color="green">029</FONT>    import org.apache.logging.log4j.core.config.plugins.PluginType;<a name="line.29"></a>
<FONT color="green">030</FONT>    import org.apache.logging.log4j.core.config.plugins.PluginValue;<a name="line.30"></a>
<FONT color="green">031</FONT>    import org.apache.logging.log4j.core.filter.Filterable;<a name="line.31"></a>
<FONT color="green">032</FONT>    import org.apache.logging.log4j.core.helpers.NameUtil;<a name="line.32"></a>
<FONT color="green">033</FONT>    import org.apache.logging.log4j.core.lookup.Interpolator;<a name="line.33"></a>
<FONT color="green">034</FONT>    import org.apache.logging.log4j.core.lookup.StrLookup;<a name="line.34"></a>
<FONT color="green">035</FONT>    import org.apache.logging.log4j.core.lookup.StrSubstitutor;<a name="line.35"></a>
<FONT color="green">036</FONT>    import org.apache.logging.log4j.status.StatusLogger;<a name="line.36"></a>
<FONT color="green">037</FONT>    <a name="line.37"></a>
<FONT color="green">038</FONT>    import java.lang.annotation.Annotation;<a name="line.38"></a>
<FONT color="green">039</FONT>    import java.lang.reflect.Array;<a name="line.39"></a>
<FONT color="green">040</FONT>    import java.lang.reflect.Method;<a name="line.40"></a>
<FONT color="green">041</FONT>    import java.lang.reflect.Modifier;<a name="line.41"></a>
<FONT color="green">042</FONT>    import java.util.ArrayList;<a name="line.42"></a>
<FONT color="green">043</FONT>    import java.util.Collections;<a name="line.43"></a>
<FONT color="green">044</FONT>    import java.util.List;<a name="line.44"></a>
<FONT color="green">045</FONT>    import java.util.Map;<a name="line.45"></a>
<FONT color="green">046</FONT>    import java.util.concurrent.ConcurrentHashMap;<a name="line.46"></a>
<FONT color="green">047</FONT>    import java.util.concurrent.ConcurrentMap;<a name="line.47"></a>
<FONT color="green">048</FONT>    import java.util.concurrent.CopyOnWriteArrayList;<a name="line.48"></a>
<FONT color="green">049</FONT>    <a name="line.49"></a>
<FONT color="green">050</FONT>    /**<a name="line.50"></a>
<FONT color="green">051</FONT>     * The Base Configuration. Many configuration implementations will extend this class.<a name="line.51"></a>
<FONT color="green">052</FONT>     */<a name="line.52"></a>
<FONT color="green">053</FONT>    public class BaseConfiguration extends Filterable implements Configuration {<a name="line.53"></a>
<FONT color="green">054</FONT>        /**<a name="line.54"></a>
<FONT color="green">055</FONT>         * Allow subclasses access to the status logger without creating another instance.<a name="line.55"></a>
<FONT color="green">056</FONT>         */<a name="line.56"></a>
<FONT color="green">057</FONT>        protected static final Logger LOGGER = StatusLogger.getLogger();<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>         * The root node of the configuration.<a name="line.60"></a>
<FONT color="green">061</FONT>         */<a name="line.61"></a>
<FONT color="green">062</FONT>        protected Node rootNode;<a name="line.62"></a>
<FONT color="green">063</FONT>    <a name="line.63"></a>
<FONT color="green">064</FONT>        /**<a name="line.64"></a>
<FONT color="green">065</FONT>         * The Plugin Manager.<a name="line.65"></a>
<FONT color="green">066</FONT>         */<a name="line.66"></a>
<FONT color="green">067</FONT>        protected PluginManager pluginManager;<a name="line.67"></a>
<FONT color="green">068</FONT>    <a name="line.68"></a>
<FONT color="green">069</FONT>        /**<a name="line.69"></a>
<FONT color="green">070</FONT>         * Listeners for configuration changes.<a name="line.70"></a>
<FONT color="green">071</FONT>         */<a name="line.71"></a>
<FONT color="green">072</FONT>        protected final List&lt;ConfigurationListener&gt; listeners =<a name="line.72"></a>
<FONT color="green">073</FONT>            new CopyOnWriteArrayList&lt;ConfigurationListener&gt;();<a name="line.73"></a>
<FONT color="green">074</FONT>    <a name="line.74"></a>
<FONT color="green">075</FONT>        /**<a name="line.75"></a>
<FONT color="green">076</FONT>         * The ConfigurationMonitor that checks for configuration changes.<a name="line.76"></a>
<FONT color="green">077</FONT>         */<a name="line.77"></a>
<FONT color="green">078</FONT>        protected ConfigurationMonitor monitor = new DefaultConfigurationMonitor();<a name="line.78"></a>
<FONT color="green">079</FONT>    <a name="line.79"></a>
<FONT color="green">080</FONT>        private String name;<a name="line.80"></a>
<FONT color="green">081</FONT>    <a name="line.81"></a>
<FONT color="green">082</FONT>        private ConcurrentMap&lt;String, Appender&gt; appenders = new ConcurrentHashMap&lt;String, Appender&gt;();<a name="line.82"></a>
<FONT color="green">083</FONT>    <a name="line.83"></a>
<FONT color="green">084</FONT>        private ConcurrentMap&lt;String, LoggerConfig&gt; loggers = new ConcurrentHashMap&lt;String, LoggerConfig&gt;();<a name="line.84"></a>
<FONT color="green">085</FONT>    <a name="line.85"></a>
<FONT color="green">086</FONT>        private StrSubstitutor subst = new StrSubstitutor();<a name="line.86"></a>
<FONT color="green">087</FONT>    <a name="line.87"></a>
<FONT color="green">088</FONT>        private LoggerConfig root = new LoggerConfig();<a name="line.88"></a>
<FONT color="green">089</FONT>    <a name="line.89"></a>
<FONT color="green">090</FONT>        private boolean started = false;<a name="line.90"></a>
<FONT color="green">091</FONT>    <a name="line.91"></a>
<FONT color="green">092</FONT>        private ConcurrentMap&lt;String, Object&gt; componentMap = new ConcurrentHashMap&lt;String, Object&gt;();<a name="line.92"></a>
<FONT color="green">093</FONT>    <a name="line.93"></a>
<FONT color="green">094</FONT>        /**<a name="line.94"></a>
<FONT color="green">095</FONT>         * Constructor.<a name="line.95"></a>
<FONT color="green">096</FONT>         */<a name="line.96"></a>
<FONT color="green">097</FONT>        protected BaseConfiguration() {<a name="line.97"></a>
<FONT color="green">098</FONT>            pluginManager = new PluginManager("Core");<a name="line.98"></a>
<FONT color="green">099</FONT>            rootNode = new Node();<a name="line.99"></a>
<FONT color="green">100</FONT>        }<a name="line.100"></a>
<FONT color="green">101</FONT>    <a name="line.101"></a>
<FONT color="green">102</FONT>        /**<a name="line.102"></a>
<FONT color="green">103</FONT>         * Initialize the configuration.<a name="line.103"></a>
<FONT color="green">104</FONT>         */<a name="line.104"></a>
<FONT color="green">105</FONT>        public void start() {<a name="line.105"></a>
<FONT color="green">106</FONT>            pluginManager.collectPlugins();<a name="line.106"></a>
<FONT color="green">107</FONT>            setup();<a name="line.107"></a>
<FONT color="green">108</FONT>            doConfigure();<a name="line.108"></a>
<FONT color="green">109</FONT>            for (LoggerConfig logger : loggers.values()) {<a name="line.109"></a>
<FONT color="green">110</FONT>                logger.startFilter();<a name="line.110"></a>
<FONT color="green">111</FONT>            }<a name="line.111"></a>
<FONT color="green">112</FONT>            for (Appender appender : appenders.values()) {<a name="line.112"></a>
<FONT color="green">113</FONT>                appender.start();<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>            startFilter();<a name="line.116"></a>
<FONT color="green">117</FONT>        }<a name="line.117"></a>
<FONT color="green">118</FONT>    <a name="line.118"></a>
<FONT color="green">119</FONT>        /**<a name="line.119"></a>
<FONT color="green">120</FONT>         * Tear down the configuration.<a name="line.120"></a>
<FONT color="green">121</FONT>         */<a name="line.121"></a>
<FONT color="green">122</FONT>        public void stop() {<a name="line.122"></a>
<FONT color="green">123</FONT>            for (LoggerConfig logger : loggers.values()) {<a name="line.123"></a>
<FONT color="green">124</FONT>                logger.clearAppenders();<a name="line.124"></a>
<FONT color="green">125</FONT>                logger.stopFilter();<a name="line.125"></a>
<FONT color="green">126</FONT>            }<a name="line.126"></a>
<FONT color="green">127</FONT>            for (Appender appender : appenders.values()) {<a name="line.127"></a>
<FONT color="green">128</FONT>                appender.stop();<a name="line.128"></a>
<FONT color="green">129</FONT>            }<a name="line.129"></a>
<FONT color="green">130</FONT>            stopFilter();<a name="line.130"></a>
<FONT color="green">131</FONT>        }<a name="line.131"></a>
<FONT color="green">132</FONT>    <a name="line.132"></a>
<FONT color="green">133</FONT>        protected void setup() {<a name="line.133"></a>
<FONT color="green">134</FONT>        }<a name="line.134"></a>
<FONT color="green">135</FONT>    <a name="line.135"></a>
<FONT color="green">136</FONT>        public Object getComponent(String name) {<a name="line.136"></a>
<FONT color="green">137</FONT>            return componentMap.get(name);<a name="line.137"></a>
<FONT color="green">138</FONT>        }<a name="line.138"></a>
<FONT color="green">139</FONT>    <a name="line.139"></a>
<FONT color="green">140</FONT>        public void addComponent(String name, Object obj) {<a name="line.140"></a>
<FONT color="green">141</FONT>            componentMap.putIfAbsent(name, obj);<a name="line.141"></a>
<FONT color="green">142</FONT>        }<a name="line.142"></a>
<FONT color="green">143</FONT>    <a name="line.143"></a>
<FONT color="green">144</FONT>        protected void doConfigure() {<a name="line.144"></a>
<FONT color="green">145</FONT>            boolean setRoot = false;<a name="line.145"></a>
<FONT color="green">146</FONT>            boolean setLoggers = false;<a name="line.146"></a>
<FONT color="green">147</FONT>            for (Node child : rootNode.getChildren()) {<a name="line.147"></a>
<FONT color="green">148</FONT>                createConfiguration(child, null);<a name="line.148"></a>
<FONT color="green">149</FONT>                if (child.getObject() == null) {<a name="line.149"></a>
<FONT color="green">150</FONT>                    continue;<a name="line.150"></a>
<FONT color="green">151</FONT>                }<a name="line.151"></a>
<FONT color="green">152</FONT>                if (child.getName().equalsIgnoreCase("properties")) {<a name="line.152"></a>
<FONT color="green">153</FONT>                    if (subst.getVariableResolver() == null) {<a name="line.153"></a>
<FONT color="green">154</FONT>                        subst.setVariableResolver((StrLookup) child.getObject());<a name="line.154"></a>
<FONT color="green">155</FONT>                    } else {<a name="line.155"></a>
<FONT color="green">156</FONT>                        LOGGER.error("Properties declaration must be the first element in the configuration");<a name="line.156"></a>
<FONT color="green">157</FONT>                    }<a name="line.157"></a>
<FONT color="green">158</FONT>                    continue;<a name="line.158"></a>
<FONT color="green">159</FONT>                } else if (subst.getVariableResolver() == null) {<a name="line.159"></a>
<FONT color="green">160</FONT>                    subst.setVariableResolver(new Interpolator(null));<a name="line.160"></a>
<FONT color="green">161</FONT>                }<a name="line.161"></a>
<FONT color="green">162</FONT>                if (child.getName().equalsIgnoreCase("appenders")) {<a name="line.162"></a>
<FONT color="green">163</FONT>                    appenders = (ConcurrentMap&lt;String, Appender&gt;) child.getObject();<a name="line.163"></a>
<FONT color="green">164</FONT>                } else if (child.getObject() instanceof Filter) {<a name="line.164"></a>
<FONT color="green">165</FONT>                    addFilter((Filter) child.getObject());<a name="line.165"></a>
<FONT color="green">166</FONT>                } else if (child.getName().equalsIgnoreCase("loggers")) {<a name="line.166"></a>
<FONT color="green">167</FONT>                    Loggers l = (Loggers) child.getObject();<a name="line.167"></a>
<FONT color="green">168</FONT>                    loggers = l.getMap();<a name="line.168"></a>
<FONT color="green">169</FONT>                    setLoggers = true;<a name="line.169"></a>
<FONT color="green">170</FONT>                    if (l.getRoot() != null) {<a name="line.170"></a>
<FONT color="green">171</FONT>                        root = l.getRoot();<a name="line.171"></a>
<FONT color="green">172</FONT>                        setRoot = true;<a name="line.172"></a>
<FONT color="green">173</FONT>                    }<a name="line.173"></a>
<FONT color="green">174</FONT>                } else {<a name="line.174"></a>
<FONT color="green">175</FONT>                    LOGGER.error("Unknown object \"" + child.getName() + "\" of type " +<a name="line.175"></a>
<FONT color="green">176</FONT>                        child.getObject().getClass().getName() + " is ignored");<a name="line.176"></a>
<FONT color="green">177</FONT>                }<a name="line.177"></a>
<FONT color="green">178</FONT>            }<a name="line.178"></a>
<FONT color="green">179</FONT>    <a name="line.179"></a>
<FONT color="green">180</FONT>            if (!setLoggers) {<a name="line.180"></a>
<FONT color="green">181</FONT>                LOGGER.warn("No Loggers were configured, using default");<a name="line.181"></a>
<FONT color="green">182</FONT>            } else if (!setRoot) {<a name="line.182"></a>
<FONT color="green">183</FONT>                LOGGER.warn("No Root logger was configured, using default");<a name="line.183"></a>
<FONT color="green">184</FONT>            }<a name="line.184"></a>
<FONT color="green">185</FONT>    <a name="line.185"></a>
<FONT color="green">186</FONT>            root.setConfigurationMonitor(monitor);<a name="line.186"></a>
<FONT color="green">187</FONT>    <a name="line.187"></a>
<FONT color="green">188</FONT>            for (Map.Entry&lt;String, LoggerConfig&gt; entry : loggers.entrySet()) {<a name="line.188"></a>
<FONT color="green">189</FONT>                LoggerConfig l = entry.getValue();<a name="line.189"></a>
<FONT color="green">190</FONT>                l.setConfigurationMonitor(monitor);<a name="line.190"></a>
<FONT color="green">191</FONT>                for (AppenderRef ref : l.getAppenderRefs()) {<a name="line.191"></a>
<FONT color="green">192</FONT>                    Appender app = appenders.get(ref.getRef());<a name="line.192"></a>
<FONT color="green">193</FONT>                    if (app != null) {<a name="line.193"></a>
<FONT color="green">194</FONT>                        l.addAppender(app, ref.getLevel(), ref.getFilter());<a name="line.194"></a>
<FONT color="green">195</FONT>                    } else {<a name="line.195"></a>
<FONT color="green">196</FONT>                        LOGGER.error("Unable to locate appender " + ref.getRef() + " for logger " + l.getName());<a name="line.196"></a>
<FONT color="green">197</FONT>                    }<a name="line.197"></a>
<FONT color="green">198</FONT>                }<a name="line.198"></a>
<FONT color="green">199</FONT>    <a name="line.199"></a>
<FONT color="green">200</FONT>            }<a name="line.200"></a>
<FONT color="green">201</FONT>    <a name="line.201"></a>
<FONT color="green">202</FONT>            setParents();<a name="line.202"></a>
<FONT color="green">203</FONT>        }<a name="line.203"></a>
<FONT color="green">204</FONT>    <a name="line.204"></a>
<FONT color="green">205</FONT>        protected PluginManager getPluginManager() {<a name="line.205"></a>
<FONT color="green">206</FONT>            return pluginManager;<a name="line.206"></a>
<FONT color="green">207</FONT>        }<a name="line.207"></a>
<FONT color="green">208</FONT>    <a name="line.208"></a>
<FONT color="green">209</FONT>        /**<a name="line.209"></a>
<FONT color="green">210</FONT>         * Set the name of the configuration.<a name="line.210"></a>
<FONT color="green">211</FONT>         * @param name The name.<a name="line.211"></a>
<FONT color="green">212</FONT>         */<a name="line.212"></a>
<FONT color="green">213</FONT>        public void setName(String name) {<a name="line.213"></a>
<FONT color="green">214</FONT>            this.name = name;<a name="line.214"></a>
<FONT color="green">215</FONT>        }<a name="line.215"></a>
<FONT color="green">216</FONT>    <a name="line.216"></a>
<FONT color="green">217</FONT>        /**<a name="line.217"></a>
<FONT color="green">218</FONT>         * Return the name of the configuration.<a name="line.218"></a>
<FONT color="green">219</FONT>         * @return the name of the configuration.<a name="line.219"></a>
<FONT color="green">220</FONT>         */<a name="line.220"></a>
<FONT color="green">221</FONT>        public String getName() {<a name="line.221"></a>
<FONT color="green">222</FONT>            return name;<a name="line.222"></a>
<FONT color="green">223</FONT>        }<a name="line.223"></a>
<FONT color="green">224</FONT>    <a name="line.224"></a>
<FONT color="green">225</FONT>        /**<a name="line.225"></a>
<FONT color="green">226</FONT>         * Add a listener for changes on the configuration.<a name="line.226"></a>
<FONT color="green">227</FONT>         * @param listener The ConfigurationListener to add.<a name="line.227"></a>
<FONT color="green">228</FONT>         */<a name="line.228"></a>
<FONT color="green">229</FONT>        public void addListener(ConfigurationListener listener) {<a name="line.229"></a>
<FONT color="green">230</FONT>            listeners.add(listener);<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>         * Remove a ConfigurationListener.<a name="line.234"></a>
<FONT color="green">235</FONT>         * @param listener The ConfigurationListener to remove.<a name="line.235"></a>
<FONT color="green">236</FONT>         */<a name="line.236"></a>
<FONT color="green">237</FONT>        public void removeListener(ConfigurationListener listener) {<a name="line.237"></a>
<FONT color="green">238</FONT>            listeners.remove(listener);<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>        /**<a name="line.241"></a>
<FONT color="green">242</FONT>         * Return the Appender with the specified name.<a name="line.242"></a>
<FONT color="green">243</FONT>         * @param name The name of the Appender.<a name="line.243"></a>
<FONT color="green">244</FONT>         * @return the Appender with the specified name or null if the Appender cannot be located.<a name="line.244"></a>
<FONT color="green">245</FONT>         */<a name="line.245"></a>
<FONT color="green">246</FONT>        public Appender getAppender(String name) {<a name="line.246"></a>
<FONT color="green">247</FONT>            return appenders.get(name);<a name="line.247"></a>
<FONT color="green">248</FONT>        }<a name="line.248"></a>
<FONT color="green">249</FONT>    <a name="line.249"></a>
<FONT color="green">250</FONT>        /**<a name="line.250"></a>
<FONT color="green">251</FONT>         * Return a Map containing all the Appenders and their name.<a name="line.251"></a>
<FONT color="green">252</FONT>         * @return A Map containing each Appender's naem and the Appender object.<a name="line.252"></a>
<FONT color="green">253</FONT>         */<a name="line.253"></a>
<FONT color="green">254</FONT>        public Map&lt;String, Appender&gt; getAppenders() {<a name="line.254"></a>
<FONT color="green">255</FONT>            return appenders;<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>        /**<a name="line.258"></a>
<FONT color="green">259</FONT>         * Adds an Appender to the configuration.<a name="line.259"></a>
<FONT color="green">260</FONT>         * @param appender The Appender to add.<a name="line.260"></a>
<FONT color="green">261</FONT>         */<a name="line.261"></a>
<FONT color="green">262</FONT>        public void addAppender(Appender appender) {<a name="line.262"></a>
<FONT color="green">263</FONT>            appenders.put(appender.getName(), appender);<a name="line.263"></a>
<FONT color="green">264</FONT>        }<a name="line.264"></a>
<FONT color="green">265</FONT>    <a name="line.265"></a>
<FONT color="green">266</FONT>        public StrSubstitutor getSubst() {<a name="line.266"></a>
<FONT color="green">267</FONT>            return subst;<a name="line.267"></a>
<FONT color="green">268</FONT>        }<a name="line.268"></a>
<FONT color="green">269</FONT>    <a name="line.269"></a>
<FONT color="green">270</FONT>        /**<a name="line.270"></a>
<FONT color="green">271</FONT>         * Associates an Appender with a LoggerConfig. This method is synchronized in case a Logger with the<a name="line.271"></a>
<FONT color="green">272</FONT>         * same name is being updated at the same time.<a name="line.272"></a>
<FONT color="green">273</FONT>         *<a name="line.273"></a>
<FONT color="green">274</FONT>         * Note: This method is not used when configuring via configuration. It is primarily used by<a name="line.274"></a>
<FONT color="green">275</FONT>         * unit tests.<a name="line.275"></a>
<FONT color="green">276</FONT>         * @param logger The Logger the Appender will be associated with.<a name="line.276"></a>
<FONT color="green">277</FONT>         * @param appender The Appender.<a name="line.277"></a>
<FONT color="green">278</FONT>         */<a name="line.278"></a>
<FONT color="green">279</FONT>        public synchronized void addLoggerAppender(org.apache.logging.log4j.core.Logger logger, Appender appender) {<a name="line.279"></a>
<FONT color="green">280</FONT>            String name = logger.getName();<a name="line.280"></a>
<FONT color="green">281</FONT>            appenders.putIfAbsent(name, appender);<a name="line.281"></a>
<FONT color="green">282</FONT>            LoggerConfig lc = getLoggerConfig(name);<a name="line.282"></a>
<FONT color="green">283</FONT>            if (lc.getName().equals(name)) {<a name="line.283"></a>
<FONT color="green">284</FONT>                lc.addAppender(appender, null, null);<a name="line.284"></a>
<FONT color="green">285</FONT>            } else {<a name="line.285"></a>
<FONT color="green">286</FONT>                LoggerConfig nlc = new LoggerConfig(name, lc.getLevel(), lc.isAdditive());<a name="line.286"></a>
<FONT color="green">287</FONT>                nlc.setConfigurationMonitor(monitor);<a name="line.287"></a>
<FONT color="green">288</FONT>                nlc.addAppender(appender, null, null);<a name="line.288"></a>
<FONT color="green">289</FONT>                nlc.setParent(lc);<a name="line.289"></a>
<FONT color="green">290</FONT>                loggers.putIfAbsent(name, nlc);<a name="line.290"></a>
<FONT color="green">291</FONT>                setParents();<a name="line.291"></a>
<FONT color="green">292</FONT>                logger.getContext().updateLoggers();<a name="line.292"></a>
<FONT color="green">293</FONT>            }<a name="line.293"></a>
<FONT color="green">294</FONT>        }<a name="line.294"></a>
<FONT color="green">295</FONT>        /**<a name="line.295"></a>
<FONT color="green">296</FONT>         * Associates a Filter with a LoggerConfig. This method is synchronized in case a Logger with the<a name="line.296"></a>
<FONT color="green">297</FONT>         * same name is being updated at the same time.<a name="line.297"></a>
<FONT color="green">298</FONT>         *<a name="line.298"></a>
<FONT color="green">299</FONT>         * Note: This method is not used when configuring via configuration. It is primarily used by<a name="line.299"></a>
<FONT color="green">300</FONT>         * unit tests.<a name="line.300"></a>
<FONT color="green">301</FONT>         * @param logger The Logger the Fo;ter will be associated with.<a name="line.301"></a>
<FONT color="green">302</FONT>         * @param filter The Filter.<a name="line.302"></a>
<FONT color="green">303</FONT>         */<a name="line.303"></a>
<FONT color="green">304</FONT>        public synchronized void addLoggerFilter(org.apache.logging.log4j.core.Logger logger, Filter filter) {<a name="line.304"></a>
<FONT color="green">305</FONT>            String name = logger.getName();<a name="line.305"></a>
<FONT color="green">306</FONT>            LoggerConfig lc = getLoggerConfig(name);<a name="line.306"></a>
<FONT color="green">307</FONT>            if (lc.getName().equals(name)) {<a name="line.307"></a>
<FONT color="green">308</FONT>    <a name="line.308"></a>
<FONT color="green">309</FONT>                lc.addFilter(filter);<a name="line.309"></a>
<FONT color="green">310</FONT>            } else {<a name="line.310"></a>
<FONT color="green">311</FONT>                LoggerConfig nlc = new LoggerConfig(name, lc.getLevel(), lc.isAdditive());<a name="line.311"></a>
<FONT color="green">312</FONT>                nlc.setConfigurationMonitor(monitor);<a name="line.312"></a>
<FONT color="green">313</FONT>                nlc.addFilter(filter);<a name="line.313"></a>
<FONT color="green">314</FONT>                nlc.setParent(lc);<a name="line.314"></a>
<FONT color="green">315</FONT>                loggers.putIfAbsent(name, nlc);<a name="line.315"></a>
<FONT color="green">316</FONT>                setParents();<a name="line.316"></a>
<FONT color="green">317</FONT>                logger.getContext().updateLoggers();<a name="line.317"></a>
<FONT color="green">318</FONT>            }<a name="line.318"></a>
<FONT color="green">319</FONT>        }<a name="line.319"></a>
<FONT color="green">320</FONT>        /**<a name="line.320"></a>
<FONT color="green">321</FONT>         * Marks a LoggerConfig as additive. This method is synchronized in case a Logger with the<a name="line.321"></a>
<FONT color="green">322</FONT>         * same name is being updated at the same time.<a name="line.322"></a>
<FONT color="green">323</FONT>         *<a name="line.323"></a>
<FONT color="green">324</FONT>         * Note: This method is not used when configuring via configuration. It is primarily used by<a name="line.324"></a>
<FONT color="green">325</FONT>         * unit tests.<a name="line.325"></a>
<FONT color="green">326</FONT>         * @param logger The Logger the Appender will be associated with.<a name="line.326"></a>
<FONT color="green">327</FONT>         * @param additive True if the LoggerConfig should be additive, false otherwise.<a name="line.327"></a>
<FONT color="green">328</FONT>         */<a name="line.328"></a>
<FONT color="green">329</FONT>        public synchronized void setLoggerAdditive(org.apache.logging.log4j.core.Logger logger, boolean additive) {<a name="line.329"></a>
<FONT color="green">330</FONT>            String name = logger.getName();<a name="line.330"></a>
<FONT color="green">331</FONT>            LoggerConfig lc = getLoggerConfig(name);<a name="line.331"></a>
<FONT color="green">332</FONT>            if (lc.getName().equals(name)) {<a name="line.332"></a>
<FONT color="green">333</FONT>                lc.setAdditive(additive);<a name="line.333"></a>
<FONT color="green">334</FONT>            } else {<a name="line.334"></a>
<FONT color="green">335</FONT>                LoggerConfig nlc = new LoggerConfig(name, lc.getLevel(), additive);<a name="line.335"></a>
<FONT color="green">336</FONT>                nlc.setConfigurationMonitor(monitor);<a name="line.336"></a>
<FONT color="green">337</FONT>                nlc.setParent(lc);<a name="line.337"></a>
<FONT color="green">338</FONT>                loggers.putIfAbsent(name, nlc);<a name="line.338"></a>
<FONT color="green">339</FONT>                setParents();<a name="line.339"></a>
<FONT color="green">340</FONT>                logger.getContext().updateLoggers();<a name="line.340"></a>
<FONT color="green">341</FONT>            }<a name="line.341"></a>
<FONT color="green">342</FONT>        }<a name="line.342"></a>
<FONT color="green">343</FONT>    <a name="line.343"></a>
<FONT color="green">344</FONT>        /**<a name="line.344"></a>
<FONT color="green">345</FONT>         * Remove an Appender. First removes any associations between LoggerContigs and the Appender, removes<a name="line.345"></a>
<FONT color="green">346</FONT>         * the Appender from this appender list and then stops the appender. This method is synchronized in<a name="line.346"></a>
<FONT color="green">347</FONT>         * case an Appender with the same name is being added during the removal.<a name="line.347"></a>
<FONT color="green">348</FONT>         * @param name the name of the appender to remove.<a name="line.348"></a>
<FONT color="green">349</FONT>         */<a name="line.349"></a>
<FONT color="green">350</FONT>        public synchronized void removeAppender(String name) {<a name="line.350"></a>
<FONT color="green">351</FONT>            for (LoggerConfig logger : loggers.values()) {<a name="line.351"></a>
<FONT color="green">352</FONT>                logger.removeAppender(name);<a name="line.352"></a>
<FONT color="green">353</FONT>            }<a name="line.353"></a>
<FONT color="green">354</FONT>            Appender app = appenders.remove(name);<a name="line.354"></a>
<FONT color="green">355</FONT>    <a name="line.355"></a>
<FONT color="green">356</FONT>            if (app != null) {<a name="line.356"></a>
<FONT color="green">357</FONT>                app.stop();<a name="line.357"></a>
<FONT color="green">358</FONT>            }<a name="line.358"></a>
<FONT color="green">359</FONT>        }<a name="line.359"></a>
<FONT color="green">360</FONT>    <a name="line.360"></a>
<FONT color="green">361</FONT>        /**<a name="line.361"></a>
<FONT color="green">362</FONT>         * Locates the appropriate LoggerConfig for a Logger name. This will remove tokens from the<a name="line.362"></a>
<FONT color="green">363</FONT>         * package name as necessary or return the root LoggerConfig if no other matches were found.<a name="line.363"></a>
<FONT color="green">364</FONT>         * @param name The Logger name.<a name="line.364"></a>
<FONT color="green">365</FONT>         * @return The located LoggerConfig.<a name="line.365"></a>
<FONT color="green">366</FONT>         */<a name="line.366"></a>
<FONT color="green">367</FONT>        public LoggerConfig getLoggerConfig(String name) {<a name="line.367"></a>
<FONT color="green">368</FONT>            if (loggers.containsKey(name)) {<a name="line.368"></a>
<FONT color="green">369</FONT>                return loggers.get(name);<a name="line.369"></a>
<FONT color="green">370</FONT>            }<a name="line.370"></a>
<FONT color="green">371</FONT>            String substr = name;<a name="line.371"></a>
<FONT color="green">372</FONT>            while ((substr = NameUtil.getSubName(substr)) != null) {<a name="line.372"></a>
<FONT color="green">373</FONT>                if (loggers.containsKey(substr)) {<a name="line.373"></a>
<FONT color="green">374</FONT>                    return loggers.get(substr);<a name="line.374"></a>
<FONT color="green">375</FONT>                }<a name="line.375"></a>
<FONT color="green">376</FONT>            }<a name="line.376"></a>
<FONT color="green">377</FONT>            return root;<a name="line.377"></a>
<FONT color="green">378</FONT>        }<a name="line.378"></a>
<FONT color="green">379</FONT>    <a name="line.379"></a>
<FONT color="green">380</FONT>        /**<a name="line.380"></a>
<FONT color="green">381</FONT>         * Returns the root Logger.<a name="line.381"></a>
<FONT color="green">382</FONT>         * @return the root Logger.<a name="line.382"></a>
<FONT color="green">383</FONT>         */<a name="line.383"></a>
<FONT color="green">384</FONT>        public LoggerConfig getRootLogger() {<a name="line.384"></a>
<FONT color="green">385</FONT>            return root;<a name="line.385"></a>
<FONT color="green">386</FONT>        }<a name="line.386"></a>
<FONT color="green">387</FONT>    <a name="line.387"></a>
<FONT color="green">388</FONT>        /**<a name="line.388"></a>
<FONT color="green">389</FONT>         * Return a Map of all the LoggerConfigs.<a name="line.389"></a>
<FONT color="green">390</FONT>         * @return a Map with each entry containing the name of the Logger and the LoggerConfig.<a name="line.390"></a>
<FONT color="green">391</FONT>         */<a name="line.391"></a>
<FONT color="green">392</FONT>        public Map&lt;String, LoggerConfig&gt; getLoggers() {<a name="line.392"></a>
<FONT color="green">393</FONT>            return Collections.unmodifiableMap(loggers);<a name="line.393"></a>
<FONT color="green">394</FONT>        }<a name="line.394"></a>
<FONT color="green">395</FONT>    <a name="line.395"></a>
<FONT color="green">396</FONT>        /**<a name="line.396"></a>
<FONT color="green">397</FONT>         * Returns the LoggerConfig with the specified name.<a name="line.397"></a>
<FONT color="green">398</FONT>         * @param name The Logger name.<a name="line.398"></a>
<FONT color="green">399</FONT>         * @return The LoggerConfig or null if no match was found.<a name="line.399"></a>
<FONT color="green">400</FONT>         */<a name="line.400"></a>
<FONT color="green">401</FONT>        public LoggerConfig getLogger(String name) {<a name="line.401"></a>
<FONT color="green">402</FONT>            return loggers.get(name);<a name="line.402"></a>
<FONT color="green">403</FONT>        }<a name="line.403"></a>
<FONT color="green">404</FONT>    <a name="line.404"></a>
<FONT color="green">405</FONT>        /**<a name="line.405"></a>
<FONT color="green">406</FONT>         * Adding a logger cannot be done atomically so is not allowed in an active configuration. Adding<a name="line.406"></a>
<FONT color="green">407</FONT>         * or removing a Logger requires creating a new configuration and then switching.<a name="line.407"></a>
<FONT color="green">408</FONT>         *<a name="line.408"></a>
<FONT color="green">409</FONT>         * @param name The name of the Logger.<a name="line.409"></a>
<FONT color="green">410</FONT>         * @param loggerConfig The LoggerConfig.<a name="line.410"></a>
<FONT color="green">411</FONT>         */<a name="line.411"></a>
<FONT color="green">412</FONT>        public void addLogger(String name, LoggerConfig loggerConfig) {<a name="line.412"></a>
<FONT color="green">413</FONT>            if (started) {<a name="line.413"></a>
<FONT color="green">414</FONT>                String msg = "Cannot add logger " + name + " to an active configuration";<a name="line.414"></a>
<FONT color="green">415</FONT>                LOGGER.warn(msg);<a name="line.415"></a>
<FONT color="green">416</FONT>                throw new IllegalStateException(msg);<a name="line.416"></a>
<FONT color="green">417</FONT>            }<a name="line.417"></a>
<FONT color="green">418</FONT>            loggers.put(name, loggerConfig);<a name="line.418"></a>
<FONT color="green">419</FONT>            setParents();<a name="line.419"></a>
<FONT color="green">420</FONT>        }<a name="line.420"></a>
<FONT color="green">421</FONT>    <a name="line.421"></a>
<FONT color="green">422</FONT>        /**<a name="line.422"></a>
<FONT color="green">423</FONT>         * Removing a logger cannot be done atomically so is not allowed in an active configuration. Adding<a name="line.423"></a>
<FONT color="green">424</FONT>         * or removing a Logger requires creating a new configuration and then switching.<a name="line.424"></a>
<FONT color="green">425</FONT>         *<a name="line.425"></a>
<FONT color="green">426</FONT>         * @param name The name of the Logger.<a name="line.426"></a>
<FONT color="green">427</FONT>         */<a name="line.427"></a>
<FONT color="green">428</FONT>        public void removeLogger(String name) {<a name="line.428"></a>
<FONT color="green">429</FONT>            if (started) {<a name="line.429"></a>
<FONT color="green">430</FONT>                String msg = "Cannot remove logger " + name + " in an active configuration";<a name="line.430"></a>
<FONT color="green">431</FONT>                LOGGER.warn(msg);<a name="line.431"></a>
<FONT color="green">432</FONT>                throw new IllegalStateException(msg);<a name="line.432"></a>
<FONT color="green">433</FONT>            }<a name="line.433"></a>
<FONT color="green">434</FONT>            loggers.remove(name);<a name="line.434"></a>
<FONT color="green">435</FONT>            setParents();<a name="line.435"></a>
<FONT color="green">436</FONT>        }<a name="line.436"></a>
<FONT color="green">437</FONT>    <a name="line.437"></a>
<FONT color="green">438</FONT>        public void createConfiguration(Node node, LogEvent event) {<a name="line.438"></a>
<FONT color="green">439</FONT>            PluginType type = node.getType();<a name="line.439"></a>
<FONT color="green">440</FONT>            if (type != null &amp;&amp; type.isDeferChildren()) {<a name="line.440"></a>
<FONT color="green">441</FONT>                node.setObject(createPluginObject(type, node, event));<a name="line.441"></a>
<FONT color="green">442</FONT>            } else {<a name="line.442"></a>
<FONT color="green">443</FONT>                for (Node child : node.getChildren()) {<a name="line.443"></a>
<FONT color="green">444</FONT>                    createConfiguration(child, event);<a name="line.444"></a>
<FONT color="green">445</FONT>                }<a name="line.445"></a>
<FONT color="green">446</FONT>    <a name="line.446"></a>
<FONT color="green">447</FONT>                if (type == null) {<a name="line.447"></a>
<FONT color="green">448</FONT>                    if (node.getParent() != null) {<a name="line.448"></a>
<FONT color="green">449</FONT>                        LOGGER.error("Unable to locate plugin for " + node.getName());<a name="line.449"></a>
<FONT color="green">450</FONT>                    }<a name="line.450"></a>
<FONT color="green">451</FONT>                } else {<a name="line.451"></a>
<FONT color="green">452</FONT>                    node.setObject(createPluginObject(type, node, event));<a name="line.452"></a>
<FONT color="green">453</FONT>                }<a name="line.453"></a>
<FONT color="green">454</FONT>            }<a name="line.454"></a>
<FONT color="green">455</FONT>        }<a name="line.455"></a>
<FONT color="green">456</FONT>    <a name="line.456"></a>
<FONT color="green">457</FONT>       /*<a name="line.457"></a>
<FONT color="green">458</FONT>        * Retrieve a static public 'method to create the desired object. Every parameter<a name="line.458"></a>
<FONT color="green">459</FONT>        * will be annotated to identify the appropriate attribute or element to use to<a name="line.459"></a>
<FONT color="green">460</FONT>        * set the value of the paraemter.<a name="line.460"></a>
<FONT color="green">461</FONT>        * Parameters annotated with PluginAttr will always be set as Strings.<a name="line.461"></a>
<FONT color="green">462</FONT>        * Parameters annotated with PluginElement may be Objects or arrays. Collections<a name="line.462"></a>
<FONT color="green">463</FONT>        * and Maps are currently not supported, although the factory method that is called<a name="line.463"></a>
<FONT color="green">464</FONT>        * can create these from an array.<a name="line.464"></a>
<FONT color="green">465</FONT>        *<a name="line.465"></a>
<FONT color="green">466</FONT>        * Although the happy path works, more work still needs to be done to log incorrect<a name="line.466"></a>
<FONT color="green">467</FONT>        * parameters. These will generally result in unhelpful InvocationTargetExceptions.<a name="line.467"></a>
<FONT color="green">468</FONT>        * @param classClass the class.<a name="line.468"></a>
<FONT color="green">469</FONT>        * @return the instantiate method or null if there is none by that<a name="line.469"></a>
<FONT color="green">470</FONT>        * description.<a name="line.470"></a>
<FONT color="green">471</FONT>        */<a name="line.471"></a>
<FONT color="green">472</FONT>        private Object createPluginObject(PluginType type, Node node, LogEvent event)<a name="line.472"></a>
<FONT color="green">473</FONT>        {<a name="line.473"></a>
<FONT color="green">474</FONT>            Class clazz = type.getPluginClass();<a name="line.474"></a>
<FONT color="green">475</FONT>    <a name="line.475"></a>
<FONT color="green">476</FONT>            if (Map.class.isAssignableFrom(clazz)) {<a name="line.476"></a>
<FONT color="green">477</FONT>                try {<a name="line.477"></a>
<FONT color="green">478</FONT>                    Map&lt;String, Object&gt; map = (Map&lt;String, Object&gt;) clazz.newInstance();<a name="line.478"></a>
<FONT color="green">479</FONT>                    for (Node child : node.getChildren()) {<a name="line.479"></a>
<FONT color="green">480</FONT>                        map.put(child.getName(), child.getObject());<a name="line.480"></a>
<FONT color="green">481</FONT>                    }<a name="line.481"></a>
<FONT color="green">482</FONT>                    return map;<a name="line.482"></a>
<FONT color="green">483</FONT>                } catch (Exception ex) {<a name="line.483"></a>
<FONT color="green">484</FONT>                    LOGGER.warn("Unable to create Map for " + type.getElementName() + " of class " +<a name="line.484"></a>
<FONT color="green">485</FONT>                        clazz);<a name="line.485"></a>
<FONT color="green">486</FONT>                }<a name="line.486"></a>
<FONT color="green">487</FONT>            }<a name="line.487"></a>
<FONT color="green">488</FONT>    <a name="line.488"></a>
<FONT color="green">489</FONT>            if (List.class.isAssignableFrom(clazz)) {<a name="line.489"></a>
<FONT color="green">490</FONT>                try {<a name="line.490"></a>
<FONT color="green">491</FONT>                    List&lt;Object&gt; list = (List&lt;Object&gt;) clazz.newInstance();<a name="line.491"></a>
<FONT color="green">492</FONT>                    for (Node child : node.getChildren()) {<a name="line.492"></a>
<FONT color="green">493</FONT>                        list.add(child.getObject());<a name="line.493"></a>
<FONT color="green">494</FONT>                    }<a name="line.494"></a>
<FONT color="green">495</FONT>                    return list;<a name="line.495"></a>
<FONT color="green">496</FONT>                } catch (Exception ex) {<a name="line.496"></a>
<FONT color="green">497</FONT>                    LOGGER.warn("Unable to create List for " + type.getElementName() + " of class " +<a name="line.497"></a>
<FONT color="green">498</FONT>                        clazz);<a name="line.498"></a>
<FONT color="green">499</FONT>                }<a name="line.499"></a>
<FONT color="green">500</FONT>            }<a name="line.500"></a>
<FONT color="green">501</FONT>    <a name="line.501"></a>
<FONT color="green">502</FONT>            Method factoryMethod = null;<a name="line.502"></a>
<FONT color="green">503</FONT>    <a name="line.503"></a>
<FONT color="green">504</FONT>            for (Method method : clazz.getMethods()) {<a name="line.504"></a>
<FONT color="green">505</FONT>                if (method.isAnnotationPresent(PluginFactory.class)) {<a name="line.505"></a>
<FONT color="green">506</FONT>                    factoryMethod = method;<a name="line.506"></a>
<FONT color="green">507</FONT>                    break;<a name="line.507"></a>
<FONT color="green">508</FONT>                }<a name="line.508"></a>
<FONT color="green">509</FONT>            }<a name="line.509"></a>
<FONT color="green">510</FONT>            if (factoryMethod == null) {<a name="line.510"></a>
<FONT color="green">511</FONT>                return null;<a name="line.511"></a>
<FONT color="green">512</FONT>            }<a name="line.512"></a>
<FONT color="green">513</FONT>    <a name="line.513"></a>
<FONT color="green">514</FONT>            Annotation[][] parmArray = factoryMethod.getParameterAnnotations();<a name="line.514"></a>
<FONT color="green">515</FONT>            Class[] parmClasses = factoryMethod.getParameterTypes();<a name="line.515"></a>
<FONT color="green">516</FONT>            if (parmArray.length != parmClasses.length) {<a name="line.516"></a>
<FONT color="green">517</FONT>                LOGGER.error("Number of parameter annotations does not equal the number of paramters");<a name="line.517"></a>
<FONT color="green">518</FONT>            }<a name="line.518"></a>
<FONT color="green">519</FONT>            Object[] parms = new Object[parmClasses.length];<a name="line.519"></a>
<FONT color="green">520</FONT>    <a name="line.520"></a>
<FONT color="green">521</FONT>            int index = 0;<a name="line.521"></a>
<FONT color="green">522</FONT>            Map&lt;String, String&gt; attrs = node.getAttributes();<a name="line.522"></a>
<FONT color="green">523</FONT>            List&lt;Node&gt; children = node.getChildren();<a name="line.523"></a>
<FONT color="green">524</FONT>            StringBuilder sb = new StringBuilder();<a name="line.524"></a>
<FONT color="green">525</FONT>            List&lt;Node&gt; used = new ArrayList&lt;Node&gt;();<a name="line.525"></a>
<FONT color="green">526</FONT>    <a name="line.526"></a>
<FONT color="green">527</FONT>            /*<a name="line.527"></a>
<FONT color="green">528</FONT>             * For each parameter:<a name="line.528"></a>
<FONT color="green">529</FONT>             * If the parameter is an attribute store the value of the attribute in the parameter array.<a name="line.529"></a>
<FONT color="green">530</FONT>             * If the parameter is an element:<a name="line.530"></a>
<FONT color="green">531</FONT>             *   Determine if the required parameter is an array.<a name="line.531"></a>
<FONT color="green">532</FONT>             *     If so, if a child contains the array, use it,<a name="line.532"></a>
<FONT color="green">533</FONT>             *      otherwise create the array from all child nodes of the correct type.<a name="line.533"></a>
<FONT color="green">534</FONT>             *     Store the array into the parameter array.<a name="line.534"></a>
<FONT color="green">535</FONT>             *   If not an array, store the object in the child node into the parameter array.<a name="line.535"></a>
<FONT color="green">536</FONT>             */<a name="line.536"></a>
<FONT color="green">537</FONT>            for (Annotation[] parmTypes : parmArray) {<a name="line.537"></a>
<FONT color="green">538</FONT>                for (Annotation a : parmTypes) {<a name="line.538"></a>
<FONT color="green">539</FONT>                    if (sb.length() == 0) {<a name="line.539"></a>
<FONT color="green">540</FONT>                        sb.append(" with params(");<a name="line.540"></a>
<FONT color="green">541</FONT>                    } else {<a name="line.541"></a>
<FONT color="green">542</FONT>                        sb.append(", ");<a name="line.542"></a>
<FONT color="green">543</FONT>                    }<a name="line.543"></a>
<FONT color="green">544</FONT>                    if (a instanceof PluginNode) {<a name="line.544"></a>
<FONT color="green">545</FONT>                        parms[index] = node;<a name="line.545"></a>
<FONT color="green">546</FONT>                        sb.append("Node=").append(node.getName());<a name="line.546"></a>
<FONT color="green">547</FONT>                    } else if (a instanceof PluginConfiguration) {<a name="line.547"></a>
<FONT color="green">548</FONT>                        parms[index] = this;<a name="line.548"></a>
<FONT color="green">549</FONT>                        if (this.name != null) {<a name="line.549"></a>
<FONT color="green">550</FONT>                            sb.append("Configuration(").append(name).append(")");<a name="line.550"></a>
<FONT color="green">551</FONT>                        } else {<a name="line.551"></a>
<FONT color="green">552</FONT>                            sb.append("Configuration");<a name="line.552"></a>
<FONT color="green">553</FONT>                        }<a name="line.553"></a>
<FONT color="green">554</FONT>                    } else if (a instanceof PluginValue) {<a name="line.554"></a>
<FONT color="green">555</FONT>                        String name = ((PluginValue) a).value();<a name="line.555"></a>
<FONT color="green">556</FONT>                        String v = node.getValue();<a name="line.556"></a>
<FONT color="green">557</FONT>                        if (v == null) {<a name="line.557"></a>
<FONT color="green">558</FONT>                            v = getAttrValue("value", attrs);<a name="line.558"></a>
<FONT color="green">559</FONT>                        }<a name="line.559"></a>
<FONT color="green">560</FONT>                        String value = subst.replace(event, v);<a name="line.560"></a>
<FONT color="green">561</FONT>                        sb.append(name).append("=\"").append(value).append("\"");<a name="line.561"></a>
<FONT color="green">562</FONT>                        parms[index] = value;<a name="line.562"></a>
<FONT color="green">563</FONT>                    } else if (a instanceof PluginAttr) {<a name="line.563"></a>
<FONT color="green">564</FONT>                        String name = ((PluginAttr) a).value();<a name="line.564"></a>
<FONT color="green">565</FONT>                        String value = subst.replace(event, getAttrValue(name, attrs));<a name="line.565"></a>
<FONT color="green">566</FONT>                        sb.append(name).append("=\"").append(value).append("\"");<a name="line.566"></a>
<FONT color="green">567</FONT>                        parms[index] = value;<a name="line.567"></a>
<FONT color="green">568</FONT>                    } else if (a instanceof PluginElement) {<a name="line.568"></a>
<FONT color="green">569</FONT>                        PluginElement elem = (PluginElement) a;<a name="line.569"></a>
<FONT color="green">570</FONT>                        String name = elem.value();<a name="line.570"></a>
<FONT color="green">571</FONT>                        if (parmClasses[index].isArray()) {<a name="line.571"></a>
<FONT color="green">572</FONT>                            Class parmClass = parmClasses[index].getComponentType();<a name="line.572"></a>
<FONT color="green">573</FONT>                            List&lt;Object&gt; list = new ArrayList&lt;Object&gt;();<a name="line.573"></a>
<FONT color="green">574</FONT>                            sb.append(name).append("={");<a name="line.574"></a>
<FONT color="green">575</FONT>                            boolean first = true;<a name="line.575"></a>
<FONT color="green">576</FONT>                            for (Node child : children) {<a name="line.576"></a>
<FONT color="green">577</FONT>                                PluginType childType = child.getType();<a name="line.577"></a>
<FONT color="green">578</FONT>                                if (elem.value().equalsIgnoreCase(childType.getElementName()) ||<a name="line.578"></a>
<FONT color="green">579</FONT>                                    parmClass.isAssignableFrom(childType.getPluginClass())) {<a name="line.579"></a>
<FONT color="green">580</FONT>                                    used.add(child);<a name="line.580"></a>
<FONT color="green">581</FONT>                                    if (!first) {<a name="line.581"></a>
<FONT color="green">582</FONT>                                        sb.append(", ");<a name="line.582"></a>
<FONT color="green">583</FONT>                                    }<a name="line.583"></a>
<FONT color="green">584</FONT>                                    first = false;<a name="line.584"></a>
<FONT color="green">585</FONT>                                    Object obj = child.getObject();<a name="line.585"></a>
<FONT color="green">586</FONT>                                    if (obj == null) {<a name="line.586"></a>
<FONT color="green">587</FONT>                                        System.out.println("Null object returned for " + child.getName());<a name="line.587"></a>
<FONT color="green">588</FONT>                                    }<a name="line.588"></a>
<FONT color="green">589</FONT>                                    if (obj.getClass().isArray()) {<a name="line.589"></a>
<FONT color="green">590</FONT>                                        printArray(sb, (Object[]) obj);<a name="line.590"></a>
<FONT color="green">591</FONT>                                        parms[index] = obj;<a name="line.591"></a>
<FONT color="green">592</FONT>                                        break;<a name="line.592"></a>
<FONT color="green">593</FONT>                                    }<a name="line.593"></a>
<FONT color="green">594</FONT>                                    sb.append(child.toString());<a name="line.594"></a>
<FONT color="green">595</FONT>                                    list.add(obj);<a name="line.595"></a>
<FONT color="green">596</FONT>                                }<a name="line.596"></a>
<FONT color="green">597</FONT>                            }<a name="line.597"></a>
<FONT color="green">598</FONT>                            sb.append("}");<a name="line.598"></a>
<FONT color="green">599</FONT>                            if (parms[index] != null) {<a name="line.599"></a>
<FONT color="green">600</FONT>                                break;<a name="line.600"></a>
<FONT color="green">601</FONT>                            }<a name="line.601"></a>
<FONT color="green">602</FONT>                            if (list.size() &gt; 0 &amp;&amp; !parmClass.isAssignableFrom(list.get(0).getClass())) {<a name="line.602"></a>
<FONT color="green">603</FONT>                                LOGGER.error("Attempted to assign List containing class " +<a name="line.603"></a>
<FONT color="green">604</FONT>                                    list.get(0).getClass().getName() + " to array of type " + parmClass +<a name="line.604"></a>
<FONT color="green">605</FONT>                                    " for attribute " + name);<a name="line.605"></a>
<FONT color="green">606</FONT>                                break;<a name="line.606"></a>
<FONT color="green">607</FONT>                            }<a name="line.607"></a>
<FONT color="green">608</FONT>                            Object[] array = (Object[]) Array.newInstance(parmClass, list.size());<a name="line.608"></a>
<FONT color="green">609</FONT>                            int i = 0;<a name="line.609"></a>
<FONT color="green">610</FONT>                            for (Object obj : list) {<a name="line.610"></a>
<FONT color="green">611</FONT>                                array[i] = obj;<a name="line.611"></a>
<FONT color="green">612</FONT>                                ++i;<a name="line.612"></a>
<FONT color="green">613</FONT>                            }<a name="line.613"></a>
<FONT color="green">614</FONT>                            parms[index] = array;<a name="line.614"></a>
<FONT color="green">615</FONT>                        } else {<a name="line.615"></a>
<FONT color="green">616</FONT>                            Class parmClass = parmClasses[index];<a name="line.616"></a>
<FONT color="green">617</FONT>                            boolean present = false;<a name="line.617"></a>
<FONT color="green">618</FONT>                            for (Node child : children) {<a name="line.618"></a>
<FONT color="green">619</FONT>                                PluginType childType = child.getType();<a name="line.619"></a>
<FONT color="green">620</FONT>                                if (elem.value().equals(childType.getElementName()) ||<a name="line.620"></a>
<FONT color="green">621</FONT>                                    parmClass.isAssignableFrom(childType.getPluginClass())) {<a name="line.621"></a>
<FONT color="green">622</FONT>                                    sb.append(child.getName()).append("(").append(child.toString()).append(")");<a name="line.622"></a>
<FONT color="green">623</FONT>                                    present = true;<a name="line.623"></a>
<FONT color="green">624</FONT>                                    used.add(child);<a name="line.624"></a>
<FONT color="green">625</FONT>                                    parms[index] = child.getObject();<a name="line.625"></a>
<FONT color="green">626</FONT>                                    break;<a name="line.626"></a>
<FONT color="green">627</FONT>                                }<a name="line.627"></a>
<FONT color="green">628</FONT>                            }<a name="line.628"></a>
<FONT color="green">629</FONT>                            if (!present) {<a name="line.629"></a>
<FONT color="green">630</FONT>                                sb.append("null");<a name="line.630"></a>
<FONT color="green">631</FONT>                            }<a name="line.631"></a>
<FONT color="green">632</FONT>                        }<a name="line.632"></a>
<FONT color="green">633</FONT>                    }<a name="line.633"></a>
<FONT color="green">634</FONT>                }<a name="line.634"></a>
<FONT color="green">635</FONT>                ++index;<a name="line.635"></a>
<FONT color="green">636</FONT>            }<a name="line.636"></a>
<FONT color="green">637</FONT>            if (sb.length() &gt; 0) {<a name="line.637"></a>
<FONT color="green">638</FONT>                sb.append(")");<a name="line.638"></a>
<FONT color="green">639</FONT>            }<a name="line.639"></a>
<FONT color="green">640</FONT>    <a name="line.640"></a>
<FONT color="green">641</FONT>            if (attrs.size() &gt; 0) {<a name="line.641"></a>
<FONT color="green">642</FONT>                StringBuilder eb = new StringBuilder();<a name="line.642"></a>
<FONT color="green">643</FONT>                for (String key : attrs.keySet()) {<a name="line.643"></a>
<FONT color="green">644</FONT>                    if (eb.length() == 0) {<a name="line.644"></a>
<FONT color="green">645</FONT>                        eb.append(node.getName());<a name="line.645"></a>
<FONT color="green">646</FONT>                        eb.append(" contains ");<a name="line.646"></a>
<FONT color="green">647</FONT>                        if (attrs.size() == 1) {<a name="line.647"></a>
<FONT color="green">648</FONT>                            eb.append("an invalid element or attribute ");<a name="line.648"></a>
<FONT color="green">649</FONT>                        } else {<a name="line.649"></a>
<FONT color="green">650</FONT>                            eb.append("invalid attributes ");<a name="line.650"></a>
<FONT color="green">651</FONT>                        }<a name="line.651"></a>
<FONT color="green">652</FONT>                    } else {<a name="line.652"></a>
<FONT color="green">653</FONT>                        eb.append(", ");<a name="line.653"></a>
<FONT color="green">654</FONT>                    }<a name="line.654"></a>
<FONT color="green">655</FONT>                    eb.append("\"");<a name="line.655"></a>
<FONT color="green">656</FONT>                    eb.append(key);<a name="line.656"></a>
<FONT color="green">657</FONT>                    eb.append("\"");<a name="line.657"></a>
<FONT color="green">658</FONT>    <a name="line.658"></a>
<FONT color="green">659</FONT>                }<a name="line.659"></a>
<FONT color="green">660</FONT>                LOGGER.error(eb.toString());<a name="line.660"></a>
<FONT color="green">661</FONT>            }<a name="line.661"></a>
<FONT color="green">662</FONT>    <a name="line.662"></a>
<FONT color="green">663</FONT>            if (!type.isDeferChildren() &amp;&amp; used.size() != children.size()) {<a name="line.663"></a>
<FONT color="green">664</FONT>                for (Node child : children) {<a name="line.664"></a>
<FONT color="green">665</FONT>                    if (used.contains(child)) {<a name="line.665"></a>
<FONT color="green">666</FONT>                        continue;<a name="line.666"></a>
<FONT color="green">667</FONT>                    }<a name="line.667"></a>
<FONT color="green">668</FONT>                    String nodeType = node.getType().getElementName();<a name="line.668"></a>
<FONT color="green">669</FONT>                    String start = nodeType.equals(node.getName()) ? node.getName() : nodeType + " " + node.getName();<a name="line.669"></a>
<FONT color="green">670</FONT>                    LOGGER.error(start + " has no parameter that matches element " + child.getName());<a name="line.670"></a>
<FONT color="green">671</FONT>                }<a name="line.671"></a>
<FONT color="green">672</FONT>            }<a name="line.672"></a>
<FONT color="green">673</FONT>    <a name="line.673"></a>
<FONT color="green">674</FONT>            try {<a name="line.674"></a>
<FONT color="green">675</FONT>                int mod = factoryMethod.getModifiers();<a name="line.675"></a>
<FONT color="green">676</FONT>                if (!Modifier.isStatic(mod)) {<a name="line.676"></a>
<FONT color="green">677</FONT>                    LOGGER.error(factoryMethod.getName() + " method is not static on class " +<a name="line.677"></a>
<FONT color="green">678</FONT>                        clazz.getName() + " for element " + node.getName());<a name="line.678"></a>
<FONT color="green">679</FONT>                    return null;<a name="line.679"></a>
<FONT color="green">680</FONT>                }<a name="line.680"></a>
<FONT color="green">681</FONT>                LOGGER.debug("Calling {} on class {} for element {}", factoryMethod.getName(), clazz.getName(),<a name="line.681"></a>
<FONT color="green">682</FONT>                    node.getName(), sb.toString());<a name="line.682"></a>
<FONT color="green">683</FONT>                //if (parms.length &gt; 0) {<a name="line.683"></a>
<FONT color="green">684</FONT>                    return factoryMethod.invoke(null, parms);<a name="line.684"></a>
<FONT color="green">685</FONT>                //}<a name="line.685"></a>
<FONT color="green">686</FONT>                //return factoryMethod.invoke(null, node);<a name="line.686"></a>
<FONT color="green">687</FONT>            } catch (Exception e) {<a name="line.687"></a>
<FONT color="green">688</FONT>                LOGGER.error("Unable to invoke method " + factoryMethod.getName() + " in class " +<a name="line.688"></a>
<FONT color="green">689</FONT>                    clazz.getName() + " for element " + node.getName(), e);<a name="line.689"></a>
<FONT color="green">690</FONT>            }<a name="line.690"></a>
<FONT color="green">691</FONT>            return null;<a name="line.691"></a>
<FONT color="green">692</FONT>        }<a name="line.692"></a>
<FONT color="green">693</FONT>    <a name="line.693"></a>
<FONT color="green">694</FONT>        private void printArray(StringBuilder sb, Object[] array) {<a name="line.694"></a>
<FONT color="green">695</FONT>            boolean first = true;<a name="line.695"></a>
<FONT color="green">696</FONT>            for (Object obj : array) {<a name="line.696"></a>
<FONT color="green">697</FONT>                if (!first) {<a name="line.697"></a>
<FONT color="green">698</FONT>                    sb.append(", ");<a name="line.698"></a>
<FONT color="green">699</FONT>                }<a name="line.699"></a>
<FONT color="green">700</FONT>                sb.append(obj.toString());<a name="line.700"></a>
<FONT color="green">701</FONT>                first = false;<a name="line.701"></a>
<FONT color="green">702</FONT>            }<a name="line.702"></a>
<FONT color="green">703</FONT>        }<a name="line.703"></a>
<FONT color="green">704</FONT>    <a name="line.704"></a>
<FONT color="green">705</FONT>        private String getAttrValue(String name, Map&lt;String, String&gt; attrs) {<a name="line.705"></a>
<FONT color="green">706</FONT>            for (String key : attrs.keySet()) {<a name="line.706"></a>
<FONT color="green">707</FONT>                if (key.equalsIgnoreCase(name)) {<a name="line.707"></a>
<FONT color="green">708</FONT>                    String attr = attrs.get(key);<a name="line.708"></a>
<FONT color="green">709</FONT>                    attrs.remove(key);<a name="line.709"></a>
<FONT color="green">710</FONT>                    return attr;<a name="line.710"></a>
<FONT color="green">711</FONT>                }<a name="line.711"></a>
<FONT color="green">712</FONT>            }<a name="line.712"></a>
<FONT color="green">713</FONT>            return null;<a name="line.713"></a>
<FONT color="green">714</FONT>        }<a name="line.714"></a>
<FONT color="green">715</FONT>    <a name="line.715"></a>
<FONT color="green">716</FONT>        private void setParents() {<a name="line.716"></a>
<FONT color="green">717</FONT>             for (Map.Entry&lt;String, LoggerConfig&gt; entry : loggers.entrySet()) {<a name="line.717"></a>
<FONT color="green">718</FONT>                LoggerConfig logger = entry.getValue();<a name="line.718"></a>
<FONT color="green">719</FONT>                String name = entry.getKey();<a name="line.719"></a>
<FONT color="green">720</FONT>                if (!name.equals("")) {<a name="line.720"></a>
<FONT color="green">721</FONT>                    int i = name.lastIndexOf(".");<a name="line.721"></a>
<FONT color="green">722</FONT>                    if (i &gt; 0) {<a name="line.722"></a>
<FONT color="green">723</FONT>                        name = name.substring(0, i);<a name="line.723"></a>
<FONT color="green">724</FONT>                        LoggerConfig parent = getLoggerConfig(name);<a name="line.724"></a>
<FONT color="green">725</FONT>                        if (parent == null) {<a name="line.725"></a>
<FONT color="green">726</FONT>                            parent = root;<a name="line.726"></a>
<FONT color="green">727</FONT>                        }<a name="line.727"></a>
<FONT color="green">728</FONT>                        logger.setParent(parent);<a name="line.728"></a>
<FONT color="green">729</FONT>                    }<a name="line.729"></a>
<FONT color="green">730</FONT>                }<a name="line.730"></a>
<FONT color="green">731</FONT>            }<a name="line.731"></a>
<FONT color="green">732</FONT>        }<a name="line.732"></a>
<FONT color="green">733</FONT>    }<a name="line.733"></a>




























































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