<!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><a name="line.17"></a>
<span class="sourceLineNo">018</span>package org.apache.logging.log4j.core.config.properties;<a name="line.18"></a>
<span class="sourceLineNo">019</span><a name="line.19"></a>
<span class="sourceLineNo">020</span>import java.util.Map;<a name="line.20"></a>
<span class="sourceLineNo">021</span>import java.util.Properties;<a name="line.21"></a>
<span class="sourceLineNo">022</span>import java.util.concurrent.TimeUnit;<a name="line.22"></a>
<span class="sourceLineNo">023</span><a name="line.23"></a>
<span class="sourceLineNo">024</span>import org.apache.logging.log4j.Level;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import org.apache.logging.log4j.core.Appender;<a name="line.25"></a>
<span class="sourceLineNo">026</span>import org.apache.logging.log4j.core.LoggerContext;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import org.apache.logging.log4j.core.config.ConfigurationException;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import org.apache.logging.log4j.core.config.ConfigurationSource;<a name="line.28"></a>
<span class="sourceLineNo">029</span>import org.apache.logging.log4j.core.config.LoggerConfig;<a name="line.29"></a>
<span class="sourceLineNo">030</span>import org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder;<a name="line.30"></a>
<span class="sourceLineNo">031</span>import org.apache.logging.log4j.core.config.builder.api.AppenderRefComponentBuilder;<a name="line.31"></a>
<span class="sourceLineNo">032</span>import org.apache.logging.log4j.core.config.builder.api.ComponentBuilder;<a name="line.32"></a>
<span class="sourceLineNo">033</span>import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;<a name="line.33"></a>
<span class="sourceLineNo">034</span>import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;<a name="line.34"></a>
<span class="sourceLineNo">035</span>import org.apache.logging.log4j.core.config.builder.api.FilterComponentBuilder;<a name="line.35"></a>
<span class="sourceLineNo">036</span>import org.apache.logging.log4j.core.config.builder.api.FilterableComponentBuilder;<a name="line.36"></a>
<span class="sourceLineNo">037</span>import org.apache.logging.log4j.core.config.builder.api.LayoutComponentBuilder;<a name="line.37"></a>
<span class="sourceLineNo">038</span>import org.apache.logging.log4j.core.config.builder.api.LoggableComponentBuilder;<a name="line.38"></a>
<span class="sourceLineNo">039</span>import org.apache.logging.log4j.core.config.builder.api.LoggerComponentBuilder;<a name="line.39"></a>
<span class="sourceLineNo">040</span>import org.apache.logging.log4j.core.config.builder.api.RootLoggerComponentBuilder;<a name="line.40"></a>
<span class="sourceLineNo">041</span>import org.apache.logging.log4j.core.config.builder.api.ScriptComponentBuilder;<a name="line.41"></a>
<span class="sourceLineNo">042</span>import org.apache.logging.log4j.core.config.builder.api.ScriptFileComponentBuilder;<a name="line.42"></a>
<span class="sourceLineNo">043</span>import org.apache.logging.log4j.core.filter.AbstractFilter.AbstractFilterBuilder;<a name="line.43"></a>
<span class="sourceLineNo">044</span>import org.apache.logging.log4j.core.util.Builder;<a name="line.44"></a>
<span class="sourceLineNo">045</span>import org.apache.logging.log4j.util.PropertiesUtil;<a name="line.45"></a>
<span class="sourceLineNo">046</span>import org.apache.logging.log4j.util.Strings;<a name="line.46"></a>
<span class="sourceLineNo">047</span><a name="line.47"></a>
<span class="sourceLineNo">048</span>/**<a name="line.48"></a>
<span class="sourceLineNo">049</span> * Helper builder for parsing properties files into a PropertiesConfiguration.<a name="line.49"></a>
<span class="sourceLineNo">050</span> *<a name="line.50"></a>
<span class="sourceLineNo">051</span> * @since 2.6<a name="line.51"></a>
<span class="sourceLineNo">052</span> */<a name="line.52"></a>
<span class="sourceLineNo">053</span>public class PropertiesConfigurationBuilder extends ConfigurationBuilderFactory<a name="line.53"></a>
<span class="sourceLineNo">054</span>    implements Builder&lt;PropertiesConfiguration&gt; {<a name="line.54"></a>
<span class="sourceLineNo">055</span><a name="line.55"></a>
<span class="sourceLineNo">056</span>    private static final String ADVERTISER_KEY = "advertiser";<a name="line.56"></a>
<span class="sourceLineNo">057</span>    private static final String STATUS_KEY = "status";<a name="line.57"></a>
<span class="sourceLineNo">058</span>    private static final String SHUTDOWN_HOOK = "shutdownHook";<a name="line.58"></a>
<span class="sourceLineNo">059</span>    private static final String SHUTDOWN_TIMEOUT = "shutdownTimeout";<a name="line.59"></a>
<span class="sourceLineNo">060</span>    private static final String VERBOSE = "verbose";<a name="line.60"></a>
<span class="sourceLineNo">061</span>    private static final String DEST = "dest";<a name="line.61"></a>
<span class="sourceLineNo">062</span>    private static final String PACKAGES = "packages";<a name="line.62"></a>
<span class="sourceLineNo">063</span>    private static final String CONFIG_NAME = "name";<a name="line.63"></a>
<span class="sourceLineNo">064</span>    private static final String MONITOR_INTERVAL = "monitorInterval";<a name="line.64"></a>
<span class="sourceLineNo">065</span>    private static final String CONFIG_TYPE = "type";<a name="line.65"></a>
<span class="sourceLineNo">066</span><a name="line.66"></a>
<span class="sourceLineNo">067</span>    private final ConfigurationBuilder&lt;PropertiesConfiguration&gt; builder;<a name="line.67"></a>
<span class="sourceLineNo">068</span>    private LoggerContext loggerContext;<a name="line.68"></a>
<span class="sourceLineNo">069</span>    private Properties rootProperties;<a name="line.69"></a>
<span class="sourceLineNo">070</span><a name="line.70"></a>
<span class="sourceLineNo">071</span>    public PropertiesConfigurationBuilder() {<a name="line.71"></a>
<span class="sourceLineNo">072</span>        this.builder = newConfigurationBuilder(PropertiesConfiguration.class);<a name="line.72"></a>
<span class="sourceLineNo">073</span>    }<a name="line.73"></a>
<span class="sourceLineNo">074</span><a name="line.74"></a>
<span class="sourceLineNo">075</span>    public PropertiesConfigurationBuilder setRootProperties(final Properties rootProperties) {<a name="line.75"></a>
<span class="sourceLineNo">076</span>        this.rootProperties = rootProperties;<a name="line.76"></a>
<span class="sourceLineNo">077</span>        return this;<a name="line.77"></a>
<span class="sourceLineNo">078</span>    }<a name="line.78"></a>
<span class="sourceLineNo">079</span><a name="line.79"></a>
<span class="sourceLineNo">080</span>    public PropertiesConfigurationBuilder setConfigurationSource(final ConfigurationSource source) {<a name="line.80"></a>
<span class="sourceLineNo">081</span>        builder.setConfigurationSource(source);<a name="line.81"></a>
<span class="sourceLineNo">082</span>        return this;<a name="line.82"></a>
<span class="sourceLineNo">083</span>    }<a name="line.83"></a>
<span class="sourceLineNo">084</span><a name="line.84"></a>
<span class="sourceLineNo">085</span>    @Override<a name="line.85"></a>
<span class="sourceLineNo">086</span>    public PropertiesConfiguration build() {<a name="line.86"></a>
<span class="sourceLineNo">087</span>        for (final String key : rootProperties.stringPropertyNames()) {<a name="line.87"></a>
<span class="sourceLineNo">088</span>            if (!key.contains(".")) {<a name="line.88"></a>
<span class="sourceLineNo">089</span>                builder.addRootProperty(key, rootProperties.getProperty(key));<a name="line.89"></a>
<span class="sourceLineNo">090</span>            }<a name="line.90"></a>
<span class="sourceLineNo">091</span>        }<a name="line.91"></a>
<span class="sourceLineNo">092</span>        builder<a name="line.92"></a>
<span class="sourceLineNo">093</span>            .setStatusLevel(Level.toLevel(rootProperties.getProperty(STATUS_KEY), Level.ERROR))<a name="line.93"></a>
<span class="sourceLineNo">094</span>            .setShutdownHook(rootProperties.getProperty(SHUTDOWN_HOOK))<a name="line.94"></a>
<span class="sourceLineNo">095</span>            .setShutdownTimeout(Long.parseLong(rootProperties.getProperty(SHUTDOWN_TIMEOUT, "0")), TimeUnit.MILLISECONDS)<a name="line.95"></a>
<span class="sourceLineNo">096</span>            .setVerbosity(rootProperties.getProperty(VERBOSE))<a name="line.96"></a>
<span class="sourceLineNo">097</span>            .setDestination(rootProperties.getProperty(DEST))<a name="line.97"></a>
<span class="sourceLineNo">098</span>            .setPackages(rootProperties.getProperty(PACKAGES))<a name="line.98"></a>
<span class="sourceLineNo">099</span>            .setConfigurationName(rootProperties.getProperty(CONFIG_NAME))<a name="line.99"></a>
<span class="sourceLineNo">100</span>            .setMonitorInterval(rootProperties.getProperty(MONITOR_INTERVAL, "0"))<a name="line.100"></a>
<span class="sourceLineNo">101</span>            .setAdvertiser(rootProperties.getProperty(ADVERTISER_KEY));<a name="line.101"></a>
<span class="sourceLineNo">102</span><a name="line.102"></a>
<span class="sourceLineNo">103</span>        final Properties propertyPlaceholders = PropertiesUtil.extractSubset(rootProperties, "property");<a name="line.103"></a>
<span class="sourceLineNo">104</span>        for (final String key : propertyPlaceholders.stringPropertyNames()) {<a name="line.104"></a>
<span class="sourceLineNo">105</span>            builder.addProperty(key, propertyPlaceholders.getProperty(key));<a name="line.105"></a>
<span class="sourceLineNo">106</span>        }<a name="line.106"></a>
<span class="sourceLineNo">107</span><a name="line.107"></a>
<span class="sourceLineNo">108</span>        final Map&lt;String, Properties&gt; scripts = PropertiesUtil.partitionOnCommonPrefixes(<a name="line.108"></a>
<span class="sourceLineNo">109</span>            PropertiesUtil.extractSubset(rootProperties, "script"));<a name="line.109"></a>
<span class="sourceLineNo">110</span>        for (final Map.Entry&lt;String, Properties&gt; entry : scripts.entrySet()) {<a name="line.110"></a>
<span class="sourceLineNo">111</span>            final Properties scriptProps = entry.getValue();<a name="line.111"></a>
<span class="sourceLineNo">112</span>            final String type = (String) scriptProps.remove("type");<a name="line.112"></a>
<span class="sourceLineNo">113</span>            if (type == null) {<a name="line.113"></a>
<span class="sourceLineNo">114</span>                throw new ConfigurationException("No type provided for script - must be Script or ScriptFile");<a name="line.114"></a>
<span class="sourceLineNo">115</span>            }<a name="line.115"></a>
<span class="sourceLineNo">116</span>            if (type.equalsIgnoreCase("script")) {<a name="line.116"></a>
<span class="sourceLineNo">117</span>                builder.add(createScript(scriptProps));<a name="line.117"></a>
<span class="sourceLineNo">118</span>            } else {<a name="line.118"></a>
<span class="sourceLineNo">119</span>                builder.add(createScriptFile(scriptProps));<a name="line.119"></a>
<span class="sourceLineNo">120</span>            }<a name="line.120"></a>
<span class="sourceLineNo">121</span>        }<a name="line.121"></a>
<span class="sourceLineNo">122</span><a name="line.122"></a>
<span class="sourceLineNo">123</span>        final Properties levelProps = PropertiesUtil.extractSubset(rootProperties, "customLevel");<a name="line.123"></a>
<span class="sourceLineNo">124</span>        if (levelProps.size() &gt; 0) {<a name="line.124"></a>
<span class="sourceLineNo">125</span>            for (final String key : levelProps.stringPropertyNames()) {<a name="line.125"></a>
<span class="sourceLineNo">126</span>                builder.add(builder.newCustomLevel(key, Integer.parseInt(levelProps.getProperty(key))));<a name="line.126"></a>
<span class="sourceLineNo">127</span>            }<a name="line.127"></a>
<span class="sourceLineNo">128</span>        }<a name="line.128"></a>
<span class="sourceLineNo">129</span><a name="line.129"></a>
<span class="sourceLineNo">130</span>        final String filterProp = rootProperties.getProperty("filters");<a name="line.130"></a>
<span class="sourceLineNo">131</span>        if (filterProp != null) {<a name="line.131"></a>
<span class="sourceLineNo">132</span>            final String[] filterNames = filterProp.split(",");<a name="line.132"></a>
<span class="sourceLineNo">133</span>            for (final String filterName : filterNames) {<a name="line.133"></a>
<span class="sourceLineNo">134</span>                final String name = filterName.trim();<a name="line.134"></a>
<span class="sourceLineNo">135</span>                builder.add(createFilter(name, PropertiesUtil.extractSubset(rootProperties, "filter." + name)));<a name="line.135"></a>
<span class="sourceLineNo">136</span>            }<a name="line.136"></a>
<span class="sourceLineNo">137</span>        } else {<a name="line.137"></a>
<span class="sourceLineNo">138</span><a name="line.138"></a>
<span class="sourceLineNo">139</span>            final Map&lt;String, Properties&gt; filters = PropertiesUtil<a name="line.139"></a>
<span class="sourceLineNo">140</span>                    .partitionOnCommonPrefixes(PropertiesUtil.extractSubset(rootProperties, "filter"));<a name="line.140"></a>
<span class="sourceLineNo">141</span>            for (final Map.Entry&lt;String, Properties&gt; entry : filters.entrySet()) {<a name="line.141"></a>
<span class="sourceLineNo">142</span>                builder.add(createFilter(entry.getKey().trim(), entry.getValue()));<a name="line.142"></a>
<span class="sourceLineNo">143</span>            }<a name="line.143"></a>
<span class="sourceLineNo">144</span>        }<a name="line.144"></a>
<span class="sourceLineNo">145</span><a name="line.145"></a>
<span class="sourceLineNo">146</span>        final String appenderProp = rootProperties.getProperty("appenders");<a name="line.146"></a>
<span class="sourceLineNo">147</span>        if (appenderProp != null) {<a name="line.147"></a>
<span class="sourceLineNo">148</span>            final String[] appenderNames = appenderProp.split(",");<a name="line.148"></a>
<span class="sourceLineNo">149</span>            for (final String appenderName : appenderNames) {<a name="line.149"></a>
<span class="sourceLineNo">150</span>                final String name = appenderName.trim();<a name="line.150"></a>
<span class="sourceLineNo">151</span>                builder.add(createAppender(appenderName.trim(),<a name="line.151"></a>
<span class="sourceLineNo">152</span>                        PropertiesUtil.extractSubset(rootProperties, "appender." + name)));<a name="line.152"></a>
<span class="sourceLineNo">153</span>            }<a name="line.153"></a>
<span class="sourceLineNo">154</span>        } else {<a name="line.154"></a>
<span class="sourceLineNo">155</span>            final Map&lt;String, Properties&gt; appenders = PropertiesUtil<a name="line.155"></a>
<span class="sourceLineNo">156</span>                    .partitionOnCommonPrefixes(PropertiesUtil.extractSubset(rootProperties, Appender.ELEMENT_TYPE));<a name="line.156"></a>
<span class="sourceLineNo">157</span>            for (final Map.Entry&lt;String, Properties&gt; entry : appenders.entrySet()) {<a name="line.157"></a>
<span class="sourceLineNo">158</span>                builder.add(createAppender(entry.getKey().trim(), entry.getValue()));<a name="line.158"></a>
<span class="sourceLineNo">159</span>            }<a name="line.159"></a>
<span class="sourceLineNo">160</span>        }<a name="line.160"></a>
<span class="sourceLineNo">161</span><a name="line.161"></a>
<span class="sourceLineNo">162</span>        final String loggerProp = rootProperties.getProperty("loggers");<a name="line.162"></a>
<span class="sourceLineNo">163</span>        if (loggerProp != null) {<a name="line.163"></a>
<span class="sourceLineNo">164</span>            final String[] loggerNames = loggerProp.split(",");<a name="line.164"></a>
<span class="sourceLineNo">165</span>            for (final String loggerName : loggerNames) {<a name="line.165"></a>
<span class="sourceLineNo">166</span>                final String name = loggerName.trim();<a name="line.166"></a>
<span class="sourceLineNo">167</span>                if (!name.equals(LoggerConfig.ROOT)) {<a name="line.167"></a>
<span class="sourceLineNo">168</span>                    builder.add(createLogger(name, PropertiesUtil.extractSubset(rootProperties, "logger." +<a name="line.168"></a>
<span class="sourceLineNo">169</span>                            name)));<a name="line.169"></a>
<span class="sourceLineNo">170</span>                }<a name="line.170"></a>
<span class="sourceLineNo">171</span>            }<a name="line.171"></a>
<span class="sourceLineNo">172</span>        } else {<a name="line.172"></a>
<span class="sourceLineNo">173</span>            final Map&lt;String, Properties&gt; loggers = PropertiesUtil<a name="line.173"></a>
<span class="sourceLineNo">174</span>                    .partitionOnCommonPrefixes(PropertiesUtil.extractSubset(rootProperties, "logger"));<a name="line.174"></a>
<span class="sourceLineNo">175</span>            for (final Map.Entry&lt;String, Properties&gt; entry : loggers.entrySet()) {<a name="line.175"></a>
<span class="sourceLineNo">176</span>                final String name = entry.getKey().trim();<a name="line.176"></a>
<span class="sourceLineNo">177</span>                if (!name.equals(LoggerConfig.ROOT)) {<a name="line.177"></a>
<span class="sourceLineNo">178</span>                    builder.add(createLogger(name, entry.getValue()));<a name="line.178"></a>
<span class="sourceLineNo">179</span>                }<a name="line.179"></a>
<span class="sourceLineNo">180</span>            }<a name="line.180"></a>
<span class="sourceLineNo">181</span>        }<a name="line.181"></a>
<span class="sourceLineNo">182</span><a name="line.182"></a>
<span class="sourceLineNo">183</span>        final Properties props = PropertiesUtil.extractSubset(rootProperties, "rootLogger");<a name="line.183"></a>
<span class="sourceLineNo">184</span>        if (props.size() &gt; 0) {<a name="line.184"></a>
<span class="sourceLineNo">185</span>            builder.add(createRootLogger(props));<a name="line.185"></a>
<span class="sourceLineNo">186</span>        }<a name="line.186"></a>
<span class="sourceLineNo">187</span><a name="line.187"></a>
<span class="sourceLineNo">188</span>        builder.setLoggerContext(loggerContext);<a name="line.188"></a>
<span class="sourceLineNo">189</span><a name="line.189"></a>
<span class="sourceLineNo">190</span>        return builder.build(false);<a name="line.190"></a>
<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
<span class="sourceLineNo">192</span><a name="line.192"></a>
<span class="sourceLineNo">193</span>    private ScriptComponentBuilder createScript(final Properties properties) {<a name="line.193"></a>
<span class="sourceLineNo">194</span>        final String name = (String) properties.remove("name");<a name="line.194"></a>
<span class="sourceLineNo">195</span>        final String language = (String) properties.remove("language");<a name="line.195"></a>
<span class="sourceLineNo">196</span>        final String text = (String) properties.remove("text");<a name="line.196"></a>
<span class="sourceLineNo">197</span>        final ScriptComponentBuilder scriptBuilder = builder.newScript(name, language, text);<a name="line.197"></a>
<span class="sourceLineNo">198</span>        return processRemainingProperties(scriptBuilder, properties);<a name="line.198"></a>
<span class="sourceLineNo">199</span>    }<a name="line.199"></a>
<span class="sourceLineNo">200</span><a name="line.200"></a>
<span class="sourceLineNo">201</span><a name="line.201"></a>
<span class="sourceLineNo">202</span>    private ScriptFileComponentBuilder createScriptFile(final Properties properties) {<a name="line.202"></a>
<span class="sourceLineNo">203</span>        final String name = (String) properties.remove("name");<a name="line.203"></a>
<span class="sourceLineNo">204</span>        final String path = (String) properties.remove("path");<a name="line.204"></a>
<span class="sourceLineNo">205</span>        final ScriptFileComponentBuilder scriptFileBuilder = builder.newScriptFile(name, path);<a name="line.205"></a>
<span class="sourceLineNo">206</span>        return processRemainingProperties(scriptFileBuilder, properties);<a name="line.206"></a>
<span class="sourceLineNo">207</span>    }<a name="line.207"></a>
<span class="sourceLineNo">208</span><a name="line.208"></a>
<span class="sourceLineNo">209</span>    private AppenderComponentBuilder createAppender(final String key, final Properties properties) {<a name="line.209"></a>
<span class="sourceLineNo">210</span>        final String name = (String) properties.remove(CONFIG_NAME);<a name="line.210"></a>
<span class="sourceLineNo">211</span>        if (Strings.isEmpty(name)) {<a name="line.211"></a>
<span class="sourceLineNo">212</span>            throw new ConfigurationException("No name attribute provided for Appender " + key);<a name="line.212"></a>
<span class="sourceLineNo">213</span>        }<a name="line.213"></a>
<span class="sourceLineNo">214</span>        final String type = (String) properties.remove(CONFIG_TYPE);<a name="line.214"></a>
<span class="sourceLineNo">215</span>        if (Strings.isEmpty(type)) {<a name="line.215"></a>
<span class="sourceLineNo">216</span>            throw new ConfigurationException("No type attribute provided for Appender " + key);<a name="line.216"></a>
<span class="sourceLineNo">217</span>        }<a name="line.217"></a>
<span class="sourceLineNo">218</span>        final AppenderComponentBuilder appenderBuilder = builder.newAppender(name, type);<a name="line.218"></a>
<span class="sourceLineNo">219</span>        addFiltersToComponent(appenderBuilder, properties);<a name="line.219"></a>
<span class="sourceLineNo">220</span>        final Properties layoutProps = PropertiesUtil.extractSubset(properties, "layout");<a name="line.220"></a>
<span class="sourceLineNo">221</span>        if (layoutProps.size() &gt; 0) {<a name="line.221"></a>
<span class="sourceLineNo">222</span>            appenderBuilder.add(createLayout(name, layoutProps));<a name="line.222"></a>
<span class="sourceLineNo">223</span>        }<a name="line.223"></a>
<span class="sourceLineNo">224</span><a name="line.224"></a>
<span class="sourceLineNo">225</span>        return processRemainingProperties(appenderBuilder, properties);<a name="line.225"></a>
<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
<span class="sourceLineNo">227</span><a name="line.227"></a>
<span class="sourceLineNo">228</span>    private FilterComponentBuilder createFilter(final String key, final Properties properties) {<a name="line.228"></a>
<span class="sourceLineNo">229</span>        final String type = (String) properties.remove(CONFIG_TYPE);<a name="line.229"></a>
<span class="sourceLineNo">230</span>        if (Strings.isEmpty(type)) {<a name="line.230"></a>
<span class="sourceLineNo">231</span>            throw new ConfigurationException("No type attribute provided for Appender " + key);<a name="line.231"></a>
<span class="sourceLineNo">232</span>        }<a name="line.232"></a>
<span class="sourceLineNo">233</span>        final String onMatch = (String) properties.remove(AbstractFilterBuilder.ATTR_ON_MATCH);<a name="line.233"></a>
<span class="sourceLineNo">234</span>        final String onMismatch = (String) properties.remove(AbstractFilterBuilder.ATTR_ON_MISMATCH);<a name="line.234"></a>
<span class="sourceLineNo">235</span>        final FilterComponentBuilder filterBuilder = builder.newFilter(type, onMatch, onMismatch);<a name="line.235"></a>
<span class="sourceLineNo">236</span>        return processRemainingProperties(filterBuilder, properties);<a name="line.236"></a>
<span class="sourceLineNo">237</span>    }<a name="line.237"></a>
<span class="sourceLineNo">238</span><a name="line.238"></a>
<span class="sourceLineNo">239</span>    private AppenderRefComponentBuilder createAppenderRef(final String key, final Properties properties) {<a name="line.239"></a>
<span class="sourceLineNo">240</span>        final String ref = (String) properties.remove("ref");<a name="line.240"></a>
<span class="sourceLineNo">241</span>        if (Strings.isEmpty(ref)) {<a name="line.241"></a>
<span class="sourceLineNo">242</span>            throw new ConfigurationException("No ref attribute provided for AppenderRef " + key);<a name="line.242"></a>
<span class="sourceLineNo">243</span>        }<a name="line.243"></a>
<span class="sourceLineNo">244</span>        final AppenderRefComponentBuilder appenderRefBuilder = builder.newAppenderRef(ref);<a name="line.244"></a>
<span class="sourceLineNo">245</span>        final String level = Strings.trimToNull((String) properties.remove("level"));<a name="line.245"></a>
<span class="sourceLineNo">246</span>        if (!Strings.isEmpty(level)) {<a name="line.246"></a>
<span class="sourceLineNo">247</span>            appenderRefBuilder.addAttribute("level", level);<a name="line.247"></a>
<span class="sourceLineNo">248</span>        }<a name="line.248"></a>
<span class="sourceLineNo">249</span>        return addFiltersToComponent(appenderRefBuilder, properties);<a name="line.249"></a>
<span class="sourceLineNo">250</span>    }<a name="line.250"></a>
<span class="sourceLineNo">251</span><a name="line.251"></a>
<span class="sourceLineNo">252</span>    private LoggerComponentBuilder createLogger(final String key, final Properties properties) {<a name="line.252"></a>
<span class="sourceLineNo">253</span>        final String name = (String) properties.remove(CONFIG_NAME);<a name="line.253"></a>
<span class="sourceLineNo">254</span>        final String location = (String) properties.remove("includeLocation");<a name="line.254"></a>
<span class="sourceLineNo">255</span>        if (Strings.isEmpty(name)) {<a name="line.255"></a>
<span class="sourceLineNo">256</span>            throw new ConfigurationException("No name attribute provided for Logger " + key);<a name="line.256"></a>
<span class="sourceLineNo">257</span>        }<a name="line.257"></a>
<span class="sourceLineNo">258</span>        final String level = Strings.trimToNull((String) properties.remove("level"));<a name="line.258"></a>
<span class="sourceLineNo">259</span>        final String type = (String) properties.remove(CONFIG_TYPE);<a name="line.259"></a>
<span class="sourceLineNo">260</span>        final LoggerComponentBuilder loggerBuilder;<a name="line.260"></a>
<span class="sourceLineNo">261</span>        boolean includeLocation;<a name="line.261"></a>
<span class="sourceLineNo">262</span>        if (type != null) {<a name="line.262"></a>
<span class="sourceLineNo">263</span>            if (type.equalsIgnoreCase("asyncLogger")) {<a name="line.263"></a>
<span class="sourceLineNo">264</span>                if (location != null) {<a name="line.264"></a>
<span class="sourceLineNo">265</span>                    includeLocation = Boolean.parseBoolean(location);<a name="line.265"></a>
<span class="sourceLineNo">266</span>                    loggerBuilder = builder.newAsyncLogger(name, level, includeLocation);<a name="line.266"></a>
<span class="sourceLineNo">267</span>                } else {<a name="line.267"></a>
<span class="sourceLineNo">268</span>                    loggerBuilder = builder.newAsyncLogger(name, level);<a name="line.268"></a>
<span class="sourceLineNo">269</span>                }<a name="line.269"></a>
<span class="sourceLineNo">270</span>            } else {<a name="line.270"></a>
<span class="sourceLineNo">271</span>                throw new ConfigurationException("Unknown Logger type " + type + " for Logger " + name);<a name="line.271"></a>
<span class="sourceLineNo">272</span>            }<a name="line.272"></a>
<span class="sourceLineNo">273</span>        } else {<a name="line.273"></a>
<span class="sourceLineNo">274</span>            if (location != null) {<a name="line.274"></a>
<span class="sourceLineNo">275</span>                includeLocation = Boolean.parseBoolean(location);<a name="line.275"></a>
<span class="sourceLineNo">276</span>                loggerBuilder = builder.newLogger(name, level, includeLocation);<a name="line.276"></a>
<span class="sourceLineNo">277</span>            } else {<a name="line.277"></a>
<span class="sourceLineNo">278</span>                loggerBuilder = builder.newLogger(name, level);<a name="line.278"></a>
<span class="sourceLineNo">279</span>            }<a name="line.279"></a>
<span class="sourceLineNo">280</span>        }<a name="line.280"></a>
<span class="sourceLineNo">281</span>        addLoggersToComponent(loggerBuilder, properties);<a name="line.281"></a>
<span class="sourceLineNo">282</span>        addFiltersToComponent(loggerBuilder, properties);<a name="line.282"></a>
<span class="sourceLineNo">283</span>        final String additivity = (String) properties.remove("additivity");<a name="line.283"></a>
<span class="sourceLineNo">284</span>        if (!Strings.isEmpty(additivity)) {<a name="line.284"></a>
<span class="sourceLineNo">285</span>            loggerBuilder.addAttribute("additivity", additivity);<a name="line.285"></a>
<span class="sourceLineNo">286</span>        }<a name="line.286"></a>
<span class="sourceLineNo">287</span>        return loggerBuilder;<a name="line.287"></a>
<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
<span class="sourceLineNo">289</span><a name="line.289"></a>
<span class="sourceLineNo">290</span>    private RootLoggerComponentBuilder createRootLogger(final Properties properties) {<a name="line.290"></a>
<span class="sourceLineNo">291</span>        final String level = Strings.trimToNull((String) properties.remove("level"));<a name="line.291"></a>
<span class="sourceLineNo">292</span>        final String type = (String) properties.remove(CONFIG_TYPE);<a name="line.292"></a>
<span class="sourceLineNo">293</span>        final String location = (String) properties.remove("includeLocation");<a name="line.293"></a>
<span class="sourceLineNo">294</span>        final boolean includeLocation;<a name="line.294"></a>
<span class="sourceLineNo">295</span>        final RootLoggerComponentBuilder loggerBuilder;<a name="line.295"></a>
<span class="sourceLineNo">296</span>        if (type != null) {<a name="line.296"></a>
<span class="sourceLineNo">297</span>            if (type.equalsIgnoreCase("asyncRoot")) {<a name="line.297"></a>
<span class="sourceLineNo">298</span>                if (location != null) {<a name="line.298"></a>
<span class="sourceLineNo">299</span>                    includeLocation = Boolean.parseBoolean(location);<a name="line.299"></a>
<span class="sourceLineNo">300</span>                    loggerBuilder = builder.newAsyncRootLogger(level, includeLocation);<a name="line.300"></a>
<span class="sourceLineNo">301</span>                } else {<a name="line.301"></a>
<span class="sourceLineNo">302</span>                    loggerBuilder = builder.newAsyncRootLogger(level);<a name="line.302"></a>
<span class="sourceLineNo">303</span>                }<a name="line.303"></a>
<span class="sourceLineNo">304</span>            } else {<a name="line.304"></a>
<span class="sourceLineNo">305</span>                throw new ConfigurationException("Unknown Logger type for root logger" + type);<a name="line.305"></a>
<span class="sourceLineNo">306</span>            }<a name="line.306"></a>
<span class="sourceLineNo">307</span>        } else {<a name="line.307"></a>
<span class="sourceLineNo">308</span>            if (location != null) {<a name="line.308"></a>
<span class="sourceLineNo">309</span>                includeLocation = Boolean.parseBoolean(location);<a name="line.309"></a>
<span class="sourceLineNo">310</span>                loggerBuilder = builder.newRootLogger(level, includeLocation);<a name="line.310"></a>
<span class="sourceLineNo">311</span>            } else {<a name="line.311"></a>
<span class="sourceLineNo">312</span>                loggerBuilder = builder.newRootLogger(level);<a name="line.312"></a>
<span class="sourceLineNo">313</span>            }<a name="line.313"></a>
<span class="sourceLineNo">314</span>        }<a name="line.314"></a>
<span class="sourceLineNo">315</span>        addLoggersToComponent(loggerBuilder, properties);<a name="line.315"></a>
<span class="sourceLineNo">316</span>        return addFiltersToComponent(loggerBuilder, properties);<a name="line.316"></a>
<span class="sourceLineNo">317</span>    }<a name="line.317"></a>
<span class="sourceLineNo">318</span><a name="line.318"></a>
<span class="sourceLineNo">319</span>    private LayoutComponentBuilder createLayout(final String appenderName, final Properties properties) {<a name="line.319"></a>
<span class="sourceLineNo">320</span>        final String type = (String) properties.remove(CONFIG_TYPE);<a name="line.320"></a>
<span class="sourceLineNo">321</span>        if (Strings.isEmpty(type)) {<a name="line.321"></a>
<span class="sourceLineNo">322</span>            throw new ConfigurationException("No type attribute provided for Layout on Appender " + appenderName);<a name="line.322"></a>
<span class="sourceLineNo">323</span>        }<a name="line.323"></a>
<span class="sourceLineNo">324</span>        final LayoutComponentBuilder layoutBuilder = builder.newLayout(type);<a name="line.324"></a>
<span class="sourceLineNo">325</span>        return processRemainingProperties(layoutBuilder, properties);<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>    private static &lt;B extends ComponentBuilder&lt;B&gt;&gt; ComponentBuilder&lt;B&gt; createComponent(final ComponentBuilder&lt;?&gt; parent,<a name="line.328"></a>
<span class="sourceLineNo">329</span>                                                                                       final String key,<a name="line.329"></a>
<span class="sourceLineNo">330</span>                                                                                       final Properties properties) {<a name="line.330"></a>
<span class="sourceLineNo">331</span>        final String name = (String) properties.remove(CONFIG_NAME);<a name="line.331"></a>
<span class="sourceLineNo">332</span>        final String type = (String) properties.remove(CONFIG_TYPE);<a name="line.332"></a>
<span class="sourceLineNo">333</span>        if (Strings.isEmpty(type)) {<a name="line.333"></a>
<span class="sourceLineNo">334</span>            throw new ConfigurationException("No type attribute provided for component " + key);<a name="line.334"></a>
<span class="sourceLineNo">335</span>        }<a name="line.335"></a>
<span class="sourceLineNo">336</span>        final ComponentBuilder&lt;B&gt; componentBuilder = parent.getBuilder().newComponent(name, type);<a name="line.336"></a>
<span class="sourceLineNo">337</span>        return processRemainingProperties(componentBuilder, properties);<a name="line.337"></a>
<span class="sourceLineNo">338</span>    }<a name="line.338"></a>
<span class="sourceLineNo">339</span><a name="line.339"></a>
<span class="sourceLineNo">340</span>    private static &lt;B extends ComponentBuilder&lt;?&gt;&gt; B processRemainingProperties(final B builder,<a name="line.340"></a>
<span class="sourceLineNo">341</span>                                                                                final Properties properties) {<a name="line.341"></a>
<span class="sourceLineNo">342</span>        while (properties.size() &gt; 0) {<a name="line.342"></a>
<span class="sourceLineNo">343</span>            final String propertyName = properties.stringPropertyNames().iterator().next();<a name="line.343"></a>
<span class="sourceLineNo">344</span>            final int index = propertyName.indexOf('.');<a name="line.344"></a>
<span class="sourceLineNo">345</span>            if (index &gt; 0) {<a name="line.345"></a>
<span class="sourceLineNo">346</span>                final String prefix = propertyName.substring(0, index);<a name="line.346"></a>
<span class="sourceLineNo">347</span>                final Properties componentProperties = PropertiesUtil.extractSubset(properties, prefix);<a name="line.347"></a>
<span class="sourceLineNo">348</span>                builder.addComponent(createComponent(builder, prefix, componentProperties));<a name="line.348"></a>
<span class="sourceLineNo">349</span>            } else {<a name="line.349"></a>
<span class="sourceLineNo">350</span>                builder.addAttribute(propertyName, properties.getProperty(propertyName));<a name="line.350"></a>
<span class="sourceLineNo">351</span>                properties.remove(propertyName);<a name="line.351"></a>
<span class="sourceLineNo">352</span>            }<a name="line.352"></a>
<span class="sourceLineNo">353</span>        }<a name="line.353"></a>
<span class="sourceLineNo">354</span>        return builder;<a name="line.354"></a>
<span class="sourceLineNo">355</span>    }<a name="line.355"></a>
<span class="sourceLineNo">356</span><a name="line.356"></a>
<span class="sourceLineNo">357</span>    private &lt;B extends FilterableComponentBuilder&lt;? extends ComponentBuilder&lt;?&gt;&gt;&gt; B addFiltersToComponent(<a name="line.357"></a>
<span class="sourceLineNo">358</span>        final B componentBuilder, final Properties properties) {<a name="line.358"></a>
<span class="sourceLineNo">359</span>        final Map&lt;String, Properties&gt; filters = PropertiesUtil.partitionOnCommonPrefixes(<a name="line.359"></a>
<span class="sourceLineNo">360</span>            PropertiesUtil.extractSubset(properties, "filter"));<a name="line.360"></a>
<span class="sourceLineNo">361</span>        for (final Map.Entry&lt;String, Properties&gt; entry : filters.entrySet()) {<a name="line.361"></a>
<span class="sourceLineNo">362</span>            componentBuilder.add(createFilter(entry.getKey().trim(), entry.getValue()));<a name="line.362"></a>
<span class="sourceLineNo">363</span>        }<a name="line.363"></a>
<span class="sourceLineNo">364</span>        return componentBuilder;<a name="line.364"></a>
<span class="sourceLineNo">365</span>    }<a name="line.365"></a>
<span class="sourceLineNo">366</span><a name="line.366"></a>
<span class="sourceLineNo">367</span>    private &lt;B extends LoggableComponentBuilder&lt;? extends ComponentBuilder&lt;?&gt;&gt;&gt; B addLoggersToComponent(<a name="line.367"></a>
<span class="sourceLineNo">368</span>        final B loggerBuilder, final Properties properties) {<a name="line.368"></a>
<span class="sourceLineNo">369</span>        final Map&lt;String, Properties&gt; appenderRefs = PropertiesUtil.partitionOnCommonPrefixes(<a name="line.369"></a>
<span class="sourceLineNo">370</span>            PropertiesUtil.extractSubset(properties, "appenderRef"));<a name="line.370"></a>
<span class="sourceLineNo">371</span>        for (final Map.Entry&lt;String, Properties&gt; entry : appenderRefs.entrySet()) {<a name="line.371"></a>
<span class="sourceLineNo">372</span>            loggerBuilder.add(createAppenderRef(entry.getKey().trim(), entry.getValue()));<a name="line.372"></a>
<span class="sourceLineNo">373</span>        }<a name="line.373"></a>
<span class="sourceLineNo">374</span>        return loggerBuilder;<a name="line.374"></a>
<span class="sourceLineNo">375</span>    }<a name="line.375"></a>
<span class="sourceLineNo">376</span><a name="line.376"></a>
<span class="sourceLineNo">377</span>    public PropertiesConfigurationBuilder setLoggerContext(final LoggerContext loggerContext) {<a name="line.377"></a>
<span class="sourceLineNo">378</span>        this.loggerContext = loggerContext;<a name="line.378"></a>
<span class="sourceLineNo">379</span>        return this;<a name="line.379"></a>
<span class="sourceLineNo">380</span>    }<a name="line.380"></a>
<span class="sourceLineNo">381</span><a name="line.381"></a>
<span class="sourceLineNo">382</span>    public LoggerContext getLoggerContext() {<a name="line.382"></a>
<span class="sourceLineNo">383</span>        return loggerContext;<a name="line.383"></a>
<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
<span class="sourceLineNo">385</span>}<a name="line.385"></a>




























































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