<!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.logging.log4j.core.util;<a name="line.17"></a>
<span class="sourceLineNo">018</span><a name="line.18"></a>
<span class="sourceLineNo">019</span>import java.io.InterruptedIOException;<a name="line.19"></a>
<span class="sourceLineNo">020</span>import java.util.Locale;<a name="line.20"></a>
<span class="sourceLineNo">021</span>import java.util.Properties;<a name="line.21"></a>
<span class="sourceLineNo">022</span><a name="line.22"></a>
<span class="sourceLineNo">023</span>import org.apache.logging.log4j.Level;<a name="line.23"></a>
<span class="sourceLineNo">024</span>import org.apache.logging.log4j.Logger;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import org.apache.logging.log4j.status.StatusLogger;<a name="line.25"></a>
<span class="sourceLineNo">026</span>import org.apache.logging.log4j.util.PropertiesUtil;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import org.apache.logging.log4j.util.Strings;<a name="line.27"></a>
<span class="sourceLineNo">028</span><a name="line.28"></a>
<span class="sourceLineNo">029</span>/**<a name="line.29"></a>
<span class="sourceLineNo">030</span> * A convenience class to convert property values to specific types.<a name="line.30"></a>
<span class="sourceLineNo">031</span> */<a name="line.31"></a>
<span class="sourceLineNo">032</span>public final class OptionConverter {<a name="line.32"></a>
<span class="sourceLineNo">033</span><a name="line.33"></a>
<span class="sourceLineNo">034</span>    private static final Logger LOGGER = StatusLogger.getLogger();<a name="line.34"></a>
<span class="sourceLineNo">035</span><a name="line.35"></a>
<span class="sourceLineNo">036</span>    private static final String DELIM_START = "${";<a name="line.36"></a>
<span class="sourceLineNo">037</span>    private static final char DELIM_STOP = '}';<a name="line.37"></a>
<span class="sourceLineNo">038</span>    private static final int DELIM_START_LEN = 2;<a name="line.38"></a>
<span class="sourceLineNo">039</span>    private static final int DELIM_STOP_LEN = 1;<a name="line.39"></a>
<span class="sourceLineNo">040</span>    private static final int ONE_K = 1024;<a name="line.40"></a>
<span class="sourceLineNo">041</span><a name="line.41"></a>
<span class="sourceLineNo">042</span>    /**<a name="line.42"></a>
<span class="sourceLineNo">043</span>     * OptionConverter is a static class.<a name="line.43"></a>
<span class="sourceLineNo">044</span>     */<a name="line.44"></a>
<span class="sourceLineNo">045</span>    private OptionConverter() {<a name="line.45"></a>
<span class="sourceLineNo">046</span>    }<a name="line.46"></a>
<span class="sourceLineNo">047</span><a name="line.47"></a>
<span class="sourceLineNo">048</span>    public static String[] concatenateArrays(final String[] l, final String[] r) {<a name="line.48"></a>
<span class="sourceLineNo">049</span>        final int len = l.length + r.length;<a name="line.49"></a>
<span class="sourceLineNo">050</span>        final String[] a = new String[len];<a name="line.50"></a>
<span class="sourceLineNo">051</span><a name="line.51"></a>
<span class="sourceLineNo">052</span>        System.arraycopy(l, 0, a, 0, l.length);<a name="line.52"></a>
<span class="sourceLineNo">053</span>        System.arraycopy(r, 0, a, l.length, r.length);<a name="line.53"></a>
<span class="sourceLineNo">054</span><a name="line.54"></a>
<span class="sourceLineNo">055</span>        return a;<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>    public static String convertSpecialChars(final String s) {<a name="line.58"></a>
<span class="sourceLineNo">059</span>        char c;<a name="line.59"></a>
<span class="sourceLineNo">060</span>        final int len = s.length();<a name="line.60"></a>
<span class="sourceLineNo">061</span>        final StringBuilder sbuf = new StringBuilder(len);<a name="line.61"></a>
<span class="sourceLineNo">062</span><a name="line.62"></a>
<span class="sourceLineNo">063</span>        int i = 0;<a name="line.63"></a>
<span class="sourceLineNo">064</span>        while (i &lt; len) {<a name="line.64"></a>
<span class="sourceLineNo">065</span>            c = s.charAt(i++);<a name="line.65"></a>
<span class="sourceLineNo">066</span>            if (c == '\\') {<a name="line.66"></a>
<span class="sourceLineNo">067</span>                c = s.charAt(i++);<a name="line.67"></a>
<span class="sourceLineNo">068</span>                switch (c) {<a name="line.68"></a>
<span class="sourceLineNo">069</span>                case 'n':<a name="line.69"></a>
<span class="sourceLineNo">070</span>                    c = '\n';<a name="line.70"></a>
<span class="sourceLineNo">071</span>                    break;<a name="line.71"></a>
<span class="sourceLineNo">072</span>                case 'r':<a name="line.72"></a>
<span class="sourceLineNo">073</span>                    c = '\r';<a name="line.73"></a>
<span class="sourceLineNo">074</span>                    break;<a name="line.74"></a>
<span class="sourceLineNo">075</span>                case 't':<a name="line.75"></a>
<span class="sourceLineNo">076</span>                    c = '\t';<a name="line.76"></a>
<span class="sourceLineNo">077</span>                    break;<a name="line.77"></a>
<span class="sourceLineNo">078</span>                case 'f':<a name="line.78"></a>
<span class="sourceLineNo">079</span>                    c = '\f';<a name="line.79"></a>
<span class="sourceLineNo">080</span>                    break;<a name="line.80"></a>
<span class="sourceLineNo">081</span>                case 'b':<a name="line.81"></a>
<span class="sourceLineNo">082</span>                    c = '\b';<a name="line.82"></a>
<span class="sourceLineNo">083</span>                    break;<a name="line.83"></a>
<span class="sourceLineNo">084</span>                case '"':<a name="line.84"></a>
<span class="sourceLineNo">085</span>                    c = '\"';<a name="line.85"></a>
<span class="sourceLineNo">086</span>                    break;<a name="line.86"></a>
<span class="sourceLineNo">087</span>                case '\'':<a name="line.87"></a>
<span class="sourceLineNo">088</span>                    c = '\'';<a name="line.88"></a>
<span class="sourceLineNo">089</span>                    break;<a name="line.89"></a>
<span class="sourceLineNo">090</span>                case '\\':<a name="line.90"></a>
<span class="sourceLineNo">091</span>                    c = '\\';<a name="line.91"></a>
<span class="sourceLineNo">092</span>                    break;<a name="line.92"></a>
<span class="sourceLineNo">093</span>                default:<a name="line.93"></a>
<span class="sourceLineNo">094</span>                    // there is no default case.<a name="line.94"></a>
<span class="sourceLineNo">095</span>                }<a name="line.95"></a>
<span class="sourceLineNo">096</span>            }<a name="line.96"></a>
<span class="sourceLineNo">097</span>            sbuf.append(c);<a name="line.97"></a>
<span class="sourceLineNo">098</span>        }<a name="line.98"></a>
<span class="sourceLineNo">099</span>        return sbuf.toString();<a name="line.99"></a>
<span class="sourceLineNo">100</span>    }<a name="line.100"></a>
<span class="sourceLineNo">101</span><a name="line.101"></a>
<span class="sourceLineNo">102</span>    public static Object instantiateByKey(final Properties props, final String key, final Class&lt;?&gt; superClass,<a name="line.102"></a>
<span class="sourceLineNo">103</span>                                   final Object defaultValue) {<a name="line.103"></a>
<span class="sourceLineNo">104</span><a name="line.104"></a>
<span class="sourceLineNo">105</span>        // Get the value of the property in string form<a name="line.105"></a>
<span class="sourceLineNo">106</span>        final String className = findAndSubst(key, props);<a name="line.106"></a>
<span class="sourceLineNo">107</span>        if (className == null) {<a name="line.107"></a>
<span class="sourceLineNo">108</span>            LOGGER.error("Could not find value for key {}", key);<a name="line.108"></a>
<span class="sourceLineNo">109</span>            return defaultValue;<a name="line.109"></a>
<span class="sourceLineNo">110</span>        }<a name="line.110"></a>
<span class="sourceLineNo">111</span>        // Trim className to avoid trailing spaces that cause problems.<a name="line.111"></a>
<span class="sourceLineNo">112</span>        return OptionConverter.instantiateByClassName(className.trim(), superClass,<a name="line.112"></a>
<span class="sourceLineNo">113</span>            defaultValue);<a name="line.113"></a>
<span class="sourceLineNo">114</span>    }<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>     * If &lt;code&gt;value&lt;/code&gt; is "true", then {@code true} is<a name="line.117"></a>
<span class="sourceLineNo">118</span>     * returned. If &lt;code&gt;value&lt;/code&gt; is "false", then<a name="line.118"></a>
<span class="sourceLineNo">119</span>     * {@code false} is returned. Otherwise, &lt;code&gt;default&lt;/code&gt; is<a name="line.119"></a>
<span class="sourceLineNo">120</span>     * returned.<a name="line.120"></a>
<span class="sourceLineNo">121</span>     *<a name="line.121"></a>
<span class="sourceLineNo">122</span>     * &lt;p&gt;Case of value is unimportant.&lt;/p&gt;<a name="line.122"></a>
<span class="sourceLineNo">123</span>     * @param value The value to convert.<a name="line.123"></a>
<span class="sourceLineNo">124</span>     * @param defaultValue The default value.<a name="line.124"></a>
<span class="sourceLineNo">125</span>     * @return true or false, depending on the value and/or default.<a name="line.125"></a>
<span class="sourceLineNo">126</span>     */<a name="line.126"></a>
<span class="sourceLineNo">127</span>    public static boolean toBoolean(final String value, final boolean defaultValue) {<a name="line.127"></a>
<span class="sourceLineNo">128</span>        if (value == null) {<a name="line.128"></a>
<span class="sourceLineNo">129</span>            return defaultValue;<a name="line.129"></a>
<span class="sourceLineNo">130</span>        }<a name="line.130"></a>
<span class="sourceLineNo">131</span>        final String trimmedVal = value.trim();<a name="line.131"></a>
<span class="sourceLineNo">132</span>        if ("true".equalsIgnoreCase(trimmedVal)) {<a name="line.132"></a>
<span class="sourceLineNo">133</span>            return true;<a name="line.133"></a>
<span class="sourceLineNo">134</span>        }<a name="line.134"></a>
<span class="sourceLineNo">135</span>        if ("false".equalsIgnoreCase(trimmedVal)) {<a name="line.135"></a>
<span class="sourceLineNo">136</span>            return false;<a name="line.136"></a>
<span class="sourceLineNo">137</span>        }<a name="line.137"></a>
<span class="sourceLineNo">138</span>        return defaultValue;<a name="line.138"></a>
<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
<span class="sourceLineNo">140</span><a name="line.140"></a>
<span class="sourceLineNo">141</span>    /**<a name="line.141"></a>
<span class="sourceLineNo">142</span>     * Convert the String value to an int.<a name="line.142"></a>
<span class="sourceLineNo">143</span>     * @param value The value as a String.<a name="line.143"></a>
<span class="sourceLineNo">144</span>     * @param defaultValue The default value.<a name="line.144"></a>
<span class="sourceLineNo">145</span>     * @return The value as an int.<a name="line.145"></a>
<span class="sourceLineNo">146</span>     */<a name="line.146"></a>
<span class="sourceLineNo">147</span>    public static int toInt(final String value, final int defaultValue) {<a name="line.147"></a>
<span class="sourceLineNo">148</span>        if (value != null) {<a name="line.148"></a>
<span class="sourceLineNo">149</span>            final String s = value.trim();<a name="line.149"></a>
<span class="sourceLineNo">150</span>            try {<a name="line.150"></a>
<span class="sourceLineNo">151</span>                return Integer.parseInt(s);<a name="line.151"></a>
<span class="sourceLineNo">152</span>            } catch (final NumberFormatException e) {<a name="line.152"></a>
<span class="sourceLineNo">153</span>                LOGGER.error("[{}] is not in proper int form.", s, e);<a name="line.153"></a>
<span class="sourceLineNo">154</span>            }<a name="line.154"></a>
<span class="sourceLineNo">155</span>        }<a name="line.155"></a>
<span class="sourceLineNo">156</span>        return defaultValue;<a name="line.156"></a>
<span class="sourceLineNo">157</span>    }<a name="line.157"></a>
<span class="sourceLineNo">158</span><a name="line.158"></a>
<span class="sourceLineNo">159</span>    public static Level toLevel(String value, Level defaultValue) {<a name="line.159"></a>
<span class="sourceLineNo">160</span>        if(value == null) {<a name="line.160"></a>
<span class="sourceLineNo">161</span>            return defaultValue;<a name="line.161"></a>
<span class="sourceLineNo">162</span>        }<a name="line.162"></a>
<span class="sourceLineNo">163</span><a name="line.163"></a>
<span class="sourceLineNo">164</span>        value = value.trim();<a name="line.164"></a>
<span class="sourceLineNo">165</span><a name="line.165"></a>
<span class="sourceLineNo">166</span>        int hashIndex = value.indexOf('#');<a name="line.166"></a>
<span class="sourceLineNo">167</span>        if (hashIndex == -1) {<a name="line.167"></a>
<span class="sourceLineNo">168</span>            if("NULL".equalsIgnoreCase(value)) {<a name="line.168"></a>
<span class="sourceLineNo">169</span>                return null;<a name="line.169"></a>
<span class="sourceLineNo">170</span>            } else {<a name="line.170"></a>
<span class="sourceLineNo">171</span>                // no class name specified : use standard Level class<a name="line.171"></a>
<span class="sourceLineNo">172</span>                return Level.toLevel(value, defaultValue);<a name="line.172"></a>
<span class="sourceLineNo">173</span>            }<a name="line.173"></a>
<span class="sourceLineNo">174</span>        }<a name="line.174"></a>
<span class="sourceLineNo">175</span><a name="line.175"></a>
<span class="sourceLineNo">176</span>        Level result = defaultValue;<a name="line.176"></a>
<span class="sourceLineNo">177</span><a name="line.177"></a>
<span class="sourceLineNo">178</span>        String clazz = value.substring(hashIndex+1);<a name="line.178"></a>
<span class="sourceLineNo">179</span>        String levelName = value.substring(0, hashIndex);<a name="line.179"></a>
<span class="sourceLineNo">180</span><a name="line.180"></a>
<span class="sourceLineNo">181</span>        // This is degenerate case but you never know.<a name="line.181"></a>
<span class="sourceLineNo">182</span>        if("NULL".equalsIgnoreCase(levelName)) {<a name="line.182"></a>
<span class="sourceLineNo">183</span>            return null;<a name="line.183"></a>
<span class="sourceLineNo">184</span>        }<a name="line.184"></a>
<span class="sourceLineNo">185</span><a name="line.185"></a>
<span class="sourceLineNo">186</span>        LOGGER.debug("toLevel" + ":class=[" + clazz + "]"<a name="line.186"></a>
<span class="sourceLineNo">187</span>            + ":pri=[" + levelName + "]");<a name="line.187"></a>
<span class="sourceLineNo">188</span><a name="line.188"></a>
<span class="sourceLineNo">189</span>        try {<a name="line.189"></a>
<span class="sourceLineNo">190</span>            Class customLevel = Loader.loadClass(clazz);<a name="line.190"></a>
<span class="sourceLineNo">191</span><a name="line.191"></a>
<span class="sourceLineNo">192</span>            // get a ref to the specified class' static method<a name="line.192"></a>
<span class="sourceLineNo">193</span>            // toLevel(String, org.apache.log4j.Level)<a name="line.193"></a>
<span class="sourceLineNo">194</span>            Class[] paramTypes = new Class[] { String.class, Level.class<a name="line.194"></a>
<span class="sourceLineNo">195</span>            };<a name="line.195"></a>
<span class="sourceLineNo">196</span>            java.lang.reflect.Method toLevelMethod =<a name="line.196"></a>
<span class="sourceLineNo">197</span>                customLevel.getMethod("toLevel", paramTypes);<a name="line.197"></a>
<span class="sourceLineNo">198</span><a name="line.198"></a>
<span class="sourceLineNo">199</span>            // now call the toLevel method, passing level string + default<a name="line.199"></a>
<span class="sourceLineNo">200</span>            Object[] params = new Object[] {levelName, defaultValue};<a name="line.200"></a>
<span class="sourceLineNo">201</span>            Object o = toLevelMethod.invoke(null, params);<a name="line.201"></a>
<span class="sourceLineNo">202</span><a name="line.202"></a>
<span class="sourceLineNo">203</span>            result = (Level) o;<a name="line.203"></a>
<span class="sourceLineNo">204</span>        } catch(ClassNotFoundException e) {<a name="line.204"></a>
<span class="sourceLineNo">205</span>            LOGGER.warn("custom level class [" + clazz + "] not found.");<a name="line.205"></a>
<span class="sourceLineNo">206</span>        } catch(NoSuchMethodException e) {<a name="line.206"></a>
<span class="sourceLineNo">207</span>            LOGGER.warn("custom level class [" + clazz + "]"<a name="line.207"></a>
<span class="sourceLineNo">208</span>                + " does not have a class function toLevel(String, Level)", e);<a name="line.208"></a>
<span class="sourceLineNo">209</span>        } catch(java.lang.reflect.InvocationTargetException e) {<a name="line.209"></a>
<span class="sourceLineNo">210</span>            if (e.getTargetException() instanceof InterruptedException<a name="line.210"></a>
<span class="sourceLineNo">211</span>                || e.getTargetException() instanceof InterruptedIOException) {<a name="line.211"></a>
<span class="sourceLineNo">212</span>                Thread.currentThread().interrupt();<a name="line.212"></a>
<span class="sourceLineNo">213</span>            }<a name="line.213"></a>
<span class="sourceLineNo">214</span>            LOGGER.warn("custom level class [" + clazz + "]" + " could not be instantiated", e);<a name="line.214"></a>
<span class="sourceLineNo">215</span>        } catch(ClassCastException e) {<a name="line.215"></a>
<span class="sourceLineNo">216</span>            LOGGER.warn("class [" + clazz + "] is not a subclass of org.apache.log4j.Level", e);<a name="line.216"></a>
<span class="sourceLineNo">217</span>        } catch(IllegalAccessException e) {<a name="line.217"></a>
<span class="sourceLineNo">218</span>            LOGGER.warn("class ["+clazz+ "] cannot be instantiated due to access restrictions", e);<a name="line.218"></a>
<span class="sourceLineNo">219</span>        } catch(RuntimeException e) {<a name="line.219"></a>
<span class="sourceLineNo">220</span>            LOGGER.warn("class ["+clazz+"], level [" + levelName + "] conversion failed.", e);<a name="line.220"></a>
<span class="sourceLineNo">221</span>        }<a name="line.221"></a>
<span class="sourceLineNo">222</span>        return result;<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>    /**<a name="line.225"></a>
<span class="sourceLineNo">226</span>     *<a name="line.226"></a>
<span class="sourceLineNo">227</span>     * @param value The size of the file as a String.<a name="line.227"></a>
<span class="sourceLineNo">228</span>     * @param defaultValue The default value.<a name="line.228"></a>
<span class="sourceLineNo">229</span>     * @return The size of the file as a long.<a name="line.229"></a>
<span class="sourceLineNo">230</span>     */<a name="line.230"></a>
<span class="sourceLineNo">231</span>    public static long toFileSize(final String value, final long defaultValue) {<a name="line.231"></a>
<span class="sourceLineNo">232</span>        if (value == null) {<a name="line.232"></a>
<span class="sourceLineNo">233</span>            return defaultValue;<a name="line.233"></a>
<span class="sourceLineNo">234</span>        }<a name="line.234"></a>
<span class="sourceLineNo">235</span><a name="line.235"></a>
<span class="sourceLineNo">236</span>        String str = value.trim().toUpperCase(Locale.ENGLISH);<a name="line.236"></a>
<span class="sourceLineNo">237</span>        long multiplier = 1;<a name="line.237"></a>
<span class="sourceLineNo">238</span>        int index;<a name="line.238"></a>
<span class="sourceLineNo">239</span><a name="line.239"></a>
<span class="sourceLineNo">240</span>        if ((index = str.indexOf("KB")) != -1) {<a name="line.240"></a>
<span class="sourceLineNo">241</span>            multiplier = ONE_K;<a name="line.241"></a>
<span class="sourceLineNo">242</span>            str = str.substring(0, index);<a name="line.242"></a>
<span class="sourceLineNo">243</span>        } else if ((index = str.indexOf("MB")) != -1) {<a name="line.243"></a>
<span class="sourceLineNo">244</span>            multiplier = ONE_K * ONE_K;<a name="line.244"></a>
<span class="sourceLineNo">245</span>            str = str.substring(0, index);<a name="line.245"></a>
<span class="sourceLineNo">246</span>        } else if ((index = str.indexOf("GB")) != -1) {<a name="line.246"></a>
<span class="sourceLineNo">247</span>            multiplier = ONE_K * ONE_K * ONE_K;<a name="line.247"></a>
<span class="sourceLineNo">248</span>            str = str.substring(0, index);<a name="line.248"></a>
<span class="sourceLineNo">249</span>        }<a name="line.249"></a>
<span class="sourceLineNo">250</span>        try {<a name="line.250"></a>
<span class="sourceLineNo">251</span>            return Long.parseLong(str) * multiplier;<a name="line.251"></a>
<span class="sourceLineNo">252</span>        } catch (final NumberFormatException e) {<a name="line.252"></a>
<span class="sourceLineNo">253</span>            LOGGER.error("[{}] is not in proper int form.", str);<a name="line.253"></a>
<span class="sourceLineNo">254</span>            LOGGER.error("[{}] not in expected format.", value, e);<a name="line.254"></a>
<span class="sourceLineNo">255</span>        }<a name="line.255"></a>
<span class="sourceLineNo">256</span>        return defaultValue;<a name="line.256"></a>
<span class="sourceLineNo">257</span>    }<a name="line.257"></a>
<span class="sourceLineNo">258</span><a name="line.258"></a>
<span class="sourceLineNo">259</span>    /**<a name="line.259"></a>
<span class="sourceLineNo">260</span>     * Find the value corresponding to &lt;code&gt;key&lt;/code&gt; in<a name="line.260"></a>
<span class="sourceLineNo">261</span>     * &lt;code&gt;props&lt;/code&gt;. Then perform variable substitution on the<a name="line.261"></a>
<span class="sourceLineNo">262</span>     * found value.<a name="line.262"></a>
<span class="sourceLineNo">263</span>     * @param key The key to locate.<a name="line.263"></a>
<span class="sourceLineNo">264</span>     * @param props The properties.<a name="line.264"></a>
<span class="sourceLineNo">265</span>     * @return The String after substitution.<a name="line.265"></a>
<span class="sourceLineNo">266</span>     */<a name="line.266"></a>
<span class="sourceLineNo">267</span>    public static String findAndSubst(final String key, final Properties props) {<a name="line.267"></a>
<span class="sourceLineNo">268</span>        final String value = props.getProperty(key);<a name="line.268"></a>
<span class="sourceLineNo">269</span>        if (value == null) {<a name="line.269"></a>
<span class="sourceLineNo">270</span>            return null;<a name="line.270"></a>
<span class="sourceLineNo">271</span>        }<a name="line.271"></a>
<span class="sourceLineNo">272</span><a name="line.272"></a>
<span class="sourceLineNo">273</span>        try {<a name="line.273"></a>
<span class="sourceLineNo">274</span>            return substVars(value, props);<a name="line.274"></a>
<span class="sourceLineNo">275</span>        } catch (final IllegalArgumentException e) {<a name="line.275"></a>
<span class="sourceLineNo">276</span>            LOGGER.error("Bad option value [{}].", value, e);<a name="line.276"></a>
<span class="sourceLineNo">277</span>            return value;<a name="line.277"></a>
<span class="sourceLineNo">278</span>        }<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>    /**<a name="line.281"></a>
<span class="sourceLineNo">282</span>     * Instantiate an object given a class name. Check that the<a name="line.282"></a>
<span class="sourceLineNo">283</span>     * &lt;code&gt;className&lt;/code&gt; is a subclass of<a name="line.283"></a>
<span class="sourceLineNo">284</span>     * &lt;code&gt;superClass&lt;/code&gt;. If that test fails or the object could<a name="line.284"></a>
<span class="sourceLineNo">285</span>     * not be instantiated, then &lt;code&gt;defaultValue&lt;/code&gt; is returned.<a name="line.285"></a>
<span class="sourceLineNo">286</span>     *<a name="line.286"></a>
<span class="sourceLineNo">287</span>     * @param className    The fully qualified class name of the object to instantiate.<a name="line.287"></a>
<span class="sourceLineNo">288</span>     * @param superClass   The class to which the new object should belong.<a name="line.288"></a>
<span class="sourceLineNo">289</span>     * @param defaultValue The object to return in case of non-fulfillment<a name="line.289"></a>
<span class="sourceLineNo">290</span>     * @return The created object.<a name="line.290"></a>
<span class="sourceLineNo">291</span>     */<a name="line.291"></a>
<span class="sourceLineNo">292</span>    public static Object instantiateByClassName(final String className, final Class&lt;?&gt; superClass,<a name="line.292"></a>
<span class="sourceLineNo">293</span>                                         final Object defaultValue) {<a name="line.293"></a>
<span class="sourceLineNo">294</span>        if (className != null) {<a name="line.294"></a>
<span class="sourceLineNo">295</span>            try {<a name="line.295"></a>
<span class="sourceLineNo">296</span>                final Class&lt;?&gt; classObj = Loader.loadClass(className);<a name="line.296"></a>
<span class="sourceLineNo">297</span>                if (!superClass.isAssignableFrom(classObj)) {<a name="line.297"></a>
<span class="sourceLineNo">298</span>                    LOGGER.error("A \"{}\" object is not assignable to a \"{}\" variable.", className,<a name="line.298"></a>
<span class="sourceLineNo">299</span>                        superClass.getName());<a name="line.299"></a>
<span class="sourceLineNo">300</span>                    LOGGER.error("The class \"{}\" was loaded by [{}] whereas object of type [{}] was loaded by [{}].",<a name="line.300"></a>
<span class="sourceLineNo">301</span>                        superClass.getName(), superClass.getClassLoader(), classObj.getName());<a name="line.301"></a>
<span class="sourceLineNo">302</span>                    return defaultValue;<a name="line.302"></a>
<span class="sourceLineNo">303</span>                }<a name="line.303"></a>
<span class="sourceLineNo">304</span>                return classObj.newInstance();<a name="line.304"></a>
<span class="sourceLineNo">305</span>            } catch (final Exception e) {<a name="line.305"></a>
<span class="sourceLineNo">306</span>                LOGGER.error("Could not instantiate class [{}].", className, e);<a name="line.306"></a>
<span class="sourceLineNo">307</span>            }<a name="line.307"></a>
<span class="sourceLineNo">308</span>        }<a name="line.308"></a>
<span class="sourceLineNo">309</span>        return defaultValue;<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><a name="line.312"></a>
<span class="sourceLineNo">313</span>    /**<a name="line.313"></a>
<span class="sourceLineNo">314</span>     * Perform variable substitution in string &lt;code&gt;val&lt;/code&gt; from the<a name="line.314"></a>
<span class="sourceLineNo">315</span>     * values of keys found in the system propeties.<a name="line.315"></a>
<span class="sourceLineNo">316</span>     *<a name="line.316"></a>
<span class="sourceLineNo">317</span>     * &lt;p&gt;The variable substitution delimiters are &lt;b&gt;${&lt;/b&gt; and &lt;b&gt;}&lt;/b&gt;.&lt;/p&gt;<a name="line.317"></a>
<span class="sourceLineNo">318</span>     *<a name="line.318"></a>
<span class="sourceLineNo">319</span>     * &lt;p&gt;For example, if the System properties contains "key=value", then<a name="line.319"></a>
<span class="sourceLineNo">320</span>     * the call&lt;/p&gt;<a name="line.320"></a>
<span class="sourceLineNo">321</span>     * &lt;pre&gt;<a name="line.321"></a>
<span class="sourceLineNo">322</span>     * String s = OptionConverter.substituteVars("Value of key is ${key}.");<a name="line.322"></a>
<span class="sourceLineNo">323</span>     * &lt;/pre&gt;<a name="line.323"></a>
<span class="sourceLineNo">324</span>     * &lt;p&gt;<a name="line.324"></a>
<span class="sourceLineNo">325</span>     * will set the variable &lt;code&gt;s&lt;/code&gt; to "Value of key is value.".<a name="line.325"></a>
<span class="sourceLineNo">326</span>     * &lt;/p&gt;<a name="line.326"></a>
<span class="sourceLineNo">327</span>     * &lt;p&gt;If no value could be found for the specified key, then the<a name="line.327"></a>
<span class="sourceLineNo">328</span>     * &lt;code&gt;props&lt;/code&gt; parameter is searched, if the value could not<a name="line.328"></a>
<span class="sourceLineNo">329</span>     * be found there, then substitution defaults to the empty string.&lt;/p&gt;<a name="line.329"></a>
<span class="sourceLineNo">330</span>     *<a name="line.330"></a>
<span class="sourceLineNo">331</span>     * &lt;p&gt;For example, if system properties contains no value for the key<a name="line.331"></a>
<span class="sourceLineNo">332</span>     * "inexistentKey", then the call<a name="line.332"></a>
<span class="sourceLineNo">333</span>     * &lt;/p&gt;<a name="line.333"></a>
<span class="sourceLineNo">334</span>     * &lt;pre&gt;<a name="line.334"></a>
<span class="sourceLineNo">335</span>     * String s = OptionConverter.subsVars("Value of inexistentKey is [${inexistentKey}]");<a name="line.335"></a>
<span class="sourceLineNo">336</span>     * &lt;/pre&gt;<a name="line.336"></a>
<span class="sourceLineNo">337</span>     * &lt;p&gt;<a name="line.337"></a>
<span class="sourceLineNo">338</span>     * will set &lt;code&gt;s&lt;/code&gt; to "Value of inexistentKey is []"<a name="line.338"></a>
<span class="sourceLineNo">339</span>     * &lt;/p&gt;<a name="line.339"></a>
<span class="sourceLineNo">340</span>     * &lt;p&gt;An {@link java.lang.IllegalArgumentException} is thrown if<a name="line.340"></a>
<span class="sourceLineNo">341</span>     * &lt;code&gt;val&lt;/code&gt; contains a start delimeter "${" which is not<a name="line.341"></a>
<span class="sourceLineNo">342</span>     * balanced by a stop delimeter "}". &lt;/p&gt;<a name="line.342"></a>
<span class="sourceLineNo">343</span>     *<a name="line.343"></a>
<span class="sourceLineNo">344</span>     * @param val The string on which variable substitution is performed.<a name="line.344"></a>
<span class="sourceLineNo">345</span>     * @param props The properties to use for substitution.<a name="line.345"></a>
<span class="sourceLineNo">346</span>     * @return The String after substitution.<a name="line.346"></a>
<span class="sourceLineNo">347</span>     * @throws IllegalArgumentException if &lt;code&gt;val&lt;/code&gt; is malformed.<a name="line.347"></a>
<span class="sourceLineNo">348</span>     */<a name="line.348"></a>
<span class="sourceLineNo">349</span>    public static String substVars(final String val, final Properties props) throws<a name="line.349"></a>
<span class="sourceLineNo">350</span>        IllegalArgumentException {<a name="line.350"></a>
<span class="sourceLineNo">351</span><a name="line.351"></a>
<span class="sourceLineNo">352</span>        final StringBuilder sbuf = new StringBuilder();<a name="line.352"></a>
<span class="sourceLineNo">353</span><a name="line.353"></a>
<span class="sourceLineNo">354</span>        int i = 0;<a name="line.354"></a>
<span class="sourceLineNo">355</span>        int j;<a name="line.355"></a>
<span class="sourceLineNo">356</span>        int k;<a name="line.356"></a>
<span class="sourceLineNo">357</span><a name="line.357"></a>
<span class="sourceLineNo">358</span>        while (true) {<a name="line.358"></a>
<span class="sourceLineNo">359</span>            j = val.indexOf(DELIM_START, i);<a name="line.359"></a>
<span class="sourceLineNo">360</span>            if (j == -1) {<a name="line.360"></a>
<span class="sourceLineNo">361</span>                // no more variables<a name="line.361"></a>
<span class="sourceLineNo">362</span>                if (i == 0) { // this is a simple string<a name="line.362"></a>
<span class="sourceLineNo">363</span>                    return val;<a name="line.363"></a>
<span class="sourceLineNo">364</span>                }<a name="line.364"></a>
<span class="sourceLineNo">365</span>                // add the tail string which contails no variables and return the result.<a name="line.365"></a>
<span class="sourceLineNo">366</span>                sbuf.append(val.substring(i, val.length()));<a name="line.366"></a>
<span class="sourceLineNo">367</span>                return sbuf.toString();<a name="line.367"></a>
<span class="sourceLineNo">368</span>            }<a name="line.368"></a>
<span class="sourceLineNo">369</span>            sbuf.append(val.substring(i, j));<a name="line.369"></a>
<span class="sourceLineNo">370</span>            k = val.indexOf(DELIM_STOP, j);<a name="line.370"></a>
<span class="sourceLineNo">371</span>            if (k == -1) {<a name="line.371"></a>
<span class="sourceLineNo">372</span>                throw new IllegalArgumentException(Strings.dquote(val)<a name="line.372"></a>
<span class="sourceLineNo">373</span>                    + " has no closing brace. Opening brace at position " + j<a name="line.373"></a>
<span class="sourceLineNo">374</span>                    + '.');<a name="line.374"></a>
<span class="sourceLineNo">375</span>            }<a name="line.375"></a>
<span class="sourceLineNo">376</span>            j += DELIM_START_LEN;<a name="line.376"></a>
<span class="sourceLineNo">377</span>            final String key = val.substring(j, k);<a name="line.377"></a>
<span class="sourceLineNo">378</span>            // first try in System properties<a name="line.378"></a>
<span class="sourceLineNo">379</span>            String replacement = PropertiesUtil.getProperties().getStringProperty(key, null);<a name="line.379"></a>
<span class="sourceLineNo">380</span>            // then try props parameter<a name="line.380"></a>
<span class="sourceLineNo">381</span>            if (replacement == null &amp;&amp; props != null) {<a name="line.381"></a>
<span class="sourceLineNo">382</span>                replacement = props.getProperty(key);<a name="line.382"></a>
<span class="sourceLineNo">383</span>            }<a name="line.383"></a>
<span class="sourceLineNo">384</span><a name="line.384"></a>
<span class="sourceLineNo">385</span>            if (replacement != null) {<a name="line.385"></a>
<span class="sourceLineNo">386</span>                // Do variable substitution on the replacement string<a name="line.386"></a>
<span class="sourceLineNo">387</span>                // such that we can solve "Hello ${x2}" as "Hello p1"<a name="line.387"></a>
<span class="sourceLineNo">388</span>                // the where the properties are<a name="line.388"></a>
<span class="sourceLineNo">389</span>                // x1=p1<a name="line.389"></a>
<span class="sourceLineNo">390</span>                // x2=${x1}<a name="line.390"></a>
<span class="sourceLineNo">391</span>                final String recursiveReplacement = substVars(replacement, props);<a name="line.391"></a>
<span class="sourceLineNo">392</span>                sbuf.append(recursiveReplacement);<a name="line.392"></a>
<span class="sourceLineNo">393</span>            }<a name="line.393"></a>
<span class="sourceLineNo">394</span>            i = k + DELIM_STOP_LEN;<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>




























































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