<!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.appender.routing;<a name="line.17"></a>
<span class="sourceLineNo">018</span><a name="line.18"></a>
<span class="sourceLineNo">019</span>import static org.apache.logging.log4j.core.appender.routing.RoutingAppender.STATIC_VARIABLES_KEY;<a name="line.19"></a>
<span class="sourceLineNo">020</span><a name="line.20"></a>
<span class="sourceLineNo">021</span>import java.util.Objects;<a name="line.21"></a>
<span class="sourceLineNo">022</span>import java.util.concurrent.ConcurrentMap;<a name="line.22"></a>
<span class="sourceLineNo">023</span><a name="line.23"></a>
<span class="sourceLineNo">024</span>import javax.script.Bindings;<a name="line.24"></a>
<span class="sourceLineNo">025</span><a name="line.25"></a>
<span class="sourceLineNo">026</span>import org.apache.logging.log4j.Logger;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import org.apache.logging.log4j.core.Core;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import org.apache.logging.log4j.core.LogEvent;<a name="line.28"></a>
<span class="sourceLineNo">029</span>import org.apache.logging.log4j.core.config.Configuration;<a name="line.29"></a>
<span class="sourceLineNo">030</span>import org.apache.logging.log4j.core.config.plugins.Plugin;<a name="line.30"></a>
<span class="sourceLineNo">031</span>import org.apache.logging.log4j.core.config.plugins.PluginAttribute;<a name="line.31"></a>
<span class="sourceLineNo">032</span>import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;<a name="line.32"></a>
<span class="sourceLineNo">033</span>import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;<a name="line.33"></a>
<span class="sourceLineNo">034</span>import org.apache.logging.log4j.core.config.plugins.PluginElement;<a name="line.34"></a>
<span class="sourceLineNo">035</span>import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;<a name="line.35"></a>
<span class="sourceLineNo">036</span>import org.apache.logging.log4j.core.script.AbstractScript;<a name="line.36"></a>
<span class="sourceLineNo">037</span>import org.apache.logging.log4j.core.script.ScriptManager;<a name="line.37"></a>
<span class="sourceLineNo">038</span>import org.apache.logging.log4j.status.StatusLogger;<a name="line.38"></a>
<span class="sourceLineNo">039</span><a name="line.39"></a>
<span class="sourceLineNo">040</span>/**<a name="line.40"></a>
<span class="sourceLineNo">041</span> * Contains the individual Route elements.<a name="line.41"></a>
<span class="sourceLineNo">042</span> */<a name="line.42"></a>
<span class="sourceLineNo">043</span>@Plugin(name = "Routes", category = Core.CATEGORY_NAME, printObject = true)<a name="line.43"></a>
<span class="sourceLineNo">044</span>public final class Routes {<a name="line.44"></a>
<span class="sourceLineNo">045</span><a name="line.45"></a>
<span class="sourceLineNo">046</span>    private static final String LOG_EVENT_KEY = "logEvent";<a name="line.46"></a>
<span class="sourceLineNo">047</span><a name="line.47"></a>
<span class="sourceLineNo">048</span>    public static class Builder implements org.apache.logging.log4j.core.util.Builder&lt;Routes&gt;  {<a name="line.48"></a>
<span class="sourceLineNo">049</span><a name="line.49"></a>
<span class="sourceLineNo">050</span>        @PluginConfiguration<a name="line.50"></a>
<span class="sourceLineNo">051</span>        private Configuration configuration;<a name="line.51"></a>
<span class="sourceLineNo">052</span><a name="line.52"></a>
<span class="sourceLineNo">053</span>        @PluginAttribute("pattern")<a name="line.53"></a>
<span class="sourceLineNo">054</span>        private String pattern;<a name="line.54"></a>
<span class="sourceLineNo">055</span><a name="line.55"></a>
<span class="sourceLineNo">056</span>        @PluginElement("Script")<a name="line.56"></a>
<span class="sourceLineNo">057</span>        private AbstractScript patternScript;<a name="line.57"></a>
<span class="sourceLineNo">058</span><a name="line.58"></a>
<span class="sourceLineNo">059</span>        @PluginElement("Routes")<a name="line.59"></a>
<span class="sourceLineNo">060</span>        @Required<a name="line.60"></a>
<span class="sourceLineNo">061</span>        private Route[] routes;<a name="line.61"></a>
<span class="sourceLineNo">062</span><a name="line.62"></a>
<span class="sourceLineNo">063</span>        @Override<a name="line.63"></a>
<span class="sourceLineNo">064</span>        public Routes build() {<a name="line.64"></a>
<span class="sourceLineNo">065</span>            if (routes == null || routes.length == 0) {<a name="line.65"></a>
<span class="sourceLineNo">066</span>                LOGGER.error("No Routes configured.");<a name="line.66"></a>
<span class="sourceLineNo">067</span>                return null;<a name="line.67"></a>
<span class="sourceLineNo">068</span>            }<a name="line.68"></a>
<span class="sourceLineNo">069</span>            if ((patternScript != null &amp;&amp; pattern != null) || (patternScript == null &amp;&amp; pattern == null)) {<a name="line.69"></a>
<span class="sourceLineNo">070</span>                LOGGER.warn("In a Routes element, you must configure either a Script element or a pattern attribute.");<a name="line.70"></a>
<span class="sourceLineNo">071</span>            }<a name="line.71"></a>
<span class="sourceLineNo">072</span>            if (patternScript != null) {<a name="line.72"></a>
<span class="sourceLineNo">073</span>                if (configuration == null) {<a name="line.73"></a>
<span class="sourceLineNo">074</span>                    LOGGER.error("No Configuration defined for Routes; required for Script");<a name="line.74"></a>
<span class="sourceLineNo">075</span>                } else {<a name="line.75"></a>
<span class="sourceLineNo">076</span>                    configuration.getScriptManager().addScript(patternScript);<a name="line.76"></a>
<span class="sourceLineNo">077</span>                }<a name="line.77"></a>
<span class="sourceLineNo">078</span>            }<a name="line.78"></a>
<span class="sourceLineNo">079</span>            return new Routes(configuration, patternScript, pattern, routes);<a name="line.79"></a>
<span class="sourceLineNo">080</span>        }<a name="line.80"></a>
<span class="sourceLineNo">081</span><a name="line.81"></a>
<span class="sourceLineNo">082</span>        public Configuration getConfiguration() {<a name="line.82"></a>
<span class="sourceLineNo">083</span>            return configuration;<a name="line.83"></a>
<span class="sourceLineNo">084</span>        }<a name="line.84"></a>
<span class="sourceLineNo">085</span><a name="line.85"></a>
<span class="sourceLineNo">086</span>        public String getPattern() {<a name="line.86"></a>
<span class="sourceLineNo">087</span>            return pattern;<a name="line.87"></a>
<span class="sourceLineNo">088</span>        }<a name="line.88"></a>
<span class="sourceLineNo">089</span><a name="line.89"></a>
<span class="sourceLineNo">090</span>        public AbstractScript getPatternScript() {<a name="line.90"></a>
<span class="sourceLineNo">091</span>            return patternScript;<a name="line.91"></a>
<span class="sourceLineNo">092</span>        }<a name="line.92"></a>
<span class="sourceLineNo">093</span><a name="line.93"></a>
<span class="sourceLineNo">094</span>        public Route[] getRoutes() {<a name="line.94"></a>
<span class="sourceLineNo">095</span>            return routes;<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>        public Builder withConfiguration(@SuppressWarnings("hiding") final Configuration configuration) {<a name="line.98"></a>
<span class="sourceLineNo">099</span>            this.configuration = configuration;<a name="line.99"></a>
<span class="sourceLineNo">100</span>            return this;<a name="line.100"></a>
<span class="sourceLineNo">101</span>        }<a name="line.101"></a>
<span class="sourceLineNo">102</span><a name="line.102"></a>
<span class="sourceLineNo">103</span>        public Builder withPattern(@SuppressWarnings("hiding") final String pattern) {<a name="line.103"></a>
<span class="sourceLineNo">104</span>            this.pattern = pattern;<a name="line.104"></a>
<span class="sourceLineNo">105</span>            return this;<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>        public Builder withPatternScript(@SuppressWarnings("hiding") final AbstractScript patternScript) {<a name="line.108"></a>
<span class="sourceLineNo">109</span>            this.patternScript = patternScript;<a name="line.109"></a>
<span class="sourceLineNo">110</span>            return this;<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 Builder withRoutes(@SuppressWarnings("hiding") final Route[] routes) {<a name="line.113"></a>
<span class="sourceLineNo">114</span>            this.routes = routes;<a name="line.114"></a>
<span class="sourceLineNo">115</span>            return this;<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>    }<a name="line.118"></a>
<span class="sourceLineNo">119</span><a name="line.119"></a>
<span class="sourceLineNo">120</span>    private static final Logger LOGGER = StatusLogger.getLogger();<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>     * Creates the Routes.<a name="line.123"></a>
<span class="sourceLineNo">124</span>     * @param pattern The pattern.<a name="line.124"></a>
<span class="sourceLineNo">125</span>     * @param routes An array of Route elements.<a name="line.125"></a>
<span class="sourceLineNo">126</span>     * @return The Routes container.<a name="line.126"></a>
<span class="sourceLineNo">127</span>     * @deprecated since 2.7; use {@link #newBuilder()}.<a name="line.127"></a>
<span class="sourceLineNo">128</span>     */<a name="line.128"></a>
<span class="sourceLineNo">129</span>    @Deprecated<a name="line.129"></a>
<span class="sourceLineNo">130</span>    public static Routes createRoutes(<a name="line.130"></a>
<span class="sourceLineNo">131</span>            final String pattern,<a name="line.131"></a>
<span class="sourceLineNo">132</span>            final Route... routes) {<a name="line.132"></a>
<span class="sourceLineNo">133</span>        if (routes == null || routes.length == 0) {<a name="line.133"></a>
<span class="sourceLineNo">134</span>            LOGGER.error("No routes configured");<a name="line.134"></a>
<span class="sourceLineNo">135</span>            return null;<a name="line.135"></a>
<span class="sourceLineNo">136</span>        }<a name="line.136"></a>
<span class="sourceLineNo">137</span>        return new Routes(null, null, pattern, routes);<a name="line.137"></a>
<span class="sourceLineNo">138</span>    }<a name="line.138"></a>
<span class="sourceLineNo">139</span><a name="line.139"></a>
<span class="sourceLineNo">140</span>    @PluginBuilderFactory<a name="line.140"></a>
<span class="sourceLineNo">141</span>    public static Builder newBuilder() {<a name="line.141"></a>
<span class="sourceLineNo">142</span>        return new Builder();<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>    private final Configuration configuration;<a name="line.145"></a>
<span class="sourceLineNo">146</span><a name="line.146"></a>
<span class="sourceLineNo">147</span>    private final String pattern;<a name="line.147"></a>
<span class="sourceLineNo">148</span><a name="line.148"></a>
<span class="sourceLineNo">149</span>    private final AbstractScript patternScript;<a name="line.149"></a>
<span class="sourceLineNo">150</span><a name="line.150"></a>
<span class="sourceLineNo">151</span>    // TODO Why not make this a Map or add a Map.<a name="line.151"></a>
<span class="sourceLineNo">152</span>    private final Route[] routes;<a name="line.152"></a>
<span class="sourceLineNo">153</span><a name="line.153"></a>
<span class="sourceLineNo">154</span>    private Routes(final Configuration configuration, final AbstractScript patternScript, final String pattern, final Route... routes) {<a name="line.154"></a>
<span class="sourceLineNo">155</span>        this.configuration = configuration;<a name="line.155"></a>
<span class="sourceLineNo">156</span>        this.patternScript = patternScript;<a name="line.156"></a>
<span class="sourceLineNo">157</span>        this.pattern = pattern;<a name="line.157"></a>
<span class="sourceLineNo">158</span>        this.routes = routes;<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>     * Returns the pattern.<a name="line.162"></a>
<span class="sourceLineNo">163</span>     * @param event The log event passed to the script (if there is a script.)<a name="line.163"></a>
<span class="sourceLineNo">164</span>     * @param scriptStaticVariables The script's static variables.<a name="line.164"></a>
<span class="sourceLineNo">165</span>     * @return the pattern.<a name="line.165"></a>
<span class="sourceLineNo">166</span>     */<a name="line.166"></a>
<span class="sourceLineNo">167</span>    public String getPattern(final LogEvent event, final ConcurrentMap&lt;Object, Object&gt; scriptStaticVariables) {<a name="line.167"></a>
<span class="sourceLineNo">168</span>        if (patternScript != null) {<a name="line.168"></a>
<span class="sourceLineNo">169</span>            final ScriptManager scriptManager = configuration.getScriptManager();<a name="line.169"></a>
<span class="sourceLineNo">170</span>            final Bindings bindings = scriptManager.createBindings(patternScript);<a name="line.170"></a>
<span class="sourceLineNo">171</span>            bindings.put(STATIC_VARIABLES_KEY, scriptStaticVariables);<a name="line.171"></a>
<span class="sourceLineNo">172</span>            bindings.put(LOG_EVENT_KEY, event);<a name="line.172"></a>
<span class="sourceLineNo">173</span>            final Object object = scriptManager.execute(patternScript.getName(), bindings);<a name="line.173"></a>
<span class="sourceLineNo">174</span>            bindings.remove(LOG_EVENT_KEY);<a name="line.174"></a>
<span class="sourceLineNo">175</span>            return Objects.toString(object, null);<a name="line.175"></a>
<span class="sourceLineNo">176</span>        }<a name="line.176"></a>
<span class="sourceLineNo">177</span>        return pattern;<a name="line.177"></a>
<span class="sourceLineNo">178</span>    }<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>     * Gets the optional script that decides which route to pick.<a name="line.181"></a>
<span class="sourceLineNo">182</span>     * @return the optional script that decides which route to pick. May be null.<a name="line.182"></a>
<span class="sourceLineNo">183</span>     */<a name="line.183"></a>
<span class="sourceLineNo">184</span>    public AbstractScript getPatternScript() {<a name="line.184"></a>
<span class="sourceLineNo">185</span>        return patternScript;<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>    public Route getRoute(final String key) {<a name="line.188"></a>
<span class="sourceLineNo">189</span>        for (final Route route : routes) {<a name="line.189"></a>
<span class="sourceLineNo">190</span>            if (Objects.equals(route.getKey(), key)) {<a name="line.190"></a>
<span class="sourceLineNo">191</span>                return route;<a name="line.191"></a>
<span class="sourceLineNo">192</span>            }<a name="line.192"></a>
<span class="sourceLineNo">193</span>        }<a name="line.193"></a>
<span class="sourceLineNo">194</span>        return null;<a name="line.194"></a>
<span class="sourceLineNo">195</span>    }<a name="line.195"></a>
<span class="sourceLineNo">196</span><a name="line.196"></a>
<span class="sourceLineNo">197</span>    /**<a name="line.197"></a>
<span class="sourceLineNo">198</span>     * Returns the array of Route elements.<a name="line.198"></a>
<span class="sourceLineNo">199</span>     * @return an array of Route elements.<a name="line.199"></a>
<span class="sourceLineNo">200</span>     */<a name="line.200"></a>
<span class="sourceLineNo">201</span>    public Route[] getRoutes() {<a name="line.201"></a>
<span class="sourceLineNo">202</span>        return routes;<a name="line.202"></a>
<span class="sourceLineNo">203</span>    }<a name="line.203"></a>
<span class="sourceLineNo">204</span><a name="line.204"></a>
<span class="sourceLineNo">205</span>    @Override<a name="line.205"></a>
<span class="sourceLineNo">206</span>    public String toString() {<a name="line.206"></a>
<span class="sourceLineNo">207</span>        final StringBuilder sb = new StringBuilder("{");<a name="line.207"></a>
<span class="sourceLineNo">208</span>        boolean first = true;<a name="line.208"></a>
<span class="sourceLineNo">209</span>        for (final Route route : routes) {<a name="line.209"></a>
<span class="sourceLineNo">210</span>            if (!first) {<a name="line.210"></a>
<span class="sourceLineNo">211</span>                sb.append(',');<a name="line.211"></a>
<span class="sourceLineNo">212</span>            }<a name="line.212"></a>
<span class="sourceLineNo">213</span>            first = false;<a name="line.213"></a>
<span class="sourceLineNo">214</span>            sb.append(route.toString());<a name="line.214"></a>
<span class="sourceLineNo">215</span>        }<a name="line.215"></a>
<span class="sourceLineNo">216</span>        sb.append('}');<a name="line.216"></a>
<span class="sourceLineNo">217</span>        return sb.toString();<a name="line.217"></a>
<span class="sourceLineNo">218</span><a name="line.218"></a>
<span class="sourceLineNo">219</span>    }<a name="line.219"></a>
<span class="sourceLineNo">220</span><a name="line.220"></a>
<span class="sourceLineNo">221</span>}<a name="line.221"></a>




























































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