<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<title>Source code</title>
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
</head>
<body>
<div class="sourceContainer">
<pre><span class="sourceLineNo">001</span>/*<a name="line.1"></a>
<span class="sourceLineNo">002</span> * Licensed to the Apache Software Foundation (ASF) under one or more<a name="line.2"></a>
<span class="sourceLineNo">003</span> * contributor license agreements. See the NOTICE file distributed with<a name="line.3"></a>
<span class="sourceLineNo">004</span> * this work for additional information regarding copyright ownership.<a name="line.4"></a>
<span class="sourceLineNo">005</span> * The ASF licenses this file to You under the Apache license, Version 2.0<a name="line.5"></a>
<span class="sourceLineNo">006</span> * (the "License"); you may not use this file except in compliance with<a name="line.6"></a>
<span class="sourceLineNo">007</span> * the License. You may obtain a copy of the License at<a name="line.7"></a>
<span class="sourceLineNo">008</span> *<a name="line.8"></a>
<span class="sourceLineNo">009</span> *      http://www.apache.org/licenses/LICENSE-2.0<a name="line.9"></a>
<span class="sourceLineNo">010</span> *<a name="line.10"></a>
<span class="sourceLineNo">011</span> * Unless required by applicable law or agreed to in writing, software<a name="line.11"></a>
<span class="sourceLineNo">012</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.12"></a>
<span class="sourceLineNo">013</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.13"></a>
<span class="sourceLineNo">014</span> * See the license for the specific language governing permissions and<a name="line.14"></a>
<span class="sourceLineNo">015</span> * limitations under the license.<a name="line.15"></a>
<span class="sourceLineNo">016</span> */<a name="line.16"></a>
<span class="sourceLineNo">017</span>package org.apache.log4j.xml;<a name="line.17"></a>
<span class="sourceLineNo">018</span><a name="line.18"></a>
<span class="sourceLineNo">019</span>import org.apache.log4j.Appender;<a name="line.19"></a>
<span class="sourceLineNo">020</span>import org.apache.log4j.Layout;<a name="line.20"></a>
<span class="sourceLineNo">021</span>import org.apache.log4j.Level;<a name="line.21"></a>
<span class="sourceLineNo">022</span>import org.apache.log4j.bridge.AppenderAdapter;<a name="line.22"></a>
<span class="sourceLineNo">023</span>import org.apache.log4j.bridge.AppenderWrapper;<a name="line.23"></a>
<span class="sourceLineNo">024</span>import org.apache.log4j.config.Log4j1Configuration;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import org.apache.log4j.config.PropertySetter;<a name="line.25"></a>
<span class="sourceLineNo">026</span>import org.apache.log4j.helpers.OptionConverter;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import org.apache.log4j.rewrite.RewritePolicy;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import org.apache.log4j.spi.AppenderAttachable;<a name="line.28"></a>
<span class="sourceLineNo">029</span>import org.apache.log4j.spi.ErrorHandler;<a name="line.29"></a>
<span class="sourceLineNo">030</span>import org.apache.log4j.spi.Filter;<a name="line.30"></a>
<span class="sourceLineNo">031</span>import org.apache.logging.log4j.core.LoggerContext;<a name="line.31"></a>
<span class="sourceLineNo">032</span>import org.apache.logging.log4j.core.config.ConfigurationSource;<a name="line.32"></a>
<span class="sourceLineNo">033</span>import org.apache.logging.log4j.core.config.LoggerConfig;<a name="line.33"></a>
<span class="sourceLineNo">034</span>import org.apache.logging.log4j.core.config.status.StatusConfiguration;<a name="line.34"></a>
<span class="sourceLineNo">035</span>import org.apache.logging.log4j.status.StatusLogger;<a name="line.35"></a>
<span class="sourceLineNo">036</span>import org.apache.logging.log4j.util.LoaderUtil;<a name="line.36"></a>
<span class="sourceLineNo">037</span>import org.w3c.dom.Document;<a name="line.37"></a>
<span class="sourceLineNo">038</span>import org.w3c.dom.Element;<a name="line.38"></a>
<span class="sourceLineNo">039</span>import org.w3c.dom.NamedNodeMap;<a name="line.39"></a>
<span class="sourceLineNo">040</span>import org.w3c.dom.Node;<a name="line.40"></a>
<span class="sourceLineNo">041</span>import org.w3c.dom.NodeList;<a name="line.41"></a>
<span class="sourceLineNo">042</span>import org.xml.sax.InputSource;<a name="line.42"></a>
<span class="sourceLineNo">043</span>import org.xml.sax.SAXException;<a name="line.43"></a>
<span class="sourceLineNo">044</span>import org.xml.sax.SAXParseException;<a name="line.44"></a>
<span class="sourceLineNo">045</span><a name="line.45"></a>
<span class="sourceLineNo">046</span>import javax.xml.parsers.DocumentBuilder;<a name="line.46"></a>
<span class="sourceLineNo">047</span>import javax.xml.parsers.DocumentBuilderFactory;<a name="line.47"></a>
<span class="sourceLineNo">048</span>import javax.xml.parsers.FactoryConfigurationError;<a name="line.48"></a>
<span class="sourceLineNo">049</span>import java.io.IOException;<a name="line.49"></a>
<span class="sourceLineNo">050</span>import java.io.InterruptedIOException;<a name="line.50"></a>
<span class="sourceLineNo">051</span>import java.lang.reflect.Method;<a name="line.51"></a>
<span class="sourceLineNo">052</span>import java.util.HashMap;<a name="line.52"></a>
<span class="sourceLineNo">053</span>import java.util.Map;<a name="line.53"></a>
<span class="sourceLineNo">054</span>import java.util.Properties;<a name="line.54"></a>
<span class="sourceLineNo">055</span>import java.util.function.Consumer;<a name="line.55"></a>
<span class="sourceLineNo">056</span><a name="line.56"></a>
<span class="sourceLineNo">057</span>/**<a name="line.57"></a>
<span class="sourceLineNo">058</span> * Class Description goes here.<a name="line.58"></a>
<span class="sourceLineNo">059</span> */<a name="line.59"></a>
<span class="sourceLineNo">060</span>public class XmlConfiguration extends Log4j1Configuration {<a name="line.60"></a>
<span class="sourceLineNo">061</span><a name="line.61"></a>
<span class="sourceLineNo">062</span>    private static final org.apache.logging.log4j.Logger LOGGER = StatusLogger.getLogger();<a name="line.62"></a>
<span class="sourceLineNo">063</span><a name="line.63"></a>
<span class="sourceLineNo">064</span>    private static final String CONFIGURATION_TAG = "log4j:configuration";<a name="line.64"></a>
<span class="sourceLineNo">065</span>    private static final String OLD_CONFIGURATION_TAG = "configuration";<a name="line.65"></a>
<span class="sourceLineNo">066</span>    private static final String RENDERER_TAG = "renderer";<a name="line.66"></a>
<span class="sourceLineNo">067</span>    private static final String APPENDER_TAG = "appender";<a name="line.67"></a>
<span class="sourceLineNo">068</span>    public  static final String PARAM_TAG = "param";<a name="line.68"></a>
<span class="sourceLineNo">069</span>    public static final String LAYOUT_TAG = "layout";<a name="line.69"></a>
<span class="sourceLineNo">070</span>    private static final String CATEGORY = "category";<a name="line.70"></a>
<span class="sourceLineNo">071</span>    private static final String LOGGER_ELEMENT = "logger";<a name="line.71"></a>
<span class="sourceLineNo">072</span>    private static final String CATEGORY_FACTORY_TAG = "categoryFactory";<a name="line.72"></a>
<span class="sourceLineNo">073</span>    private static final String LOGGER_FACTORY_TAG = "loggerFactory";<a name="line.73"></a>
<span class="sourceLineNo">074</span>    public static final String NAME_ATTR = "name";<a name="line.74"></a>
<span class="sourceLineNo">075</span>    private static final String CLASS_ATTR = "class";<a name="line.75"></a>
<span class="sourceLineNo">076</span>    public static final String VALUE_ATTR = "value";<a name="line.76"></a>
<span class="sourceLineNo">077</span>    private static final String ROOT_TAG = "root";<a name="line.77"></a>
<span class="sourceLineNo">078</span>    private static final String LEVEL_TAG = "level";<a name="line.78"></a>
<span class="sourceLineNo">079</span>    private static final String PRIORITY_TAG = "priority";<a name="line.79"></a>
<span class="sourceLineNo">080</span>    public static final String FILTER_TAG = "filter";<a name="line.80"></a>
<span class="sourceLineNo">081</span>    private static final String ERROR_HANDLER_TAG = "errorHandler";<a name="line.81"></a>
<span class="sourceLineNo">082</span>    public static final String REF_ATTR = "ref";<a name="line.82"></a>
<span class="sourceLineNo">083</span>    private static final String ADDITIVITY_ATTR = "additivity";<a name="line.83"></a>
<span class="sourceLineNo">084</span>    private static final String CONFIG_DEBUG_ATTR = "configDebug";<a name="line.84"></a>
<span class="sourceLineNo">085</span>    private static final String INTERNAL_DEBUG_ATTR = "debug";<a name="line.85"></a>
<span class="sourceLineNo">086</span>    private static final String EMPTY_STR = "";<a name="line.86"></a>
<span class="sourceLineNo">087</span>    private static final Class[] ONE_STRING_PARAM = new Class[]{String.class};<a name="line.87"></a>
<span class="sourceLineNo">088</span>    private static final String dbfKey = "javax.xml.parsers.DocumentBuilderFactory";<a name="line.88"></a>
<span class="sourceLineNo">089</span>    private static final String THROWABLE_RENDERER_TAG = "throwableRenderer";<a name="line.89"></a>
<span class="sourceLineNo">090</span><a name="line.90"></a>
<span class="sourceLineNo">091</span>    public static final long DEFAULT_DELAY = 60000;<a name="line.91"></a>
<span class="sourceLineNo">092</span>    /**<a name="line.92"></a>
<span class="sourceLineNo">093</span>     * File name prefix for test configurations.<a name="line.93"></a>
<span class="sourceLineNo">094</span>     */<a name="line.94"></a>
<span class="sourceLineNo">095</span>    protected static final String TEST_PREFIX = "log4j-test";<a name="line.95"></a>
<span class="sourceLineNo">096</span><a name="line.96"></a>
<span class="sourceLineNo">097</span>    /**<a name="line.97"></a>
<span class="sourceLineNo">098</span>     * File name prefix for standard configurations.<a name="line.98"></a>
<span class="sourceLineNo">099</span>     */<a name="line.99"></a>
<span class="sourceLineNo">100</span>    protected static final String DEFAULT_PREFIX = "log4j";<a name="line.100"></a>
<span class="sourceLineNo">101</span><a name="line.101"></a>
<span class="sourceLineNo">102</span>    // key: appenderName, value: appender<a name="line.102"></a>
<span class="sourceLineNo">103</span>    private Map&lt;String, Appender&gt; appenderMap;<a name="line.103"></a>
<span class="sourceLineNo">104</span><a name="line.104"></a>
<span class="sourceLineNo">105</span>    private Properties props = null;<a name="line.105"></a>
<span class="sourceLineNo">106</span><a name="line.106"></a>
<span class="sourceLineNo">107</span>    public XmlConfiguration(final LoggerContext loggerContext, final ConfigurationSource source,<a name="line.107"></a>
<span class="sourceLineNo">108</span>            int monitorIntervalSeconds) {<a name="line.108"></a>
<span class="sourceLineNo">109</span>        super(loggerContext, source, monitorIntervalSeconds);<a name="line.109"></a>
<span class="sourceLineNo">110</span>        appenderMap = new HashMap&lt;&gt;();<a name="line.110"></a>
<span class="sourceLineNo">111</span>    }<a name="line.111"></a>
<span class="sourceLineNo">112</span><a name="line.112"></a>
<span class="sourceLineNo">113</span>    public void addAppenderIfAbsent(Appender appender) {<a name="line.113"></a>
<span class="sourceLineNo">114</span>        appenderMap.putIfAbsent(appender.getName(), appender);<a name="line.114"></a>
<span class="sourceLineNo">115</span>    }<a name="line.115"></a>
<span class="sourceLineNo">116</span><a name="line.116"></a>
<span class="sourceLineNo">117</span>    /**<a name="line.117"></a>
<span class="sourceLineNo">118</span>     * Configure log4j by reading in a log4j.dtd compliant XML<a name="line.118"></a>
<span class="sourceLineNo">119</span>     * configuration file.<a name="line.119"></a>
<span class="sourceLineNo">120</span>     */<a name="line.120"></a>
<span class="sourceLineNo">121</span>    @Override<a name="line.121"></a>
<span class="sourceLineNo">122</span>    public void doConfigure() throws FactoryConfigurationError {<a name="line.122"></a>
<span class="sourceLineNo">123</span>        ConfigurationSource source = getConfigurationSource();<a name="line.123"></a>
<span class="sourceLineNo">124</span>        ParseAction action = new ParseAction() {<a name="line.124"></a>
<span class="sourceLineNo">125</span>            public Document parse(final DocumentBuilder parser) throws SAXException, IOException {<a name="line.125"></a>
<span class="sourceLineNo">126</span>                InputSource inputSource = new InputSource(source.getInputStream());<a name="line.126"></a>
<span class="sourceLineNo">127</span>                inputSource.setSystemId("dummy://log4j.dtd");<a name="line.127"></a>
<span class="sourceLineNo">128</span>                return parser.parse(inputSource);<a name="line.128"></a>
<span class="sourceLineNo">129</span>            }<a name="line.129"></a>
<span class="sourceLineNo">130</span><a name="line.130"></a>
<span class="sourceLineNo">131</span>            public String toString() {<a name="line.131"></a>
<span class="sourceLineNo">132</span>                return getConfigurationSource().getLocation();<a name="line.132"></a>
<span class="sourceLineNo">133</span>            }<a name="line.133"></a>
<span class="sourceLineNo">134</span>        };<a name="line.134"></a>
<span class="sourceLineNo">135</span>        doConfigure(action);<a name="line.135"></a>
<span class="sourceLineNo">136</span>    }<a name="line.136"></a>
<span class="sourceLineNo">137</span><a name="line.137"></a>
<span class="sourceLineNo">138</span>    private void doConfigure(final ParseAction action) throws FactoryConfigurationError {<a name="line.138"></a>
<span class="sourceLineNo">139</span>        DocumentBuilderFactory dbf;<a name="line.139"></a>
<span class="sourceLineNo">140</span>        try {<a name="line.140"></a>
<span class="sourceLineNo">141</span>            LOGGER.debug("System property is : {}", OptionConverter.getSystemProperty(dbfKey, null));<a name="line.141"></a>
<span class="sourceLineNo">142</span>            dbf = DocumentBuilderFactory.newInstance();<a name="line.142"></a>
<span class="sourceLineNo">143</span>            LOGGER.debug("Standard DocumentBuilderFactory search succeded.");<a name="line.143"></a>
<span class="sourceLineNo">144</span>            LOGGER.debug("DocumentBuilderFactory is: " + dbf.getClass().getName());<a name="line.144"></a>
<span class="sourceLineNo">145</span>        } catch (FactoryConfigurationError fce) {<a name="line.145"></a>
<span class="sourceLineNo">146</span>            Exception e = fce.getException();<a name="line.146"></a>
<span class="sourceLineNo">147</span>            LOGGER.debug("Could not instantiate a DocumentBuilderFactory.", e);<a name="line.147"></a>
<span class="sourceLineNo">148</span>            throw fce;<a name="line.148"></a>
<span class="sourceLineNo">149</span>        }<a name="line.149"></a>
<span class="sourceLineNo">150</span><a name="line.150"></a>
<span class="sourceLineNo">151</span>        try {<a name="line.151"></a>
<span class="sourceLineNo">152</span>            dbf.setValidating(true);<a name="line.152"></a>
<span class="sourceLineNo">153</span><a name="line.153"></a>
<span class="sourceLineNo">154</span>            DocumentBuilder docBuilder = dbf.newDocumentBuilder();<a name="line.154"></a>
<span class="sourceLineNo">155</span><a name="line.155"></a>
<span class="sourceLineNo">156</span>            docBuilder.setErrorHandler(new SAXErrorHandler());<a name="line.156"></a>
<span class="sourceLineNo">157</span>            docBuilder.setEntityResolver(new Log4jEntityResolver());<a name="line.157"></a>
<span class="sourceLineNo">158</span><a name="line.158"></a>
<span class="sourceLineNo">159</span>            Document doc = action.parse(docBuilder);<a name="line.159"></a>
<span class="sourceLineNo">160</span>            parse(doc.getDocumentElement());<a name="line.160"></a>
<span class="sourceLineNo">161</span>        } catch (Exception e) {<a name="line.161"></a>
<span class="sourceLineNo">162</span>            if (e instanceof InterruptedException || e instanceof InterruptedIOException) {<a name="line.162"></a>
<span class="sourceLineNo">163</span>                Thread.currentThread().interrupt();<a name="line.163"></a>
<span class="sourceLineNo">164</span>            }<a name="line.164"></a>
<span class="sourceLineNo">165</span>            // I know this is miserable...<a name="line.165"></a>
<span class="sourceLineNo">166</span>            LOGGER.error("Could not parse " + action.toString() + ".", e);<a name="line.166"></a>
<span class="sourceLineNo">167</span>        }<a name="line.167"></a>
<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
<span class="sourceLineNo">169</span><a name="line.169"></a>
<span class="sourceLineNo">170</span>    /**<a name="line.170"></a>
<span class="sourceLineNo">171</span>     * Delegates unrecognized content to created instance if it supports UnrecognizedElementParser.<a name="line.171"></a>
<span class="sourceLineNo">172</span>     *<a name="line.172"></a>
<span class="sourceLineNo">173</span>     * @param instance instance, may be null.<a name="line.173"></a>
<span class="sourceLineNo">174</span>     * @param element  element, may not be null.<a name="line.174"></a>
<span class="sourceLineNo">175</span>     * @param props    properties<a name="line.175"></a>
<span class="sourceLineNo">176</span>     * @throws IOException thrown if configuration of owner object should be abandoned.<a name="line.176"></a>
<span class="sourceLineNo">177</span>     */<a name="line.177"></a>
<span class="sourceLineNo">178</span>    private void parseUnrecognizedElement(final Object instance, final Element element,<a name="line.178"></a>
<span class="sourceLineNo">179</span>            final Properties props) throws Exception {<a name="line.179"></a>
<span class="sourceLineNo">180</span>        boolean recognized = false;<a name="line.180"></a>
<span class="sourceLineNo">181</span>        if (instance instanceof UnrecognizedElementHandler) {<a name="line.181"></a>
<span class="sourceLineNo">182</span>            recognized = ((UnrecognizedElementHandler) instance).parseUnrecognizedElement(<a name="line.182"></a>
<span class="sourceLineNo">183</span>                    element, props);<a name="line.183"></a>
<span class="sourceLineNo">184</span>        }<a name="line.184"></a>
<span class="sourceLineNo">185</span>        if (!recognized) {<a name="line.185"></a>
<span class="sourceLineNo">186</span>            LOGGER.warn("Unrecognized element {}", element.getNodeName());<a name="line.186"></a>
<span class="sourceLineNo">187</span>        }<a name="line.187"></a>
<span class="sourceLineNo">188</span>    }<a name="line.188"></a>
<span class="sourceLineNo">189</span><a name="line.189"></a>
<span class="sourceLineNo">190</span>    /**<a name="line.190"></a>
<span class="sourceLineNo">191</span>     * Delegates unrecognized content to created instance if<a name="line.191"></a>
<span class="sourceLineNo">192</span>     * it supports UnrecognizedElementParser and catches and<a name="line.192"></a>
<span class="sourceLineNo">193</span>     * logs any exception.<a name="line.193"></a>
<span class="sourceLineNo">194</span>     *<a name="line.194"></a>
<span class="sourceLineNo">195</span>     * @param instance instance, may be null.<a name="line.195"></a>
<span class="sourceLineNo">196</span>     * @param element  element, may not be null.<a name="line.196"></a>
<span class="sourceLineNo">197</span>     * @param props    properties<a name="line.197"></a>
<span class="sourceLineNo">198</span>     * @since 1.2.15<a name="line.198"></a>
<span class="sourceLineNo">199</span>     */<a name="line.199"></a>
<span class="sourceLineNo">200</span>    private void quietParseUnrecognizedElement(final Object instance,<a name="line.200"></a>
<span class="sourceLineNo">201</span>            final Element element,<a name="line.201"></a>
<span class="sourceLineNo">202</span>            final Properties props) {<a name="line.202"></a>
<span class="sourceLineNo">203</span>        try {<a name="line.203"></a>
<span class="sourceLineNo">204</span>            parseUnrecognizedElement(instance, element, props);<a name="line.204"></a>
<span class="sourceLineNo">205</span>        } catch (Exception ex) {<a name="line.205"></a>
<span class="sourceLineNo">206</span>            if (ex instanceof InterruptedException || ex instanceof InterruptedIOException) {<a name="line.206"></a>
<span class="sourceLineNo">207</span>                Thread.currentThread().interrupt();<a name="line.207"></a>
<span class="sourceLineNo">208</span>            }<a name="line.208"></a>
<span class="sourceLineNo">209</span>            LOGGER.error("Error in extension content: ", ex);<a name="line.209"></a>
<span class="sourceLineNo">210</span>        }<a name="line.210"></a>
<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
<span class="sourceLineNo">212</span><a name="line.212"></a>
<span class="sourceLineNo">213</span>    /**<a name="line.213"></a>
<span class="sourceLineNo">214</span>     * Substitutes property value for any references in expression.<a name="line.214"></a>
<span class="sourceLineNo">215</span>     *<a name="line.215"></a>
<span class="sourceLineNo">216</span>     * @param value value from configuration file, may contain<a name="line.216"></a>
<span class="sourceLineNo">217</span>     *              literal text, property references or both<a name="line.217"></a>
<span class="sourceLineNo">218</span>     * @param props properties.<a name="line.218"></a>
<span class="sourceLineNo">219</span>     * @return evaluated expression, may still contain expressions<a name="line.219"></a>
<span class="sourceLineNo">220</span>     * if unable to expand.<a name="line.220"></a>
<span class="sourceLineNo">221</span>     */<a name="line.221"></a>
<span class="sourceLineNo">222</span>    public String subst(final String value, final Properties props) {<a name="line.222"></a>
<span class="sourceLineNo">223</span>        try {<a name="line.223"></a>
<span class="sourceLineNo">224</span>            return OptionConverter.substVars(value, props);<a name="line.224"></a>
<span class="sourceLineNo">225</span>        } catch (IllegalArgumentException e) {<a name="line.225"></a>
<span class="sourceLineNo">226</span>            LOGGER.warn("Could not perform variable substitution.", e);<a name="line.226"></a>
<span class="sourceLineNo">227</span>            return value;<a name="line.227"></a>
<span class="sourceLineNo">228</span>        }<a name="line.228"></a>
<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
<span class="sourceLineNo">230</span><a name="line.230"></a>
<span class="sourceLineNo">231</span>    /**<a name="line.231"></a>
<span class="sourceLineNo">232</span>     * Sets a parameter based from configuration file content.<a name="line.232"></a>
<span class="sourceLineNo">233</span>     *<a name="line.233"></a>
<span class="sourceLineNo">234</span>     * @param elem       param element, may not be null.<a name="line.234"></a>
<span class="sourceLineNo">235</span>     * @param propSetter property setter, may not be null.<a name="line.235"></a>
<span class="sourceLineNo">236</span>     * @param props      properties<a name="line.236"></a>
<span class="sourceLineNo">237</span>     * @since 1.2.15<a name="line.237"></a>
<span class="sourceLineNo">238</span>     */<a name="line.238"></a>
<span class="sourceLineNo">239</span>    public void setParameter(final Element elem, final PropertySetter propSetter, final Properties props) {<a name="line.239"></a>
<span class="sourceLineNo">240</span>        String name = subst(elem.getAttribute("name"), props);<a name="line.240"></a>
<span class="sourceLineNo">241</span>        String value = (elem.getAttribute("value"));<a name="line.241"></a>
<span class="sourceLineNo">242</span>        value = subst(OptionConverter.convertSpecialChars(value), props);<a name="line.242"></a>
<span class="sourceLineNo">243</span>        propSetter.setProperty(name, value);<a name="line.243"></a>
<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
<span class="sourceLineNo">245</span><a name="line.245"></a>
<span class="sourceLineNo">246</span>    /**<a name="line.246"></a>
<span class="sourceLineNo">247</span>     * Creates an object and processes any nested param elements<a name="line.247"></a>
<span class="sourceLineNo">248</span>     * but does not call activateOptions.  If the class also supports<a name="line.248"></a>
<span class="sourceLineNo">249</span>     * UnrecognizedElementParser, the parseUnrecognizedElement method<a name="line.249"></a>
<span class="sourceLineNo">250</span>     * will be call for any child elements other than param.<a name="line.250"></a>
<span class="sourceLineNo">251</span>     *<a name="line.251"></a>
<span class="sourceLineNo">252</span>     * @param element       element, may not be null.<a name="line.252"></a>
<span class="sourceLineNo">253</span>     * @param props         properties<a name="line.253"></a>
<span class="sourceLineNo">254</span>     * @param expectedClass interface or class expected to be implemented<a name="line.254"></a>
<span class="sourceLineNo">255</span>     *                      by created class<a name="line.255"></a>
<span class="sourceLineNo">256</span>     * @return created class or null.<a name="line.256"></a>
<span class="sourceLineNo">257</span>     * @throws Exception thrown if the contain object should be abandoned.<a name="line.257"></a>
<span class="sourceLineNo">258</span>     * @since 1.2.15<a name="line.258"></a>
<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
<span class="sourceLineNo">260</span>    public Object parseElement(final Element element, final Properties props,<a name="line.260"></a>
<span class="sourceLineNo">261</span>            @SuppressWarnings("rawtypes") final Class expectedClass) throws Exception {<a name="line.261"></a>
<span class="sourceLineNo">262</span>        String clazz = subst(element.getAttribute("class"), props);<a name="line.262"></a>
<span class="sourceLineNo">263</span>        Object instance = OptionConverter.instantiateByClassName(clazz,<a name="line.263"></a>
<span class="sourceLineNo">264</span>                expectedClass, null);<a name="line.264"></a>
<span class="sourceLineNo">265</span><a name="line.265"></a>
<span class="sourceLineNo">266</span>        if (instance != null) {<a name="line.266"></a>
<span class="sourceLineNo">267</span>            PropertySetter propSetter = new PropertySetter(instance);<a name="line.267"></a>
<span class="sourceLineNo">268</span>            NodeList children = element.getChildNodes();<a name="line.268"></a>
<span class="sourceLineNo">269</span>            final int length = children.getLength();<a name="line.269"></a>
<span class="sourceLineNo">270</span><a name="line.270"></a>
<span class="sourceLineNo">271</span>            for (int loop = 0; loop &lt; length; loop++) {<a name="line.271"></a>
<span class="sourceLineNo">272</span>                Node currentNode = children.item(loop);<a name="line.272"></a>
<span class="sourceLineNo">273</span>                if (currentNode.getNodeType() == Node.ELEMENT_NODE) {<a name="line.273"></a>
<span class="sourceLineNo">274</span>                    Element currentElement = (Element) currentNode;<a name="line.274"></a>
<span class="sourceLineNo">275</span>                    String tagName = currentElement.getTagName();<a name="line.275"></a>
<span class="sourceLineNo">276</span>                    if (tagName.equals("param")) {<a name="line.276"></a>
<span class="sourceLineNo">277</span>                        setParameter(currentElement, propSetter, props);<a name="line.277"></a>
<span class="sourceLineNo">278</span>                    } else {<a name="line.278"></a>
<span class="sourceLineNo">279</span>                        parseUnrecognizedElement(instance, currentElement, props);<a name="line.279"></a>
<span class="sourceLineNo">280</span>                    }<a name="line.280"></a>
<span class="sourceLineNo">281</span>                }<a name="line.281"></a>
<span class="sourceLineNo">282</span>            }<a name="line.282"></a>
<span class="sourceLineNo">283</span>            return instance;<a name="line.283"></a>
<span class="sourceLineNo">284</span>        }<a name="line.284"></a>
<span class="sourceLineNo">285</span>        return null;<a name="line.285"></a>
<span class="sourceLineNo">286</span>    }<a name="line.286"></a>
<span class="sourceLineNo">287</span><a name="line.287"></a>
<span class="sourceLineNo">288</span>    /**<a name="line.288"></a>
<span class="sourceLineNo">289</span>     * Used internally to parse appenders by IDREF name.<a name="line.289"></a>
<span class="sourceLineNo">290</span>     */<a name="line.290"></a>
<span class="sourceLineNo">291</span>    private Appender findAppenderByName(Document doc, String appenderName) {<a name="line.291"></a>
<span class="sourceLineNo">292</span>        Appender appender = appenderMap.get(appenderName);<a name="line.292"></a>
<span class="sourceLineNo">293</span><a name="line.293"></a>
<span class="sourceLineNo">294</span>        if (appender != null) {<a name="line.294"></a>
<span class="sourceLineNo">295</span>            return appender;<a name="line.295"></a>
<span class="sourceLineNo">296</span>        } else {<a name="line.296"></a>
<span class="sourceLineNo">297</span>            // Doesn't work on DOM Level 1 :<a name="line.297"></a>
<span class="sourceLineNo">298</span>            // Element element = doc.getElementById(appenderName);<a name="line.298"></a>
<span class="sourceLineNo">299</span><a name="line.299"></a>
<span class="sourceLineNo">300</span>            // Endre's hack:<a name="line.300"></a>
<span class="sourceLineNo">301</span>            Element element = null;<a name="line.301"></a>
<span class="sourceLineNo">302</span>            NodeList list = doc.getElementsByTagName("appender");<a name="line.302"></a>
<span class="sourceLineNo">303</span>            for (int t = 0; t &lt; list.getLength(); t++) {<a name="line.303"></a>
<span class="sourceLineNo">304</span>                Node node = list.item(t);<a name="line.304"></a>
<span class="sourceLineNo">305</span>                NamedNodeMap map = node.getAttributes();<a name="line.305"></a>
<span class="sourceLineNo">306</span>                Node attrNode = map.getNamedItem("name");<a name="line.306"></a>
<span class="sourceLineNo">307</span>                if (appenderName.equals(attrNode.getNodeValue())) {<a name="line.307"></a>
<span class="sourceLineNo">308</span>                    element = (Element) node;<a name="line.308"></a>
<span class="sourceLineNo">309</span>                    break;<a name="line.309"></a>
<span class="sourceLineNo">310</span>                }<a name="line.310"></a>
<span class="sourceLineNo">311</span>            }<a name="line.311"></a>
<span class="sourceLineNo">312</span>            // Hack finished.<a name="line.312"></a>
<span class="sourceLineNo">313</span><a name="line.313"></a>
<span class="sourceLineNo">314</span>            if (element == null) {<a name="line.314"></a>
<span class="sourceLineNo">315</span><a name="line.315"></a>
<span class="sourceLineNo">316</span>                LOGGER.error("No appender named [{}] could be found.", appenderName);<a name="line.316"></a>
<span class="sourceLineNo">317</span>                return null;<a name="line.317"></a>
<span class="sourceLineNo">318</span>            } else {<a name="line.318"></a>
<span class="sourceLineNo">319</span>                appender = parseAppender(element);<a name="line.319"></a>
<span class="sourceLineNo">320</span>                if (appender != null) {<a name="line.320"></a>
<span class="sourceLineNo">321</span>                    appenderMap.put(appenderName, appender);<a name="line.321"></a>
<span class="sourceLineNo">322</span>                }<a name="line.322"></a>
<span class="sourceLineNo">323</span>                return appender;<a name="line.323"></a>
<span class="sourceLineNo">324</span>            }<a name="line.324"></a>
<span class="sourceLineNo">325</span>        }<a name="line.325"></a>
<span class="sourceLineNo">326</span>    }<a name="line.326"></a>
<span class="sourceLineNo">327</span><a name="line.327"></a>
<span class="sourceLineNo">328</span>    /**<a name="line.328"></a>
<span class="sourceLineNo">329</span>     * Used internally to parse appenders by IDREF element.<a name="line.329"></a>
<span class="sourceLineNo">330</span>     */<a name="line.330"></a>
<span class="sourceLineNo">331</span>    public Appender findAppenderByReference(Element appenderRef) {<a name="line.331"></a>
<span class="sourceLineNo">332</span>        String appenderName = subst(appenderRef.getAttribute(REF_ATTR));<a name="line.332"></a>
<span class="sourceLineNo">333</span>        Document doc = appenderRef.getOwnerDocument();<a name="line.333"></a>
<span class="sourceLineNo">334</span>        return findAppenderByName(doc, appenderName);<a name="line.334"></a>
<span class="sourceLineNo">335</span>    }<a name="line.335"></a>
<span class="sourceLineNo">336</span><a name="line.336"></a>
<span class="sourceLineNo">337</span>    /**<a name="line.337"></a>
<span class="sourceLineNo">338</span>     * Used internally to parse an appender element.<a name="line.338"></a>
<span class="sourceLineNo">339</span>     */<a name="line.339"></a>
<span class="sourceLineNo">340</span>    public Appender parseAppender(Element appenderElement) {<a name="line.340"></a>
<span class="sourceLineNo">341</span>        String className = subst(appenderElement.getAttribute(CLASS_ATTR));<a name="line.341"></a>
<span class="sourceLineNo">342</span>        LOGGER.debug("Class name: [" + className + ']');<a name="line.342"></a>
<span class="sourceLineNo">343</span>        Appender appender = manager.parseAppender(className, appenderElement, this);<a name="line.343"></a>
<span class="sourceLineNo">344</span>        if (appender == null) {<a name="line.344"></a>
<span class="sourceLineNo">345</span>            appender = buildAppender(className, appenderElement);<a name="line.345"></a>
<span class="sourceLineNo">346</span>        }<a name="line.346"></a>
<span class="sourceLineNo">347</span>        return appender;<a name="line.347"></a>
<span class="sourceLineNo">348</span>    }<a name="line.348"></a>
<span class="sourceLineNo">349</span><a name="line.349"></a>
<span class="sourceLineNo">350</span>    private Appender buildAppender(String className, Element appenderElement) {<a name="line.350"></a>
<span class="sourceLineNo">351</span>        try {<a name="line.351"></a>
<span class="sourceLineNo">352</span>            Appender appender = LoaderUtil.newInstanceOf(className);<a name="line.352"></a>
<span class="sourceLineNo">353</span>            PropertySetter propSetter = new PropertySetter(appender);<a name="line.353"></a>
<span class="sourceLineNo">354</span><a name="line.354"></a>
<span class="sourceLineNo">355</span>            appender.setName(subst(appenderElement.getAttribute(NAME_ATTR)));<a name="line.355"></a>
<span class="sourceLineNo">356</span>            forEachElement(appenderElement.getChildNodes(), (currentElement) -&gt; {<a name="line.356"></a>
<span class="sourceLineNo">357</span>                // Parse appender parameters<a name="line.357"></a>
<span class="sourceLineNo">358</span>                switch (currentElement.getTagName()) {<a name="line.358"></a>
<span class="sourceLineNo">359</span>                    case PARAM_TAG:<a name="line.359"></a>
<span class="sourceLineNo">360</span>                        setParameter(currentElement, propSetter);<a name="line.360"></a>
<span class="sourceLineNo">361</span>                        break;<a name="line.361"></a>
<span class="sourceLineNo">362</span>                    case LAYOUT_TAG:<a name="line.362"></a>
<span class="sourceLineNo">363</span>                        appender.setLayout(parseLayout(currentElement));<a name="line.363"></a>
<span class="sourceLineNo">364</span>                        break;<a name="line.364"></a>
<span class="sourceLineNo">365</span>                    case FILTER_TAG:<a name="line.365"></a>
<span class="sourceLineNo">366</span>                        Filter filter = parseFilters(currentElement);<a name="line.366"></a>
<span class="sourceLineNo">367</span>                        if (filter != null) {<a name="line.367"></a>
<span class="sourceLineNo">368</span>                            LOGGER.debug("Adding filter of type [{}] to appender named [{}]",<a name="line.368"></a>
<span class="sourceLineNo">369</span>                                    filter.getClass(), appender.getName());<a name="line.369"></a>
<span class="sourceLineNo">370</span>                            appender.addFilter(filter);<a name="line.370"></a>
<span class="sourceLineNo">371</span>                        }<a name="line.371"></a>
<span class="sourceLineNo">372</span>                        break;<a name="line.372"></a>
<span class="sourceLineNo">373</span>                    case ERROR_HANDLER_TAG:<a name="line.373"></a>
<span class="sourceLineNo">374</span>                        parseErrorHandler(currentElement, appender);<a name="line.374"></a>
<span class="sourceLineNo">375</span>                        break;<a name="line.375"></a>
<span class="sourceLineNo">376</span>                    case APPENDER_REF_TAG:<a name="line.376"></a>
<span class="sourceLineNo">377</span>                        String refName = subst(currentElement.getAttribute(REF_ATTR));<a name="line.377"></a>
<span class="sourceLineNo">378</span>                        if (appender instanceof AppenderAttachable) {<a name="line.378"></a>
<span class="sourceLineNo">379</span>                            AppenderAttachable aa = (AppenderAttachable) appender;<a name="line.379"></a>
<span class="sourceLineNo">380</span>                            Appender child = findAppenderByReference(currentElement);<a name="line.380"></a>
<span class="sourceLineNo">381</span>                            LOGGER.debug("Attaching appender named [{}] to appender named [{}].", refName,<a name="line.381"></a>
<span class="sourceLineNo">382</span>                                    appender.getName());<a name="line.382"></a>
<span class="sourceLineNo">383</span>                            aa.addAppender(child);<a name="line.383"></a>
<span class="sourceLineNo">384</span>                        } else {<a name="line.384"></a>
<span class="sourceLineNo">385</span>                            LOGGER.error("Requesting attachment of appender named [{}] to appender named [{}}]"<a name="line.385"></a>
<span class="sourceLineNo">386</span>                                            + "which does not implement org.apache.log4j.spi.AppenderAttachable.",<a name="line.386"></a>
<span class="sourceLineNo">387</span>                                    refName, appender.getName());<a name="line.387"></a>
<span class="sourceLineNo">388</span>                        }<a name="line.388"></a>
<span class="sourceLineNo">389</span>                        break;<a name="line.389"></a>
<span class="sourceLineNo">390</span>                    default:<a name="line.390"></a>
<span class="sourceLineNo">391</span>                        try {<a name="line.391"></a>
<span class="sourceLineNo">392</span>                            parseUnrecognizedElement(appender, currentElement, props);<a name="line.392"></a>
<span class="sourceLineNo">393</span>                        } catch (Exception ex) {<a name="line.393"></a>
<span class="sourceLineNo">394</span>                            throw new ConsumerException(ex);<a name="line.394"></a>
<span class="sourceLineNo">395</span>                        }<a name="line.395"></a>
<span class="sourceLineNo">396</span>                }<a name="line.396"></a>
<span class="sourceLineNo">397</span>            });<a name="line.397"></a>
<span class="sourceLineNo">398</span>            propSetter.activate();<a name="line.398"></a>
<span class="sourceLineNo">399</span>            return appender;<a name="line.399"></a>
<span class="sourceLineNo">400</span>        } catch (ConsumerException ex) {<a name="line.400"></a>
<span class="sourceLineNo">401</span>            Throwable t = ex.getCause();<a name="line.401"></a>
<span class="sourceLineNo">402</span>            if (t instanceof InterruptedException || t instanceof InterruptedIOException) {<a name="line.402"></a>
<span class="sourceLineNo">403</span>                Thread.currentThread().interrupt();<a name="line.403"></a>
<span class="sourceLineNo">404</span>            }<a name="line.404"></a>
<span class="sourceLineNo">405</span>            LOGGER.error("Could not create an Appender. Reported error follows.", t);<a name="line.405"></a>
<span class="sourceLineNo">406</span>        } catch (Exception oops) {<a name="line.406"></a>
<span class="sourceLineNo">407</span>            if (oops instanceof InterruptedException || oops instanceof InterruptedIOException) {<a name="line.407"></a>
<span class="sourceLineNo">408</span>                Thread.currentThread().interrupt();<a name="line.408"></a>
<span class="sourceLineNo">409</span>            }<a name="line.409"></a>
<span class="sourceLineNo">410</span>            LOGGER.error("Could not create an Appender. Reported error follows.", oops);<a name="line.410"></a>
<span class="sourceLineNo">411</span>        }<a name="line.411"></a>
<span class="sourceLineNo">412</span>        return null;<a name="line.412"></a>
<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
<span class="sourceLineNo">414</span><a name="line.414"></a>
<span class="sourceLineNo">415</span>    public RewritePolicy parseRewritePolicy(Element rewritePolicyElement) {<a name="line.415"></a>
<span class="sourceLineNo">416</span>        String className = subst(rewritePolicyElement.getAttribute(CLASS_ATTR));<a name="line.416"></a>
<span class="sourceLineNo">417</span>        LOGGER.debug("Class name: [" + className + ']');<a name="line.417"></a>
<span class="sourceLineNo">418</span>        RewritePolicy policy = manager.parseRewritePolicy(className, rewritePolicyElement, this);<a name="line.418"></a>
<span class="sourceLineNo">419</span>        if (policy == null) {<a name="line.419"></a>
<span class="sourceLineNo">420</span>            policy = buildRewritePolicy(className, rewritePolicyElement);<a name="line.420"></a>
<span class="sourceLineNo">421</span>        }<a name="line.421"></a>
<span class="sourceLineNo">422</span>        return policy;<a name="line.422"></a>
<span class="sourceLineNo">423</span>    }<a name="line.423"></a>
<span class="sourceLineNo">424</span><a name="line.424"></a>
<span class="sourceLineNo">425</span>    private RewritePolicy buildRewritePolicy(String className, Element element) {<a name="line.425"></a>
<span class="sourceLineNo">426</span>        try {<a name="line.426"></a>
<span class="sourceLineNo">427</span>            RewritePolicy policy = LoaderUtil.newInstanceOf(className);<a name="line.427"></a>
<span class="sourceLineNo">428</span>            PropertySetter propSetter = new PropertySetter(policy);<a name="line.428"></a>
<span class="sourceLineNo">429</span><a name="line.429"></a>
<span class="sourceLineNo">430</span>            forEachElement(element.getChildNodes(), (currentElement) -&gt; {<a name="line.430"></a>
<span class="sourceLineNo">431</span>                if (currentElement.getTagName().equalsIgnoreCase(PARAM_TAG)) {<a name="line.431"></a>
<span class="sourceLineNo">432</span>                    setParameter(currentElement, propSetter);<a name="line.432"></a>
<span class="sourceLineNo">433</span>                }<a name="line.433"></a>
<span class="sourceLineNo">434</span>            });<a name="line.434"></a>
<span class="sourceLineNo">435</span>            propSetter.activate();<a name="line.435"></a>
<span class="sourceLineNo">436</span>            return policy;<a name="line.436"></a>
<span class="sourceLineNo">437</span>        } catch (ConsumerException ex) {<a name="line.437"></a>
<span class="sourceLineNo">438</span>            Throwable t = ex.getCause();<a name="line.438"></a>
<span class="sourceLineNo">439</span>            if (t instanceof InterruptedException || t instanceof InterruptedIOException) {<a name="line.439"></a>
<span class="sourceLineNo">440</span>                Thread.currentThread().interrupt();<a name="line.440"></a>
<span class="sourceLineNo">441</span>            }<a name="line.441"></a>
<span class="sourceLineNo">442</span>            LOGGER.error("Could not create an RewritePolicy. Reported error follows.", t);<a name="line.442"></a>
<span class="sourceLineNo">443</span>        } catch (Exception oops) {<a name="line.443"></a>
<span class="sourceLineNo">444</span>            if (oops instanceof InterruptedException || oops instanceof InterruptedIOException) {<a name="line.444"></a>
<span class="sourceLineNo">445</span>                Thread.currentThread().interrupt();<a name="line.445"></a>
<span class="sourceLineNo">446</span>            }<a name="line.446"></a>
<span class="sourceLineNo">447</span>            LOGGER.error("Could not create an RewritePolicy. Reported error follows.", oops);<a name="line.447"></a>
<span class="sourceLineNo">448</span>        }<a name="line.448"></a>
<span class="sourceLineNo">449</span>        return null;<a name="line.449"></a>
<span class="sourceLineNo">450</span>    }<a name="line.450"></a>
<span class="sourceLineNo">451</span><a name="line.451"></a>
<span class="sourceLineNo">452</span>    /**<a name="line.452"></a>
<span class="sourceLineNo">453</span>     * Used internally to parse an {@link ErrorHandler} element.<a name="line.453"></a>
<span class="sourceLineNo">454</span>     */<a name="line.454"></a>
<span class="sourceLineNo">455</span>    private void parseErrorHandler(Element element, Appender appender) {<a name="line.455"></a>
<span class="sourceLineNo">456</span>        ErrorHandler eh = (ErrorHandler) OptionConverter.instantiateByClassName(<a name="line.456"></a>
<span class="sourceLineNo">457</span>                subst(element.getAttribute(CLASS_ATTR)),<a name="line.457"></a>
<span class="sourceLineNo">458</span>                ErrorHandler.class,<a name="line.458"></a>
<span class="sourceLineNo">459</span>                null);<a name="line.459"></a>
<span class="sourceLineNo">460</span><a name="line.460"></a>
<span class="sourceLineNo">461</span>        if (eh != null) {<a name="line.461"></a>
<span class="sourceLineNo">462</span>            eh.setAppender(appender);<a name="line.462"></a>
<span class="sourceLineNo">463</span><a name="line.463"></a>
<span class="sourceLineNo">464</span>            PropertySetter propSetter = new PropertySetter(eh);<a name="line.464"></a>
<span class="sourceLineNo">465</span>            forEachElement(element.getChildNodes(), (currentElement) -&gt; {<a name="line.465"></a>
<span class="sourceLineNo">466</span>                String tagName = currentElement.getTagName();<a name="line.466"></a>
<span class="sourceLineNo">467</span>                if (tagName.equals(PARAM_TAG)) {<a name="line.467"></a>
<span class="sourceLineNo">468</span>                    setParameter(currentElement, propSetter);<a name="line.468"></a>
<span class="sourceLineNo">469</span>                }<a name="line.469"></a>
<span class="sourceLineNo">470</span>            });<a name="line.470"></a>
<span class="sourceLineNo">471</span>            propSetter.activate();<a name="line.471"></a>
<span class="sourceLineNo">472</span>            appender.setErrorHandler(eh);<a name="line.472"></a>
<span class="sourceLineNo">473</span>        }<a name="line.473"></a>
<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
<span class="sourceLineNo">475</span><a name="line.475"></a>
<span class="sourceLineNo">476</span>    /**<a name="line.476"></a>
<span class="sourceLineNo">477</span>     * Used internally to parse a filter element.<a name="line.477"></a>
<span class="sourceLineNo">478</span>     */<a name="line.478"></a>
<span class="sourceLineNo">479</span>    public Filter parseFilters(Element filterElement) {<a name="line.479"></a>
<span class="sourceLineNo">480</span>        String className = subst(filterElement.getAttribute(CLASS_ATTR));<a name="line.480"></a>
<span class="sourceLineNo">481</span>        LOGGER.debug("Class name: [" + className + ']');<a name="line.481"></a>
<span class="sourceLineNo">482</span>        Filter filter = manager.parseFilter(className, filterElement, this);<a name="line.482"></a>
<span class="sourceLineNo">483</span>        if (filter == null) {<a name="line.483"></a>
<span class="sourceLineNo">484</span>            PropertySetter propSetter = new PropertySetter(filter);<a name="line.484"></a>
<span class="sourceLineNo">485</span>            forEachElement(filterElement.getChildNodes(), (currentElement) -&gt; {<a name="line.485"></a>
<span class="sourceLineNo">486</span>                String tagName = currentElement.getTagName();<a name="line.486"></a>
<span class="sourceLineNo">487</span>                if (tagName.equals(PARAM_TAG)) {<a name="line.487"></a>
<span class="sourceLineNo">488</span>                    setParameter(currentElement, propSetter);<a name="line.488"></a>
<span class="sourceLineNo">489</span>                } else {<a name="line.489"></a>
<span class="sourceLineNo">490</span>                    quietParseUnrecognizedElement(filter, currentElement, props);<a name="line.490"></a>
<span class="sourceLineNo">491</span>                }<a name="line.491"></a>
<span class="sourceLineNo">492</span>            });<a name="line.492"></a>
<span class="sourceLineNo">493</span>            propSetter.activate();<a name="line.493"></a>
<span class="sourceLineNo">494</span>        }<a name="line.494"></a>
<span class="sourceLineNo">495</span>        return filter;<a name="line.495"></a>
<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
<span class="sourceLineNo">497</span><a name="line.497"></a>
<span class="sourceLineNo">498</span>    /**<a name="line.498"></a>
<span class="sourceLineNo">499</span>     * Used internally to parse an category element.<a name="line.499"></a>
<span class="sourceLineNo">500</span>     */<a name="line.500"></a>
<span class="sourceLineNo">501</span>    private void parseCategory(Element loggerElement) {<a name="line.501"></a>
<span class="sourceLineNo">502</span>        // Create a new org.apache.log4j.Category object from the &lt;category&gt; element.<a name="line.502"></a>
<span class="sourceLineNo">503</span>        String catName = subst(loggerElement.getAttribute(NAME_ATTR));<a name="line.503"></a>
<span class="sourceLineNo">504</span>        boolean additivity = OptionConverter.toBoolean(subst(loggerElement.getAttribute(ADDITIVITY_ATTR)), true);<a name="line.504"></a>
<span class="sourceLineNo">505</span>        LoggerConfig loggerConfig = getLogger(catName);<a name="line.505"></a>
<span class="sourceLineNo">506</span>        if (loggerConfig == null) {<a name="line.506"></a>
<span class="sourceLineNo">507</span>            loggerConfig = new LoggerConfig(catName, org.apache.logging.log4j.Level.ERROR, additivity);<a name="line.507"></a>
<span class="sourceLineNo">508</span>            addLogger(catName, loggerConfig);<a name="line.508"></a>
<span class="sourceLineNo">509</span>        } else {<a name="line.509"></a>
<span class="sourceLineNo">510</span>            loggerConfig.setAdditive(additivity);<a name="line.510"></a>
<span class="sourceLineNo">511</span>        }<a name="line.511"></a>
<span class="sourceLineNo">512</span>        parseChildrenOfLoggerElement(loggerElement, loggerConfig, false);<a name="line.512"></a>
<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
<span class="sourceLineNo">514</span><a name="line.514"></a>
<span class="sourceLineNo">515</span>    /**<a name="line.515"></a>
<span class="sourceLineNo">516</span>     * Used internally to parse the roor category element.<a name="line.516"></a>
<span class="sourceLineNo">517</span>     */<a name="line.517"></a>
<span class="sourceLineNo">518</span>    private void parseRoot(Element rootElement) {<a name="line.518"></a>
<span class="sourceLineNo">519</span>        LoggerConfig root = getRootLogger();<a name="line.519"></a>
<span class="sourceLineNo">520</span>        parseChildrenOfLoggerElement(rootElement, root, true);<a name="line.520"></a>
<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
<span class="sourceLineNo">522</span><a name="line.522"></a>
<span class="sourceLineNo">523</span>    /**<a name="line.523"></a>
<span class="sourceLineNo">524</span>     * Used internally to parse the children of a LoggerConfig element.<a name="line.524"></a>
<span class="sourceLineNo">525</span>     */<a name="line.525"></a>
<span class="sourceLineNo">526</span>    private void parseChildrenOfLoggerElement(Element catElement, LoggerConfig loggerConfig, boolean isRoot) {<a name="line.526"></a>
<span class="sourceLineNo">527</span><a name="line.527"></a>
<span class="sourceLineNo">528</span>        final PropertySetter propSetter = new PropertySetter(loggerConfig);<a name="line.528"></a>
<span class="sourceLineNo">529</span>        loggerConfig.getAppenderRefs().clear();<a name="line.529"></a>
<span class="sourceLineNo">530</span>        forEachElement(catElement.getChildNodes(), (currentElement) -&gt; {<a name="line.530"></a>
<span class="sourceLineNo">531</span>            switch (currentElement.getTagName()) {<a name="line.531"></a>
<span class="sourceLineNo">532</span>                case APPENDER_REF_TAG: {<a name="line.532"></a>
<span class="sourceLineNo">533</span>                    Appender appender = findAppenderByReference(currentElement);<a name="line.533"></a>
<span class="sourceLineNo">534</span>                    String refName = subst(currentElement.getAttribute(REF_ATTR));<a name="line.534"></a>
<span class="sourceLineNo">535</span>                    if (appender != null) {<a name="line.535"></a>
<span class="sourceLineNo">536</span>                        LOGGER.debug("Adding appender named [{}] to loggerConfig [{}].", refName,<a name="line.536"></a>
<span class="sourceLineNo">537</span>                                loggerConfig.getName());<a name="line.537"></a>
<span class="sourceLineNo">538</span>                        loggerConfig.addAppender(getAppender(refName), null, null);<a name="line.538"></a>
<span class="sourceLineNo">539</span>                    } else {<a name="line.539"></a>
<span class="sourceLineNo">540</span>                        LOGGER.debug("Appender named [{}}] not found.", refName);<a name="line.540"></a>
<span class="sourceLineNo">541</span>                    }<a name="line.541"></a>
<span class="sourceLineNo">542</span>                    break;<a name="line.542"></a>
<span class="sourceLineNo">543</span>                }<a name="line.543"></a>
<span class="sourceLineNo">544</span>                case LEVEL_TAG: case PRIORITY_TAG: {<a name="line.544"></a>
<span class="sourceLineNo">545</span>                    parseLevel(currentElement, loggerConfig, isRoot);<a name="line.545"></a>
<span class="sourceLineNo">546</span>                    break;<a name="line.546"></a>
<span class="sourceLineNo">547</span>                }<a name="line.547"></a>
<span class="sourceLineNo">548</span>                case PARAM_TAG: {<a name="line.548"></a>
<span class="sourceLineNo">549</span>                    setParameter(currentElement, propSetter);<a name="line.549"></a>
<span class="sourceLineNo">550</span>                    break;<a name="line.550"></a>
<span class="sourceLineNo">551</span>                }<a name="line.551"></a>
<span class="sourceLineNo">552</span>                default: {<a name="line.552"></a>
<span class="sourceLineNo">553</span>                    quietParseUnrecognizedElement(loggerConfig, currentElement, props);<a name="line.553"></a>
<span class="sourceLineNo">554</span>                }<a name="line.554"></a>
<span class="sourceLineNo">555</span>            }<a name="line.555"></a>
<span class="sourceLineNo">556</span>        });<a name="line.556"></a>
<span class="sourceLineNo">557</span>        propSetter.activate();<a name="line.557"></a>
<span class="sourceLineNo">558</span>    }<a name="line.558"></a>
<span class="sourceLineNo">559</span><a name="line.559"></a>
<span class="sourceLineNo">560</span>    /**<a name="line.560"></a>
<span class="sourceLineNo">561</span>     * Used internally to parse a layout element.<a name="line.561"></a>
<span class="sourceLineNo">562</span>     */<a name="line.562"></a>
<span class="sourceLineNo">563</span>    public Layout parseLayout(Element layoutElement) {<a name="line.563"></a>
<span class="sourceLineNo">564</span>        String className = subst(layoutElement.getAttribute(CLASS_ATTR));<a name="line.564"></a>
<span class="sourceLineNo">565</span>        LOGGER.debug("Parsing layout of class: \"{}\"", className);<a name="line.565"></a>
<span class="sourceLineNo">566</span>        Layout layout = manager.parseLayout(className, layoutElement, this);<a name="line.566"></a>
<span class="sourceLineNo">567</span>        if (layout == null) {<a name="line.567"></a>
<span class="sourceLineNo">568</span>            layout = buildLayout(className, layoutElement);<a name="line.568"></a>
<span class="sourceLineNo">569</span>        }<a name="line.569"></a>
<span class="sourceLineNo">570</span>        return layout;<a name="line.570"></a>
<span class="sourceLineNo">571</span>    }<a name="line.571"></a>
<span class="sourceLineNo">572</span><a name="line.572"></a>
<span class="sourceLineNo">573</span>    private Layout buildLayout(String className, Element layout_element) {<a name="line.573"></a>
<span class="sourceLineNo">574</span>        try {<a name="line.574"></a>
<span class="sourceLineNo">575</span>            Layout layout = LoaderUtil.newInstanceOf(className);<a name="line.575"></a>
<span class="sourceLineNo">576</span>            PropertySetter propSetter = new PropertySetter(layout);<a name="line.576"></a>
<span class="sourceLineNo">577</span>            forEachElement(layout_element.getChildNodes(), (currentElement) -&gt; {<a name="line.577"></a>
<span class="sourceLineNo">578</span>                String tagName = currentElement.getTagName();<a name="line.578"></a>
<span class="sourceLineNo">579</span>                if (tagName.equals(PARAM_TAG)) {<a name="line.579"></a>
<span class="sourceLineNo">580</span>                    setParameter(currentElement, propSetter);<a name="line.580"></a>
<span class="sourceLineNo">581</span>                } else {<a name="line.581"></a>
<span class="sourceLineNo">582</span>                    try {<a name="line.582"></a>
<span class="sourceLineNo">583</span>                        parseUnrecognizedElement(layout, currentElement, props);<a name="line.583"></a>
<span class="sourceLineNo">584</span>                    } catch (Exception ex) {<a name="line.584"></a>
<span class="sourceLineNo">585</span>                        throw new ConsumerException(ex);<a name="line.585"></a>
<span class="sourceLineNo">586</span>                    }<a name="line.586"></a>
<span class="sourceLineNo">587</span>                }<a name="line.587"></a>
<span class="sourceLineNo">588</span>            });<a name="line.588"></a>
<span class="sourceLineNo">589</span><a name="line.589"></a>
<span class="sourceLineNo">590</span>            propSetter.activate();<a name="line.590"></a>
<span class="sourceLineNo">591</span>            return layout;<a name="line.591"></a>
<span class="sourceLineNo">592</span>        } catch (ConsumerException ce) {<a name="line.592"></a>
<span class="sourceLineNo">593</span>            Throwable cause = ce.getCause();<a name="line.593"></a>
<span class="sourceLineNo">594</span>            if (cause instanceof InterruptedException || cause instanceof InterruptedIOException) {<a name="line.594"></a>
<span class="sourceLineNo">595</span>                Thread.currentThread().interrupt();<a name="line.595"></a>
<span class="sourceLineNo">596</span>            }<a name="line.596"></a>
<span class="sourceLineNo">597</span>            LOGGER.error("Could not create the Layout. Reported error follows.", cause);<a name="line.597"></a>
<span class="sourceLineNo">598</span>        } catch (Exception oops) {<a name="line.598"></a>
<span class="sourceLineNo">599</span>            if (oops instanceof InterruptedException || oops instanceof InterruptedIOException) {<a name="line.599"></a>
<span class="sourceLineNo">600</span>                Thread.currentThread().interrupt();<a name="line.600"></a>
<span class="sourceLineNo">601</span>            }<a name="line.601"></a>
<span class="sourceLineNo">602</span>            LOGGER.error("Could not create the Layout. Reported error follows.", oops);<a name="line.602"></a>
<span class="sourceLineNo">603</span>        }<a name="line.603"></a>
<span class="sourceLineNo">604</span>        return null;<a name="line.604"></a>
<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
<span class="sourceLineNo">606</span><a name="line.606"></a>
<span class="sourceLineNo">607</span>    /**<a name="line.607"></a>
<span class="sourceLineNo">608</span>     * Used internally to parse a level  element.<a name="line.608"></a>
<span class="sourceLineNo">609</span>     */<a name="line.609"></a>
<span class="sourceLineNo">610</span>    private void parseLevel(Element element, LoggerConfig logger, boolean isRoot) {<a name="line.610"></a>
<span class="sourceLineNo">611</span>        String catName = logger.getName();<a name="line.611"></a>
<span class="sourceLineNo">612</span>        if (isRoot) {<a name="line.612"></a>
<span class="sourceLineNo">613</span>            catName = "root";<a name="line.613"></a>
<span class="sourceLineNo">614</span>        }<a name="line.614"></a>
<span class="sourceLineNo">615</span><a name="line.615"></a>
<span class="sourceLineNo">616</span>        String priStr = subst(element.getAttribute(VALUE_ATTR));<a name="line.616"></a>
<span class="sourceLineNo">617</span>        LOGGER.debug("Level value for {} is [{}}].", catName, priStr);<a name="line.617"></a>
<span class="sourceLineNo">618</span><a name="line.618"></a>
<span class="sourceLineNo">619</span>        if (INHERITED.equalsIgnoreCase(priStr) || NULL.equalsIgnoreCase(priStr)) {<a name="line.619"></a>
<span class="sourceLineNo">620</span>            if (isRoot) {<a name="line.620"></a>
<span class="sourceLineNo">621</span>                LOGGER.error("Root level cannot be inherited. Ignoring directive.");<a name="line.621"></a>
<span class="sourceLineNo">622</span>            } else {<a name="line.622"></a>
<span class="sourceLineNo">623</span>                logger.setLevel(null);<a name="line.623"></a>
<span class="sourceLineNo">624</span>            }<a name="line.624"></a>
<span class="sourceLineNo">625</span>        } else {<a name="line.625"></a>
<span class="sourceLineNo">626</span>            String className = subst(element.getAttribute(CLASS_ATTR));<a name="line.626"></a>
<span class="sourceLineNo">627</span>            if (EMPTY_STR.equals(className)) {<a name="line.627"></a>
<span class="sourceLineNo">628</span>                logger.setLevel(OptionConverter.convertLevel(priStr, org.apache.logging.log4j.Level.DEBUG));<a name="line.628"></a>
<span class="sourceLineNo">629</span>            } else {<a name="line.629"></a>
<span class="sourceLineNo">630</span>                LOGGER.debug("Desired Level sub-class: [{}]", className);<a name="line.630"></a>
<span class="sourceLineNo">631</span>                try {<a name="line.631"></a>
<span class="sourceLineNo">632</span>                    Class&lt;?&gt; clazz = LoaderUtil.loadClass(className);<a name="line.632"></a>
<span class="sourceLineNo">633</span>                    Method toLevelMethod = clazz.getMethod("toLevel", ONE_STRING_PARAM);<a name="line.633"></a>
<span class="sourceLineNo">634</span>                    Level pri = (Level) toLevelMethod.invoke(null, new Object[]{priStr});<a name="line.634"></a>
<span class="sourceLineNo">635</span>                    logger.setLevel(OptionConverter.convertLevel(pri));<a name="line.635"></a>
<span class="sourceLineNo">636</span>                } catch (Exception oops) {<a name="line.636"></a>
<span class="sourceLineNo">637</span>                    if (oops instanceof InterruptedException || oops instanceof InterruptedIOException) {<a name="line.637"></a>
<span class="sourceLineNo">638</span>                        Thread.currentThread().interrupt();<a name="line.638"></a>
<span class="sourceLineNo">639</span>                    }<a name="line.639"></a>
<span class="sourceLineNo">640</span>                    LOGGER.error("Could not create level [" + priStr +<a name="line.640"></a>
<span class="sourceLineNo">641</span>                            "]. Reported error follows.", oops);<a name="line.641"></a>
<span class="sourceLineNo">642</span>                    return;<a name="line.642"></a>
<span class="sourceLineNo">643</span>                }<a name="line.643"></a>
<span class="sourceLineNo">644</span>            }<a name="line.644"></a>
<span class="sourceLineNo">645</span>        }<a name="line.645"></a>
<span class="sourceLineNo">646</span>        LOGGER.debug("{} level set to {}", catName,  logger.getLevel());<a name="line.646"></a>
<span class="sourceLineNo">647</span>    }<a name="line.647"></a>
<span class="sourceLineNo">648</span><a name="line.648"></a>
<span class="sourceLineNo">649</span>    private void setParameter(Element elem, PropertySetter propSetter) {<a name="line.649"></a>
<span class="sourceLineNo">650</span>        String name = subst(elem.getAttribute(NAME_ATTR));<a name="line.650"></a>
<span class="sourceLineNo">651</span>        String value = (elem.getAttribute(VALUE_ATTR));<a name="line.651"></a>
<span class="sourceLineNo">652</span>        value = subst(OptionConverter.convertSpecialChars(value));<a name="line.652"></a>
<span class="sourceLineNo">653</span>        propSetter.setProperty(name, value);<a name="line.653"></a>
<span class="sourceLineNo">654</span>    }<a name="line.654"></a>
<span class="sourceLineNo">655</span><a name="line.655"></a>
<span class="sourceLineNo">656</span>    /**<a name="line.656"></a>
<span class="sourceLineNo">657</span>     * Used internally to configure the log4j framework by parsing a DOM<a name="line.657"></a>
<span class="sourceLineNo">658</span>     * tree of XML elements based on &lt;a<a name="line.658"></a>
<span class="sourceLineNo">659</span>     * href="doc-files/log4j.dtd"&gt;log4j.dtd&lt;/a&gt;.<a name="line.659"></a>
<span class="sourceLineNo">660</span>     */<a name="line.660"></a>
<span class="sourceLineNo">661</span>    private void parse(Element element) {<a name="line.661"></a>
<span class="sourceLineNo">662</span>        String rootElementName = element.getTagName();<a name="line.662"></a>
<span class="sourceLineNo">663</span><a name="line.663"></a>
<span class="sourceLineNo">664</span>        if (!rootElementName.equals(CONFIGURATION_TAG)) {<a name="line.664"></a>
<span class="sourceLineNo">665</span>            if (rootElementName.equals(OLD_CONFIGURATION_TAG)) {<a name="line.665"></a>
<span class="sourceLineNo">666</span>                LOGGER.warn("The &lt;" + OLD_CONFIGURATION_TAG +<a name="line.666"></a>
<span class="sourceLineNo">667</span>                        "&gt; element has been deprecated.");<a name="line.667"></a>
<span class="sourceLineNo">668</span>                LOGGER.warn("Use the &lt;" + CONFIGURATION_TAG + "&gt; element instead.");<a name="line.668"></a>
<span class="sourceLineNo">669</span>            } else {<a name="line.669"></a>
<span class="sourceLineNo">670</span>                LOGGER.error("DOM element is - not a &lt;" + CONFIGURATION_TAG + "&gt; element.");<a name="line.670"></a>
<span class="sourceLineNo">671</span>                return;<a name="line.671"></a>
<span class="sourceLineNo">672</span>            }<a name="line.672"></a>
<span class="sourceLineNo">673</span>        }<a name="line.673"></a>
<span class="sourceLineNo">674</span><a name="line.674"></a>
<span class="sourceLineNo">675</span><a name="line.675"></a>
<span class="sourceLineNo">676</span>        String debugAttrib = subst(element.getAttribute(INTERNAL_DEBUG_ATTR));<a name="line.676"></a>
<span class="sourceLineNo">677</span><a name="line.677"></a>
<span class="sourceLineNo">678</span>        LOGGER.debug("debug attribute= \"" + debugAttrib + "\".");<a name="line.678"></a>
<span class="sourceLineNo">679</span>        // if the log4j.dtd is not specified in the XML file, then the<a name="line.679"></a>
<span class="sourceLineNo">680</span>        // "debug" attribute is returned as the empty string.<a name="line.680"></a>
<span class="sourceLineNo">681</span>        String status = "error";<a name="line.681"></a>
<span class="sourceLineNo">682</span>        if (!debugAttrib.equals("") &amp;&amp; !debugAttrib.equals("null")) {<a name="line.682"></a>
<span class="sourceLineNo">683</span>            status = OptionConverter.toBoolean(debugAttrib, true) ? "debug" : "error";<a name="line.683"></a>
<span class="sourceLineNo">684</span><a name="line.684"></a>
<span class="sourceLineNo">685</span>        } else {<a name="line.685"></a>
<span class="sourceLineNo">686</span>            LOGGER.debug("Ignoring " + INTERNAL_DEBUG_ATTR + " attribute.");<a name="line.686"></a>
<span class="sourceLineNo">687</span>        }<a name="line.687"></a>
<span class="sourceLineNo">688</span><a name="line.688"></a>
<span class="sourceLineNo">689</span>        String confDebug = subst(element.getAttribute(CONFIG_DEBUG_ATTR));<a name="line.689"></a>
<span class="sourceLineNo">690</span>        if (!confDebug.equals("") &amp;&amp; !confDebug.equals("null")) {<a name="line.690"></a>
<span class="sourceLineNo">691</span>            LOGGER.warn("The \"" + CONFIG_DEBUG_ATTR + "\" attribute is deprecated.");<a name="line.691"></a>
<span class="sourceLineNo">692</span>            LOGGER.warn("Use the \"" + INTERNAL_DEBUG_ATTR + "\" attribute instead.");<a name="line.692"></a>
<span class="sourceLineNo">693</span>            status = OptionConverter.toBoolean(confDebug, true) ? "debug" : "error";<a name="line.693"></a>
<span class="sourceLineNo">694</span>        }<a name="line.694"></a>
<span class="sourceLineNo">695</span><a name="line.695"></a>
<span class="sourceLineNo">696</span>        final StatusConfiguration statusConfig = new StatusConfiguration().withStatus(status);<a name="line.696"></a>
<span class="sourceLineNo">697</span>        statusConfig.initialize();<a name="line.697"></a>
<span class="sourceLineNo">698</span><a name="line.698"></a>
<span class="sourceLineNo">699</span>        forEachElement(element.getChildNodes(), (currentElement) -&gt; {<a name="line.699"></a>
<span class="sourceLineNo">700</span>            switch (currentElement.getTagName()) {<a name="line.700"></a>
<span class="sourceLineNo">701</span>                case CATEGORY: case LOGGER_ELEMENT:<a name="line.701"></a>
<span class="sourceLineNo">702</span>                    parseCategory(currentElement);<a name="line.702"></a>
<span class="sourceLineNo">703</span>                    break;<a name="line.703"></a>
<span class="sourceLineNo">704</span>                case ROOT_TAG:<a name="line.704"></a>
<span class="sourceLineNo">705</span>                    parseRoot(currentElement);<a name="line.705"></a>
<span class="sourceLineNo">706</span>                    break;<a name="line.706"></a>
<span class="sourceLineNo">707</span>                case RENDERER_TAG:<a name="line.707"></a>
<span class="sourceLineNo">708</span>                    LOGGER.warn("Renderers are not supported by Log4j 2 and will be ignored.");<a name="line.708"></a>
<span class="sourceLineNo">709</span>                    break;<a name="line.709"></a>
<span class="sourceLineNo">710</span>                case THROWABLE_RENDERER_TAG:<a name="line.710"></a>
<span class="sourceLineNo">711</span>                    LOGGER.warn("Throwable Renderers are not supported by Log4j 2 and will be ignored.");<a name="line.711"></a>
<span class="sourceLineNo">712</span>                    break;<a name="line.712"></a>
<span class="sourceLineNo">713</span>                case CATEGORY_FACTORY_TAG: case LOGGER_FACTORY_TAG:<a name="line.713"></a>
<span class="sourceLineNo">714</span>                    LOGGER.warn("Log4j 1 Logger factories are not supported by Log4j 2 and will be ignored.");<a name="line.714"></a>
<span class="sourceLineNo">715</span>                    break;<a name="line.715"></a>
<span class="sourceLineNo">716</span>                case APPENDER_TAG:<a name="line.716"></a>
<span class="sourceLineNo">717</span>                    Appender appender = parseAppender(currentElement);<a name="line.717"></a>
<span class="sourceLineNo">718</span>                    appenderMap.put(appender.getName(), appender);<a name="line.718"></a>
<span class="sourceLineNo">719</span>                    if (appender instanceof AppenderWrapper) {<a name="line.719"></a>
<span class="sourceLineNo">720</span>                        addAppender(((AppenderWrapper) appender).getAppender());<a name="line.720"></a>
<span class="sourceLineNo">721</span>                    } else {<a name="line.721"></a>
<span class="sourceLineNo">722</span>                        addAppender(new AppenderAdapter(appender).getAdapter());<a name="line.722"></a>
<span class="sourceLineNo">723</span>                    }<a name="line.723"></a>
<span class="sourceLineNo">724</span>                    break;<a name="line.724"></a>
<span class="sourceLineNo">725</span>                default:<a name="line.725"></a>
<span class="sourceLineNo">726</span>                    quietParseUnrecognizedElement(null, currentElement, props);<a name="line.726"></a>
<span class="sourceLineNo">727</span>            }<a name="line.727"></a>
<span class="sourceLineNo">728</span>        });<a name="line.728"></a>
<span class="sourceLineNo">729</span>    }<a name="line.729"></a>
<span class="sourceLineNo">730</span><a name="line.730"></a>
<span class="sourceLineNo">731</span>    private String subst(final String value) {<a name="line.731"></a>
<span class="sourceLineNo">732</span>        return getStrSubstitutor().replace(value);<a name="line.732"></a>
<span class="sourceLineNo">733</span>    }<a name="line.733"></a>
<span class="sourceLineNo">734</span><a name="line.734"></a>
<span class="sourceLineNo">735</span>    public static void forEachElement(NodeList list, Consumer&lt;Element&gt; consumer) {<a name="line.735"></a>
<span class="sourceLineNo">736</span>        final int length = list.getLength();<a name="line.736"></a>
<span class="sourceLineNo">737</span>        for (int loop = 0; loop &lt; length; loop++) {<a name="line.737"></a>
<span class="sourceLineNo">738</span>            Node currentNode = list.item(loop);<a name="line.738"></a>
<span class="sourceLineNo">739</span><a name="line.739"></a>
<span class="sourceLineNo">740</span>            if (currentNode.getNodeType() == Node.ELEMENT_NODE) {<a name="line.740"></a>
<span class="sourceLineNo">741</span>                Element currentElement = (Element) currentNode;<a name="line.741"></a>
<span class="sourceLineNo">742</span>                consumer.accept(currentElement);<a name="line.742"></a>
<span class="sourceLineNo">743</span>            }<a name="line.743"></a>
<span class="sourceLineNo">744</span>        }<a name="line.744"></a>
<span class="sourceLineNo">745</span>    }<a name="line.745"></a>
<span class="sourceLineNo">746</span><a name="line.746"></a>
<span class="sourceLineNo">747</span>    private interface ParseAction {<a name="line.747"></a>
<span class="sourceLineNo">748</span>        Document parse(final DocumentBuilder parser) throws SAXException, IOException;<a name="line.748"></a>
<span class="sourceLineNo">749</span>    }<a name="line.749"></a>
<span class="sourceLineNo">750</span><a name="line.750"></a>
<span class="sourceLineNo">751</span>    private static class SAXErrorHandler implements org.xml.sax.ErrorHandler {<a name="line.751"></a>
<span class="sourceLineNo">752</span>        private static final org.apache.logging.log4j.Logger LOGGER = StatusLogger.getLogger();<a name="line.752"></a>
<span class="sourceLineNo">753</span><a name="line.753"></a>
<span class="sourceLineNo">754</span>        public void error(final SAXParseException ex) {<a name="line.754"></a>
<span class="sourceLineNo">755</span>            emitMessage("Continuable parsing error ", ex);<a name="line.755"></a>
<span class="sourceLineNo">756</span>        }<a name="line.756"></a>
<span class="sourceLineNo">757</span><a name="line.757"></a>
<span class="sourceLineNo">758</span>        public void fatalError(final SAXParseException ex) {<a name="line.758"></a>
<span class="sourceLineNo">759</span>            emitMessage("Fatal parsing error ", ex);<a name="line.759"></a>
<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
<span class="sourceLineNo">761</span><a name="line.761"></a>
<span class="sourceLineNo">762</span>        public void warning(final SAXParseException ex) {<a name="line.762"></a>
<span class="sourceLineNo">763</span>            emitMessage("Parsing warning ", ex);<a name="line.763"></a>
<span class="sourceLineNo">764</span>        }<a name="line.764"></a>
<span class="sourceLineNo">765</span><a name="line.765"></a>
<span class="sourceLineNo">766</span>        private static void emitMessage(final String msg, final SAXParseException ex) {<a name="line.766"></a>
<span class="sourceLineNo">767</span>            LOGGER.warn("{} {} and column {}", msg, ex.getLineNumber(), ex.getColumnNumber());<a name="line.767"></a>
<span class="sourceLineNo">768</span>            LOGGER.warn(ex.getMessage(), ex.getException());<a name="line.768"></a>
<span class="sourceLineNo">769</span>        }<a name="line.769"></a>
<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
<span class="sourceLineNo">771</span><a name="line.771"></a>
<span class="sourceLineNo">772</span>    private static class ConsumerException extends RuntimeException {<a name="line.772"></a>
<span class="sourceLineNo">773</span><a name="line.773"></a>
<span class="sourceLineNo">774</span>        ConsumerException(Exception ex) {<a name="line.774"></a>
<span class="sourceLineNo">775</span>            super(ex);<a name="line.775"></a>
<span class="sourceLineNo">776</span>        }<a name="line.776"></a>
<span class="sourceLineNo">777</span>    }<a name="line.777"></a>
<span class="sourceLineNo">778</span>}<a name="line.778"></a>




























































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