<!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.rolling;<a name="line.17"></a>
<span class="sourceLineNo">018</span><a name="line.18"></a>
<span class="sourceLineNo">019</span>import java.io.File;<a name="line.19"></a>
<span class="sourceLineNo">020</span>import java.io.IOException;<a name="line.20"></a>
<span class="sourceLineNo">021</span>import java.nio.file.Files;<a name="line.21"></a>
<span class="sourceLineNo">022</span>import java.nio.file.Path;<a name="line.22"></a>
<span class="sourceLineNo">023</span>import java.util.Arrays;<a name="line.23"></a>
<span class="sourceLineNo">024</span>import java.util.Collections;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import java.util.List;<a name="line.25"></a>
<span class="sourceLineNo">026</span>import java.util.Map;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import java.util.SortedMap;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import java.util.concurrent.TimeUnit;<a name="line.28"></a>
<span class="sourceLineNo">029</span>import java.util.zip.Deflater;<a name="line.29"></a>
<span class="sourceLineNo">030</span><a name="line.30"></a>
<span class="sourceLineNo">031</span>import org.apache.logging.log4j.core.Core;<a name="line.31"></a>
<span class="sourceLineNo">032</span>import org.apache.logging.log4j.core.appender.rolling.action.Action;<a name="line.32"></a>
<span class="sourceLineNo">033</span>import org.apache.logging.log4j.core.appender.rolling.action.CompositeAction;<a name="line.33"></a>
<span class="sourceLineNo">034</span>import org.apache.logging.log4j.core.appender.rolling.action.FileRenameAction;<a name="line.34"></a>
<span class="sourceLineNo">035</span>import org.apache.logging.log4j.core.appender.rolling.action.PathCondition;<a name="line.35"></a>
<span class="sourceLineNo">036</span>import org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction;<a name="line.36"></a>
<span class="sourceLineNo">037</span>import org.apache.logging.log4j.core.config.Configuration;<a name="line.37"></a>
<span class="sourceLineNo">038</span>import org.apache.logging.log4j.core.config.plugins.Plugin;<a name="line.38"></a>
<span class="sourceLineNo">039</span>import org.apache.logging.log4j.core.config.plugins.PluginAttribute;<a name="line.39"></a>
<span class="sourceLineNo">040</span>import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;<a name="line.40"></a>
<span class="sourceLineNo">041</span>import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;<a name="line.41"></a>
<span class="sourceLineNo">042</span>import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;<a name="line.42"></a>
<span class="sourceLineNo">043</span>import org.apache.logging.log4j.core.config.plugins.PluginElement;<a name="line.43"></a>
<span class="sourceLineNo">044</span>import org.apache.logging.log4j.core.config.plugins.PluginFactory;<a name="line.44"></a>
<span class="sourceLineNo">045</span>import org.apache.logging.log4j.core.lookup.StrSubstitutor;<a name="line.45"></a>
<span class="sourceLineNo">046</span>import org.apache.logging.log4j.core.util.Integers;<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> * When rolling over, &lt;code&gt;DefaultRolloverStrategy&lt;/code&gt; renames files according to an algorithm as described below.<a name="line.49"></a>
<span class="sourceLineNo">050</span> *<a name="line.50"></a>
<span class="sourceLineNo">051</span> * &lt;p&gt;<a name="line.51"></a>
<span class="sourceLineNo">052</span> * The DefaultRolloverStrategy is a combination of a time-based policy and a fixed-window policy. When the file name<a name="line.52"></a>
<span class="sourceLineNo">053</span> * pattern contains a date format then the rollover time interval will be used to calculate the time to use in the file<a name="line.53"></a>
<span class="sourceLineNo">054</span> * pattern. When the file pattern contains an integer replacement token one of the counting techniques will be used.<a name="line.54"></a>
<span class="sourceLineNo">055</span> * &lt;/p&gt;<a name="line.55"></a>
<span class="sourceLineNo">056</span> * &lt;p&gt;<a name="line.56"></a>
<span class="sourceLineNo">057</span> * When the ascending attribute is set to true (the default) then the counter will be incremented and the current log<a name="line.57"></a>
<span class="sourceLineNo">058</span> * file will be renamed to include the counter value. If the counter hits the maximum value then the oldest file, which<a name="line.58"></a>
<span class="sourceLineNo">059</span> * will have the smallest counter, will be deleted, all other files will be renamed to have their counter decremented<a name="line.59"></a>
<span class="sourceLineNo">060</span> * and then the current file will be renamed to have the maximum counter value. Note that with this counting strategy<a name="line.60"></a>
<span class="sourceLineNo">061</span> * specifying a large maximum value may entirely avoid renaming files.<a name="line.61"></a>
<span class="sourceLineNo">062</span> * &lt;/p&gt;<a name="line.62"></a>
<span class="sourceLineNo">063</span> * &lt;p&gt;<a name="line.63"></a>
<span class="sourceLineNo">064</span> * When the ascending attribute is false, then the "normal" fixed-window strategy will be used.<a name="line.64"></a>
<span class="sourceLineNo">065</span> * &lt;/p&gt;<a name="line.65"></a>
<span class="sourceLineNo">066</span> * &lt;p&gt;<a name="line.66"></a>
<span class="sourceLineNo">067</span> * Let &lt;em&gt;max&lt;/em&gt; and &lt;em&gt;min&lt;/em&gt; represent the values of respectively the &lt;b&gt;MaxIndex&lt;/b&gt; and &lt;b&gt;MinIndex&lt;/b&gt;<a name="line.67"></a>
<span class="sourceLineNo">068</span> * options. Let "foo.log" be the value of the &lt;b&gt;ActiveFile&lt;/b&gt; option and "foo.%i.log" the value of<a name="line.68"></a>
<span class="sourceLineNo">069</span> * &lt;b&gt;FileNamePattern&lt;/b&gt;. Then, when rolling over, the file &lt;code&gt;foo.&lt;em&gt;max&lt;/em&gt;.log&lt;/code&gt; will be deleted, the file<a name="line.69"></a>
<span class="sourceLineNo">070</span> * &lt;code&gt;foo.&lt;em&gt;max-1&lt;/em&gt;.log&lt;/code&gt; will be renamed as &lt;code&gt;foo.&lt;em&gt;max&lt;/em&gt;.log&lt;/code&gt;, the file<a name="line.70"></a>
<span class="sourceLineNo">071</span> * &lt;code&gt;foo.&lt;em&gt;max-2&lt;/em&gt;.log&lt;/code&gt; renamed as &lt;code&gt;foo.&lt;em&gt;max-1&lt;/em&gt;.log&lt;/code&gt;, and so on, the file<a name="line.71"></a>
<span class="sourceLineNo">072</span> * &lt;code&gt;foo.&lt;em&gt;min+1&lt;/em&gt;.log&lt;/code&gt; renamed as &lt;code&gt;foo.&lt;em&gt;min+2&lt;/em&gt;.log&lt;/code&gt;. Lastly, the active file<a name="line.72"></a>
<span class="sourceLineNo">073</span> * &lt;code&gt;foo.log&lt;/code&gt; will be renamed as &lt;code&gt;foo.&lt;em&gt;min&lt;/em&gt;.log&lt;/code&gt; and a new active file name<a name="line.73"></a>
<span class="sourceLineNo">074</span> * &lt;code&gt;foo.log&lt;/code&gt; will be created.<a name="line.74"></a>
<span class="sourceLineNo">075</span> * &lt;/p&gt;<a name="line.75"></a>
<span class="sourceLineNo">076</span> * &lt;p&gt;<a name="line.76"></a>
<span class="sourceLineNo">077</span> * Given that this rollover algorithm requires as many file renaming operations as the window size, large window sizes<a name="line.77"></a>
<span class="sourceLineNo">078</span> * are discouraged.<a name="line.78"></a>
<span class="sourceLineNo">079</span> * &lt;/p&gt;<a name="line.79"></a>
<span class="sourceLineNo">080</span> */<a name="line.80"></a>
<span class="sourceLineNo">081</span>@Plugin(name = "DefaultRolloverStrategy", category = Core.CATEGORY_NAME, printObject = true)<a name="line.81"></a>
<span class="sourceLineNo">082</span>public class DefaultRolloverStrategy extends AbstractRolloverStrategy {<a name="line.82"></a>
<span class="sourceLineNo">083</span><a name="line.83"></a>
<span class="sourceLineNo">084</span>    private static final int MIN_WINDOW_SIZE = 1;<a name="line.84"></a>
<span class="sourceLineNo">085</span>    private static final int DEFAULT_WINDOW_SIZE = 7;<a name="line.85"></a>
<span class="sourceLineNo">086</span><a name="line.86"></a>
<span class="sourceLineNo">087</span>    /**<a name="line.87"></a>
<span class="sourceLineNo">088</span>     * Builds DefaultRolloverStrategy instances.<a name="line.88"></a>
<span class="sourceLineNo">089</span>     */<a name="line.89"></a>
<span class="sourceLineNo">090</span>    public static class Builder implements org.apache.logging.log4j.core.util.Builder&lt;DefaultRolloverStrategy&gt; {<a name="line.90"></a>
<span class="sourceLineNo">091</span>        @PluginBuilderAttribute("max")<a name="line.91"></a>
<span class="sourceLineNo">092</span>        private String max;<a name="line.92"></a>
<span class="sourceLineNo">093</span><a name="line.93"></a>
<span class="sourceLineNo">094</span>        @PluginBuilderAttribute("min")<a name="line.94"></a>
<span class="sourceLineNo">095</span>        private String min;<a name="line.95"></a>
<span class="sourceLineNo">096</span><a name="line.96"></a>
<span class="sourceLineNo">097</span>        @PluginBuilderAttribute("fileIndex")<a name="line.97"></a>
<span class="sourceLineNo">098</span>        private String fileIndex;<a name="line.98"></a>
<span class="sourceLineNo">099</span><a name="line.99"></a>
<span class="sourceLineNo">100</span>        @PluginBuilderAttribute("compressionLevel")<a name="line.100"></a>
<span class="sourceLineNo">101</span>        private String compressionLevelStr;<a name="line.101"></a>
<span class="sourceLineNo">102</span><a name="line.102"></a>
<span class="sourceLineNo">103</span>        @PluginElement("Actions")<a name="line.103"></a>
<span class="sourceLineNo">104</span>        private Action[] customActions;<a name="line.104"></a>
<span class="sourceLineNo">105</span><a name="line.105"></a>
<span class="sourceLineNo">106</span>        @PluginBuilderAttribute(value = "stopCustomActionsOnError")<a name="line.106"></a>
<span class="sourceLineNo">107</span>        private boolean stopCustomActionsOnError = true;<a name="line.107"></a>
<span class="sourceLineNo">108</span><a name="line.108"></a>
<span class="sourceLineNo">109</span>        @PluginBuilderAttribute(value = "tempCompressedFilePattern")<a name="line.109"></a>
<span class="sourceLineNo">110</span>        private String tempCompressedFilePattern;<a name="line.110"></a>
<span class="sourceLineNo">111</span><a name="line.111"></a>
<span class="sourceLineNo">112</span>        @PluginConfiguration<a name="line.112"></a>
<span class="sourceLineNo">113</span>        private Configuration config;<a name="line.113"></a>
<span class="sourceLineNo">114</span><a name="line.114"></a>
<span class="sourceLineNo">115</span>        @Override<a name="line.115"></a>
<span class="sourceLineNo">116</span>        public DefaultRolloverStrategy build() {<a name="line.116"></a>
<span class="sourceLineNo">117</span>            int minIndex;<a name="line.117"></a>
<span class="sourceLineNo">118</span>            int maxIndex;<a name="line.118"></a>
<span class="sourceLineNo">119</span>            boolean useMax;<a name="line.119"></a>
<span class="sourceLineNo">120</span><a name="line.120"></a>
<span class="sourceLineNo">121</span>            if (fileIndex != null &amp;&amp; fileIndex.equalsIgnoreCase("nomax")) {<a name="line.121"></a>
<span class="sourceLineNo">122</span>                minIndex = Integer.MIN_VALUE;<a name="line.122"></a>
<span class="sourceLineNo">123</span>                maxIndex = Integer.MAX_VALUE;<a name="line.123"></a>
<span class="sourceLineNo">124</span>                useMax = false;<a name="line.124"></a>
<span class="sourceLineNo">125</span>            } else {<a name="line.125"></a>
<span class="sourceLineNo">126</span>                useMax = fileIndex == null ? true : fileIndex.equalsIgnoreCase("max");<a name="line.126"></a>
<span class="sourceLineNo">127</span>                minIndex = MIN_WINDOW_SIZE;<a name="line.127"></a>
<span class="sourceLineNo">128</span>                if (min != null) {<a name="line.128"></a>
<span class="sourceLineNo">129</span>                    minIndex = Integer.parseInt(min);<a name="line.129"></a>
<span class="sourceLineNo">130</span>                    if (minIndex &lt; 1) {<a name="line.130"></a>
<span class="sourceLineNo">131</span>                        LOGGER.error("Minimum window size too small. Limited to " + MIN_WINDOW_SIZE);<a name="line.131"></a>
<span class="sourceLineNo">132</span>                        minIndex = MIN_WINDOW_SIZE;<a name="line.132"></a>
<span class="sourceLineNo">133</span>                    }<a name="line.133"></a>
<span class="sourceLineNo">134</span>                }<a name="line.134"></a>
<span class="sourceLineNo">135</span>                maxIndex = DEFAULT_WINDOW_SIZE;<a name="line.135"></a>
<span class="sourceLineNo">136</span>                if (max != null) {<a name="line.136"></a>
<span class="sourceLineNo">137</span>                    maxIndex = Integer.parseInt(max);<a name="line.137"></a>
<span class="sourceLineNo">138</span>                    if (maxIndex &lt; minIndex) {<a name="line.138"></a>
<span class="sourceLineNo">139</span>                        maxIndex = minIndex &lt; DEFAULT_WINDOW_SIZE ? DEFAULT_WINDOW_SIZE : minIndex;<a name="line.139"></a>
<span class="sourceLineNo">140</span>                        LOGGER.error("Maximum window size must be greater than the minimum windows size. Set to " + maxIndex);<a name="line.140"></a>
<span class="sourceLineNo">141</span>                    }<a name="line.141"></a>
<span class="sourceLineNo">142</span>                }<a name="line.142"></a>
<span class="sourceLineNo">143</span>            }<a name="line.143"></a>
<span class="sourceLineNo">144</span>            final int compressionLevel = Integers.parseInt(compressionLevelStr, Deflater.DEFAULT_COMPRESSION);<a name="line.144"></a>
<span class="sourceLineNo">145</span>            // The config object can be null when this object is built programmatically.<a name="line.145"></a>
<span class="sourceLineNo">146</span>            final StrSubstitutor nonNullStrSubstitutor = config != null ? config.getStrSubstitutor() : new StrSubstitutor();<a name="line.146"></a>
<span class="sourceLineNo">147</span>                        return new DefaultRolloverStrategy(minIndex, maxIndex, useMax, compressionLevel, nonNullStrSubstitutor,<a name="line.147"></a>
<span class="sourceLineNo">148</span>                    customActions, stopCustomActionsOnError, tempCompressedFilePattern);<a name="line.148"></a>
<span class="sourceLineNo">149</span>        }<a name="line.149"></a>
<span class="sourceLineNo">150</span><a name="line.150"></a>
<span class="sourceLineNo">151</span>        public String getMax() {<a name="line.151"></a>
<span class="sourceLineNo">152</span>            return max;<a name="line.152"></a>
<span class="sourceLineNo">153</span>        }<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>         * Defines the maximum number of files to keep.<a name="line.156"></a>
<span class="sourceLineNo">157</span>         *<a name="line.157"></a>
<span class="sourceLineNo">158</span>         * @param max The maximum number of files to keep.<a name="line.158"></a>
<span class="sourceLineNo">159</span>         * @return This builder for chaining convenience<a name="line.159"></a>
<span class="sourceLineNo">160</span>         */<a name="line.160"></a>
<span class="sourceLineNo">161</span>        public Builder withMax(final String max) {<a name="line.161"></a>
<span class="sourceLineNo">162</span>            this.max = max;<a name="line.162"></a>
<span class="sourceLineNo">163</span>            return this;<a name="line.163"></a>
<span class="sourceLineNo">164</span>        }<a name="line.164"></a>
<span class="sourceLineNo">165</span><a name="line.165"></a>
<span class="sourceLineNo">166</span>        public String getMin() {<a name="line.166"></a>
<span class="sourceLineNo">167</span>            return min;<a name="line.167"></a>
<span class="sourceLineNo">168</span>        }<a name="line.168"></a>
<span class="sourceLineNo">169</span><a name="line.169"></a>
<span class="sourceLineNo">170</span>        /**<a name="line.170"></a>
<span class="sourceLineNo">171</span>         * Defines the minimum number of files to keep.<a name="line.171"></a>
<span class="sourceLineNo">172</span>         *<a name="line.172"></a>
<span class="sourceLineNo">173</span>         * @param min The minimum number of files to keep.<a name="line.173"></a>
<span class="sourceLineNo">174</span>         * @return This builder for chaining convenience<a name="line.174"></a>
<span class="sourceLineNo">175</span>         */<a name="line.175"></a>
<span class="sourceLineNo">176</span>        public Builder withMin(final String min) {<a name="line.176"></a>
<span class="sourceLineNo">177</span>            this.min = min;<a name="line.177"></a>
<span class="sourceLineNo">178</span>            return this;<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>        public String getFileIndex() {<a name="line.181"></a>
<span class="sourceLineNo">182</span>            return fileIndex;<a name="line.182"></a>
<span class="sourceLineNo">183</span>        }<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>         * Defines the file index for rolling strategy.<a name="line.186"></a>
<span class="sourceLineNo">187</span>         *<a name="line.187"></a>
<span class="sourceLineNo">188</span>         * @param fileIndex If set to "max" (the default), files with a higher index will be newer than files with a smaller<a name="line.188"></a>
<span class="sourceLineNo">189</span>         *            index. If set to "min", file renaming and the counter will follow the Fixed Window strategy.<a name="line.189"></a>
<span class="sourceLineNo">190</span>         * @return This builder for chaining convenience<a name="line.190"></a>
<span class="sourceLineNo">191</span>         */<a name="line.191"></a>
<span class="sourceLineNo">192</span>        public Builder withFileIndex(final String fileIndex) {<a name="line.192"></a>
<span class="sourceLineNo">193</span>            this.fileIndex = fileIndex;<a name="line.193"></a>
<span class="sourceLineNo">194</span>            return this;<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>        public String getCompressionLevelStr() {<a name="line.197"></a>
<span class="sourceLineNo">198</span>            return compressionLevelStr;<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>         * Defines compression level.<a name="line.202"></a>
<span class="sourceLineNo">203</span>         *<a name="line.203"></a>
<span class="sourceLineNo">204</span>         * @param compressionLevelStr The compression level, 0 (less) through 9 (more); applies only to ZIP files.<a name="line.204"></a>
<span class="sourceLineNo">205</span>         * @return This builder for chaining convenience<a name="line.205"></a>
<span class="sourceLineNo">206</span>         */<a name="line.206"></a>
<span class="sourceLineNo">207</span>        public Builder withCompressionLevelStr(final String compressionLevelStr) {<a name="line.207"></a>
<span class="sourceLineNo">208</span>            this.compressionLevelStr = compressionLevelStr;<a name="line.208"></a>
<span class="sourceLineNo">209</span>            return this;<a name="line.209"></a>
<span class="sourceLineNo">210</span>        }<a name="line.210"></a>
<span class="sourceLineNo">211</span><a name="line.211"></a>
<span class="sourceLineNo">212</span>        public Action[] getCustomActions() {<a name="line.212"></a>
<span class="sourceLineNo">213</span>            return customActions;<a name="line.213"></a>
<span class="sourceLineNo">214</span>        }<a name="line.214"></a>
<span class="sourceLineNo">215</span><a name="line.215"></a>
<span class="sourceLineNo">216</span>        /**<a name="line.216"></a>
<span class="sourceLineNo">217</span>         * Defines custom actions.<a name="line.217"></a>
<span class="sourceLineNo">218</span>         *<a name="line.218"></a>
<span class="sourceLineNo">219</span>         * @param customActions custom actions to perform asynchronously after rollover<a name="line.219"></a>
<span class="sourceLineNo">220</span>         * @return This builder for chaining convenience<a name="line.220"></a>
<span class="sourceLineNo">221</span>         */<a name="line.221"></a>
<span class="sourceLineNo">222</span>        public Builder withCustomActions(final Action[] customActions) {<a name="line.222"></a>
<span class="sourceLineNo">223</span>            this.customActions = customActions;<a name="line.223"></a>
<span class="sourceLineNo">224</span>            return this;<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>        public boolean isStopCustomActionsOnError() {<a name="line.227"></a>
<span class="sourceLineNo">228</span>            return stopCustomActionsOnError;<a name="line.228"></a>
<span class="sourceLineNo">229</span>        }<a name="line.229"></a>
<span class="sourceLineNo">230</span><a name="line.230"></a>
<span class="sourceLineNo">231</span>        /**<a name="line.231"></a>
<span class="sourceLineNo">232</span>         * Defines whether to stop executing asynchronous actions if an error occurs.<a name="line.232"></a>
<span class="sourceLineNo">233</span>         *<a name="line.233"></a>
<span class="sourceLineNo">234</span>         * @param stopCustomActionsOnError whether to stop executing asynchronous actions if an error occurs<a name="line.234"></a>
<span class="sourceLineNo">235</span>         * @return This builder for chaining convenience<a name="line.235"></a>
<span class="sourceLineNo">236</span>         */<a name="line.236"></a>
<span class="sourceLineNo">237</span>        public Builder withStopCustomActionsOnError(final boolean stopCustomActionsOnError) {<a name="line.237"></a>
<span class="sourceLineNo">238</span>            this.stopCustomActionsOnError = stopCustomActionsOnError;<a name="line.238"></a>
<span class="sourceLineNo">239</span>            return this;<a name="line.239"></a>
<span class="sourceLineNo">240</span>        }<a name="line.240"></a>
<span class="sourceLineNo">241</span><a name="line.241"></a>
<span class="sourceLineNo">242</span>        public String getTempCompressedFilePattern() {<a name="line.242"></a>
<span class="sourceLineNo">243</span>            return tempCompressedFilePattern;<a name="line.243"></a>
<span class="sourceLineNo">244</span>        }<a name="line.244"></a>
<span class="sourceLineNo">245</span><a name="line.245"></a>
<span class="sourceLineNo">246</span>        /**<a name="line.246"></a>
<span class="sourceLineNo">247</span>         * Defines temporary compression file pattern.<a name="line.247"></a>
<span class="sourceLineNo">248</span>         *<a name="line.248"></a>
<span class="sourceLineNo">249</span>         * @param tempCompressedFilePattern File pattern of the working file pattern used during compression, if null no temporary file are used<a name="line.249"></a>
<span class="sourceLineNo">250</span>         * @return This builder for chaining convenience<a name="line.250"></a>
<span class="sourceLineNo">251</span>         */<a name="line.251"></a>
<span class="sourceLineNo">252</span>        public Builder withTempCompressedFilePattern(final String tempCompressedFilePattern) {<a name="line.252"></a>
<span class="sourceLineNo">253</span>            this.tempCompressedFilePattern = tempCompressedFilePattern;<a name="line.253"></a>
<span class="sourceLineNo">254</span>            return this;<a name="line.254"></a>
<span class="sourceLineNo">255</span>        }<a name="line.255"></a>
<span class="sourceLineNo">256</span><a name="line.256"></a>
<span class="sourceLineNo">257</span>        public Configuration getConfig() {<a name="line.257"></a>
<span class="sourceLineNo">258</span>            return config;<a name="line.258"></a>
<span class="sourceLineNo">259</span>        }<a name="line.259"></a>
<span class="sourceLineNo">260</span><a name="line.260"></a>
<span class="sourceLineNo">261</span>        /**<a name="line.261"></a>
<span class="sourceLineNo">262</span>         * Defines configuration.<a name="line.262"></a>
<span class="sourceLineNo">263</span>         *<a name="line.263"></a>
<span class="sourceLineNo">264</span>         * @param config The Configuration.<a name="line.264"></a>
<span class="sourceLineNo">265</span>         * @return This builder for chaining convenience<a name="line.265"></a>
<span class="sourceLineNo">266</span>         */<a name="line.266"></a>
<span class="sourceLineNo">267</span>        public Builder withConfig(final Configuration config) {<a name="line.267"></a>
<span class="sourceLineNo">268</span>            this.config = config;<a name="line.268"></a>
<span class="sourceLineNo">269</span>            return this;<a name="line.269"></a>
<span class="sourceLineNo">270</span>        }<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>    @PluginBuilderFactory<a name="line.273"></a>
<span class="sourceLineNo">274</span>    public static Builder newBuilder() {<a name="line.274"></a>
<span class="sourceLineNo">275</span>        return new Builder();<a name="line.275"></a>
<span class="sourceLineNo">276</span>    }<a name="line.276"></a>
<span class="sourceLineNo">277</span><a name="line.277"></a>
<span class="sourceLineNo">278</span>    /**<a name="line.278"></a>
<span class="sourceLineNo">279</span>     * Creates the DefaultRolloverStrategy.<a name="line.279"></a>
<span class="sourceLineNo">280</span>     *<a name="line.280"></a>
<span class="sourceLineNo">281</span>     * @param max The maximum number of files to keep.<a name="line.281"></a>
<span class="sourceLineNo">282</span>     * @param min The minimum number of files to keep.<a name="line.282"></a>
<span class="sourceLineNo">283</span>     * @param fileIndex If set to "max" (the default), files with a higher index will be newer than files with a smaller<a name="line.283"></a>
<span class="sourceLineNo">284</span>     *            index. If set to "min", file renaming and the counter will follow the Fixed Window strategy.<a name="line.284"></a>
<span class="sourceLineNo">285</span>     * @param compressionLevelStr The compression level, 0 (less) through 9 (more); applies only to ZIP files.<a name="line.285"></a>
<span class="sourceLineNo">286</span>     * @param customActions custom actions to perform asynchronously after rollover<a name="line.286"></a>
<span class="sourceLineNo">287</span>     * @param stopCustomActionsOnError whether to stop executing asynchronous actions if an error occurs<a name="line.287"></a>
<span class="sourceLineNo">288</span>     * @param config The Configuration.<a name="line.288"></a>
<span class="sourceLineNo">289</span>     * @return A DefaultRolloverStrategy.<a name="line.289"></a>
<span class="sourceLineNo">290</span>     * @deprecated Since 2.9 Usage of Builder API is preferable<a name="line.290"></a>
<span class="sourceLineNo">291</span>     */<a name="line.291"></a>
<span class="sourceLineNo">292</span>    @PluginFactory<a name="line.292"></a>
<span class="sourceLineNo">293</span>    @Deprecated<a name="line.293"></a>
<span class="sourceLineNo">294</span>    public static DefaultRolloverStrategy createStrategy(<a name="line.294"></a>
<span class="sourceLineNo">295</span>            // @formatter:off<a name="line.295"></a>
<span class="sourceLineNo">296</span>            @PluginAttribute("max") final String max,<a name="line.296"></a>
<span class="sourceLineNo">297</span>            @PluginAttribute("min") final String min,<a name="line.297"></a>
<span class="sourceLineNo">298</span>            @PluginAttribute("fileIndex") final String fileIndex,<a name="line.298"></a>
<span class="sourceLineNo">299</span>            @PluginAttribute("compressionLevel") final String compressionLevelStr,<a name="line.299"></a>
<span class="sourceLineNo">300</span>            @PluginElement("Actions") final Action[] customActions,<a name="line.300"></a>
<span class="sourceLineNo">301</span>            @PluginAttribute(value = "stopCustomActionsOnError", defaultBoolean = true)<a name="line.301"></a>
<span class="sourceLineNo">302</span>                    final boolean stopCustomActionsOnError,<a name="line.302"></a>
<span class="sourceLineNo">303</span>            @PluginConfiguration final Configuration config) {<a name="line.303"></a>
<span class="sourceLineNo">304</span>        return DefaultRolloverStrategy.newBuilder()<a name="line.304"></a>
<span class="sourceLineNo">305</span>                    .withMin(min)<a name="line.305"></a>
<span class="sourceLineNo">306</span>                    .withMax(max)<a name="line.306"></a>
<span class="sourceLineNo">307</span>                    .withFileIndex(fileIndex)<a name="line.307"></a>
<span class="sourceLineNo">308</span>                    .withCompressionLevelStr(compressionLevelStr)<a name="line.308"></a>
<span class="sourceLineNo">309</span>                    .withCustomActions(customActions)<a name="line.309"></a>
<span class="sourceLineNo">310</span>                    .withStopCustomActionsOnError(stopCustomActionsOnError)<a name="line.310"></a>
<span class="sourceLineNo">311</span>                    .withConfig(config)<a name="line.311"></a>
<span class="sourceLineNo">312</span>                .build();<a name="line.312"></a>
<span class="sourceLineNo">313</span>            // @formatter:on<a name="line.313"></a>
<span class="sourceLineNo">314</span>    }<a name="line.314"></a>
<span class="sourceLineNo">315</span><a name="line.315"></a>
<span class="sourceLineNo">316</span>    /**<a name="line.316"></a>
<span class="sourceLineNo">317</span>     * Index for oldest retained log file.<a name="line.317"></a>
<span class="sourceLineNo">318</span>     */<a name="line.318"></a>
<span class="sourceLineNo">319</span>    private final int maxIndex;<a name="line.319"></a>
<span class="sourceLineNo">320</span><a name="line.320"></a>
<span class="sourceLineNo">321</span>    /**<a name="line.321"></a>
<span class="sourceLineNo">322</span>     * Index for most recent log file.<a name="line.322"></a>
<span class="sourceLineNo">323</span>     */<a name="line.323"></a>
<span class="sourceLineNo">324</span>    private final int minIndex;<a name="line.324"></a>
<span class="sourceLineNo">325</span>    private final boolean useMax;<a name="line.325"></a>
<span class="sourceLineNo">326</span>    private final int compressionLevel;<a name="line.326"></a>
<span class="sourceLineNo">327</span>    private final List&lt;Action&gt; customActions;<a name="line.327"></a>
<span class="sourceLineNo">328</span>    private final boolean stopCustomActionsOnError;<a name="line.328"></a>
<span class="sourceLineNo">329</span>    private final PatternProcessor tempCompressedFilePattern;<a name="line.329"></a>
<span class="sourceLineNo">330</span><a name="line.330"></a>
<span class="sourceLineNo">331</span>    /**<a name="line.331"></a>
<span class="sourceLineNo">332</span>     * Constructs a new instance.<a name="line.332"></a>
<span class="sourceLineNo">333</span>     *<a name="line.333"></a>
<span class="sourceLineNo">334</span>     * @param minIndex The minimum index.<a name="line.334"></a>
<span class="sourceLineNo">335</span>     * @param maxIndex The maximum index.<a name="line.335"></a>
<span class="sourceLineNo">336</span>     * @param customActions custom actions to perform asynchronously after rollover<a name="line.336"></a>
<span class="sourceLineNo">337</span>     * @param stopCustomActionsOnError whether to stop executing asynchronous actions if an error occurs<a name="line.337"></a>
<span class="sourceLineNo">338</span>     * @deprecated Since 2.9 Added tempCompressedFilePatternString parameter<a name="line.338"></a>
<span class="sourceLineNo">339</span>     */<a name="line.339"></a>
<span class="sourceLineNo">340</span>    @Deprecated<a name="line.340"></a>
<span class="sourceLineNo">341</span>    protected DefaultRolloverStrategy(final int minIndex, final int maxIndex, final boolean useMax,<a name="line.341"></a>
<span class="sourceLineNo">342</span>            final int compressionLevel, final StrSubstitutor strSubstitutor, final Action[] customActions,<a name="line.342"></a>
<span class="sourceLineNo">343</span>            final boolean stopCustomActionsOnError) {<a name="line.343"></a>
<span class="sourceLineNo">344</span>        this(minIndex, maxIndex, useMax, compressionLevel,<a name="line.344"></a>
<span class="sourceLineNo">345</span>                       strSubstitutor, customActions, stopCustomActionsOnError, null);<a name="line.345"></a>
<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
<span class="sourceLineNo">347</span><a name="line.347"></a>
<span class="sourceLineNo">348</span>    /**<a name="line.348"></a>
<span class="sourceLineNo">349</span>     * Constructs a new instance.<a name="line.349"></a>
<span class="sourceLineNo">350</span>     *<a name="line.350"></a>
<span class="sourceLineNo">351</span>     * @param minIndex The minimum index.<a name="line.351"></a>
<span class="sourceLineNo">352</span>     * @param maxIndex The maximum index.<a name="line.352"></a>
<span class="sourceLineNo">353</span>     * @param customActions custom actions to perform asynchronously after rollover<a name="line.353"></a>
<span class="sourceLineNo">354</span>     * @param stopCustomActionsOnError whether to stop executing asynchronous actions if an error occurs<a name="line.354"></a>
<span class="sourceLineNo">355</span>     * @param tempCompressedFilePatternString File pattern of the working file<a name="line.355"></a>
<span class="sourceLineNo">356</span>     *                                     used during compression, if null no temporary file are used<a name="line.356"></a>
<span class="sourceLineNo">357</span>     */<a name="line.357"></a>
<span class="sourceLineNo">358</span>    protected DefaultRolloverStrategy(final int minIndex, final int maxIndex, final boolean useMax,<a name="line.358"></a>
<span class="sourceLineNo">359</span>            final int compressionLevel, final StrSubstitutor strSubstitutor, final Action[] customActions,<a name="line.359"></a>
<span class="sourceLineNo">360</span>            final boolean stopCustomActionsOnError, final String tempCompressedFilePatternString) {<a name="line.360"></a>
<span class="sourceLineNo">361</span>        super(strSubstitutor);<a name="line.361"></a>
<span class="sourceLineNo">362</span>        this.minIndex = minIndex;<a name="line.362"></a>
<span class="sourceLineNo">363</span>        this.maxIndex = maxIndex;<a name="line.363"></a>
<span class="sourceLineNo">364</span>        this.useMax = useMax;<a name="line.364"></a>
<span class="sourceLineNo">365</span>        this.compressionLevel = compressionLevel;<a name="line.365"></a>
<span class="sourceLineNo">366</span>        this.stopCustomActionsOnError = stopCustomActionsOnError;<a name="line.366"></a>
<span class="sourceLineNo">367</span>        this.customActions = customActions == null ? Collections.&lt;Action&gt; emptyList() : Arrays.asList(customActions);<a name="line.367"></a>
<span class="sourceLineNo">368</span>        this.tempCompressedFilePattern =<a name="line.368"></a>
<span class="sourceLineNo">369</span>                tempCompressedFilePatternString != null ? new PatternProcessor(tempCompressedFilePatternString) : null;<a name="line.369"></a>
<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
<span class="sourceLineNo">371</span><a name="line.371"></a>
<span class="sourceLineNo">372</span>    public int getCompressionLevel() {<a name="line.372"></a>
<span class="sourceLineNo">373</span>        return this.compressionLevel;<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>    public List&lt;Action&gt; getCustomActions() {<a name="line.376"></a>
<span class="sourceLineNo">377</span>        return customActions;<a name="line.377"></a>
<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
<span class="sourceLineNo">379</span><a name="line.379"></a>
<span class="sourceLineNo">380</span>    public int getMaxIndex() {<a name="line.380"></a>
<span class="sourceLineNo">381</span>        return this.maxIndex;<a name="line.381"></a>
<span class="sourceLineNo">382</span>    }<a name="line.382"></a>
<span class="sourceLineNo">383</span><a name="line.383"></a>
<span class="sourceLineNo">384</span>    public int getMinIndex() {<a name="line.384"></a>
<span class="sourceLineNo">385</span>        return this.minIndex;<a name="line.385"></a>
<span class="sourceLineNo">386</span>    }<a name="line.386"></a>
<span class="sourceLineNo">387</span><a name="line.387"></a>
<span class="sourceLineNo">388</span>    public boolean isStopCustomActionsOnError() {<a name="line.388"></a>
<span class="sourceLineNo">389</span>        return stopCustomActionsOnError;<a name="line.389"></a>
<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
<span class="sourceLineNo">391</span><a name="line.391"></a>
<span class="sourceLineNo">392</span>    public boolean isUseMax() {<a name="line.392"></a>
<span class="sourceLineNo">393</span>        return useMax;<a name="line.393"></a>
<span class="sourceLineNo">394</span>    }<a name="line.394"></a>
<span class="sourceLineNo">395</span><a name="line.395"></a>
<span class="sourceLineNo">396</span>    public PatternProcessor getTempCompressedFilePattern() {<a name="line.396"></a>
<span class="sourceLineNo">397</span>        return tempCompressedFilePattern;<a name="line.397"></a>
<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
<span class="sourceLineNo">399</span><a name="line.399"></a>
<span class="sourceLineNo">400</span>    private int purge(final int lowIndex, final int highIndex, final RollingFileManager manager) {<a name="line.400"></a>
<span class="sourceLineNo">401</span>        return useMax ? purgeAscending(lowIndex, highIndex, manager) : purgeDescending(lowIndex, highIndex, manager);<a name="line.401"></a>
<span class="sourceLineNo">402</span>    }<a name="line.402"></a>
<span class="sourceLineNo">403</span><a name="line.403"></a>
<span class="sourceLineNo">404</span>    /**<a name="line.404"></a>
<span class="sourceLineNo">405</span>     * Purges and renames old log files in preparation for rollover. The oldest file will have the smallest index, the<a name="line.405"></a>
<span class="sourceLineNo">406</span>     * newest the highest.<a name="line.406"></a>
<span class="sourceLineNo">407</span>     *<a name="line.407"></a>
<span class="sourceLineNo">408</span>     * @param lowIndex low index. Log file associated with low index will be deleted if needed.<a name="line.408"></a>
<span class="sourceLineNo">409</span>     * @param highIndex high index.<a name="line.409"></a>
<span class="sourceLineNo">410</span>     * @param manager The RollingFileManager<a name="line.410"></a>
<span class="sourceLineNo">411</span>     * @return true if purge was successful and rollover should be attempted.<a name="line.411"></a>
<span class="sourceLineNo">412</span>     */<a name="line.412"></a>
<span class="sourceLineNo">413</span>    private int purgeAscending(final int lowIndex, final int highIndex, final RollingFileManager manager) {<a name="line.413"></a>
<span class="sourceLineNo">414</span>        final SortedMap&lt;Integer, Path&gt; eligibleFiles = getEligibleFiles(manager);<a name="line.414"></a>
<span class="sourceLineNo">415</span>        final int maxFiles = highIndex - lowIndex + 1;<a name="line.415"></a>
<span class="sourceLineNo">416</span><a name="line.416"></a>
<span class="sourceLineNo">417</span>        boolean renameFiles = !eligibleFiles.isEmpty() &amp;&amp; eligibleFiles.lastKey() &gt;= maxIndex;<a name="line.417"></a>
<span class="sourceLineNo">418</span>        while (eligibleFiles.size() &gt;= maxFiles) {<a name="line.418"></a>
<span class="sourceLineNo">419</span>            try {<a name="line.419"></a>
<span class="sourceLineNo">420</span>                LOGGER.debug("Eligible files: {}", eligibleFiles);<a name="line.420"></a>
<span class="sourceLineNo">421</span>                final Integer key = eligibleFiles.firstKey();<a name="line.421"></a>
<span class="sourceLineNo">422</span>                LOGGER.debug("Deleting {}", eligibleFiles.get(key).toFile().getAbsolutePath());<a name="line.422"></a>
<span class="sourceLineNo">423</span>                Files.delete(eligibleFiles.get(key));<a name="line.423"></a>
<span class="sourceLineNo">424</span>                eligibleFiles.remove(key);<a name="line.424"></a>
<span class="sourceLineNo">425</span>                renameFiles = true;<a name="line.425"></a>
<span class="sourceLineNo">426</span>            } catch (final IOException ioe) {<a name="line.426"></a>
<span class="sourceLineNo">427</span>                LOGGER.error("Unable to delete {}, {}", eligibleFiles.firstKey(), ioe.getMessage(), ioe);<a name="line.427"></a>
<span class="sourceLineNo">428</span>                break;<a name="line.428"></a>
<span class="sourceLineNo">429</span>            }<a name="line.429"></a>
<span class="sourceLineNo">430</span>        }<a name="line.430"></a>
<span class="sourceLineNo">431</span>        final StringBuilder buf = new StringBuilder();<a name="line.431"></a>
<span class="sourceLineNo">432</span>        if (renameFiles) {<a name="line.432"></a>
<span class="sourceLineNo">433</span>            for (final Map.Entry&lt;Integer, Path&gt; entry : eligibleFiles.entrySet()) {<a name="line.433"></a>
<span class="sourceLineNo">434</span>                buf.setLength(0);<a name="line.434"></a>
<span class="sourceLineNo">435</span>                // LOG4J2-531: directory scan &amp; rollover must use same format<a name="line.435"></a>
<span class="sourceLineNo">436</span>                manager.getPatternProcessor().formatFileName(strSubstitutor, buf, entry.getKey() - 1);<a name="line.436"></a>
<span class="sourceLineNo">437</span>                final String currentName = entry.getValue().toFile().getName();<a name="line.437"></a>
<span class="sourceLineNo">438</span>                String renameTo = buf.toString();<a name="line.438"></a>
<span class="sourceLineNo">439</span>                final int suffixLength = suffixLength(renameTo);<a name="line.439"></a>
<span class="sourceLineNo">440</span>                if (suffixLength &gt; 0 &amp;&amp; suffixLength(currentName) == 0) {<a name="line.440"></a>
<span class="sourceLineNo">441</span>                   renameTo = renameTo.substring(0, renameTo.length() - suffixLength);<a name="line.441"></a>
<span class="sourceLineNo">442</span>                }<a name="line.442"></a>
<span class="sourceLineNo">443</span>                final Action action = new FileRenameAction(entry.getValue().toFile(), new File(renameTo), true);<a name="line.443"></a>
<span class="sourceLineNo">444</span>                try {<a name="line.444"></a>
<span class="sourceLineNo">445</span>                    LOGGER.debug("DefaultRolloverStrategy.purgeAscending executing {}", action);<a name="line.445"></a>
<span class="sourceLineNo">446</span>                    if (!action.execute()) {<a name="line.446"></a>
<span class="sourceLineNo">447</span>                        return -1;<a name="line.447"></a>
<span class="sourceLineNo">448</span>                    }<a name="line.448"></a>
<span class="sourceLineNo">449</span>                } catch (final Exception ex) {<a name="line.449"></a>
<span class="sourceLineNo">450</span>                    LOGGER.warn("Exception during purge in RollingFileAppender", ex);<a name="line.450"></a>
<span class="sourceLineNo">451</span>                    return -1;<a name="line.451"></a>
<span class="sourceLineNo">452</span>                }<a name="line.452"></a>
<span class="sourceLineNo">453</span>            }<a name="line.453"></a>
<span class="sourceLineNo">454</span>        }<a name="line.454"></a>
<span class="sourceLineNo">455</span><a name="line.455"></a>
<span class="sourceLineNo">456</span>        return eligibleFiles.size() &gt; 0 ?<a name="line.456"></a>
<span class="sourceLineNo">457</span>                (eligibleFiles.lastKey() &lt; highIndex ? eligibleFiles.lastKey() + 1 : highIndex) : lowIndex;<a name="line.457"></a>
<span class="sourceLineNo">458</span>    }<a name="line.458"></a>
<span class="sourceLineNo">459</span><a name="line.459"></a>
<span class="sourceLineNo">460</span>    /**<a name="line.460"></a>
<span class="sourceLineNo">461</span>     * Purges and renames old log files in preparation for rollover. The newest file will have the smallest index, the<a name="line.461"></a>
<span class="sourceLineNo">462</span>     * oldest will have the highest.<a name="line.462"></a>
<span class="sourceLineNo">463</span>     *<a name="line.463"></a>
<span class="sourceLineNo">464</span>     * @param lowIndex low index<a name="line.464"></a>
<span class="sourceLineNo">465</span>     * @param highIndex high index. Log file associated with high index will be deleted if needed.<a name="line.465"></a>
<span class="sourceLineNo">466</span>     * @param manager The RollingFileManager<a name="line.466"></a>
<span class="sourceLineNo">467</span>     * @return true if purge was successful and rollover should be attempted.<a name="line.467"></a>
<span class="sourceLineNo">468</span>     */<a name="line.468"></a>
<span class="sourceLineNo">469</span>    private int purgeDescending(final int lowIndex, final int highIndex, final RollingFileManager manager) {<a name="line.469"></a>
<span class="sourceLineNo">470</span>        // Retrieve the files in descending order, so the highest key will be first.<a name="line.470"></a>
<span class="sourceLineNo">471</span>        final SortedMap&lt;Integer, Path&gt; eligibleFiles = getEligibleFiles(manager, false);<a name="line.471"></a>
<span class="sourceLineNo">472</span>        final int maxFiles = highIndex - lowIndex + 1;<a name="line.472"></a>
<span class="sourceLineNo">473</span>        LOGGER.debug("Eligible files: {}", eligibleFiles);<a name="line.473"></a>
<span class="sourceLineNo">474</span>        while (eligibleFiles.size() &gt;= maxFiles) {<a name="line.474"></a>
<span class="sourceLineNo">475</span>            try {<a name="line.475"></a>
<span class="sourceLineNo">476</span>                final Integer key = eligibleFiles.firstKey();<a name="line.476"></a>
<span class="sourceLineNo">477</span>                Files.delete(eligibleFiles.get(key));<a name="line.477"></a>
<span class="sourceLineNo">478</span>                eligibleFiles.remove(key);<a name="line.478"></a>
<span class="sourceLineNo">479</span>            } catch (final IOException ioe) {<a name="line.479"></a>
<span class="sourceLineNo">480</span>                LOGGER.error("Unable to delete {}, {}", eligibleFiles.firstKey(), ioe.getMessage(), ioe);<a name="line.480"></a>
<span class="sourceLineNo">481</span>                break;<a name="line.481"></a>
<span class="sourceLineNo">482</span>            }<a name="line.482"></a>
<span class="sourceLineNo">483</span>        }<a name="line.483"></a>
<span class="sourceLineNo">484</span>        final StringBuilder buf = new StringBuilder();<a name="line.484"></a>
<span class="sourceLineNo">485</span>        for (final Map.Entry&lt;Integer, Path&gt; entry : eligibleFiles.entrySet()) {<a name="line.485"></a>
<span class="sourceLineNo">486</span>            buf.setLength(0);<a name="line.486"></a>
<span class="sourceLineNo">487</span>            // LOG4J2-531: directory scan &amp; rollover must use same format<a name="line.487"></a>
<span class="sourceLineNo">488</span>            manager.getPatternProcessor().formatFileName(strSubstitutor, buf, entry.getKey() + 1);<a name="line.488"></a>
<span class="sourceLineNo">489</span>            final String currentName = entry.getValue().toFile().getName();<a name="line.489"></a>
<span class="sourceLineNo">490</span>            String renameTo = buf.toString();<a name="line.490"></a>
<span class="sourceLineNo">491</span>            final int suffixLength = suffixLength(renameTo);<a name="line.491"></a>
<span class="sourceLineNo">492</span>            if (suffixLength &gt; 0 &amp;&amp; suffixLength(currentName) == 0) {<a name="line.492"></a>
<span class="sourceLineNo">493</span>                renameTo = renameTo.substring(0, renameTo.length() - suffixLength);<a name="line.493"></a>
<span class="sourceLineNo">494</span>            }<a name="line.494"></a>
<span class="sourceLineNo">495</span>            final Action action = new FileRenameAction(entry.getValue().toFile(), new File(renameTo), true);<a name="line.495"></a>
<span class="sourceLineNo">496</span>            try {<a name="line.496"></a>
<span class="sourceLineNo">497</span>                LOGGER.debug("DefaultRolloverStrategy.purgeDescending executing {}", action);<a name="line.497"></a>
<span class="sourceLineNo">498</span>                if (!action.execute()) {<a name="line.498"></a>
<span class="sourceLineNo">499</span>                    return -1;<a name="line.499"></a>
<span class="sourceLineNo">500</span>                }<a name="line.500"></a>
<span class="sourceLineNo">501</span>            } catch (final Exception ex) {<a name="line.501"></a>
<span class="sourceLineNo">502</span>                LOGGER.warn("Exception during purge in RollingFileAppender", ex);<a name="line.502"></a>
<span class="sourceLineNo">503</span>                return -1;<a name="line.503"></a>
<span class="sourceLineNo">504</span>            }<a name="line.504"></a>
<span class="sourceLineNo">505</span>        }<a name="line.505"></a>
<span class="sourceLineNo">506</span><a name="line.506"></a>
<span class="sourceLineNo">507</span>        return lowIndex;<a name="line.507"></a>
<span class="sourceLineNo">508</span>    }<a name="line.508"></a>
<span class="sourceLineNo">509</span><a name="line.509"></a>
<span class="sourceLineNo">510</span>    /**<a name="line.510"></a>
<span class="sourceLineNo">511</span>     * Performs the rollover.<a name="line.511"></a>
<span class="sourceLineNo">512</span>     *<a name="line.512"></a>
<span class="sourceLineNo">513</span>     * @param manager The RollingFileManager name for current active log file.<a name="line.513"></a>
<span class="sourceLineNo">514</span>     * @return A RolloverDescription.<a name="line.514"></a>
<span class="sourceLineNo">515</span>     * @throws SecurityException if an error occurs.<a name="line.515"></a>
<span class="sourceLineNo">516</span>     */<a name="line.516"></a>
<span class="sourceLineNo">517</span>    @Override<a name="line.517"></a>
<span class="sourceLineNo">518</span>    public RolloverDescription rollover(final RollingFileManager manager) throws SecurityException {<a name="line.518"></a>
<span class="sourceLineNo">519</span>        int fileIndex;<a name="line.519"></a>
<span class="sourceLineNo">520</span>                final StringBuilder buf = new StringBuilder(255);<a name="line.520"></a>
<span class="sourceLineNo">521</span>        if (minIndex == Integer.MIN_VALUE) {<a name="line.521"></a>
<span class="sourceLineNo">522</span>            final SortedMap&lt;Integer, Path&gt; eligibleFiles = getEligibleFiles(manager);<a name="line.522"></a>
<span class="sourceLineNo">523</span>            fileIndex = eligibleFiles.size() &gt; 0 ? eligibleFiles.lastKey() + 1 : 1;<a name="line.523"></a>
<span class="sourceLineNo">524</span>                        manager.getPatternProcessor().formatFileName(strSubstitutor, buf, fileIndex);<a name="line.524"></a>
<span class="sourceLineNo">525</span>        } else {<a name="line.525"></a>
<span class="sourceLineNo">526</span>            if (maxIndex &lt; 0) {<a name="line.526"></a>
<span class="sourceLineNo">527</span>                return null;<a name="line.527"></a>
<span class="sourceLineNo">528</span>            }<a name="line.528"></a>
<span class="sourceLineNo">529</span>            final long startNanos = System.nanoTime();<a name="line.529"></a>
<span class="sourceLineNo">530</span>            fileIndex = purge(minIndex, maxIndex, manager);<a name="line.530"></a>
<span class="sourceLineNo">531</span>            if (fileIndex &lt; 0) {<a name="line.531"></a>
<span class="sourceLineNo">532</span>                return null;<a name="line.532"></a>
<span class="sourceLineNo">533</span>            }<a name="line.533"></a>
<span class="sourceLineNo">534</span>                        manager.getPatternProcessor().formatFileName(strSubstitutor, buf, fileIndex);<a name="line.534"></a>
<span class="sourceLineNo">535</span>            if (LOGGER.isTraceEnabled()) {<a name="line.535"></a>
<span class="sourceLineNo">536</span>                final double durationMillis = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNanos);<a name="line.536"></a>
<span class="sourceLineNo">537</span>                LOGGER.trace("DefaultRolloverStrategy.purge() took {} milliseconds", durationMillis);<a name="line.537"></a>
<span class="sourceLineNo">538</span>            }<a name="line.538"></a>
<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
<span class="sourceLineNo">540</span><a name="line.540"></a>
<span class="sourceLineNo">541</span>        final String currentFileName = manager.getFileName();<a name="line.541"></a>
<span class="sourceLineNo">542</span><a name="line.542"></a>
<span class="sourceLineNo">543</span>        String renameTo = buf.toString();<a name="line.543"></a>
<span class="sourceLineNo">544</span>        final String compressedName = renameTo;<a name="line.544"></a>
<span class="sourceLineNo">545</span>        Action compressAction = null;<a name="line.545"></a>
<span class="sourceLineNo">546</span><a name="line.546"></a>
<span class="sourceLineNo">547</span>        final FileExtension fileExtension = manager.getFileExtension();<a name="line.547"></a>
<span class="sourceLineNo">548</span>        if (fileExtension != null) {<a name="line.548"></a>
<span class="sourceLineNo">549</span>            final File renameToFile = new File(renameTo);<a name="line.549"></a>
<span class="sourceLineNo">550</span>            renameTo = renameTo.substring(0, renameTo.length() - fileExtension.length());<a name="line.550"></a>
<span class="sourceLineNo">551</span>            if (tempCompressedFilePattern != null) {<a name="line.551"></a>
<span class="sourceLineNo">552</span>                buf.delete(0, buf.length());<a name="line.552"></a>
<span class="sourceLineNo">553</span>                tempCompressedFilePattern.formatFileName(strSubstitutor, buf, fileIndex);<a name="line.553"></a>
<span class="sourceLineNo">554</span>                final String tmpCompressedName = buf.toString();<a name="line.554"></a>
<span class="sourceLineNo">555</span>                final File tmpCompressedNameFile = new File(tmpCompressedName);<a name="line.555"></a>
<span class="sourceLineNo">556</span>                final File parentFile = tmpCompressedNameFile.getParentFile();<a name="line.556"></a>
<span class="sourceLineNo">557</span>                if (parentFile != null) {<a name="line.557"></a>
<span class="sourceLineNo">558</span>                    parentFile.mkdirs();<a name="line.558"></a>
<span class="sourceLineNo">559</span>                }<a name="line.559"></a>
<span class="sourceLineNo">560</span>                compressAction = new CompositeAction(<a name="line.560"></a>
<span class="sourceLineNo">561</span>                        Arrays.asList(fileExtension.createCompressAction(renameTo, tmpCompressedName,<a name="line.561"></a>
<span class="sourceLineNo">562</span>                                true, compressionLevel),<a name="line.562"></a>
<span class="sourceLineNo">563</span>                                new FileRenameAction(tmpCompressedNameFile,<a name="line.563"></a>
<span class="sourceLineNo">564</span>                                        renameToFile, true)),<a name="line.564"></a>
<span class="sourceLineNo">565</span>                        true);<a name="line.565"></a>
<span class="sourceLineNo">566</span>            } else {<a name="line.566"></a>
<span class="sourceLineNo">567</span>                compressAction = fileExtension.createCompressAction(renameTo, compressedName,<a name="line.567"></a>
<span class="sourceLineNo">568</span>                        true, compressionLevel);<a name="line.568"></a>
<span class="sourceLineNo">569</span>            }<a name="line.569"></a>
<span class="sourceLineNo">570</span>        }<a name="line.570"></a>
<span class="sourceLineNo">571</span><a name="line.571"></a>
<span class="sourceLineNo">572</span>        if (currentFileName.equals(renameTo)) {<a name="line.572"></a>
<span class="sourceLineNo">573</span>            LOGGER.warn("Attempt to rename file {} to itself will be ignored", currentFileName);<a name="line.573"></a>
<span class="sourceLineNo">574</span>            return new RolloverDescriptionImpl(currentFileName, false, null, null);<a name="line.574"></a>
<span class="sourceLineNo">575</span>        }<a name="line.575"></a>
<span class="sourceLineNo">576</span><a name="line.576"></a>
<span class="sourceLineNo">577</span>        if (compressAction != null &amp;&amp; manager.isAttributeViewEnabled()) {<a name="line.577"></a>
<span class="sourceLineNo">578</span>            // Propagate posix attribute view to compressed file<a name="line.578"></a>
<span class="sourceLineNo">579</span>            // @formatter:off<a name="line.579"></a>
<span class="sourceLineNo">580</span>            final Action posixAttributeViewAction = PosixViewAttributeAction.newBuilder()<a name="line.580"></a>
<span class="sourceLineNo">581</span>                                                        .withBasePath(compressedName)<a name="line.581"></a>
<span class="sourceLineNo">582</span>                                                        .withFollowLinks(false)<a name="line.582"></a>
<span class="sourceLineNo">583</span>                                                        .withMaxDepth(1)<a name="line.583"></a>
<span class="sourceLineNo">584</span>                                                        .withPathConditions(new PathCondition[0])<a name="line.584"></a>
<span class="sourceLineNo">585</span>                                                        .withSubst(getStrSubstitutor())<a name="line.585"></a>
<span class="sourceLineNo">586</span>                                                        .withFilePermissions(manager.getFilePermissions())<a name="line.586"></a>
<span class="sourceLineNo">587</span>                                                        .withFileOwner(manager.getFileOwner())<a name="line.587"></a>
<span class="sourceLineNo">588</span>                                                        .withFileGroup(manager.getFileGroup())<a name="line.588"></a>
<span class="sourceLineNo">589</span>                                                        .build();<a name="line.589"></a>
<span class="sourceLineNo">590</span>            // @formatter:on<a name="line.590"></a>
<span class="sourceLineNo">591</span>            compressAction = new CompositeAction(Arrays.asList(compressAction, posixAttributeViewAction), false);<a name="line.591"></a>
<span class="sourceLineNo">592</span>        }<a name="line.592"></a>
<span class="sourceLineNo">593</span><a name="line.593"></a>
<span class="sourceLineNo">594</span>        final FileRenameAction renameAction = new FileRenameAction(new File(currentFileName), new File(renameTo),<a name="line.594"></a>
<span class="sourceLineNo">595</span>                    manager.isRenameEmptyFiles());<a name="line.595"></a>
<span class="sourceLineNo">596</span><a name="line.596"></a>
<span class="sourceLineNo">597</span>        final Action asyncAction = merge(compressAction, customActions, stopCustomActionsOnError);<a name="line.597"></a>
<span class="sourceLineNo">598</span>        return new RolloverDescriptionImpl(currentFileName, false, renameAction, asyncAction);<a name="line.598"></a>
<span class="sourceLineNo">599</span>    }<a name="line.599"></a>
<span class="sourceLineNo">600</span><a name="line.600"></a>
<span class="sourceLineNo">601</span>    @Override<a name="line.601"></a>
<span class="sourceLineNo">602</span>    public String toString() {<a name="line.602"></a>
<span class="sourceLineNo">603</span>        return "DefaultRolloverStrategy(min=" + minIndex + ", max=" + maxIndex + ", useMax=" + useMax + ")";<a name="line.603"></a>
<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
<span class="sourceLineNo">605</span><a name="line.605"></a>
<span class="sourceLineNo">606</span>}<a name="line.606"></a>




























































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