<!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>package org.apache.archiva.repository.scanner;<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.admin.model.RepositoryAdminException;<a name="line.22"></a>
<span class="sourceLineNo">023</span>import org.apache.archiva.admin.model.admin.ArchivaAdministration;<a name="line.23"></a>
<span class="sourceLineNo">024</span>import org.apache.archiva.admin.model.beans.ManagedRepository;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import org.apache.archiva.common.utils.BaseFile;<a name="line.25"></a>
<span class="sourceLineNo">026</span>import org.apache.archiva.configuration.ArchivaConfiguration;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import org.apache.archiva.consumers.InvalidRepositoryContentConsumer;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import org.apache.archiva.consumers.KnownRepositoryContentConsumer;<a name="line.28"></a>
<span class="sourceLineNo">029</span>import org.apache.archiva.consumers.functors.ConsumerWantsFilePredicate;<a name="line.29"></a>
<span class="sourceLineNo">030</span>import org.apache.archiva.redback.components.registry.RegistryListener;<a name="line.30"></a>
<span class="sourceLineNo">031</span>import org.apache.archiva.repository.scanner.functors.ConsumerProcessFileClosure;<a name="line.31"></a>
<span class="sourceLineNo">032</span>import org.apache.archiva.repository.scanner.functors.TriggerBeginScanClosure;<a name="line.32"></a>
<span class="sourceLineNo">033</span>import org.apache.archiva.repository.scanner.functors.TriggerScanCompletedClosure;<a name="line.33"></a>
<span class="sourceLineNo">034</span>import org.apache.commons.collections.Closure;<a name="line.34"></a>
<span class="sourceLineNo">035</span>import org.apache.commons.collections.CollectionUtils;<a name="line.35"></a>
<span class="sourceLineNo">036</span>import org.apache.commons.collections.functors.IfClosure;<a name="line.36"></a>
<span class="sourceLineNo">037</span>import org.springframework.beans.BeansException;<a name="line.37"></a>
<span class="sourceLineNo">038</span>import org.springframework.context.ApplicationContext;<a name="line.38"></a>
<span class="sourceLineNo">039</span>import org.springframework.context.ApplicationContextAware;<a name="line.39"></a>
<span class="sourceLineNo">040</span>import org.springframework.stereotype.Service;<a name="line.40"></a>
<span class="sourceLineNo">041</span><a name="line.41"></a>
<span class="sourceLineNo">042</span>import javax.inject.Inject;<a name="line.42"></a>
<span class="sourceLineNo">043</span>import java.io.File;<a name="line.43"></a>
<span class="sourceLineNo">044</span>import java.util.ArrayList;<a name="line.44"></a>
<span class="sourceLineNo">045</span>import java.util.Date;<a name="line.45"></a>
<span class="sourceLineNo">046</span>import java.util.HashMap;<a name="line.46"></a>
<span class="sourceLineNo">047</span>import java.util.List;<a name="line.47"></a>
<span class="sourceLineNo">048</span>import java.util.Map;<a name="line.48"></a>
<span class="sourceLineNo">049</span><a name="line.49"></a>
<span class="sourceLineNo">050</span>/**<a name="line.50"></a>
<span class="sourceLineNo">051</span> * RepositoryContentConsumerUtil<a name="line.51"></a>
<span class="sourceLineNo">052</span> */<a name="line.52"></a>
<span class="sourceLineNo">053</span>@Service("repositoryContentConsumers")<a name="line.53"></a>
<span class="sourceLineNo">054</span>public class RepositoryContentConsumers<a name="line.54"></a>
<span class="sourceLineNo">055</span>    implements ApplicationContextAware<a name="line.55"></a>
<span class="sourceLineNo">056</span>{<a name="line.56"></a>
<span class="sourceLineNo">057</span><a name="line.57"></a>
<span class="sourceLineNo">058</span>    @Inject<a name="line.58"></a>
<span class="sourceLineNo">059</span>    private ApplicationContext applicationContext;<a name="line.59"></a>
<span class="sourceLineNo">060</span><a name="line.60"></a>
<span class="sourceLineNo">061</span>    private ArchivaAdministration archivaAdministration;<a name="line.61"></a>
<span class="sourceLineNo">062</span><a name="line.62"></a>
<span class="sourceLineNo">063</span>    private List&lt;KnownRepositoryContentConsumer&gt; selectedKnownConsumers;<a name="line.63"></a>
<span class="sourceLineNo">064</span><a name="line.64"></a>
<span class="sourceLineNo">065</span>    private List&lt;InvalidRepositoryContentConsumer&gt; selectedInvalidConsumers;<a name="line.65"></a>
<span class="sourceLineNo">066</span><a name="line.66"></a>
<span class="sourceLineNo">067</span>    @Inject<a name="line.67"></a>
<span class="sourceLineNo">068</span>    private ArchivaConfiguration archivaConfiguration;<a name="line.68"></a>
<span class="sourceLineNo">069</span><a name="line.69"></a>
<span class="sourceLineNo">070</span>    @Inject<a name="line.70"></a>
<span class="sourceLineNo">071</span>    public RepositoryContentConsumers( ArchivaAdministration archivaAdministration )<a name="line.71"></a>
<span class="sourceLineNo">072</span>    {<a name="line.72"></a>
<span class="sourceLineNo">073</span>        this.archivaAdministration = archivaAdministration;<a name="line.73"></a>
<span class="sourceLineNo">074</span>    }<a name="line.74"></a>
<span class="sourceLineNo">075</span><a name="line.75"></a>
<span class="sourceLineNo">076</span>    @Override<a name="line.76"></a>
<span class="sourceLineNo">077</span>    public void setApplicationContext( ApplicationContext applicationContext )<a name="line.77"></a>
<span class="sourceLineNo">078</span>        throws BeansException<a name="line.78"></a>
<span class="sourceLineNo">079</span>    {<a name="line.79"></a>
<span class="sourceLineNo">080</span>        this.applicationContext = applicationContext;<a name="line.80"></a>
<span class="sourceLineNo">081</span>    }<a name="line.81"></a>
<span class="sourceLineNo">082</span><a name="line.82"></a>
<span class="sourceLineNo">083</span>    /**<a name="line.83"></a>
<span class="sourceLineNo">084</span>     * &lt;p&gt;<a name="line.84"></a>
<span class="sourceLineNo">085</span>     * Get the list of Ids associated with those {@link KnownRepositoryContentConsumer} that have<a name="line.85"></a>
<span class="sourceLineNo">086</span>     * been selected in the configuration to execute.<a name="line.86"></a>
<span class="sourceLineNo">087</span>     * &lt;/p&gt;<a name="line.87"></a>
<span class="sourceLineNo">088</span>     * &lt;p&gt;<a name="line.88"></a>
<span class="sourceLineNo">089</span>     * NOTE: This list can be larger and contain entries that might not exist or be available<a name="line.89"></a>
<span class="sourceLineNo">090</span>     * in the classpath, or as a component.<a name="line.90"></a>
<span class="sourceLineNo">091</span>     * &lt;/p&gt;<a name="line.91"></a>
<span class="sourceLineNo">092</span>     *<a name="line.92"></a>
<span class="sourceLineNo">093</span>     * @return the list of consumer ids that have been selected by the configuration.<a name="line.93"></a>
<span class="sourceLineNo">094</span>     */<a name="line.94"></a>
<span class="sourceLineNo">095</span>    public List&lt;String&gt; getSelectedKnownConsumerIds()<a name="line.95"></a>
<span class="sourceLineNo">096</span>        throws RepositoryAdminException<a name="line.96"></a>
<span class="sourceLineNo">097</span>    {<a name="line.97"></a>
<span class="sourceLineNo">098</span>        return archivaAdministration.getKnownContentConsumers();<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>    /**<a name="line.101"></a>
<span class="sourceLineNo">102</span>     * &lt;p&gt;<a name="line.102"></a>
<span class="sourceLineNo">103</span>     * Get the list of Ids associated with those {@link InvalidRepositoryContentConsumer} that have<a name="line.103"></a>
<span class="sourceLineNo">104</span>     * been selected in the configuration to execute.<a name="line.104"></a>
<span class="sourceLineNo">105</span>     * &lt;/p&gt;<a name="line.105"></a>
<span class="sourceLineNo">106</span>     * &lt;p&gt;<a name="line.106"></a>
<span class="sourceLineNo">107</span>     * NOTE: This list can be larger and contain entries that might not exist or be available<a name="line.107"></a>
<span class="sourceLineNo">108</span>     * in the classpath, or as a component.<a name="line.108"></a>
<span class="sourceLineNo">109</span>     * &lt;/p&gt;<a name="line.109"></a>
<span class="sourceLineNo">110</span>     *<a name="line.110"></a>
<span class="sourceLineNo">111</span>     * @return the list of consumer ids that have been selected by the configuration.<a name="line.111"></a>
<span class="sourceLineNo">112</span>     */<a name="line.112"></a>
<span class="sourceLineNo">113</span>    public List&lt;String&gt; getSelectedInvalidConsumerIds()<a name="line.113"></a>
<span class="sourceLineNo">114</span>        throws RepositoryAdminException<a name="line.114"></a>
<span class="sourceLineNo">115</span>    {<a name="line.115"></a>
<span class="sourceLineNo">116</span>        return archivaAdministration.getInvalidContentConsumers();<a name="line.116"></a>
<span class="sourceLineNo">117</span>    }<a name="line.117"></a>
<span class="sourceLineNo">118</span><a name="line.118"></a>
<span class="sourceLineNo">119</span>    /**<a name="line.119"></a>
<span class="sourceLineNo">120</span>     * Get the map of {@link String} ids to {@link KnownRepositoryContentConsumer} implementations,<a name="line.120"></a>
<span class="sourceLineNo">121</span>     * for those consumers that have been selected according to the active configuration.<a name="line.121"></a>
<span class="sourceLineNo">122</span>     *<a name="line.122"></a>
<span class="sourceLineNo">123</span>     * @return the map of String ids to {@link KnownRepositoryContentConsumer} objects.<a name="line.123"></a>
<span class="sourceLineNo">124</span>     */<a name="line.124"></a>
<span class="sourceLineNo">125</span>    public Map&lt;String, KnownRepositoryContentConsumer&gt; getSelectedKnownConsumersMap()<a name="line.125"></a>
<span class="sourceLineNo">126</span>        throws RepositoryAdminException<a name="line.126"></a>
<span class="sourceLineNo">127</span>    {<a name="line.127"></a>
<span class="sourceLineNo">128</span>        Map&lt;String, KnownRepositoryContentConsumer&gt; consumerMap = new HashMap&lt;&gt;();<a name="line.128"></a>
<span class="sourceLineNo">129</span><a name="line.129"></a>
<span class="sourceLineNo">130</span>        for ( KnownRepositoryContentConsumer consumer : getSelectedKnownConsumers() )<a name="line.130"></a>
<span class="sourceLineNo">131</span>        {<a name="line.131"></a>
<span class="sourceLineNo">132</span>            consumerMap.put( consumer.getId(), consumer );<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>        return consumerMap;<a name="line.135"></a>
<span class="sourceLineNo">136</span>    }<a name="line.136"></a>
<span class="sourceLineNo">137</span><a name="line.137"></a>
<span class="sourceLineNo">138</span>    /**<a name="line.138"></a>
<span class="sourceLineNo">139</span>     * Get the map of {@link String} ids to {@link InvalidRepositoryContentConsumer} implementations,<a name="line.139"></a>
<span class="sourceLineNo">140</span>     * for those consumers that have been selected according to the active configuration.<a name="line.140"></a>
<span class="sourceLineNo">141</span>     *<a name="line.141"></a>
<span class="sourceLineNo">142</span>     * @return the map of String ids to {@link InvalidRepositoryContentConsumer} objects.<a name="line.142"></a>
<span class="sourceLineNo">143</span>     */<a name="line.143"></a>
<span class="sourceLineNo">144</span>    public Map&lt;String, InvalidRepositoryContentConsumer&gt; getSelectedInvalidConsumersMap()<a name="line.144"></a>
<span class="sourceLineNo">145</span>        throws RepositoryAdminException<a name="line.145"></a>
<span class="sourceLineNo">146</span>    {<a name="line.146"></a>
<span class="sourceLineNo">147</span>        Map&lt;String, InvalidRepositoryContentConsumer&gt; consumerMap = new HashMap&lt;&gt;();<a name="line.147"></a>
<span class="sourceLineNo">148</span><a name="line.148"></a>
<span class="sourceLineNo">149</span>        for ( InvalidRepositoryContentConsumer consumer : getSelectedInvalidConsumers() )<a name="line.149"></a>
<span class="sourceLineNo">150</span>        {<a name="line.150"></a>
<span class="sourceLineNo">151</span>            consumerMap.put( consumer.getId(), consumer );<a name="line.151"></a>
<span class="sourceLineNo">152</span>        }<a name="line.152"></a>
<span class="sourceLineNo">153</span><a name="line.153"></a>
<span class="sourceLineNo">154</span>        return consumerMap;<a name="line.154"></a>
<span class="sourceLineNo">155</span>    }<a name="line.155"></a>
<span class="sourceLineNo">156</span><a name="line.156"></a>
<span class="sourceLineNo">157</span>    /**<a name="line.157"></a>
<span class="sourceLineNo">158</span>     * Get the list of {@link KnownRepositoryContentConsumer} objects that are<a name="line.158"></a>
<span class="sourceLineNo">159</span>     * selected according to the active configuration.<a name="line.159"></a>
<span class="sourceLineNo">160</span>     *<a name="line.160"></a>
<span class="sourceLineNo">161</span>     * @return the list of {@link KnownRepositoryContentConsumer} that have been selected<a name="line.161"></a>
<span class="sourceLineNo">162</span>     * by the active configuration.<a name="line.162"></a>
<span class="sourceLineNo">163</span>     */<a name="line.163"></a>
<span class="sourceLineNo">164</span>    public List&lt;KnownRepositoryContentConsumer&gt; getSelectedKnownConsumers()<a name="line.164"></a>
<span class="sourceLineNo">165</span>        throws RepositoryAdminException<a name="line.165"></a>
<span class="sourceLineNo">166</span>    {<a name="line.166"></a>
<span class="sourceLineNo">167</span>        // FIXME only for testing<a name="line.167"></a>
<span class="sourceLineNo">168</span>        if ( selectedKnownConsumers != null )<a name="line.168"></a>
<span class="sourceLineNo">169</span>        {<a name="line.169"></a>
<span class="sourceLineNo">170</span>            return selectedKnownConsumers;<a name="line.170"></a>
<span class="sourceLineNo">171</span>        }<a name="line.171"></a>
<span class="sourceLineNo">172</span>        List&lt;KnownRepositoryContentConsumer&gt; ret = new ArrayList&lt;&gt;();<a name="line.172"></a>
<span class="sourceLineNo">173</span><a name="line.173"></a>
<span class="sourceLineNo">174</span>        List&lt;String&gt; knownSelected = getSelectedKnownConsumerIds();<a name="line.174"></a>
<span class="sourceLineNo">175</span><a name="line.175"></a>
<span class="sourceLineNo">176</span>        for ( KnownRepositoryContentConsumer consumer : getAvailableKnownConsumers() )<a name="line.176"></a>
<span class="sourceLineNo">177</span>        {<a name="line.177"></a>
<span class="sourceLineNo">178</span>            if ( knownSelected.contains( consumer.getId() ) )<a name="line.178"></a>
<span class="sourceLineNo">179</span>            {<a name="line.179"></a>
<span class="sourceLineNo">180</span>                ret.add( consumer );<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>        return ret;<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>    public void releaseSelectedKnownConsumers( List&lt;KnownRepositoryContentConsumer&gt; repositoryContentConsumers )<a name="line.186"></a>
<span class="sourceLineNo">187</span>    {<a name="line.187"></a>
<span class="sourceLineNo">188</span>        if ( repositoryContentConsumers == null )<a name="line.188"></a>
<span class="sourceLineNo">189</span>        {<a name="line.189"></a>
<span class="sourceLineNo">190</span>            return;<a name="line.190"></a>
<span class="sourceLineNo">191</span>        }<a name="line.191"></a>
<span class="sourceLineNo">192</span>        for ( KnownRepositoryContentConsumer knownRepositoryContentConsumer : repositoryContentConsumers )<a name="line.192"></a>
<span class="sourceLineNo">193</span>        {<a name="line.193"></a>
<span class="sourceLineNo">194</span>            if ( RegistryListener.class.isAssignableFrom( knownRepositoryContentConsumer.getClass() ) )<a name="line.194"></a>
<span class="sourceLineNo">195</span>            {<a name="line.195"></a>
<span class="sourceLineNo">196</span>                archivaConfiguration.removeChangeListener(<a name="line.196"></a>
<span class="sourceLineNo">197</span>                    RegistryListener.class.cast( knownRepositoryContentConsumer ) );<a name="line.197"></a>
<span class="sourceLineNo">198</span>            }<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>    /**<a name="line.202"></a>
<span class="sourceLineNo">203</span>     * Get the list of {@link InvalidRepositoryContentConsumer} objects that are<a name="line.203"></a>
<span class="sourceLineNo">204</span>     * selected according to the active configuration.<a name="line.204"></a>
<span class="sourceLineNo">205</span>     *<a name="line.205"></a>
<span class="sourceLineNo">206</span>     * @return the list of {@link InvalidRepositoryContentConsumer} that have been selected<a name="line.206"></a>
<span class="sourceLineNo">207</span>     * by the active configuration.<a name="line.207"></a>
<span class="sourceLineNo">208</span>     */<a name="line.208"></a>
<span class="sourceLineNo">209</span>    public synchronized List&lt;InvalidRepositoryContentConsumer&gt; getSelectedInvalidConsumers()<a name="line.209"></a>
<span class="sourceLineNo">210</span>        throws RepositoryAdminException<a name="line.210"></a>
<span class="sourceLineNo">211</span>    {<a name="line.211"></a>
<span class="sourceLineNo">212</span><a name="line.212"></a>
<span class="sourceLineNo">213</span>        // FIXME only for testing<a name="line.213"></a>
<span class="sourceLineNo">214</span>        if ( selectedInvalidConsumers != null )<a name="line.214"></a>
<span class="sourceLineNo">215</span>        {<a name="line.215"></a>
<span class="sourceLineNo">216</span>            return selectedInvalidConsumers;<a name="line.216"></a>
<span class="sourceLineNo">217</span>        }<a name="line.217"></a>
<span class="sourceLineNo">218</span><a name="line.218"></a>
<span class="sourceLineNo">219</span>        List&lt;InvalidRepositoryContentConsumer&gt; ret = new ArrayList&lt;&gt;();<a name="line.219"></a>
<span class="sourceLineNo">220</span><a name="line.220"></a>
<span class="sourceLineNo">221</span>        List&lt;String&gt; invalidSelected = getSelectedInvalidConsumerIds();<a name="line.221"></a>
<span class="sourceLineNo">222</span><a name="line.222"></a>
<span class="sourceLineNo">223</span>        for ( InvalidRepositoryContentConsumer consumer : getAvailableInvalidConsumers() )<a name="line.223"></a>
<span class="sourceLineNo">224</span>        {<a name="line.224"></a>
<span class="sourceLineNo">225</span>            if ( invalidSelected.contains( consumer.getId() ) )<a name="line.225"></a>
<span class="sourceLineNo">226</span>            {<a name="line.226"></a>
<span class="sourceLineNo">227</span>                ret.add( consumer );<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>        return ret;<a name="line.230"></a>
<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
<span class="sourceLineNo">232</span><a name="line.232"></a>
<span class="sourceLineNo">233</span><a name="line.233"></a>
<span class="sourceLineNo">234</span>    /**<a name="line.234"></a>
<span class="sourceLineNo">235</span>     * Get the list of {@link KnownRepositoryContentConsumer} objects that are<a name="line.235"></a>
<span class="sourceLineNo">236</span>     * available and present in the classpath and as components in the IoC.<a name="line.236"></a>
<span class="sourceLineNo">237</span>     *<a name="line.237"></a>
<span class="sourceLineNo">238</span>     * @return the list of all available {@link KnownRepositoryContentConsumer} present in the classpath<a name="line.238"></a>
<span class="sourceLineNo">239</span>     * and as a component in the IoC.<a name="line.239"></a>
<span class="sourceLineNo">240</span>     */<a name="line.240"></a>
<span class="sourceLineNo">241</span>    public List&lt;KnownRepositoryContentConsumer&gt; getAvailableKnownConsumers()<a name="line.241"></a>
<span class="sourceLineNo">242</span>    {<a name="line.242"></a>
<span class="sourceLineNo">243</span>        return new ArrayList&lt;&gt;( applicationContext.getBeansOfType( KnownRepositoryContentConsumer.class ).values() );<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>     * Get the list of {@link InvalidRepositoryContentConsumer} objects that are<a name="line.247"></a>
<span class="sourceLineNo">248</span>     * available and present in the classpath and as components in the IoC.<a name="line.248"></a>
<span class="sourceLineNo">249</span>     *<a name="line.249"></a>
<span class="sourceLineNo">250</span>     * @return the list of all available {@link InvalidRepositoryContentConsumer} present in the classpath<a name="line.250"></a>
<span class="sourceLineNo">251</span>     * and as a component in the IoC.<a name="line.251"></a>
<span class="sourceLineNo">252</span>     */<a name="line.252"></a>
<span class="sourceLineNo">253</span>    public List&lt;InvalidRepositoryContentConsumer&gt; getAvailableInvalidConsumers()<a name="line.253"></a>
<span class="sourceLineNo">254</span>    {<a name="line.254"></a>
<span class="sourceLineNo">255</span>        return new ArrayList&lt;&gt;( applicationContext.getBeansOfType( InvalidRepositoryContentConsumer.class ).values() );<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>     * A convienence method to execute all of the active selected consumers for a<a name="line.259"></a>
<span class="sourceLineNo">260</span>     * particular arbitrary file.<a name="line.260"></a>
<span class="sourceLineNo">261</span>     * NOTE: Make sure that there is no repository scanning task executing before invoking this so as to prevent<a name="line.261"></a>
<span class="sourceLineNo">262</span>     * the index writer/reader of the current index-content consumer executing from getting closed. For an example,<a name="line.262"></a>
<span class="sourceLineNo">263</span>     * see ArchivaDavResource#executeConsumers( File ).<a name="line.263"></a>
<span class="sourceLineNo">264</span>     *<a name="line.264"></a>
<span class="sourceLineNo">265</span>     * @param repository             the repository configuration to use.<a name="line.265"></a>
<span class="sourceLineNo">266</span>     * @param localFile              the local file to execute the consumers against.<a name="line.266"></a>
<span class="sourceLineNo">267</span>     * @param updateRelatedArtifacts TODO<a name="line.267"></a>
<span class="sourceLineNo">268</span>     */<a name="line.268"></a>
<span class="sourceLineNo">269</span>    public void executeConsumers( ManagedRepository repository, File localFile, boolean updateRelatedArtifacts )<a name="line.269"></a>
<span class="sourceLineNo">270</span>        throws RepositoryAdminException<a name="line.270"></a>
<span class="sourceLineNo">271</span>    {<a name="line.271"></a>
<span class="sourceLineNo">272</span>        List&lt;KnownRepositoryContentConsumer&gt; selectedKnownConsumers = null;<a name="line.272"></a>
<span class="sourceLineNo">273</span>        // Run the repository consumers<a name="line.273"></a>
<span class="sourceLineNo">274</span>        try<a name="line.274"></a>
<span class="sourceLineNo">275</span>        {<a name="line.275"></a>
<span class="sourceLineNo">276</span>            Closure triggerBeginScan = new TriggerBeginScanClosure( repository, getStartTime(), false );<a name="line.276"></a>
<span class="sourceLineNo">277</span><a name="line.277"></a>
<span class="sourceLineNo">278</span>            selectedKnownConsumers = getSelectedKnownConsumers();<a name="line.278"></a>
<span class="sourceLineNo">279</span><a name="line.279"></a>
<span class="sourceLineNo">280</span>            // MRM-1212/MRM-1197 <a name="line.280"></a>
<span class="sourceLineNo">281</span>            // - do not create missing/fix invalid checksums and update metadata when deploying from webdav since these are uploaded by maven<a name="line.281"></a>
<span class="sourceLineNo">282</span>            if ( !updateRelatedArtifacts )<a name="line.282"></a>
<span class="sourceLineNo">283</span>            {<a name="line.283"></a>
<span class="sourceLineNo">284</span>                List&lt;KnownRepositoryContentConsumer&gt; clone = new ArrayList&lt;&gt;();<a name="line.284"></a>
<span class="sourceLineNo">285</span>                clone.addAll( selectedKnownConsumers );<a name="line.285"></a>
<span class="sourceLineNo">286</span><a name="line.286"></a>
<span class="sourceLineNo">287</span>                for ( KnownRepositoryContentConsumer consumer : clone )<a name="line.287"></a>
<span class="sourceLineNo">288</span>                {<a name="line.288"></a>
<span class="sourceLineNo">289</span>                    if ( consumer.getId().equals( "create-missing-checksums" ) || consumer.getId().equals(<a name="line.289"></a>
<span class="sourceLineNo">290</span>                        "metadata-updater" ) )<a name="line.290"></a>
<span class="sourceLineNo">291</span>                    {<a name="line.291"></a>
<span class="sourceLineNo">292</span>                        selectedKnownConsumers.remove( consumer );<a name="line.292"></a>
<span class="sourceLineNo">293</span>                    }<a name="line.293"></a>
<span class="sourceLineNo">294</span>                }<a name="line.294"></a>
<span class="sourceLineNo">295</span>            }<a name="line.295"></a>
<span class="sourceLineNo">296</span><a name="line.296"></a>
<span class="sourceLineNo">297</span>            List&lt;InvalidRepositoryContentConsumer&gt; selectedInvalidConsumers = getSelectedInvalidConsumers();<a name="line.297"></a>
<span class="sourceLineNo">298</span>            CollectionUtils.forAllDo( selectedKnownConsumers, triggerBeginScan );<a name="line.298"></a>
<span class="sourceLineNo">299</span>            CollectionUtils.forAllDo( selectedInvalidConsumers, triggerBeginScan );<a name="line.299"></a>
<span class="sourceLineNo">300</span><a name="line.300"></a>
<span class="sourceLineNo">301</span>            // yuck. In case you can't read this, it says<a name="line.301"></a>
<span class="sourceLineNo">302</span>            // "process the file if the consumer has it in the includes list, and not in the excludes list"<a name="line.302"></a>
<span class="sourceLineNo">303</span>            BaseFile baseFile = new BaseFile( repository.getLocation(), localFile );<a name="line.303"></a>
<span class="sourceLineNo">304</span>            ConsumerWantsFilePredicate predicate = new ConsumerWantsFilePredicate( repository );<a name="line.304"></a>
<span class="sourceLineNo">305</span>            predicate.setBasefile( baseFile );<a name="line.305"></a>
<span class="sourceLineNo">306</span>            predicate.setCaseSensitive( false );<a name="line.306"></a>
<span class="sourceLineNo">307</span><a name="line.307"></a>
<span class="sourceLineNo">308</span>            ConsumerProcessFileClosure closure = new ConsumerProcessFileClosure();<a name="line.308"></a>
<span class="sourceLineNo">309</span>            closure.setBasefile( baseFile );<a name="line.309"></a>
<span class="sourceLineNo">310</span>            closure.setExecuteOnEntireRepo( false );<a name="line.310"></a>
<span class="sourceLineNo">311</span><a name="line.311"></a>
<span class="sourceLineNo">312</span>            Closure processIfWanted = IfClosure.getInstance( predicate, closure );<a name="line.312"></a>
<span class="sourceLineNo">313</span><a name="line.313"></a>
<span class="sourceLineNo">314</span>            CollectionUtils.forAllDo( selectedKnownConsumers, processIfWanted );<a name="line.314"></a>
<span class="sourceLineNo">315</span><a name="line.315"></a>
<span class="sourceLineNo">316</span>            if ( predicate.getWantedFileCount() &lt;= 0 )<a name="line.316"></a>
<span class="sourceLineNo">317</span>            {<a name="line.317"></a>
<span class="sourceLineNo">318</span>                // Nothing known processed this file.  It is invalid!<a name="line.318"></a>
<span class="sourceLineNo">319</span>                CollectionUtils.forAllDo( selectedInvalidConsumers, closure );<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>            TriggerScanCompletedClosure scanCompletedClosure = new TriggerScanCompletedClosure( repository, false );<a name="line.322"></a>
<span class="sourceLineNo">323</span><a name="line.323"></a>
<span class="sourceLineNo">324</span>            CollectionUtils.forAllDo( selectedKnownConsumers, scanCompletedClosure );<a name="line.324"></a>
<span class="sourceLineNo">325</span>        }<a name="line.325"></a>
<span class="sourceLineNo">326</span>        finally<a name="line.326"></a>
<span class="sourceLineNo">327</span>        {<a name="line.327"></a>
<span class="sourceLineNo">328</span>            /* TODO: This is never called by the repository scanner instance, so not calling here either - but it probably should be?<a name="line.328"></a>
<span class="sourceLineNo">329</span>                        CollectionUtils.forAllDo( availableKnownConsumers, triggerCompleteScan );<a name="line.329"></a>
<span class="sourceLineNo">330</span>                        CollectionUtils.forAllDo( availableInvalidConsumers, triggerCompleteScan );<a name="line.330"></a>
<span class="sourceLineNo">331</span>            */<a name="line.331"></a>
<span class="sourceLineNo">332</span>            releaseSelectedKnownConsumers( selectedKnownConsumers );<a name="line.332"></a>
<span class="sourceLineNo">333</span>        }<a name="line.333"></a>
<span class="sourceLineNo">334</span>    }<a name="line.334"></a>
<span class="sourceLineNo">335</span><a name="line.335"></a>
<span class="sourceLineNo">336</span>    public void setSelectedKnownConsumers( List&lt;KnownRepositoryContentConsumer&gt; selectedKnownConsumers )<a name="line.336"></a>
<span class="sourceLineNo">337</span>    {<a name="line.337"></a>
<span class="sourceLineNo">338</span>        this.selectedKnownConsumers = selectedKnownConsumers;<a name="line.338"></a>
<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
<span class="sourceLineNo">340</span><a name="line.340"></a>
<span class="sourceLineNo">341</span>    public void setSelectedInvalidConsumers( List&lt;InvalidRepositoryContentConsumer&gt; selectedInvalidConsumers )<a name="line.341"></a>
<span class="sourceLineNo">342</span>    {<a name="line.342"></a>
<span class="sourceLineNo">343</span>        this.selectedInvalidConsumers = selectedInvalidConsumers;<a name="line.343"></a>
<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
<span class="sourceLineNo">345</span><a name="line.345"></a>
<span class="sourceLineNo">346</span>    protected Date getStartTime()<a name="line.346"></a>
<span class="sourceLineNo">347</span>    {<a name="line.347"></a>
<span class="sourceLineNo">348</span>        return new Date( System.currentTimeMillis() );<a name="line.348"></a>
<span class="sourceLineNo">349</span>    }<a name="line.349"></a>
<span class="sourceLineNo">350</span><a name="line.350"></a>
<span class="sourceLineNo">351</span>    public void setArchivaAdministration( ArchivaAdministration archivaAdministration )<a name="line.351"></a>
<span class="sourceLineNo">352</span>    {<a name="line.352"></a>
<span class="sourceLineNo">353</span>        this.archivaAdministration = archivaAdministration;<a name="line.353"></a>
<span class="sourceLineNo">354</span>    }<a name="line.354"></a>
<span class="sourceLineNo">355</span>}<a name="line.355"></a>




























































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