<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="de">
<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>package org.apache.archiva.configuration;<a name="line.1"></a>
<span class="sourceLineNo">002</span><a name="line.2"></a>
<span class="sourceLineNo">003</span>/*<a name="line.3"></a>
<span class="sourceLineNo">004</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.4"></a>
<span class="sourceLineNo">005</span> * or more contributor license agreements.  See the NOTICE file<a name="line.5"></a>
<span class="sourceLineNo">006</span> * distributed with this work for additional information<a name="line.6"></a>
<span class="sourceLineNo">007</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.7"></a>
<span class="sourceLineNo">008</span> * to you under the Apache License, Version 2.0 (the<a name="line.8"></a>
<span class="sourceLineNo">009</span> * "License"); you may not use this file except in compliance<a name="line.9"></a>
<span class="sourceLineNo">010</span> * with the License.  You may obtain a copy of the License at<a name="line.10"></a>
<span class="sourceLineNo">011</span> *<a name="line.11"></a>
<span class="sourceLineNo">012</span> *   http://www.apache.org/licenses/LICENSE-2.0<a name="line.12"></a>
<span class="sourceLineNo">013</span> *<a name="line.13"></a>
<span class="sourceLineNo">014</span> * Unless required by applicable law or agreed to in writing,<a name="line.14"></a>
<span class="sourceLineNo">015</span> * software distributed under the License is distributed on an<a name="line.15"></a>
<span class="sourceLineNo">016</span> * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY<a name="line.16"></a>
<span class="sourceLineNo">017</span> * KIND, either express or implied.  See the License for the<a name="line.17"></a>
<span class="sourceLineNo">018</span> * specific language governing permissions and limitations<a name="line.18"></a>
<span class="sourceLineNo">019</span> * under the License.<a name="line.19"></a>
<span class="sourceLineNo">020</span> */<a name="line.20"></a>
<span class="sourceLineNo">021</span><a name="line.21"></a>
<span class="sourceLineNo">022</span>import org.apache.archiva.configuration.functors.ProxyConnectorConfigurationOrderComparator;<a name="line.22"></a>
<span class="sourceLineNo">023</span>import org.apache.archiva.configuration.io.registry.ConfigurationRegistryReader;<a name="line.23"></a>
<span class="sourceLineNo">024</span>import org.apache.archiva.configuration.io.registry.ConfigurationRegistryWriter;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import org.apache.archiva.policies.AbstractUpdatePolicy;<a name="line.25"></a>
<span class="sourceLineNo">026</span>import org.apache.archiva.policies.CachedFailuresPolicy;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import org.apache.archiva.policies.ChecksumPolicy;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import org.apache.archiva.components.evaluator.DefaultExpressionEvaluator;<a name="line.28"></a>
<span class="sourceLineNo">029</span>import org.apache.archiva.components.evaluator.EvaluatorException;<a name="line.29"></a>
<span class="sourceLineNo">030</span>import org.apache.archiva.components.evaluator.ExpressionEvaluator;<a name="line.30"></a>
<span class="sourceLineNo">031</span>import org.apache.archiva.components.evaluator.sources.SystemPropertyExpressionSource;<a name="line.31"></a>
<span class="sourceLineNo">032</span>import org.apache.archiva.components.registry.Registry;<a name="line.32"></a>
<span class="sourceLineNo">033</span>import org.apache.archiva.components.registry.RegistryException;<a name="line.33"></a>
<span class="sourceLineNo">034</span>import org.apache.archiva.components.registry.RegistryListener;<a name="line.34"></a>
<span class="sourceLineNo">035</span>import org.apache.archiva.components.registry.commons.CommonsConfigurationRegistry;<a name="line.35"></a>
<span class="sourceLineNo">036</span>import org.apache.commons.collections4.CollectionUtils;<a name="line.36"></a>
<span class="sourceLineNo">037</span>import org.apache.commons.collections4.ListUtils;<a name="line.37"></a>
<span class="sourceLineNo">038</span>import org.apache.commons.configuration.BaseConfiguration;<a name="line.38"></a>
<span class="sourceLineNo">039</span>import org.apache.commons.io.FileUtils;<a name="line.39"></a>
<span class="sourceLineNo">040</span>import org.apache.commons.lang3.StringUtils;<a name="line.40"></a>
<span class="sourceLineNo">041</span>import org.slf4j.Logger;<a name="line.41"></a>
<span class="sourceLineNo">042</span>import org.slf4j.LoggerFactory;<a name="line.42"></a>
<span class="sourceLineNo">043</span>import org.springframework.stereotype.Service;<a name="line.43"></a>
<span class="sourceLineNo">044</span><a name="line.44"></a>
<span class="sourceLineNo">045</span>import javax.annotation.PostConstruct;<a name="line.45"></a>
<span class="sourceLineNo">046</span>import javax.inject.Inject;<a name="line.46"></a>
<span class="sourceLineNo">047</span>import javax.inject.Named;<a name="line.47"></a>
<span class="sourceLineNo">048</span>import java.io.IOException;<a name="line.48"></a>
<span class="sourceLineNo">049</span>import java.nio.file.Files;<a name="line.49"></a>
<span class="sourceLineNo">050</span>import java.nio.file.Path;<a name="line.50"></a>
<span class="sourceLineNo">051</span>import java.nio.file.Paths;<a name="line.51"></a>
<span class="sourceLineNo">052</span>import java.util.*;<a name="line.52"></a>
<span class="sourceLineNo">053</span>import java.util.Map.Entry;<a name="line.53"></a>
<span class="sourceLineNo">054</span><a name="line.54"></a>
<span class="sourceLineNo">055</span>/**<a name="line.55"></a>
<span class="sourceLineNo">056</span> * &lt;p&gt;<a name="line.56"></a>
<span class="sourceLineNo">057</span> * Implementation of configuration holder that retrieves it from the registry.<a name="line.57"></a>
<span class="sourceLineNo">058</span> * &lt;/p&gt;<a name="line.58"></a>
<span class="sourceLineNo">059</span> * &lt;p&gt;<a name="line.59"></a>
<span class="sourceLineNo">060</span> * The registry layers and merges the 2 configuration files: user, and application server.<a name="line.60"></a>
<span class="sourceLineNo">061</span> * &lt;/p&gt;<a name="line.61"></a>
<span class="sourceLineNo">062</span> * &lt;p&gt;<a name="line.62"></a>
<span class="sourceLineNo">063</span> * Instead of relying on the model defaults, if the registry is empty a default configuration file is loaded and<a name="line.63"></a>
<span class="sourceLineNo">064</span> * applied from a resource. The defaults are not loaded into the registry as the lists (eg repositories) could no longer<a name="line.64"></a>
<span class="sourceLineNo">065</span> * be removed if that was the case.<a name="line.65"></a>
<span class="sourceLineNo">066</span> * &lt;/p&gt;<a name="line.66"></a>
<span class="sourceLineNo">067</span> * &lt;p&gt;<a name="line.67"></a>
<span class="sourceLineNo">068</span> * When saving the configuration, it is saved to the location it was read from. If it was read from the defaults, it<a name="line.68"></a>
<span class="sourceLineNo">069</span> * will be saved to the user location.<a name="line.69"></a>
<span class="sourceLineNo">070</span> * However, if the configuration contains information from both sources, an exception is raised as this is currently<a name="line.70"></a>
<span class="sourceLineNo">071</span> * unsupported. The reason for this is that it is not possible to identify where to re-save elements, and can result<a name="line.71"></a>
<span class="sourceLineNo">072</span> * in list configurations (eg repositories) becoming inconsistent.<a name="line.72"></a>
<span class="sourceLineNo">073</span> * &lt;/p&gt;<a name="line.73"></a>
<span class="sourceLineNo">074</span> * &lt;p&gt;<a name="line.74"></a>
<span class="sourceLineNo">075</span> * If the configuration is outdated, it will be upgraded when it is loaded. This is done by checking the version flag<a name="line.75"></a>
<span class="sourceLineNo">076</span> * before reading it from the registry.<a name="line.76"></a>
<span class="sourceLineNo">077</span> * &lt;p&gt;<a name="line.77"></a>
<span class="sourceLineNo">078</span> * FIXME: The synchronization must be improved, the current impl may lead to inconsistent data or multiple getConfiguration() calls (martin_s@apache.org)<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>@Service("archivaConfiguration#default")<a name="line.81"></a>
<span class="sourceLineNo">082</span>public class DefaultArchivaConfiguration<a name="line.82"></a>
<span class="sourceLineNo">083</span>        implements ArchivaConfiguration, RegistryListener {<a name="line.83"></a>
<span class="sourceLineNo">084</span>    private final Logger log = LoggerFactory.getLogger(DefaultArchivaConfiguration.class);<a name="line.84"></a>
<span class="sourceLineNo">085</span><a name="line.85"></a>
<span class="sourceLineNo">086</span>    private static String FILE_ENCODING = "UTF-8";<a name="line.86"></a>
<span class="sourceLineNo">087</span><a name="line.87"></a>
<span class="sourceLineNo">088</span>    /**<a name="line.88"></a>
<span class="sourceLineNo">089</span>     * Plexus registry to read the configuration from.<a name="line.89"></a>
<span class="sourceLineNo">090</span>     */<a name="line.90"></a>
<span class="sourceLineNo">091</span>    @Inject<a name="line.91"></a>
<span class="sourceLineNo">092</span>    @Named(value = "commons-configuration")<a name="line.92"></a>
<span class="sourceLineNo">093</span>    private Registry registry;<a name="line.93"></a>
<span class="sourceLineNo">094</span><a name="line.94"></a>
<span class="sourceLineNo">095</span>    /**<a name="line.95"></a>
<span class="sourceLineNo">096</span>     * The configuration that has been converted.<a name="line.96"></a>
<span class="sourceLineNo">097</span>     */<a name="line.97"></a>
<span class="sourceLineNo">098</span>    private Configuration configuration;<a name="line.98"></a>
<span class="sourceLineNo">099</span><a name="line.99"></a>
<span class="sourceLineNo">100</span>    /**<a name="line.100"></a>
<span class="sourceLineNo">101</span>     * see #initialize<a name="line.101"></a>
<span class="sourceLineNo">102</span>     * default-value="${user.home}/.m2/archiva.xml"<a name="line.102"></a>
<span class="sourceLineNo">103</span>     */<a name="line.103"></a>
<span class="sourceLineNo">104</span>    private String userConfigFilename = "${user.home}/.m2/archiva.xml";<a name="line.104"></a>
<span class="sourceLineNo">105</span><a name="line.105"></a>
<span class="sourceLineNo">106</span>    /**<a name="line.106"></a>
<span class="sourceLineNo">107</span>     * see #initialize<a name="line.107"></a>
<span class="sourceLineNo">108</span>     * default-value="${appserver.base}/conf/archiva.xml"<a name="line.108"></a>
<span class="sourceLineNo">109</span>     */<a name="line.109"></a>
<span class="sourceLineNo">110</span>    private String altConfigFilename = "${appserver.base}/conf/archiva.xml";<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>     * Configuration Listeners we've registered.<a name="line.113"></a>
<span class="sourceLineNo">114</span>     */<a name="line.114"></a>
<span class="sourceLineNo">115</span>    private Set&lt;ConfigurationListener&gt; listeners = new HashSet&lt;&gt;();<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>     * Registry Listeners we've registered.<a name="line.118"></a>
<span class="sourceLineNo">119</span>     */<a name="line.119"></a>
<span class="sourceLineNo">120</span>    private Set&lt;RegistryListener&gt; registryListeners = new HashSet&lt;&gt;();<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>     * Boolean to help determine if the configuration exists as a result of pulling in<a name="line.123"></a>
<span class="sourceLineNo">124</span>     * the default-archiva.xml<a name="line.124"></a>
<span class="sourceLineNo">125</span>     */<a name="line.125"></a>
<span class="sourceLineNo">126</span>    private boolean isConfigurationDefaulted = false;<a name="line.126"></a>
<span class="sourceLineNo">127</span><a name="line.127"></a>
<span class="sourceLineNo">128</span>    private static final String KEY = "org.apache.archiva";<a name="line.128"></a>
<span class="sourceLineNo">129</span><a name="line.129"></a>
<span class="sourceLineNo">130</span>    // Section used for default only configuration<a name="line.130"></a>
<span class="sourceLineNo">131</span>    private static final String KEY_DEFAULT_ONLY = "org.apache.archiva_default";<a name="line.131"></a>
<span class="sourceLineNo">132</span><a name="line.132"></a>
<span class="sourceLineNo">133</span>    private Locale defaultLocale = Locale.getDefault();<a name="line.133"></a>
<span class="sourceLineNo">134</span><a name="line.134"></a>
<span class="sourceLineNo">135</span>    private List&lt;Locale.LanguageRange&gt; languagePriorities = new ArrayList&lt;&gt;();<a name="line.135"></a>
<span class="sourceLineNo">136</span><a name="line.136"></a>
<span class="sourceLineNo">137</span>    private volatile Path dataDirectory;<a name="line.137"></a>
<span class="sourceLineNo">138</span>    private volatile Path repositoryBaseDirectory;<a name="line.138"></a>
<span class="sourceLineNo">139</span>    private volatile Path remoteRepositoryBaseDirectory;<a name="line.139"></a>
<span class="sourceLineNo">140</span>    private volatile Path repositoryGroupBaseDirectory;<a name="line.140"></a>
<span class="sourceLineNo">141</span><a name="line.141"></a>
<span class="sourceLineNo">142</span>    @PostConstruct<a name="line.142"></a>
<span class="sourceLineNo">143</span>    private void init() {<a name="line.143"></a>
<span class="sourceLineNo">144</span>        languagePriorities = Locale.LanguageRange.parse("en,fr,de");<a name="line.144"></a>
<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
<span class="sourceLineNo">146</span><a name="line.146"></a>
<span class="sourceLineNo">147</span><a name="line.147"></a>
<span class="sourceLineNo">148</span>    @Override<a name="line.148"></a>
<span class="sourceLineNo">149</span>    public Configuration getConfiguration() {<a name="line.149"></a>
<span class="sourceLineNo">150</span>        return loadConfiguration();<a name="line.150"></a>
<span class="sourceLineNo">151</span>    }<a name="line.151"></a>
<span class="sourceLineNo">152</span><a name="line.152"></a>
<span class="sourceLineNo">153</span>    private synchronized Configuration loadConfiguration() {<a name="line.153"></a>
<span class="sourceLineNo">154</span>        if (configuration == null) {<a name="line.154"></a>
<span class="sourceLineNo">155</span>            configuration = load();<a name="line.155"></a>
<span class="sourceLineNo">156</span>            configuration = unescapeExpressions(configuration);<a name="line.156"></a>
<span class="sourceLineNo">157</span>            if (isConfigurationDefaulted) {<a name="line.157"></a>
<span class="sourceLineNo">158</span>                configuration = checkRepositoryLocations(configuration);<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>        return configuration;<a name="line.162"></a>
<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
<span class="sourceLineNo">164</span><a name="line.164"></a>
<span class="sourceLineNo">165</span>    private boolean hasConfigVersionChanged(Configuration current, Registry defaultOnlyConfiguration) {<a name="line.165"></a>
<span class="sourceLineNo">166</span>        return current == null || current.getVersion() == null ||<a name="line.166"></a>
<span class="sourceLineNo">167</span>                !current.getVersion().trim().equals(defaultOnlyConfiguration.getString("version", "").trim());<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>    @SuppressWarnings("unchecked")<a name="line.170"></a>
<span class="sourceLineNo">171</span>    private Configuration load() {<a name="line.171"></a>
<span class="sourceLineNo">172</span>        // TODO: should this be the same as section? make sure unnamed sections still work (eg, sys properties)<a name="line.172"></a>
<span class="sourceLineNo">173</span>        Registry subset = registry.getSubset(KEY);<a name="line.173"></a>
<span class="sourceLineNo">174</span>        if (subset.getString("version") == null) {<a name="line.174"></a>
<span class="sourceLineNo">175</span>            if (subset.getSubset("repositoryScanning").isEmpty()) {<a name="line.175"></a>
<span class="sourceLineNo">176</span>                // only for empty<a name="line.176"></a>
<span class="sourceLineNo">177</span>                subset = readDefaultConfiguration();<a name="line.177"></a>
<span class="sourceLineNo">178</span>            } else {<a name="line.178"></a>
<span class="sourceLineNo">179</span>                throw new RuntimeException("No version tag found in configuration. Archiva configuration version 1.x is not longer supported.");<a name="line.179"></a>
<span class="sourceLineNo">180</span>            }<a name="line.180"></a>
<span class="sourceLineNo">181</span>        }<a name="line.181"></a>
<span class="sourceLineNo">182</span><a name="line.182"></a>
<span class="sourceLineNo">183</span>        Configuration config = new ConfigurationRegistryReader().read(subset);<a name="line.183"></a>
<span class="sourceLineNo">184</span><a name="line.184"></a>
<span class="sourceLineNo">185</span>        // Resolving data and repositories directories<a name="line.185"></a>
<span class="sourceLineNo">186</span>        // If the config entries are absolute, the path is used as it is<a name="line.186"></a>
<span class="sourceLineNo">187</span>        // if the config entries are empty, they are resolved:<a name="line.187"></a>
<span class="sourceLineNo">188</span>        //   dataDirectory = ${appserver.base}/data<a name="line.188"></a>
<span class="sourceLineNo">189</span>        //   repositoryDirectory = ${dataDirectory}/repositories<a name="line.189"></a>
<span class="sourceLineNo">190</span>        // If the entries are relative they are resolved<a name="line.190"></a>
<span class="sourceLineNo">191</span>        //   relative to the appserver.base, for dataDirectory<a name="line.191"></a>
<span class="sourceLineNo">192</span>        //   relative to dataDirectory for repositoryBase<a name="line.192"></a>
<span class="sourceLineNo">193</span>        String dataDir = config.getArchivaRuntimeConfiguration().getDataDirectory();<a name="line.193"></a>
<span class="sourceLineNo">194</span>        if (StringUtils.isEmpty(dataDir)) {<a name="line.194"></a>
<span class="sourceLineNo">195</span>            dataDirectory = getAppServerBaseDir().resolve("data");<a name="line.195"></a>
<span class="sourceLineNo">196</span>        } else {<a name="line.196"></a>
<span class="sourceLineNo">197</span>            Path tmpDataDir = Paths.get(dataDir);<a name="line.197"></a>
<span class="sourceLineNo">198</span>            if (tmpDataDir.isAbsolute()) {<a name="line.198"></a>
<span class="sourceLineNo">199</span>                dataDirectory = tmpDataDir;<a name="line.199"></a>
<span class="sourceLineNo">200</span>            } else {<a name="line.200"></a>
<span class="sourceLineNo">201</span>                dataDirectory = getAppServerBaseDir().resolve(tmpDataDir);<a name="line.201"></a>
<span class="sourceLineNo">202</span>            }<a name="line.202"></a>
<span class="sourceLineNo">203</span>        }<a name="line.203"></a>
<span class="sourceLineNo">204</span>        config.getArchivaRuntimeConfiguration().setDataDirectory(dataDirectory.normalize().toString());<a name="line.204"></a>
<span class="sourceLineNo">205</span>        String repoBaseDir = config.getArchivaRuntimeConfiguration().getRepositoryBaseDirectory();<a name="line.205"></a>
<span class="sourceLineNo">206</span>        if (StringUtils.isEmpty(repoBaseDir)) {<a name="line.206"></a>
<span class="sourceLineNo">207</span>            repositoryBaseDirectory = dataDirectory.resolve("repositories");<a name="line.207"></a>
<span class="sourceLineNo">208</span><a name="line.208"></a>
<span class="sourceLineNo">209</span>        } else {<a name="line.209"></a>
<span class="sourceLineNo">210</span>            Path tmpRepoBaseDir = Paths.get(repoBaseDir);<a name="line.210"></a>
<span class="sourceLineNo">211</span>            if (tmpRepoBaseDir.isAbsolute()) {<a name="line.211"></a>
<span class="sourceLineNo">212</span>                repositoryBaseDirectory = tmpRepoBaseDir;<a name="line.212"></a>
<span class="sourceLineNo">213</span>            } else {<a name="line.213"></a>
<span class="sourceLineNo">214</span>                dataDirectory.resolve(tmpRepoBaseDir);<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><a name="line.217"></a>
<span class="sourceLineNo">218</span>        String remoteRepoBaseDir = config.getArchivaRuntimeConfiguration().getRemoteRepositoryBaseDirectory();<a name="line.218"></a>
<span class="sourceLineNo">219</span>        if (StringUtils.isEmpty(remoteRepoBaseDir)) {<a name="line.219"></a>
<span class="sourceLineNo">220</span>            remoteRepositoryBaseDirectory = dataDirectory.resolve("remotes");<a name="line.220"></a>
<span class="sourceLineNo">221</span>        } else {<a name="line.221"></a>
<span class="sourceLineNo">222</span>            Path tmpRemoteRepoDir = Paths.get(remoteRepoBaseDir);<a name="line.222"></a>
<span class="sourceLineNo">223</span>            if (tmpRemoteRepoDir.isAbsolute()) {<a name="line.223"></a>
<span class="sourceLineNo">224</span>                remoteRepositoryBaseDirectory = tmpRemoteRepoDir;<a name="line.224"></a>
<span class="sourceLineNo">225</span>            } else {<a name="line.225"></a>
<span class="sourceLineNo">226</span>                dataDirectory.resolve(tmpRemoteRepoDir);<a name="line.226"></a>
<span class="sourceLineNo">227</span>            }<a name="line.227"></a>
<span class="sourceLineNo">228</span>        }<a name="line.228"></a>
<span class="sourceLineNo">229</span><a name="line.229"></a>
<span class="sourceLineNo">230</span>        String repositoryGroupBaseDir = config.getArchivaRuntimeConfiguration().getRepositoryGroupBaseDirectory();<a name="line.230"></a>
<span class="sourceLineNo">231</span>        if (StringUtils.isEmpty(repositoryGroupBaseDir)) {<a name="line.231"></a>
<span class="sourceLineNo">232</span>            repositoryGroupBaseDirectory = dataDirectory.resolve("groups");<a name="line.232"></a>
<span class="sourceLineNo">233</span>        } else {<a name="line.233"></a>
<span class="sourceLineNo">234</span>            Path tmpGroupDir = Paths.get(repositoryGroupBaseDir);<a name="line.234"></a>
<span class="sourceLineNo">235</span>            if (tmpGroupDir.isAbsolute()) {<a name="line.235"></a>
<span class="sourceLineNo">236</span>                repositoryGroupBaseDirectory = tmpGroupDir;<a name="line.236"></a>
<span class="sourceLineNo">237</span>            } else {<a name="line.237"></a>
<span class="sourceLineNo">238</span>                dataDirectory.resolve(tmpGroupDir);<a name="line.238"></a>
<span class="sourceLineNo">239</span>            }<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><a name="line.242"></a>
<span class="sourceLineNo">243</span>        config.getRepositoryGroups();<a name="line.243"></a>
<span class="sourceLineNo">244</span>        config.getRepositoryGroupsAsMap();<a name="line.244"></a>
<span class="sourceLineNo">245</span>        if (!CollectionUtils.isEmpty(config.getRemoteRepositories())) {<a name="line.245"></a>
<span class="sourceLineNo">246</span>            List&lt;RemoteRepositoryConfiguration&gt; remoteRepos = config.getRemoteRepositories();<a name="line.246"></a>
<span class="sourceLineNo">247</span>            for (RemoteRepositoryConfiguration repo : remoteRepos) {<a name="line.247"></a>
<span class="sourceLineNo">248</span>                // [MRM-582] Remote Repositories with empty &lt;username&gt; and &lt;password&gt; fields shouldn't be created in configuration.<a name="line.248"></a>
<span class="sourceLineNo">249</span>                if (StringUtils.isBlank(repo.getUsername())) {<a name="line.249"></a>
<span class="sourceLineNo">250</span>                    repo.setUsername(null);<a name="line.250"></a>
<span class="sourceLineNo">251</span>                }<a name="line.251"></a>
<span class="sourceLineNo">252</span><a name="line.252"></a>
<span class="sourceLineNo">253</span>                if (StringUtils.isBlank(repo.getPassword())) {<a name="line.253"></a>
<span class="sourceLineNo">254</span>                    repo.setPassword(null);<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>        }<a name="line.257"></a>
<span class="sourceLineNo">258</span><a name="line.258"></a>
<span class="sourceLineNo">259</span>        if (!config.getProxyConnectors().isEmpty()) {<a name="line.259"></a>
<span class="sourceLineNo">260</span>            // Fix Proxy Connector Settings.<a name="line.260"></a>
<span class="sourceLineNo">261</span><a name="line.261"></a>
<span class="sourceLineNo">262</span>            // Create a copy of the list to read from (to prevent concurrent modification exceptions)<a name="line.262"></a>
<span class="sourceLineNo">263</span>            List&lt;ProxyConnectorConfiguration&gt; proxyConnectorList = new ArrayList&lt;&gt;(config.getProxyConnectors());<a name="line.263"></a>
<span class="sourceLineNo">264</span>            // Remove the old connector list.<a name="line.264"></a>
<span class="sourceLineNo">265</span>            config.getProxyConnectors().clear();<a name="line.265"></a>
<span class="sourceLineNo">266</span><a name="line.266"></a>
<span class="sourceLineNo">267</span>            for (ProxyConnectorConfiguration connector : proxyConnectorList) {<a name="line.267"></a>
<span class="sourceLineNo">268</span>                // Fix policies<a name="line.268"></a>
<span class="sourceLineNo">269</span>                boolean connectorValid = true;<a name="line.269"></a>
<span class="sourceLineNo">270</span><a name="line.270"></a>
<span class="sourceLineNo">271</span>                Map&lt;String, String&gt; policies = new HashMap&lt;&gt;();<a name="line.271"></a>
<span class="sourceLineNo">272</span>                // Make copy of policies<a name="line.272"></a>
<span class="sourceLineNo">273</span>                policies.putAll(connector.getPolicies());<a name="line.273"></a>
<span class="sourceLineNo">274</span>                // Clear out policies<a name="line.274"></a>
<span class="sourceLineNo">275</span>                connector.getPolicies().clear();<a name="line.275"></a>
<span class="sourceLineNo">276</span><a name="line.276"></a>
<span class="sourceLineNo">277</span>                // Work thru policies. cleaning them up.<a name="line.277"></a>
<span class="sourceLineNo">278</span>                for (Entry&lt;String, String&gt; entry : policies.entrySet()) {<a name="line.278"></a>
<span class="sourceLineNo">279</span>                    String policyId = entry.getKey();<a name="line.279"></a>
<span class="sourceLineNo">280</span>                    String setting = entry.getValue();<a name="line.280"></a>
<span class="sourceLineNo">281</span><a name="line.281"></a>
<span class="sourceLineNo">282</span>                    // Upgrade old policy settings.<a name="line.282"></a>
<span class="sourceLineNo">283</span>                    if ("releases".equals(policyId) || "snapshots".equals(policyId)) {<a name="line.283"></a>
<span class="sourceLineNo">284</span>                        if ("ignored".equals(setting)) {<a name="line.284"></a>
<span class="sourceLineNo">285</span>                            setting = AbstractUpdatePolicy.ALWAYS.getId();<a name="line.285"></a>
<span class="sourceLineNo">286</span>                        } else if ("disabled".equals(setting)) {<a name="line.286"></a>
<span class="sourceLineNo">287</span>                            setting = AbstractUpdatePolicy.NEVER.getId();<a name="line.287"></a>
<span class="sourceLineNo">288</span>                        }<a name="line.288"></a>
<span class="sourceLineNo">289</span>                    } else if ("cache-failures".equals(policyId)) {<a name="line.289"></a>
<span class="sourceLineNo">290</span>                        if ("ignored".equals(setting)) {<a name="line.290"></a>
<span class="sourceLineNo">291</span>                            setting = CachedFailuresPolicy.NO.getId();<a name="line.291"></a>
<span class="sourceLineNo">292</span>                        } else if ("cached".equals(setting)) {<a name="line.292"></a>
<span class="sourceLineNo">293</span>                            setting = CachedFailuresPolicy.YES.getId();<a name="line.293"></a>
<span class="sourceLineNo">294</span>                        }<a name="line.294"></a>
<span class="sourceLineNo">295</span>                    } else if ("checksum".equals(policyId)) {<a name="line.295"></a>
<span class="sourceLineNo">296</span>                        if ("ignored".equals(setting)) {<a name="line.296"></a>
<span class="sourceLineNo">297</span>                            setting = ChecksumPolicy.IGNORE.getId();<a name="line.297"></a>
<span class="sourceLineNo">298</span>                        }<a name="line.298"></a>
<span class="sourceLineNo">299</span>                    }<a name="line.299"></a>
<span class="sourceLineNo">300</span><a name="line.300"></a>
<span class="sourceLineNo">301</span>                    // Validate existance of policy key.<a name="line.301"></a>
<span class="sourceLineNo">302</span>                    connector.addPolicy(policyId, setting);<a name="line.302"></a>
<span class="sourceLineNo">303</span>                }<a name="line.303"></a>
<span class="sourceLineNo">304</span><a name="line.304"></a>
<span class="sourceLineNo">305</span>                if (connectorValid) {<a name="line.305"></a>
<span class="sourceLineNo">306</span>                    config.addProxyConnector(connector);<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><a name="line.309"></a>
<span class="sourceLineNo">310</span>            // Normalize the order fields in the proxy connectors.<a name="line.310"></a>
<span class="sourceLineNo">311</span>            Map&lt;String, java.util.List&lt;ProxyConnectorConfiguration&gt;&gt; proxyConnectorMap =<a name="line.311"></a>
<span class="sourceLineNo">312</span>                    config.getProxyConnectorAsMap();<a name="line.312"></a>
<span class="sourceLineNo">313</span><a name="line.313"></a>
<span class="sourceLineNo">314</span>            for (List&lt;ProxyConnectorConfiguration&gt; connectors : proxyConnectorMap.values()) {<a name="line.314"></a>
<span class="sourceLineNo">315</span>                // Sort connectors by order field.<a name="line.315"></a>
<span class="sourceLineNo">316</span>                Collections.sort(connectors, ProxyConnectorConfigurationOrderComparator.getInstance());<a name="line.316"></a>
<span class="sourceLineNo">317</span><a name="line.317"></a>
<span class="sourceLineNo">318</span>                // Normalize the order field values.<a name="line.318"></a>
<span class="sourceLineNo">319</span>                int order = 1;<a name="line.319"></a>
<span class="sourceLineNo">320</span>                for (ProxyConnectorConfiguration connector : connectors) {<a name="line.320"></a>
<span class="sourceLineNo">321</span>                    connector.setOrder(order++);<a name="line.321"></a>
<span class="sourceLineNo">322</span>                }<a name="line.322"></a>
<span class="sourceLineNo">323</span>            }<a name="line.323"></a>
<span class="sourceLineNo">324</span>        }<a name="line.324"></a>
<span class="sourceLineNo">325</span><a name="line.325"></a>
<span class="sourceLineNo">326</span>        this.defaultLocale = Locale.forLanguageTag(config.getArchivaRuntimeConfiguration().getDefaultLanguage());<a name="line.326"></a>
<span class="sourceLineNo">327</span>        this.languagePriorities = Locale.LanguageRange.parse(config.getArchivaRuntimeConfiguration().getLanguageRange());<a name="line.327"></a>
<span class="sourceLineNo">328</span>        return config;<a name="line.328"></a>
<span class="sourceLineNo">329</span>    }<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>     * Updates the checkpath list for repositories.<a name="line.332"></a>
<span class="sourceLineNo">333</span>     *<a name="line.333"></a>
<span class="sourceLineNo">334</span>     * We are replacing existing ones and adding new ones. This allows to update the list with new releases.<a name="line.334"></a>
<span class="sourceLineNo">335</span>     *<a name="line.335"></a>
<span class="sourceLineNo">336</span>     * We are also updating existing remote repositories, if they exist already.<a name="line.336"></a>
<span class="sourceLineNo">337</span>     *<a name="line.337"></a>
<span class="sourceLineNo">338</span>     * This update method should only be called, if the config version changes to avoid overwriting<a name="line.338"></a>
<span class="sourceLineNo">339</span>     * user repository settings all the time.<a name="line.339"></a>
<span class="sourceLineNo">340</span>     */<a name="line.340"></a>
<span class="sourceLineNo">341</span>    private void updateCheckPathDefaults(Configuration config, Registry defaultConfiguration) {<a name="line.341"></a>
<span class="sourceLineNo">342</span>        List&lt;RepositoryCheckPath&gt; existingCheckPathList = config.getArchivaDefaultConfiguration().getDefaultCheckPaths();<a name="line.342"></a>
<span class="sourceLineNo">343</span>        HashMap&lt;String, RepositoryCheckPath&gt; existingCheckPaths = new HashMap&lt;&gt;();<a name="line.343"></a>
<span class="sourceLineNo">344</span>        HashMap&lt;String, RepositoryCheckPath&gt; newCheckPaths = new HashMap&lt;&gt;();<a name="line.344"></a>
<span class="sourceLineNo">345</span>        for (RepositoryCheckPath path : config.getArchivaDefaultConfiguration().getDefaultCheckPaths()) {<a name="line.345"></a>
<span class="sourceLineNo">346</span>            existingCheckPaths.put(path.getUrl(), path);<a name="line.346"></a>
<span class="sourceLineNo">347</span>        }<a name="line.347"></a>
<span class="sourceLineNo">348</span>        List defaultCheckPathsSubsets = defaultConfiguration.getSubsetList("archivaDefaultConfiguration.defaultCheckPaths.defaultCheckPath");<a name="line.348"></a>
<span class="sourceLineNo">349</span>        for (Iterator i = defaultCheckPathsSubsets.iterator(); i.hasNext(); ) {<a name="line.349"></a>
<span class="sourceLineNo">350</span>            RepositoryCheckPath v = readRepositoryCheckPath((Registry) i.next());<a name="line.350"></a>
<span class="sourceLineNo">351</span>            if (existingCheckPaths.containsKey(v.getUrl())) {<a name="line.351"></a>
<span class="sourceLineNo">352</span>                existingCheckPathList.remove(existingCheckPaths.get(v.getUrl()));<a name="line.352"></a>
<span class="sourceLineNo">353</span>            }<a name="line.353"></a>
<span class="sourceLineNo">354</span>            existingCheckPathList.add(v);<a name="line.354"></a>
<span class="sourceLineNo">355</span>            newCheckPaths.put(v.getUrl(), v);<a name="line.355"></a>
<span class="sourceLineNo">356</span>        }<a name="line.356"></a>
<span class="sourceLineNo">357</span>        // Remote repositories update<a name="line.357"></a>
<span class="sourceLineNo">358</span>        for (RemoteRepositoryConfiguration remoteRepositoryConfiguration : config.getRemoteRepositories()) {<a name="line.358"></a>
<span class="sourceLineNo">359</span>            String url = remoteRepositoryConfiguration.getUrl().toLowerCase();<a name="line.359"></a>
<span class="sourceLineNo">360</span>            if (newCheckPaths.containsKey(url)) {<a name="line.360"></a>
<span class="sourceLineNo">361</span>                String currentPath = remoteRepositoryConfiguration.getCheckPath();<a name="line.361"></a>
<span class="sourceLineNo">362</span>                String newPath = newCheckPaths.get(url).getPath();<a name="line.362"></a>
<span class="sourceLineNo">363</span>                log.info("Updating connection check path for repository {}, from '{}' to '{}'.", remoteRepositoryConfiguration.getId(),<a name="line.363"></a>
<span class="sourceLineNo">364</span>                        currentPath, newPath);<a name="line.364"></a>
<span class="sourceLineNo">365</span>                remoteRepositoryConfiguration.setCheckPath(newPath);<a name="line.365"></a>
<span class="sourceLineNo">366</span>            }<a name="line.366"></a>
<span class="sourceLineNo">367</span>        }<a name="line.367"></a>
<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
<span class="sourceLineNo">369</span><a name="line.369"></a>
<span class="sourceLineNo">370</span>    private RepositoryCheckPath readRepositoryCheckPath(Registry registry) {<a name="line.370"></a>
<span class="sourceLineNo">371</span>        RepositoryCheckPath value = new RepositoryCheckPath();<a name="line.371"></a>
<span class="sourceLineNo">372</span><a name="line.372"></a>
<span class="sourceLineNo">373</span>        String url = registry.getString("url", value.getUrl());<a name="line.373"></a>
<span class="sourceLineNo">374</span><a name="line.374"></a>
<span class="sourceLineNo">375</span>        value.setUrl(url);<a name="line.375"></a>
<span class="sourceLineNo">376</span>        String path = registry.getString("path", value.getPath());<a name="line.376"></a>
<span class="sourceLineNo">377</span>        value.setPath(path);<a name="line.377"></a>
<span class="sourceLineNo">378</span>        return value;<a name="line.378"></a>
<span class="sourceLineNo">379</span>    }<a name="line.379"></a>
<span class="sourceLineNo">380</span><a name="line.380"></a>
<span class="sourceLineNo">381</span><a name="line.381"></a>
<span class="sourceLineNo">382</span>    private Registry readDefaultConfiguration() {<a name="line.382"></a>
<span class="sourceLineNo">383</span>        // if it contains some old configuration, remove it (Archiva 0.9)<a name="line.383"></a>
<span class="sourceLineNo">384</span>        registry.removeSubset(KEY);<a name="line.384"></a>
<span class="sourceLineNo">385</span><a name="line.385"></a>
<span class="sourceLineNo">386</span>        try {<a name="line.386"></a>
<span class="sourceLineNo">387</span>            registry.addConfigurationFromResource("org/apache/archiva/configuration/default-archiva.xml", KEY);<a name="line.387"></a>
<span class="sourceLineNo">388</span>            this.isConfigurationDefaulted = true;<a name="line.388"></a>
<span class="sourceLineNo">389</span>        } catch (RegistryException e) {<a name="line.389"></a>
<span class="sourceLineNo">390</span>            throw new ConfigurationRuntimeException(<a name="line.390"></a>
<span class="sourceLineNo">391</span>                    "Fatal error: Unable to find the built-in default configuration and load it into the registry", e);<a name="line.391"></a>
<span class="sourceLineNo">392</span>        }<a name="line.392"></a>
<span class="sourceLineNo">393</span>        return registry.getSubset(KEY);<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>    /*<a name="line.396"></a>
<span class="sourceLineNo">397</span>     * Reads the default only configuration into a special prefix. This allows to check for changes<a name="line.397"></a>
<span class="sourceLineNo">398</span>     * of the default configuration.<a name="line.398"></a>
<span class="sourceLineNo">399</span>     */<a name="line.399"></a>
<span class="sourceLineNo">400</span>    private Registry readDefaultOnlyConfiguration() {<a name="line.400"></a>
<span class="sourceLineNo">401</span>        registry.removeSubset(KEY_DEFAULT_ONLY);<a name="line.401"></a>
<span class="sourceLineNo">402</span>        try {<a name="line.402"></a>
<span class="sourceLineNo">403</span>            registry.addConfigurationFromResource("org/apache/archiva/configuration/default-archiva.xml", KEY_DEFAULT_ONLY);<a name="line.403"></a>
<span class="sourceLineNo">404</span>        } catch (RegistryException e) {<a name="line.404"></a>
<span class="sourceLineNo">405</span>            throw new ConfigurationRuntimeException(<a name="line.405"></a>
<span class="sourceLineNo">406</span>                    "Fatal error: Unable to find the built-in default configuration and load it into the registry", e);<a name="line.406"></a>
<span class="sourceLineNo">407</span>        }<a name="line.407"></a>
<span class="sourceLineNo">408</span>        return registry.getSubset(KEY_DEFAULT_ONLY);<a name="line.408"></a>
<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
<span class="sourceLineNo">410</span><a name="line.410"></a>
<span class="sourceLineNo">411</span>    @SuppressWarnings("unchecked")<a name="line.411"></a>
<span class="sourceLineNo">412</span>    @Override<a name="line.412"></a>
<span class="sourceLineNo">413</span>    public synchronized void save(Configuration configuration)<a name="line.413"></a>
<span class="sourceLineNo">414</span>            throws IndeterminateConfigurationException, RegistryException {<a name="line.414"></a>
<span class="sourceLineNo">415</span>        Registry section = registry.getSection(KEY + ".user");<a name="line.415"></a>
<span class="sourceLineNo">416</span>        Registry baseSection = registry.getSection(KEY + ".base");<a name="line.416"></a>
<span class="sourceLineNo">417</span>        if (section == null) {<a name="line.417"></a>
<span class="sourceLineNo">418</span>            section = baseSection;<a name="line.418"></a>
<span class="sourceLineNo">419</span>            if (section == null) {<a name="line.419"></a>
<span class="sourceLineNo">420</span>                section = createDefaultConfigurationFile();<a name="line.420"></a>
<span class="sourceLineNo">421</span>            }<a name="line.421"></a>
<span class="sourceLineNo">422</span>        } else if (baseSection != null) {<a name="line.422"></a>
<span class="sourceLineNo">423</span>            Collection&lt;String&gt; keys = baseSection.getKeys();<a name="line.423"></a>
<span class="sourceLineNo">424</span>            boolean foundList = false;<a name="line.424"></a>
<span class="sourceLineNo">425</span>            for (Iterator&lt;String&gt; i = keys.iterator(); i.hasNext() &amp;&amp; !foundList; ) {<a name="line.425"></a>
<span class="sourceLineNo">426</span>                String key = i.next();<a name="line.426"></a>
<span class="sourceLineNo">427</span><a name="line.427"></a>
<span class="sourceLineNo">428</span>                // a little aggressive with the repositoryScanning and databaseScanning - should be no need to split<a name="line.428"></a>
<span class="sourceLineNo">429</span>                // that configuration<a name="line.429"></a>
<span class="sourceLineNo">430</span>                if (key.startsWith("repositories") //<a name="line.430"></a>
<span class="sourceLineNo">431</span>                        || key.startsWith("proxyConnectors") //<a name="line.431"></a>
<span class="sourceLineNo">432</span>                        || key.startsWith("networkProxies") //<a name="line.432"></a>
<span class="sourceLineNo">433</span>                        || key.startsWith("repositoryScanning") //<a name="line.433"></a>
<span class="sourceLineNo">434</span>                        || key.startsWith("remoteRepositories") //<a name="line.434"></a>
<span class="sourceLineNo">435</span>                        || key.startsWith("managedRepositories") //<a name="line.435"></a>
<span class="sourceLineNo">436</span>                        || key.startsWith("repositoryGroups")) //<a name="line.436"></a>
<span class="sourceLineNo">437</span>                {<a name="line.437"></a>
<span class="sourceLineNo">438</span>                    foundList = true;<a name="line.438"></a>
<span class="sourceLineNo">439</span>                }<a name="line.439"></a>
<span class="sourceLineNo">440</span>            }<a name="line.440"></a>
<span class="sourceLineNo">441</span><a name="line.441"></a>
<span class="sourceLineNo">442</span>            if (foundList) {<a name="line.442"></a>
<span class="sourceLineNo">443</span>                this.configuration = null;<a name="line.443"></a>
<span class="sourceLineNo">444</span><a name="line.444"></a>
<span class="sourceLineNo">445</span>                throw new IndeterminateConfigurationException(<a name="line.445"></a>
<span class="sourceLineNo">446</span>                        "Configuration can not be saved when it is loaded from two sources");<a name="line.446"></a>
<span class="sourceLineNo">447</span>            }<a name="line.447"></a>
<span class="sourceLineNo">448</span>        }<a name="line.448"></a>
<span class="sourceLineNo">449</span><a name="line.449"></a>
<span class="sourceLineNo">450</span>        // escape all cron expressions to handle ','<a name="line.450"></a>
<span class="sourceLineNo">451</span>        escapeCronExpressions(configuration);<a name="line.451"></a>
<span class="sourceLineNo">452</span><a name="line.452"></a>
<span class="sourceLineNo">453</span>        // [MRM-661] Due to a bug in the modello registry writer, we need to take these out by hand. They'll be put back by the writer.<a name="line.453"></a>
<span class="sourceLineNo">454</span>        if (section != null) {<a name="line.454"></a>
<span class="sourceLineNo">455</span>            if (configuration.getManagedRepositories().isEmpty()) {<a name="line.455"></a>
<span class="sourceLineNo">456</span>                section.removeSubset("managedRepositories");<a name="line.456"></a>
<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
<span class="sourceLineNo">458</span>            if (configuration.getRemoteRepositories().isEmpty()) {<a name="line.458"></a>
<span class="sourceLineNo">459</span>                section.removeSubset("remoteRepositories");<a name="line.459"></a>
<span class="sourceLineNo">460</span><a name="line.460"></a>
<span class="sourceLineNo">461</span>            }<a name="line.461"></a>
<span class="sourceLineNo">462</span>            if (configuration.getProxyConnectors().isEmpty()) {<a name="line.462"></a>
<span class="sourceLineNo">463</span>                section.removeSubset("proxyConnectors");<a name="line.463"></a>
<span class="sourceLineNo">464</span>            }<a name="line.464"></a>
<span class="sourceLineNo">465</span>            if (configuration.getNetworkProxies().isEmpty()) {<a name="line.465"></a>
<span class="sourceLineNo">466</span>                section.removeSubset("networkProxies");<a name="line.466"></a>
<span class="sourceLineNo">467</span>            }<a name="line.467"></a>
<span class="sourceLineNo">468</span>            if (configuration.getLegacyArtifactPaths().isEmpty()) {<a name="line.468"></a>
<span class="sourceLineNo">469</span>                section.removeSubset("legacyArtifactPaths");<a name="line.469"></a>
<span class="sourceLineNo">470</span>            }<a name="line.470"></a>
<span class="sourceLineNo">471</span>            if (configuration.getRepositoryGroups().isEmpty()) {<a name="line.471"></a>
<span class="sourceLineNo">472</span>                section.removeSubset("repositoryGroups");<a name="line.472"></a>
<span class="sourceLineNo">473</span>            }<a name="line.473"></a>
<span class="sourceLineNo">474</span>            if (configuration.getRepositoryScanning() != null) {<a name="line.474"></a>
<span class="sourceLineNo">475</span>                if (configuration.getRepositoryScanning().getKnownContentConsumers().isEmpty()) {<a name="line.475"></a>
<span class="sourceLineNo">476</span>                    section.removeSubset("repositoryScanning.knownContentConsumers");<a name="line.476"></a>
<span class="sourceLineNo">477</span>                }<a name="line.477"></a>
<span class="sourceLineNo">478</span>                if (configuration.getRepositoryScanning().getInvalidContentConsumers().isEmpty()) {<a name="line.478"></a>
<span class="sourceLineNo">479</span>                    section.removeSubset("repositoryScanning.invalidContentConsumers");<a name="line.479"></a>
<span class="sourceLineNo">480</span>                }<a name="line.480"></a>
<span class="sourceLineNo">481</span>            }<a name="line.481"></a>
<span class="sourceLineNo">482</span>            if (configuration.getArchivaRuntimeConfiguration() != null) {<a name="line.482"></a>
<span class="sourceLineNo">483</span>                section.removeSubset("archivaRuntimeConfiguration.defaultCheckPaths");<a name="line.483"></a>
<span class="sourceLineNo">484</span>            }<a name="line.484"></a>
<span class="sourceLineNo">485</span><a name="line.485"></a>
<span class="sourceLineNo">486</span>            new ConfigurationRegistryWriter().write(configuration, section);<a name="line.486"></a>
<span class="sourceLineNo">487</span>            section.save();<a name="line.487"></a>
<span class="sourceLineNo">488</span>        }<a name="line.488"></a>
<span class="sourceLineNo">489</span><a name="line.489"></a>
<span class="sourceLineNo">490</span><a name="line.490"></a>
<span class="sourceLineNo">491</span>        this.configuration = unescapeExpressions(configuration);<a name="line.491"></a>
<span class="sourceLineNo">492</span>        isConfigurationDefaulted = false;<a name="line.492"></a>
<span class="sourceLineNo">493</span><a name="line.493"></a>
<span class="sourceLineNo">494</span>        triggerEvent(ConfigurationEvent.SAVED);<a name="line.494"></a>
<span class="sourceLineNo">495</span>    }<a name="line.495"></a>
<span class="sourceLineNo">496</span><a name="line.496"></a>
<span class="sourceLineNo">497</span>    private void escapeCronExpressions(Configuration configuration) {<a name="line.497"></a>
<span class="sourceLineNo">498</span>        for (ManagedRepositoryConfiguration c : configuration.getManagedRepositories()) {<a name="line.498"></a>
<span class="sourceLineNo">499</span>            c.setRefreshCronExpression(escapeCronExpression(c.getRefreshCronExpression()));<a name="line.499"></a>
<span class="sourceLineNo">500</span>        }<a name="line.500"></a>
<span class="sourceLineNo">501</span>    }<a name="line.501"></a>
<span class="sourceLineNo">502</span><a name="line.502"></a>
<span class="sourceLineNo">503</span>    private Registry createDefaultConfigurationFile()<a name="line.503"></a>
<span class="sourceLineNo">504</span>            throws RegistryException {<a name="line.504"></a>
<span class="sourceLineNo">505</span>        // TODO: may not be needed under commons-configuration 1.4 - check<a name="line.505"></a>
<span class="sourceLineNo">506</span><a name="line.506"></a>
<span class="sourceLineNo">507</span>        String contents = "&lt;configuration /&gt;";<a name="line.507"></a>
<span class="sourceLineNo">508</span><a name="line.508"></a>
<span class="sourceLineNo">509</span>        String fileLocation = userConfigFilename;<a name="line.509"></a>
<span class="sourceLineNo">510</span><a name="line.510"></a>
<span class="sourceLineNo">511</span>        if (!writeFile("user configuration", userConfigFilename, contents)) {<a name="line.511"></a>
<span class="sourceLineNo">512</span>            fileLocation = altConfigFilename;<a name="line.512"></a>
<span class="sourceLineNo">513</span>            if (!writeFile("alternative configuration", altConfigFilename, contents, true)) {<a name="line.513"></a>
<span class="sourceLineNo">514</span>                throw new RegistryException(<a name="line.514"></a>
<span class="sourceLineNo">515</span>                        "Unable to create configuration file in either user [" + userConfigFilename + "] or alternative ["<a name="line.515"></a>
<span class="sourceLineNo">516</span>                                + altConfigFilename<a name="line.516"></a>
<span class="sourceLineNo">517</span>                                + "] locations on disk, usually happens when not allowed to write to those locations.");<a name="line.517"></a>
<span class="sourceLineNo">518</span>            }<a name="line.518"></a>
<span class="sourceLineNo">519</span>        }<a name="line.519"></a>
<span class="sourceLineNo">520</span><a name="line.520"></a>
<span class="sourceLineNo">521</span>        // olamy hackish I know :-)<a name="line.521"></a>
<span class="sourceLineNo">522</span>        contents = "&lt;configuration&gt;&lt;xml fileName=\"" + fileLocation<a name="line.522"></a>
<span class="sourceLineNo">523</span>                + "\" config-forceCreate=\"true\" config-name=\"org.apache.archiva.user\"/&gt;" + "&lt;/configuration&gt;";<a name="line.523"></a>
<span class="sourceLineNo">524</span><a name="line.524"></a>
<span class="sourceLineNo">525</span>        ((CommonsConfigurationRegistry) registry).setProperties(contents);<a name="line.525"></a>
<span class="sourceLineNo">526</span><a name="line.526"></a>
<span class="sourceLineNo">527</span>        registry.initialize();<a name="line.527"></a>
<span class="sourceLineNo">528</span><a name="line.528"></a>
<span class="sourceLineNo">529</span>        for (RegistryListener regListener : registryListeners) {<a name="line.529"></a>
<span class="sourceLineNo">530</span>            addRegistryChangeListener(regListener);<a name="line.530"></a>
<span class="sourceLineNo">531</span>        }<a name="line.531"></a>
<span class="sourceLineNo">532</span><a name="line.532"></a>
<span class="sourceLineNo">533</span>        triggerEvent(ConfigurationEvent.SAVED);<a name="line.533"></a>
<span class="sourceLineNo">534</span><a name="line.534"></a>
<span class="sourceLineNo">535</span>        Registry section = registry.getSection(KEY + ".user");<a name="line.535"></a>
<span class="sourceLineNo">536</span>        return section == null ? new CommonsConfigurationRegistry(new BaseConfiguration()) : section;<a name="line.536"></a>
<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
<span class="sourceLineNo">538</span><a name="line.538"></a>
<span class="sourceLineNo">539</span>    private boolean writeFile(String filetype, String path, String contents) {<a name="line.539"></a>
<span class="sourceLineNo">540</span>        return writeFile( filetype, path, contents, false );<a name="line.540"></a>
<span class="sourceLineNo">541</span>    }<a name="line.541"></a>
<span class="sourceLineNo">542</span><a name="line.542"></a>
<span class="sourceLineNo">543</span>    /**<a name="line.543"></a>
<span class="sourceLineNo">544</span>     * Attempts to write the contents to a file, if an IOException occurs, return false.<a name="line.544"></a>
<span class="sourceLineNo">545</span>     * &lt;p/&gt;<a name="line.545"></a>
<span class="sourceLineNo">546</span>     * The file will be created if the directory to the file exists, otherwise this will return false.<a name="line.546"></a>
<span class="sourceLineNo">547</span>     *<a name="line.547"></a>
<span class="sourceLineNo">548</span>     * @param filetype the filetype (freeform text) to use in logging messages when failure to write.<a name="line.548"></a>
<span class="sourceLineNo">549</span>     * @param path     the path to write to.<a name="line.549"></a>
<span class="sourceLineNo">550</span>     * @param contents the contents to write.<a name="line.550"></a>
<span class="sourceLineNo">551</span>     * @return true if write successful.<a name="line.551"></a>
<span class="sourceLineNo">552</span>     */<a name="line.552"></a>
<span class="sourceLineNo">553</span>    private boolean writeFile(String filetype, String path, String contents, boolean createDirs) {<a name="line.553"></a>
<span class="sourceLineNo">554</span>        Path file = Paths.get(path);<a name="line.554"></a>
<span class="sourceLineNo">555</span><a name="line.555"></a>
<span class="sourceLineNo">556</span>        try {<a name="line.556"></a>
<span class="sourceLineNo">557</span>            // Check parent directory (if it is declared)<a name="line.557"></a>
<span class="sourceLineNo">558</span>            final Path parent = file.getParent();<a name="line.558"></a>
<span class="sourceLineNo">559</span>            if (parent != null) {<a name="line.559"></a>
<span class="sourceLineNo">560</span>                // Check that directory exists<a name="line.560"></a>
<span class="sourceLineNo">561</span>                if (!Files.exists( parent ) &amp;&amp; createDirs) {<a name="line.561"></a>
<span class="sourceLineNo">562</span>                    Files.createDirectories( parent );<a name="line.562"></a>
<span class="sourceLineNo">563</span>                }<a name="line.563"></a>
<span class="sourceLineNo">564</span>                if (!Files.isDirectory(parent)) {<a name="line.564"></a>
<span class="sourceLineNo">565</span>                    // Directory to file must exist for file to be created<a name="line.565"></a>
<span class="sourceLineNo">566</span>                    return false;<a name="line.566"></a>
<span class="sourceLineNo">567</span>                }<a name="line.567"></a>
<span class="sourceLineNo">568</span>            }<a name="line.568"></a>
<span class="sourceLineNo">569</span>            FileUtils.writeStringToFile(file.toFile(), contents, FILE_ENCODING);<a name="line.569"></a>
<span class="sourceLineNo">570</span>            return true;<a name="line.570"></a>
<span class="sourceLineNo">571</span>        } catch (IOException e) {<a name="line.571"></a>
<span class="sourceLineNo">572</span>            log.error("Unable to create {} file: {}", filetype, e.getMessage(), e);<a name="line.572"></a>
<span class="sourceLineNo">573</span>            return false;<a name="line.573"></a>
<span class="sourceLineNo">574</span>        }<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>    private void triggerEvent(int type) {<a name="line.577"></a>
<span class="sourceLineNo">578</span>        ConfigurationEvent evt = new ConfigurationEvent(type);<a name="line.578"></a>
<span class="sourceLineNo">579</span>        for (ConfigurationListener listener : listeners) {<a name="line.579"></a>
<span class="sourceLineNo">580</span>            listener.configurationEvent(evt);<a name="line.580"></a>
<span class="sourceLineNo">581</span>        }<a name="line.581"></a>
<span class="sourceLineNo">582</span>    }<a name="line.582"></a>
<span class="sourceLineNo">583</span><a name="line.583"></a>
<span class="sourceLineNo">584</span>    @Override<a name="line.584"></a>
<span class="sourceLineNo">585</span>    public void addListener(ConfigurationListener listener) {<a name="line.585"></a>
<span class="sourceLineNo">586</span>        if (listener == null) {<a name="line.586"></a>
<span class="sourceLineNo">587</span>            return;<a name="line.587"></a>
<span class="sourceLineNo">588</span>        }<a name="line.588"></a>
<span class="sourceLineNo">589</span><a name="line.589"></a>
<span class="sourceLineNo">590</span>        listeners.add(listener);<a name="line.590"></a>
<span class="sourceLineNo">591</span>    }<a name="line.591"></a>
<span class="sourceLineNo">592</span><a name="line.592"></a>
<span class="sourceLineNo">593</span>    @Override<a name="line.593"></a>
<span class="sourceLineNo">594</span>    public void removeListener(ConfigurationListener listener) {<a name="line.594"></a>
<span class="sourceLineNo">595</span>        if (listener == null) {<a name="line.595"></a>
<span class="sourceLineNo">596</span>            return;<a name="line.596"></a>
<span class="sourceLineNo">597</span>        }<a name="line.597"></a>
<span class="sourceLineNo">598</span><a name="line.598"></a>
<span class="sourceLineNo">599</span>        listeners.remove(listener);<a name="line.599"></a>
<span class="sourceLineNo">600</span>    }<a name="line.600"></a>
<span class="sourceLineNo">601</span><a name="line.601"></a>
<span class="sourceLineNo">602</span><a name="line.602"></a>
<span class="sourceLineNo">603</span>    @Override<a name="line.603"></a>
<span class="sourceLineNo">604</span>    public void addChangeListener(RegistryListener listener) {<a name="line.604"></a>
<span class="sourceLineNo">605</span>        addRegistryChangeListener(listener);<a name="line.605"></a>
<span class="sourceLineNo">606</span><a name="line.606"></a>
<span class="sourceLineNo">607</span>        // keep track for later<a name="line.607"></a>
<span class="sourceLineNo">608</span>        registryListeners.add(listener);<a name="line.608"></a>
<span class="sourceLineNo">609</span>    }<a name="line.609"></a>
<span class="sourceLineNo">610</span><a name="line.610"></a>
<span class="sourceLineNo">611</span>    private void addRegistryChangeListener(RegistryListener listener) {<a name="line.611"></a>
<span class="sourceLineNo">612</span>        Registry section = registry.getSection(KEY + ".user");<a name="line.612"></a>
<span class="sourceLineNo">613</span>        if (section != null) {<a name="line.613"></a>
<span class="sourceLineNo">614</span>            section.addChangeListener(listener);<a name="line.614"></a>
<span class="sourceLineNo">615</span>        }<a name="line.615"></a>
<span class="sourceLineNo">616</span>        section = registry.getSection(KEY + ".base");<a name="line.616"></a>
<span class="sourceLineNo">617</span>        if (section != null) {<a name="line.617"></a>
<span class="sourceLineNo">618</span>            section.addChangeListener(listener);<a name="line.618"></a>
<span class="sourceLineNo">619</span>        }<a name="line.619"></a>
<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
<span class="sourceLineNo">621</span><a name="line.621"></a>
<span class="sourceLineNo">622</span>    @Override<a name="line.622"></a>
<span class="sourceLineNo">623</span>    public void removeChangeListener(RegistryListener listener) {<a name="line.623"></a>
<span class="sourceLineNo">624</span>        boolean removed = registryListeners.remove(listener);<a name="line.624"></a>
<span class="sourceLineNo">625</span>        log.debug("RegistryListener: '{}' removed {}", listener, removed);<a name="line.625"></a>
<span class="sourceLineNo">626</span><a name="line.626"></a>
<span class="sourceLineNo">627</span>        Registry section = registry.getSection(KEY + ".user");<a name="line.627"></a>
<span class="sourceLineNo">628</span>        if (section != null) {<a name="line.628"></a>
<span class="sourceLineNo">629</span>            section.removeChangeListener(listener);<a name="line.629"></a>
<span class="sourceLineNo">630</span>        }<a name="line.630"></a>
<span class="sourceLineNo">631</span>        section = registry.getSection(KEY + ".base");<a name="line.631"></a>
<span class="sourceLineNo">632</span>        if (section != null) {<a name="line.632"></a>
<span class="sourceLineNo">633</span>            section.removeChangeListener(listener);<a name="line.633"></a>
<span class="sourceLineNo">634</span>        }<a name="line.634"></a>
<span class="sourceLineNo">635</span><a name="line.635"></a>
<span class="sourceLineNo">636</span>    }<a name="line.636"></a>
<span class="sourceLineNo">637</span><a name="line.637"></a>
<span class="sourceLineNo">638</span>    @PostConstruct<a name="line.638"></a>
<span class="sourceLineNo">639</span>    public void initialize() {<a name="line.639"></a>
<span class="sourceLineNo">640</span><a name="line.640"></a>
<span class="sourceLineNo">641</span>        // Resolve expressions in the userConfigFilename and altConfigFilename<a name="line.641"></a>
<span class="sourceLineNo">642</span>        try {<a name="line.642"></a>
<span class="sourceLineNo">643</span>            ExpressionEvaluator expressionEvaluator = new DefaultExpressionEvaluator();<a name="line.643"></a>
<span class="sourceLineNo">644</span>            expressionEvaluator.addExpressionSource(new SystemPropertyExpressionSource());<a name="line.644"></a>
<span class="sourceLineNo">645</span>            String userConfigFileNameSysProps = System.getProperty(USER_CONFIG_PROPERTY);<a name="line.645"></a>
<span class="sourceLineNo">646</span>            if (StringUtils.isNotBlank(userConfigFileNameSysProps)) {<a name="line.646"></a>
<span class="sourceLineNo">647</span>                userConfigFilename = userConfigFileNameSysProps;<a name="line.647"></a>
<span class="sourceLineNo">648</span>            } else {<a name="line.648"></a>
<span class="sourceLineNo">649</span>                String userConfigFileNameEnv = System.getenv(USER_CONFIG_ENVVAR);<a name="line.649"></a>
<span class="sourceLineNo">650</span>                if (StringUtils.isNotBlank(userConfigFileNameEnv)) {<a name="line.650"></a>
<span class="sourceLineNo">651</span>                    userConfigFilename = userConfigFileNameEnv;<a name="line.651"></a>
<span class="sourceLineNo">652</span>                } else {<a name="line.652"></a>
<span class="sourceLineNo">653</span>                    userConfigFilename = expressionEvaluator.expand(userConfigFilename);<a name="line.653"></a>
<span class="sourceLineNo">654</span>                }<a name="line.654"></a>
<span class="sourceLineNo">655</span>            }<a name="line.655"></a>
<span class="sourceLineNo">656</span>            altConfigFilename = expressionEvaluator.expand(altConfigFilename);<a name="line.656"></a>
<span class="sourceLineNo">657</span>            loadConfiguration();<a name="line.657"></a>
<span class="sourceLineNo">658</span>            handleUpgradeConfiguration();<a name="line.658"></a>
<span class="sourceLineNo">659</span>        } catch (IndeterminateConfigurationException | RegistryException e) {<a name="line.659"></a>
<span class="sourceLineNo">660</span>            throw new RuntimeException("failed during upgrade from previous version" + e.getMessage(), e);<a name="line.660"></a>
<span class="sourceLineNo">661</span>        } catch (EvaluatorException e) {<a name="line.661"></a>
<span class="sourceLineNo">662</span>            throw new RuntimeException(<a name="line.662"></a>
<span class="sourceLineNo">663</span>                    "Unable to evaluate expressions found in " + "userConfigFilename or altConfigFilename.", e);<a name="line.663"></a>
<span class="sourceLineNo">664</span>        }<a name="line.664"></a>
<span class="sourceLineNo">665</span>        registry.addChangeListener(this);<a name="line.665"></a>
<span class="sourceLineNo">666</span>    }<a name="line.666"></a>
<span class="sourceLineNo">667</span><a name="line.667"></a>
<span class="sourceLineNo">668</span>    /**<a name="line.668"></a>
<span class="sourceLineNo">669</span>     * Handle upgrade to newer version<a name="line.669"></a>
<span class="sourceLineNo">670</span>     */<a name="line.670"></a>
<span class="sourceLineNo">671</span>    private void handleUpgradeConfiguration()<a name="line.671"></a>
<span class="sourceLineNo">672</span>            throws RegistryException, IndeterminateConfigurationException {<a name="line.672"></a>
<span class="sourceLineNo">673</span><a name="line.673"></a>
<span class="sourceLineNo">674</span>        List&lt;String&gt; dbConsumers = Arrays.asList("update-db-artifact", "update-db-repository-metadata");<a name="line.674"></a>
<span class="sourceLineNo">675</span><a name="line.675"></a>
<span class="sourceLineNo">676</span>        // remove database consumers if here<a name="line.676"></a>
<span class="sourceLineNo">677</span>        List&lt;String&gt; intersec =<a name="line.677"></a>
<span class="sourceLineNo">678</span>                ListUtils.intersection(dbConsumers, configuration.getRepositoryScanning().getKnownContentConsumers());<a name="line.678"></a>
<span class="sourceLineNo">679</span><a name="line.679"></a>
<span class="sourceLineNo">680</span>        if (!intersec.isEmpty()) {<a name="line.680"></a>
<span class="sourceLineNo">681</span><a name="line.681"></a>
<span class="sourceLineNo">682</span>            List&lt;String&gt; knowContentConsumers =<a name="line.682"></a>
<span class="sourceLineNo">683</span>                    new ArrayList&lt;&gt;(configuration.getRepositoryScanning().getKnownContentConsumers().size());<a name="line.683"></a>
<span class="sourceLineNo">684</span>            for (String knowContentConsumer : configuration.getRepositoryScanning().getKnownContentConsumers()) {<a name="line.684"></a>
<span class="sourceLineNo">685</span>                if (!dbConsumers.contains(knowContentConsumer)) {<a name="line.685"></a>
<span class="sourceLineNo">686</span>                    knowContentConsumers.add(knowContentConsumer);<a name="line.686"></a>
<span class="sourceLineNo">687</span>                }<a name="line.687"></a>
<span class="sourceLineNo">688</span>            }<a name="line.688"></a>
<span class="sourceLineNo">689</span><a name="line.689"></a>
<span class="sourceLineNo">690</span>            configuration.getRepositoryScanning().setKnownContentConsumers(knowContentConsumers);<a name="line.690"></a>
<span class="sourceLineNo">691</span>        }<a name="line.691"></a>
<span class="sourceLineNo">692</span><a name="line.692"></a>
<span class="sourceLineNo">693</span>        // ensure create-archiva-metadata is here<a name="line.693"></a>
<span class="sourceLineNo">694</span>        if (!configuration.getRepositoryScanning().getKnownContentConsumers().contains("create-archiva-metadata")) {<a name="line.694"></a>
<span class="sourceLineNo">695</span>            List&lt;String&gt; knowContentConsumers =<a name="line.695"></a>
<span class="sourceLineNo">696</span>                    new ArrayList&lt;&gt;(configuration.getRepositoryScanning().getKnownContentConsumers());<a name="line.696"></a>
<span class="sourceLineNo">697</span>            knowContentConsumers.add("create-archiva-metadata");<a name="line.697"></a>
<span class="sourceLineNo">698</span>            configuration.getRepositoryScanning().setKnownContentConsumers(knowContentConsumers);<a name="line.698"></a>
<span class="sourceLineNo">699</span>        }<a name="line.699"></a>
<span class="sourceLineNo">700</span><a name="line.700"></a>
<span class="sourceLineNo">701</span>        // ensure duplicate-artifacts is here<a name="line.701"></a>
<span class="sourceLineNo">702</span>        if (!configuration.getRepositoryScanning().getKnownContentConsumers().contains("duplicate-artifacts")) {<a name="line.702"></a>
<span class="sourceLineNo">703</span>            List&lt;String&gt; knowContentConsumers =<a name="line.703"></a>
<span class="sourceLineNo">704</span>                    new ArrayList&lt;&gt;(configuration.getRepositoryScanning().getKnownContentConsumers());<a name="line.704"></a>
<span class="sourceLineNo">705</span>            knowContentConsumers.add("duplicate-artifacts");<a name="line.705"></a>
<span class="sourceLineNo">706</span>            configuration.getRepositoryScanning().setKnownContentConsumers(knowContentConsumers);<a name="line.706"></a>
<span class="sourceLineNo">707</span>        }<a name="line.707"></a>
<span class="sourceLineNo">708</span><a name="line.708"></a>
<span class="sourceLineNo">709</span>        Registry defaultOnlyConfiguration = readDefaultOnlyConfiguration();<a name="line.709"></a>
<span class="sourceLineNo">710</span>        // Currently we check only for configuration version change, not certain version numbers.<a name="line.710"></a>
<span class="sourceLineNo">711</span>        if (hasConfigVersionChanged(configuration, defaultOnlyConfiguration)) {<a name="line.711"></a>
<span class="sourceLineNo">712</span>            updateCheckPathDefaults(configuration, defaultOnlyConfiguration);<a name="line.712"></a>
<span class="sourceLineNo">713</span>            String newVersion = defaultOnlyConfiguration.getString("version");<a name="line.713"></a>
<span class="sourceLineNo">714</span>            if (newVersion == null) {<a name="line.714"></a>
<span class="sourceLineNo">715</span>                throw new IndeterminateConfigurationException("The default configuration has no version information!");<a name="line.715"></a>
<span class="sourceLineNo">716</span>            }<a name="line.716"></a>
<span class="sourceLineNo">717</span>            configuration.setVersion(newVersion);<a name="line.717"></a>
<span class="sourceLineNo">718</span>            try {<a name="line.718"></a>
<span class="sourceLineNo">719</span>                save(configuration);<a name="line.719"></a>
<span class="sourceLineNo">720</span>            } catch (IndeterminateConfigurationException e) {<a name="line.720"></a>
<span class="sourceLineNo">721</span>                log.error("Error occured during configuration update to new version: {}", e.getMessage());<a name="line.721"></a>
<span class="sourceLineNo">722</span>            } catch (RegistryException e) {<a name="line.722"></a>
<span class="sourceLineNo">723</span>                log.error("Error occured during configuration update to new version: {}", e.getMessage());<a name="line.723"></a>
<span class="sourceLineNo">724</span>            }<a name="line.724"></a>
<span class="sourceLineNo">725</span>        }<a name="line.725"></a>
<span class="sourceLineNo">726</span>    }<a name="line.726"></a>
<span class="sourceLineNo">727</span><a name="line.727"></a>
<span class="sourceLineNo">728</span>    @Override<a name="line.728"></a>
<span class="sourceLineNo">729</span>    public void reload() {<a name="line.729"></a>
<span class="sourceLineNo">730</span>        this.configuration = null;<a name="line.730"></a>
<span class="sourceLineNo">731</span>        try {<a name="line.731"></a>
<span class="sourceLineNo">732</span>            this.registry.initialize();<a name="line.732"></a>
<span class="sourceLineNo">733</span>        } catch (RegistryException e) {<a name="line.733"></a>
<span class="sourceLineNo">734</span>            throw new ConfigurationRuntimeException(e.getMessage(), e);<a name="line.734"></a>
<span class="sourceLineNo">735</span>        }<a name="line.735"></a>
<span class="sourceLineNo">736</span>        this.initialize();<a name="line.736"></a>
<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
<span class="sourceLineNo">738</span><a name="line.738"></a>
<span class="sourceLineNo">739</span>    @Override<a name="line.739"></a>
<span class="sourceLineNo">740</span>    public Locale getDefaultLocale() {<a name="line.740"></a>
<span class="sourceLineNo">741</span>        return defaultLocale;<a name="line.741"></a>
<span class="sourceLineNo">742</span>    }<a name="line.742"></a>
<span class="sourceLineNo">743</span><a name="line.743"></a>
<span class="sourceLineNo">744</span>    @Override<a name="line.744"></a>
<span class="sourceLineNo">745</span>    public List&lt;Locale.LanguageRange&gt; getLanguagePriorities() {<a name="line.745"></a>
<span class="sourceLineNo">746</span>        return languagePriorities;<a name="line.746"></a>
<span class="sourceLineNo">747</span>    }<a name="line.747"></a>
<span class="sourceLineNo">748</span><a name="line.748"></a>
<span class="sourceLineNo">749</span>    @Override<a name="line.749"></a>
<span class="sourceLineNo">750</span>    public Path getAppServerBaseDir() {<a name="line.750"></a>
<span class="sourceLineNo">751</span>        String basePath = registry.getString("appserver.base");<a name="line.751"></a>
<span class="sourceLineNo">752</span>        if (!StringUtils.isEmpty(basePath)) {<a name="line.752"></a>
<span class="sourceLineNo">753</span>            return Paths.get(basePath);<a name="line.753"></a>
<span class="sourceLineNo">754</span>        } else {<a name="line.754"></a>
<span class="sourceLineNo">755</span>            return Paths.get("");<a name="line.755"></a>
<span class="sourceLineNo">756</span>        }<a name="line.756"></a>
<span class="sourceLineNo">757</span>    }<a name="line.757"></a>
<span class="sourceLineNo">758</span><a name="line.758"></a>
<span class="sourceLineNo">759</span>    @Override<a name="line.759"></a>
<span class="sourceLineNo">760</span>    public Path getRepositoryBaseDir() {<a name="line.760"></a>
<span class="sourceLineNo">761</span>        if (repositoryBaseDirectory == null) {<a name="line.761"></a>
<span class="sourceLineNo">762</span>            getConfiguration();<a name="line.762"></a>
<span class="sourceLineNo">763</span>        }<a name="line.763"></a>
<span class="sourceLineNo">764</span>        return repositoryBaseDirectory;<a name="line.764"></a>
<span class="sourceLineNo">765</span><a name="line.765"></a>
<span class="sourceLineNo">766</span>    }<a name="line.766"></a>
<span class="sourceLineNo">767</span><a name="line.767"></a>
<span class="sourceLineNo">768</span>    @Override<a name="line.768"></a>
<span class="sourceLineNo">769</span>    public Path getRemoteRepositoryBaseDir() {<a name="line.769"></a>
<span class="sourceLineNo">770</span>        if (remoteRepositoryBaseDirectory == null) {<a name="line.770"></a>
<span class="sourceLineNo">771</span>            getConfiguration();<a name="line.771"></a>
<span class="sourceLineNo">772</span>        }<a name="line.772"></a>
<span class="sourceLineNo">773</span>        return remoteRepositoryBaseDirectory;<a name="line.773"></a>
<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
<span class="sourceLineNo">775</span><a name="line.775"></a>
<span class="sourceLineNo">776</span>    @Override<a name="line.776"></a>
<span class="sourceLineNo">777</span>    public Path getRepositoryGroupBaseDir() {<a name="line.777"></a>
<span class="sourceLineNo">778</span>        if (repositoryGroupBaseDirectory == null) {<a name="line.778"></a>
<span class="sourceLineNo">779</span>            getConfiguration();<a name="line.779"></a>
<span class="sourceLineNo">780</span>        }<a name="line.780"></a>
<span class="sourceLineNo">781</span>        return repositoryGroupBaseDirectory;<a name="line.781"></a>
<span class="sourceLineNo">782</span>    }<a name="line.782"></a>
<span class="sourceLineNo">783</span><a name="line.783"></a>
<span class="sourceLineNo">784</span>    @Override<a name="line.784"></a>
<span class="sourceLineNo">785</span>    public Path getDataDirectory() {<a name="line.785"></a>
<span class="sourceLineNo">786</span>        if (dataDirectory == null) {<a name="line.786"></a>
<span class="sourceLineNo">787</span>            getConfiguration();<a name="line.787"></a>
<span class="sourceLineNo">788</span>        }<a name="line.788"></a>
<span class="sourceLineNo">789</span>        return dataDirectory;<a name="line.789"></a>
<span class="sourceLineNo">790</span>    }<a name="line.790"></a>
<span class="sourceLineNo">791</span><a name="line.791"></a>
<span class="sourceLineNo">792</span>    @Override<a name="line.792"></a>
<span class="sourceLineNo">793</span>    public void beforeConfigurationChange(Registry registry, String propertyName, Object propertyValue) {<a name="line.793"></a>
<span class="sourceLineNo">794</span>        // nothing to do here<a name="line.794"></a>
<span class="sourceLineNo">795</span>    }<a name="line.795"></a>
<span class="sourceLineNo">796</span><a name="line.796"></a>
<span class="sourceLineNo">797</span>    @Override<a name="line.797"></a>
<span class="sourceLineNo">798</span>    public synchronized void afterConfigurationChange(Registry registry, String propertyName, Object propertyValue) {<a name="line.798"></a>
<span class="sourceLineNo">799</span>        configuration = null;<a name="line.799"></a>
<span class="sourceLineNo">800</span>        this.dataDirectory = null;<a name="line.800"></a>
<span class="sourceLineNo">801</span>        this.repositoryBaseDirectory = null;<a name="line.801"></a>
<span class="sourceLineNo">802</span>    }<a name="line.802"></a>
<span class="sourceLineNo">803</span><a name="line.803"></a>
<span class="sourceLineNo">804</span>    private String removeExpressions(String directory) {<a name="line.804"></a>
<span class="sourceLineNo">805</span>        String value = StringUtils.replace(directory, "${appserver.base}",<a name="line.805"></a>
<span class="sourceLineNo">806</span>                registry.getString("appserver.base", "${appserver.base}"));<a name="line.806"></a>
<span class="sourceLineNo">807</span>        value = StringUtils.replace(value, "${appserver.home}",<a name="line.807"></a>
<span class="sourceLineNo">808</span>                registry.getString("appserver.home", "${appserver.home}"));<a name="line.808"></a>
<span class="sourceLineNo">809</span>        return value;<a name="line.809"></a>
<span class="sourceLineNo">810</span>    }<a name="line.810"></a>
<span class="sourceLineNo">811</span><a name="line.811"></a>
<span class="sourceLineNo">812</span>    private String unescapeCronExpression(String cronExpression) {<a name="line.812"></a>
<span class="sourceLineNo">813</span>        return StringUtils.replace(cronExpression, "\\,", ",");<a name="line.813"></a>
<span class="sourceLineNo">814</span>    }<a name="line.814"></a>
<span class="sourceLineNo">815</span><a name="line.815"></a>
<span class="sourceLineNo">816</span>    private String escapeCronExpression(String cronExpression) {<a name="line.816"></a>
<span class="sourceLineNo">817</span>        return StringUtils.replace(cronExpression, ",", "\\,");<a name="line.817"></a>
<span class="sourceLineNo">818</span>    }<a name="line.818"></a>
<span class="sourceLineNo">819</span><a name="line.819"></a>
<span class="sourceLineNo">820</span>    private Configuration unescapeExpressions(Configuration config) {<a name="line.820"></a>
<span class="sourceLineNo">821</span>        // TODO: for commons-configuration 1.3 only<a name="line.821"></a>
<span class="sourceLineNo">822</span>        for (ManagedRepositoryConfiguration c : config.getManagedRepositories()) {<a name="line.822"></a>
<span class="sourceLineNo">823</span>            c.setLocation(removeExpressions(c.getLocation()));<a name="line.823"></a>
<span class="sourceLineNo">824</span>            c.setRefreshCronExpression(unescapeCronExpression(c.getRefreshCronExpression()));<a name="line.824"></a>
<span class="sourceLineNo">825</span>        }<a name="line.825"></a>
<span class="sourceLineNo">826</span><a name="line.826"></a>
<span class="sourceLineNo">827</span>        return config;<a name="line.827"></a>
<span class="sourceLineNo">828</span>    }<a name="line.828"></a>
<span class="sourceLineNo">829</span><a name="line.829"></a>
<span class="sourceLineNo">830</span>    private Configuration checkRepositoryLocations(Configuration config) {<a name="line.830"></a>
<span class="sourceLineNo">831</span>        // additional check for [MRM-789], ensure that the location of the default repositories <a name="line.831"></a>
<span class="sourceLineNo">832</span>        // are not installed in the server installation        <a name="line.832"></a>
<span class="sourceLineNo">833</span>        for (ManagedRepositoryConfiguration repo : (List&lt;ManagedRepositoryConfiguration&gt;) config.getManagedRepositories()) {<a name="line.833"></a>
<span class="sourceLineNo">834</span>            String repoPath = repo.getLocation();<a name="line.834"></a>
<span class="sourceLineNo">835</span>            Path repoLocation = Paths.get(repoPath);<a name="line.835"></a>
<span class="sourceLineNo">836</span><a name="line.836"></a>
<span class="sourceLineNo">837</span>            if (Files.exists(repoLocation) &amp;&amp; Files.isDirectory(repoLocation) &amp;&amp; !repoPath.endsWith(<a name="line.837"></a>
<span class="sourceLineNo">838</span>                    "data/repositories/" + repo.getId())) {<a name="line.838"></a>
<span class="sourceLineNo">839</span>                repo.setLocation(repoPath + "/data/repositories/" + repo.getId());<a name="line.839"></a>
<span class="sourceLineNo">840</span>            }<a name="line.840"></a>
<span class="sourceLineNo">841</span>        }<a name="line.841"></a>
<span class="sourceLineNo">842</span><a name="line.842"></a>
<span class="sourceLineNo">843</span>        return config;<a name="line.843"></a>
<span class="sourceLineNo">844</span>    }<a name="line.844"></a>
<span class="sourceLineNo">845</span><a name="line.845"></a>
<span class="sourceLineNo">846</span>    public String getUserConfigFilename() {<a name="line.846"></a>
<span class="sourceLineNo">847</span>        return userConfigFilename;<a name="line.847"></a>
<span class="sourceLineNo">848</span>    }<a name="line.848"></a>
<span class="sourceLineNo">849</span><a name="line.849"></a>
<span class="sourceLineNo">850</span>    public String getAltConfigFilename() {<a name="line.850"></a>
<span class="sourceLineNo">851</span>        return altConfigFilename;<a name="line.851"></a>
<span class="sourceLineNo">852</span>    }<a name="line.852"></a>
<span class="sourceLineNo">853</span><a name="line.853"></a>
<span class="sourceLineNo">854</span>    @Override<a name="line.854"></a>
<span class="sourceLineNo">855</span>    public boolean isDefaulted() {<a name="line.855"></a>
<span class="sourceLineNo">856</span>        return this.isConfigurationDefaulted;<a name="line.856"></a>
<span class="sourceLineNo">857</span>    }<a name="line.857"></a>
<span class="sourceLineNo">858</span><a name="line.858"></a>
<span class="sourceLineNo">859</span>    public Registry getRegistry() {<a name="line.859"></a>
<span class="sourceLineNo">860</span>        return registry;<a name="line.860"></a>
<span class="sourceLineNo">861</span>    }<a name="line.861"></a>
<span class="sourceLineNo">862</span><a name="line.862"></a>
<span class="sourceLineNo">863</span>    public void setRegistry(Registry registry) {<a name="line.863"></a>
<span class="sourceLineNo">864</span>        this.registry = registry;<a name="line.864"></a>
<span class="sourceLineNo">865</span>    }<a name="line.865"></a>
<span class="sourceLineNo">866</span><a name="line.866"></a>
<span class="sourceLineNo">867</span><a name="line.867"></a>
<span class="sourceLineNo">868</span>    public void setUserConfigFilename(String userConfigFilename) {<a name="line.868"></a>
<span class="sourceLineNo">869</span>        this.userConfigFilename = userConfigFilename;<a name="line.869"></a>
<span class="sourceLineNo">870</span>    }<a name="line.870"></a>
<span class="sourceLineNo">871</span><a name="line.871"></a>
<span class="sourceLineNo">872</span>    public void setAltConfigFilename(String altConfigFilename) {<a name="line.872"></a>
<span class="sourceLineNo">873</span>        this.altConfigFilename = altConfigFilename;<a name="line.873"></a>
<span class="sourceLineNo">874</span>    }<a name="line.874"></a>
<span class="sourceLineNo">875</span>}<a name="line.875"></a>




























































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